ai-capability-framework 1.0.0-rc.1

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 (115) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/CONTRIBUTING.md +56 -0
  3. package/LICENSE +21 -0
  4. package/README.md +198 -0
  5. package/SECURITY.md +29 -0
  6. package/conformance/invalid/duplicate/capabilities/conformance.duplicate.one.yaml +55 -0
  7. package/conformance/invalid/duplicate/capabilities/conformance.duplicate.two.yaml +55 -0
  8. package/conformance/invalid/eval-results/conformance.results.failing.json +15 -0
  9. package/conformance/invalid/missing-reference/capabilities/conformance.missing_reference.prepare.yaml +58 -0
  10. package/conformance/invalid/schema/capabilities/conformance.invalid.missing_required.yaml +3 -0
  11. package/conformance/valid/capabilities/conformance.note.get.yaml +82 -0
  12. package/conformance/valid/decisions/conformance.note.get.denied_missing_permission.json +13 -0
  13. package/conformance/valid/entities/Note.yaml +18 -0
  14. package/conformance/valid/eval-results/conformance.results.passing.json +19 -0
  15. package/conformance/valid/evals/conformance.note.get.valid.yaml +33 -0
  16. package/conformance/valid/openai/context.no_permissions.json +6 -0
  17. package/dist/adapter-common.d.ts +62 -0
  18. package/dist/adapter-common.d.ts.map +1 -0
  19. package/dist/adapter-common.js +453 -0
  20. package/dist/ai-sdk.d.ts +5 -0
  21. package/dist/ai-sdk.d.ts.map +1 -0
  22. package/dist/ai-sdk.js +71 -0
  23. package/dist/anthropic-claude.d.ts +5 -0
  24. package/dist/anthropic-claude.d.ts.map +1 -0
  25. package/dist/anthropic-claude.js +62 -0
  26. package/dist/cli.d.ts +11 -0
  27. package/dist/cli.d.ts.map +1 -0
  28. package/dist/cli.js +360 -0
  29. package/dist/decision.d.ts +6 -0
  30. package/dist/decision.d.ts.map +1 -0
  31. package/dist/decision.js +237 -0
  32. package/dist/eval-runner.d.ts +6 -0
  33. package/dist/eval-runner.d.ts.map +1 -0
  34. package/dist/eval-runner.js +372 -0
  35. package/dist/gemini.d.ts +5 -0
  36. package/dist/gemini.d.ts.map +1 -0
  37. package/dist/gemini.js +64 -0
  38. package/dist/generated/manifest-types.d.ts +208 -0
  39. package/dist/generated/manifest-types.d.ts.map +1 -0
  40. package/dist/generated/manifest-types.js +1 -0
  41. package/dist/index.d.ts +15 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +13 -0
  44. package/dist/langchain.d.ts +5 -0
  45. package/dist/langchain.d.ts.map +1 -0
  46. package/dist/langchain.js +65 -0
  47. package/dist/loader.d.ts +4 -0
  48. package/dist/loader.d.ts.map +1 -0
  49. package/dist/loader.js +94 -0
  50. package/dist/mcp.d.ts +5 -0
  51. package/dist/mcp.d.ts.map +1 -0
  52. package/dist/mcp.js +82 -0
  53. package/dist/openai-responses.d.ts +6 -0
  54. package/dist/openai-responses.d.ts.map +1 -0
  55. package/dist/openai-responses.js +65 -0
  56. package/dist/registry.d.ts +6 -0
  57. package/dist/registry.d.ts.map +1 -0
  58. package/dist/registry.js +134 -0
  59. package/dist/semantic-kernel.d.ts +5 -0
  60. package/dist/semantic-kernel.d.ts.map +1 -0
  61. package/dist/semantic-kernel.js +79 -0
  62. package/dist/types.d.ts +400 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +1 -0
  65. package/dist/validator.d.ts +3 -0
  66. package/dist/validator.d.ts.map +1 -0
  67. package/dist/validator.js +105 -0
  68. package/docs/adapter-roadmap.md +179 -0
  69. package/docs/adapters.md +112 -0
  70. package/docs/api.md +115 -0
  71. package/docs/capability-manifests.md +47 -0
  72. package/docs/control-plane.md +59 -0
  73. package/docs/eval-runner.md +80 -0
  74. package/docs/evals.md +34 -0
  75. package/docs/getting-started.md +51 -0
  76. package/docs/host-responsibilities.md +23 -0
  77. package/docs/interoperability.md +32 -0
  78. package/docs/migration-0.1-to-1.0.md +22 -0
  79. package/docs/openai-responses.md +103 -0
  80. package/docs/release.md +75 -0
  81. package/docs/spec.md +194 -0
  82. package/examples/eval-results/public.results.passing.json +128 -0
  83. package/examples/scheduling/capabilities/scheduling.availability.get.yaml +91 -0
  84. package/examples/scheduling/capabilities/scheduling.invite.prepare.yaml +114 -0
  85. package/examples/scheduling/capabilities/scheduling.invite.send.yaml +97 -0
  86. package/examples/scheduling/decisions/scheduling.availability.get.select.json +14 -0
  87. package/examples/scheduling/decisions/scheduling.invite.prepare.allowed.json +20 -0
  88. package/examples/scheduling/decisions/scheduling.invite.send.allowed.json +22 -0
  89. package/examples/scheduling/decisions/scheduling.invite.send.denied_missing_approval.json +18 -0
  90. package/examples/scheduling/entities/AvailabilitySlot.yaml +26 -0
  91. package/examples/scheduling/entities/MeetingInvite.yaml +25 -0
  92. package/examples/scheduling/eval-results/scheduling.results.passing.json +59 -0
  93. package/examples/scheduling/evals/scheduling.availability.get.valid.yaml +38 -0
  94. package/examples/scheduling/evals/scheduling.invite.prepare.valid.yaml +44 -0
  95. package/examples/scheduling/evals/scheduling.invite.send.requires_approval.yaml +43 -0
  96. package/examples/scheduling/openai/context.scheduler.json +6 -0
  97. package/examples/support/capabilities/support.refund.commit_case.yaml +98 -0
  98. package/examples/support/capabilities/support.refund.prepare_case.yaml +116 -0
  99. package/examples/support/capabilities/support.ticket.get.yaml +85 -0
  100. package/examples/support/decisions/support.refund.commit_case.allowed.json +22 -0
  101. package/examples/support/decisions/support.refund.commit_case.denied_missing_approval.json +18 -0
  102. package/examples/support/decisions/support.refund.prepare_case.approval_required.json +19 -0
  103. package/examples/support/decisions/support.ticket.get.select.json +0 -0
  104. package/examples/support/entities/Order.yaml +23 -0
  105. package/examples/support/entities/Ticket.yaml +25 -0
  106. package/examples/support/eval-results/support.results.passing.json +68 -0
  107. package/examples/support/evals/support.refund.commit_case.requires_approval.yaml +42 -0
  108. package/examples/support/evals/support.refund.prepare_case.approval_required.yaml +45 -0
  109. package/examples/support/evals/support.refund.prepare_case.valid.yaml +43 -0
  110. package/examples/support/openai/context.support_agent.json +9 -0
  111. package/package.json +74 -0
  112. package/schemas/capability-manifest.schema.json +250 -0
  113. package/schemas/entity-manifest.schema.json +97 -0
  114. package/schemas/eval-case.schema.json +134 -0
  115. package/schemas/eval-result.schema.json +77 -0
@@ -0,0 +1,250 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://raw.githubusercontent.com/xennon101/ai-capability-framework/main/schemas/capability-manifest.schema.json",
4
+ "title": "AICF Capability Manifest",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema_version",
9
+ "id",
10
+ "version",
11
+ "status",
12
+ "name",
13
+ "summary",
14
+ "model_description",
15
+ "capability_type",
16
+ "autonomy_tier",
17
+ "risk_tier",
18
+ "input_schema",
19
+ "output_schema",
20
+ "side_effects",
21
+ "authorization",
22
+ "policy",
23
+ "lifecycle",
24
+ "observability"
25
+ ],
26
+ "properties": {
27
+ "schema_version": {
28
+ "const": "1.0"
29
+ },
30
+ "id": {
31
+ "type": "string",
32
+ "pattern": "^[a-z][a-z0-9_]*(\\.[a-z][a-z0-9_]*){2,}$"
33
+ },
34
+ "version": {
35
+ "type": "string",
36
+ "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-[0-9A-Za-z-.]+)?(?:\\+[0-9A-Za-z-.]+)?$"
37
+ },
38
+ "status": {
39
+ "enum": ["draft", "experimental", "active", "deprecated", "disabled"]
40
+ },
41
+ "name": {
42
+ "type": "string",
43
+ "minLength": 1
44
+ },
45
+ "summary": {
46
+ "type": "string",
47
+ "minLength": 1
48
+ },
49
+ "model_description": {
50
+ "type": "string",
51
+ "minLength": 1
52
+ },
53
+ "domain": {
54
+ "type": "string",
55
+ "minLength": 1
56
+ },
57
+ "owner": {
58
+ "type": "object",
59
+ "additionalProperties": false,
60
+ "properties": {
61
+ "team": { "type": "string" },
62
+ "contact": { "type": "string" }
63
+ }
64
+ },
65
+ "capability_type": {
66
+ "enum": [
67
+ "read_data",
68
+ "retrieve_documents",
69
+ "compute",
70
+ "write_prepare_only",
71
+ "write_commit",
72
+ "external_message_prepare",
73
+ "external_message_send",
74
+ "workflow_start",
75
+ "workflow_step",
76
+ "human_handoff"
77
+ ]
78
+ },
79
+ "autonomy_tier": {
80
+ "enum": ["A0", "A1", "A2", "A3", "A4", "A5"]
81
+ },
82
+ "risk_tier": {
83
+ "enum": ["none", "low", "medium", "high", "critical"]
84
+ },
85
+ "when_to_use": {
86
+ "type": "array",
87
+ "items": { "type": "string", "minLength": 1 }
88
+ },
89
+ "when_not_to_use": {
90
+ "type": "array",
91
+ "items": { "type": "string", "minLength": 1 }
92
+ },
93
+ "input_schema": { "$ref": "#/$defs/json_schema_object" },
94
+ "output_schema": { "$ref": "#/$defs/json_schema_object" },
95
+ "side_effects": {
96
+ "type": "object",
97
+ "additionalProperties": false,
98
+ "required": [
99
+ "reads_data",
100
+ "writes_data",
101
+ "creates_records",
102
+ "updates_records",
103
+ "deletes_records",
104
+ "sends_external_messages",
105
+ "charges_money",
106
+ "refunds_money",
107
+ "changes_permissions",
108
+ "triggers_external_workflow",
109
+ "irreversible"
110
+ ],
111
+ "properties": {
112
+ "reads_data": { "type": "boolean" },
113
+ "writes_data": { "type": "boolean" },
114
+ "creates_records": { "type": "boolean" },
115
+ "updates_records": { "type": "boolean" },
116
+ "deletes_records": { "type": "boolean" },
117
+ "sends_external_messages": { "type": "boolean" },
118
+ "charges_money": { "type": "boolean" },
119
+ "refunds_money": { "type": "boolean" },
120
+ "changes_permissions": { "type": "boolean" },
121
+ "triggers_external_workflow": { "type": "boolean" },
122
+ "irreversible": { "type": "boolean" }
123
+ }
124
+ },
125
+ "authorization": {
126
+ "type": "object",
127
+ "additionalProperties": false,
128
+ "required": ["permissions", "tenant_scoped", "requires_user_context"],
129
+ "properties": {
130
+ "permissions": {
131
+ "type": "array",
132
+ "minItems": 1,
133
+ "items": { "type": "string", "minLength": 1 }
134
+ },
135
+ "tenant_scoped": { "type": "boolean" },
136
+ "requires_user_context": { "type": "boolean" },
137
+ "data_scope": {
138
+ "type": "array",
139
+ "items": { "type": "string", "minLength": 1 }
140
+ }
141
+ }
142
+ },
143
+ "policy": {
144
+ "type": "object",
145
+ "additionalProperties": false,
146
+ "minProperties": 1,
147
+ "properties": {
148
+ "approval_required": { "type": "boolean" },
149
+ "approval_required_if": {
150
+ "type": "array",
151
+ "items": { "$ref": "#/$defs/policy_rule" }
152
+ },
153
+ "deny_if": {
154
+ "type": "array",
155
+ "items": { "$ref": "#/$defs/policy_rule" }
156
+ },
157
+ "max_autonomy_tier": {
158
+ "enum": ["A0", "A1", "A2", "A3", "A4", "A5"]
159
+ }
160
+ }
161
+ },
162
+ "lifecycle": {
163
+ "type": "object",
164
+ "additionalProperties": false,
165
+ "required": ["prepare", "preview", "approve", "commit", "verify", "audit"],
166
+ "properties": {
167
+ "prepare": { "type": "boolean" },
168
+ "preview": { "type": "boolean" },
169
+ "approve": { "type": "boolean" },
170
+ "commit": { "type": "boolean" },
171
+ "verify": { "type": "boolean" },
172
+ "audit": { "type": "boolean" }
173
+ }
174
+ },
175
+ "idempotency": {
176
+ "type": "object",
177
+ "additionalProperties": false,
178
+ "required": ["required"],
179
+ "properties": {
180
+ "required": { "type": "boolean" },
181
+ "key_fields": {
182
+ "type": "array",
183
+ "items": { "type": "string", "minLength": 1 }
184
+ }
185
+ }
186
+ },
187
+ "observability": {
188
+ "type": "object",
189
+ "additionalProperties": false,
190
+ "required": ["log_inputs", "log_outputs"],
191
+ "properties": {
192
+ "log_inputs": {
193
+ "enum": ["none", "summary", "redacted"]
194
+ },
195
+ "log_outputs": {
196
+ "enum": ["none", "summary", "redacted"]
197
+ },
198
+ "trace_attributes": {
199
+ "type": "object",
200
+ "additionalProperties": {
201
+ "type": ["string", "number", "boolean", "null"]
202
+ }
203
+ }
204
+ }
205
+ },
206
+ "evals": {
207
+ "type": "object",
208
+ "additionalProperties": false,
209
+ "properties": {
210
+ "golden": {
211
+ "type": "array",
212
+ "items": { "type": "string", "minLength": 1 }
213
+ },
214
+ "red_team": {
215
+ "type": "array",
216
+ "items": { "type": "string", "minLength": 1 }
217
+ }
218
+ }
219
+ },
220
+ "extensions": {
221
+ "type": "object"
222
+ }
223
+ },
224
+ "$defs": {
225
+ "json_schema_object": {
226
+ "type": "object",
227
+ "required": ["type"],
228
+ "additionalProperties": true,
229
+ "properties": {
230
+ "type": {
231
+ "type": ["string", "array"]
232
+ }
233
+ }
234
+ },
235
+ "policy_rule": {
236
+ "type": "object",
237
+ "additionalProperties": false,
238
+ "required": ["rule", "reason"],
239
+ "properties": {
240
+ "rule": { "type": "string", "minLength": 1 },
241
+ "reason": { "type": "string", "minLength": 1 },
242
+ "field": { "type": "string" },
243
+ "operator": {
244
+ "enum": ["eq", "neq", "gt", "gte", "lt", "lte", "in", "not_in", "exists"]
245
+ },
246
+ "value": {}
247
+ }
248
+ }
249
+ }
250
+ }
@@ -0,0 +1,97 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://raw.githubusercontent.com/xennon101/ai-capability-framework/main/schemas/entity-manifest.schema.json",
4
+ "title": "AICF Entity Manifest",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema_version",
9
+ "id",
10
+ "version",
11
+ "name",
12
+ "summary",
13
+ "canonical_id",
14
+ "data_classification",
15
+ "lookup",
16
+ "allowed_actions",
17
+ "model_guidance"
18
+ ],
19
+ "properties": {
20
+ "schema_version": {
21
+ "const": "1.0"
22
+ },
23
+ "id": {
24
+ "type": "string",
25
+ "pattern": "^[A-Z][A-Za-z0-9_]*$"
26
+ },
27
+ "version": {
28
+ "type": "string",
29
+ "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-[0-9A-Za-z-.]+)?(?:\\+[0-9A-Za-z-.]+)?$"
30
+ },
31
+ "name": {
32
+ "type": "string",
33
+ "minLength": 1
34
+ },
35
+ "summary": {
36
+ "type": "string",
37
+ "minLength": 1
38
+ },
39
+ "canonical_id": {
40
+ "type": "object",
41
+ "additionalProperties": false,
42
+ "required": ["field"],
43
+ "properties": {
44
+ "field": { "type": "string", "minLength": 1 },
45
+ "pattern": { "type": "string" }
46
+ }
47
+ },
48
+ "data_classification": {
49
+ "type": "object",
50
+ "additionalProperties": false,
51
+ "required": ["default"],
52
+ "properties": {
53
+ "default": { "type": "string", "minLength": 1 },
54
+ "fields": {
55
+ "type": "object",
56
+ "additionalProperties": { "type": "string" }
57
+ }
58
+ }
59
+ },
60
+ "relationships": {
61
+ "type": "array",
62
+ "items": {
63
+ "type": "object",
64
+ "additionalProperties": false,
65
+ "required": ["name", "target_entity", "cardinality"],
66
+ "properties": {
67
+ "name": { "type": "string", "minLength": 1 },
68
+ "target_entity": { "type": "string", "minLength": 1 },
69
+ "cardinality": {
70
+ "enum": ["one_to_one", "one_to_many", "many_to_one", "many_to_many"]
71
+ },
72
+ "lookup_capability": { "type": "string" }
73
+ }
74
+ }
75
+ },
76
+ "lookup": {
77
+ "type": "object",
78
+ "additionalProperties": false,
79
+ "required": ["primary_capability"],
80
+ "properties": {
81
+ "primary_capability": { "type": "string" }
82
+ }
83
+ },
84
+ "allowed_actions": {
85
+ "type": "array",
86
+ "minItems": 1,
87
+ "items": { "type": "string", "minLength": 1 }
88
+ },
89
+ "model_guidance": {
90
+ "type": "string",
91
+ "minLength": 1
92
+ },
93
+ "extensions": {
94
+ "type": "object"
95
+ }
96
+ }
97
+ }
@@ -0,0 +1,134 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://raw.githubusercontent.com/xennon101/ai-capability-framework/main/schemas/eval-case.schema.json",
4
+ "title": "AICF Eval Case",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema_version", "id", "input", "expected", "scorers"],
8
+ "properties": {
9
+ "schema_version": {
10
+ "const": "1.0"
11
+ },
12
+ "id": {
13
+ "type": "string",
14
+ "pattern": "^[a-z][a-z0-9_]*(\\.[a-z][a-z0-9_]*)*$"
15
+ },
16
+ "name": {
17
+ "type": "string"
18
+ },
19
+ "capability_under_test": {
20
+ "type": "string"
21
+ },
22
+ "tags": {
23
+ "type": "array",
24
+ "items": { "type": "string" }
25
+ },
26
+ "input": {
27
+ "type": "object",
28
+ "additionalProperties": false,
29
+ "required": ["user_message"],
30
+ "properties": {
31
+ "user_message": { "type": "string", "minLength": 1 },
32
+ "conversation": {
33
+ "type": "array",
34
+ "items": {
35
+ "type": "object",
36
+ "additionalProperties": false,
37
+ "required": ["role", "content"],
38
+ "properties": {
39
+ "role": { "enum": ["user", "assistant", "system", "tool"] },
40
+ "content": { "type": "string" }
41
+ }
42
+ }
43
+ }
44
+ }
45
+ },
46
+ "context": {
47
+ "type": "object"
48
+ },
49
+ "expected": { "$ref": "#/$defs/expected_behavior" },
50
+ "scorers": {
51
+ "type": "array",
52
+ "minItems": 1,
53
+ "items": {
54
+ "type": "object",
55
+ "additionalProperties": true,
56
+ "required": ["type"],
57
+ "properties": {
58
+ "type": { "type": "string", "minLength": 1 }
59
+ }
60
+ }
61
+ },
62
+ "extensions": {
63
+ "type": "object"
64
+ }
65
+ },
66
+ "$defs": {
67
+ "expected_behavior": {
68
+ "type": "object",
69
+ "additionalProperties": false,
70
+ "minProperties": 1,
71
+ "properties": {
72
+ "selected_capabilities": {
73
+ "type": "object",
74
+ "additionalProperties": false,
75
+ "properties": {
76
+ "includes": {
77
+ "type": "array",
78
+ "items": { "type": "string", "minLength": 1 }
79
+ },
80
+ "excludes": {
81
+ "type": "array",
82
+ "items": { "type": "string", "minLength": 1 }
83
+ }
84
+ }
85
+ },
86
+ "tool_calls": {
87
+ "type": "array",
88
+ "items": {
89
+ "type": "object",
90
+ "additionalProperties": false,
91
+ "required": ["capability_id"],
92
+ "properties": {
93
+ "capability_id": { "type": "string", "minLength": 1 },
94
+ "args_match": { "type": "object" }
95
+ }
96
+ }
97
+ },
98
+ "policy_decision": {
99
+ "enum": ["allowed", "approval_required", "denied"]
100
+ },
101
+ "action_state": {
102
+ "enum": ["none", "prepared", "approval_required", "committed", "denied", "refused"]
103
+ },
104
+ "no_commit": { "type": "boolean" },
105
+ "refusal": {
106
+ "type": "object",
107
+ "additionalProperties": false,
108
+ "required": ["required"],
109
+ "properties": {
110
+ "required": { "type": "boolean" },
111
+ "reason_contains": {
112
+ "type": "array",
113
+ "items": { "type": "string", "minLength": 1 }
114
+ }
115
+ }
116
+ },
117
+ "response": {
118
+ "type": "object",
119
+ "additionalProperties": false,
120
+ "properties": {
121
+ "must_include": {
122
+ "type": "array",
123
+ "items": { "type": "string", "minLength": 1 }
124
+ },
125
+ "must_not_include": {
126
+ "type": "array",
127
+ "items": { "type": "string", "minLength": 1 }
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
@@ -0,0 +1,77 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://raw.githubusercontent.com/xennon101/ai-capability-framework/main/schemas/eval-result.schema.json",
4
+ "title": "AICF Eval Result Fixture",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema_version", "results"],
8
+ "properties": {
9
+ "schema_version": {
10
+ "const": "1.0"
11
+ },
12
+ "results": {
13
+ "type": "array",
14
+ "items": { "$ref": "#/$defs/eval_candidate_result" }
15
+ },
16
+ "extensions": {
17
+ "type": "object"
18
+ }
19
+ },
20
+ "$defs": {
21
+ "eval_candidate_result": {
22
+ "type": "object",
23
+ "additionalProperties": false,
24
+ "required": ["eval_id"],
25
+ "properties": {
26
+ "eval_id": {
27
+ "type": "string",
28
+ "minLength": 1
29
+ },
30
+ "selected_capabilities": {
31
+ "type": "array",
32
+ "items": { "type": "string", "minLength": 1 }
33
+ },
34
+ "tool_calls": {
35
+ "type": "array",
36
+ "items": {
37
+ "type": "object",
38
+ "additionalProperties": false,
39
+ "required": ["capability_id"],
40
+ "properties": {
41
+ "capability_id": { "type": "string", "minLength": 1 },
42
+ "args": { "type": "object" }
43
+ }
44
+ }
45
+ },
46
+ "policy_decision": {
47
+ "enum": ["allowed", "approval_required", "denied"]
48
+ },
49
+ "action_state": {
50
+ "enum": ["none", "prepared", "approval_required", "committed", "denied", "refused"]
51
+ },
52
+ "committed_capabilities": {
53
+ "type": "array",
54
+ "items": { "type": "string", "minLength": 1 }
55
+ },
56
+ "refusal": {
57
+ "type": "object",
58
+ "additionalProperties": false,
59
+ "properties": {
60
+ "present": { "type": "boolean" },
61
+ "reason": { "type": "string" }
62
+ }
63
+ },
64
+ "response": {
65
+ "type": "object",
66
+ "additionalProperties": false,
67
+ "properties": {
68
+ "text": { "type": "string" }
69
+ }
70
+ },
71
+ "extensions": {
72
+ "type": "object"
73
+ }
74
+ }
75
+ }
76
+ }
77
+ }