cedar-mcp-server 1.0.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 (215) hide show
  1. package/.editorconfig +12 -0
  2. package/.github/workflows/ci.yml +31 -0
  3. package/.github/workflows/release.yml +42 -0
  4. package/.nvmrc +1 -0
  5. package/CHANGELOG.md +241 -0
  6. package/CONTRIBUTING.md +83 -0
  7. package/LICENSE +182 -0
  8. package/README.md +1635 -0
  9. package/SECURITY.md +37 -0
  10. package/dist/http-server.d.ts +61 -0
  11. package/dist/http-server.d.ts.map +1 -0
  12. package/dist/http-server.js +194 -0
  13. package/dist/http-server.js.map +1 -0
  14. package/dist/index.d.ts +32 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +270 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/parser/policy-ast.d.ts +49 -0
  19. package/dist/parser/policy-ast.d.ts.map +1 -0
  20. package/dist/parser/policy-ast.js +311 -0
  21. package/dist/parser/policy-ast.js.map +1 -0
  22. package/dist/prompts/index.d.ts +38 -0
  23. package/dist/prompts/index.d.ts.map +1 -0
  24. package/dist/prompts/index.js +172 -0
  25. package/dist/prompts/index.js.map +1 -0
  26. package/dist/resources/ref-resolver.d.ts +23 -0
  27. package/dist/resources/ref-resolver.d.ts.map +1 -0
  28. package/dist/resources/ref-resolver.js +128 -0
  29. package/dist/resources/ref-resolver.js.map +1 -0
  30. package/dist/resources/store-manager.d.ts +64 -0
  31. package/dist/resources/store-manager.d.ts.map +1 -0
  32. package/dist/resources/store-manager.js +221 -0
  33. package/dist/resources/store-manager.js.map +1 -0
  34. package/dist/server.d.ts +18 -0
  35. package/dist/server.d.ts.map +1 -0
  36. package/dist/server.js +539 -0
  37. package/dist/server.js.map +1 -0
  38. package/dist/tools/advise/avp-rules.d.ts +49 -0
  39. package/dist/tools/advise/avp-rules.d.ts.map +1 -0
  40. package/dist/tools/advise/avp-rules.js +59 -0
  41. package/dist/tools/advise/avp-rules.js.map +1 -0
  42. package/dist/tools/advise/cedar-patterns.d.ts +24 -0
  43. package/dist/tools/advise/cedar-patterns.d.ts.map +1 -0
  44. package/dist/tools/advise/cedar-patterns.js +57 -0
  45. package/dist/tools/advise/cedar-patterns.js.map +1 -0
  46. package/dist/tools/advise/context-builder.d.ts +28 -0
  47. package/dist/tools/advise/context-builder.d.ts.map +1 -0
  48. package/dist/tools/advise/context-builder.js +89 -0
  49. package/dist/tools/advise/context-builder.js.map +1 -0
  50. package/dist/tools/advise/gotchas.d.ts +15 -0
  51. package/dist/tools/advise/gotchas.d.ts.map +1 -0
  52. package/dist/tools/advise/gotchas.js +83 -0
  53. package/dist/tools/advise/gotchas.js.map +1 -0
  54. package/dist/tools/advise.d.ts +96 -0
  55. package/dist/tools/advise.d.ts.map +1 -0
  56. package/dist/tools/advise.js +258 -0
  57. package/dist/tools/advise.js.map +1 -0
  58. package/dist/tools/authorize-batch.d.ts +35 -0
  59. package/dist/tools/authorize-batch.d.ts.map +1 -0
  60. package/dist/tools/authorize-batch.js +262 -0
  61. package/dist/tools/authorize-batch.js.map +1 -0
  62. package/dist/tools/authorize.d.ts +115 -0
  63. package/dist/tools/authorize.d.ts.map +1 -0
  64. package/dist/tools/authorize.js +373 -0
  65. package/dist/tools/authorize.js.map +1 -0
  66. package/dist/tools/check-change.d.ts +19 -0
  67. package/dist/tools/check-change.d.ts.map +1 -0
  68. package/dist/tools/check-change.js +91 -0
  69. package/dist/tools/check-change.js.map +1 -0
  70. package/dist/tools/diff-schema.d.ts +103 -0
  71. package/dist/tools/diff-schema.d.ts.map +1 -0
  72. package/dist/tools/diff-schema.js +379 -0
  73. package/dist/tools/diff-schema.js.map +1 -0
  74. package/dist/tools/diff-stores.d.ts +45 -0
  75. package/dist/tools/diff-stores.d.ts.map +1 -0
  76. package/dist/tools/diff-stores.js +222 -0
  77. package/dist/tools/diff-stores.js.map +1 -0
  78. package/dist/tools/explain.d.ts +80 -0
  79. package/dist/tools/explain.d.ts.map +1 -0
  80. package/dist/tools/explain.js +187 -0
  81. package/dist/tools/explain.js.map +1 -0
  82. package/dist/tools/format.d.ts +11 -0
  83. package/dist/tools/format.d.ts.map +1 -0
  84. package/dist/tools/format.js +20 -0
  85. package/dist/tools/format.js.map +1 -0
  86. package/dist/tools/generate-sample.d.ts +28 -0
  87. package/dist/tools/generate-sample.d.ts.map +1 -0
  88. package/dist/tools/generate-sample.js +568 -0
  89. package/dist/tools/generate-sample.js.map +1 -0
  90. package/dist/tools/link-template.d.ts +17 -0
  91. package/dist/tools/link-template.d.ts.map +1 -0
  92. package/dist/tools/link-template.js +78 -0
  93. package/dist/tools/link-template.js.map +1 -0
  94. package/dist/tools/list-template-links.d.ts +16 -0
  95. package/dist/tools/list-template-links.d.ts.map +1 -0
  96. package/dist/tools/list-template-links.js +22 -0
  97. package/dist/tools/list-template-links.js.map +1 -0
  98. package/dist/tools/list-templates.d.ts +16 -0
  99. package/dist/tools/list-templates.d.ts.map +1 -0
  100. package/dist/tools/list-templates.js +36 -0
  101. package/dist/tools/list-templates.js.map +1 -0
  102. package/dist/tools/translate.d.ts +11 -0
  103. package/dist/tools/translate.d.ts.map +1 -0
  104. package/dist/tools/translate.js +53 -0
  105. package/dist/tools/translate.js.map +1 -0
  106. package/dist/tools/validate-entities.d.ts +19 -0
  107. package/dist/tools/validate-entities.d.ts.map +1 -0
  108. package/dist/tools/validate-entities.js +88 -0
  109. package/dist/tools/validate-entities.js.map +1 -0
  110. package/dist/tools/validate-schema.d.ts +22 -0
  111. package/dist/tools/validate-schema.d.ts.map +1 -0
  112. package/dist/tools/validate-schema.js +89 -0
  113. package/dist/tools/validate-schema.js.map +1 -0
  114. package/dist/tools/validate-template.d.ts +18 -0
  115. package/dist/tools/validate-template.d.ts.map +1 -0
  116. package/dist/tools/validate-template.js +59 -0
  117. package/dist/tools/validate-template.js.map +1 -0
  118. package/dist/tools/validate.d.ts +90 -0
  119. package/dist/tools/validate.d.ts.map +1 -0
  120. package/dist/tools/validate.js +351 -0
  121. package/dist/tools/validate.js.map +1 -0
  122. package/dist/utils/format-detector.d.ts +49 -0
  123. package/dist/utils/format-detector.d.ts.map +1 -0
  124. package/dist/utils/format-detector.js +298 -0
  125. package/dist/utils/format-detector.js.map +1 -0
  126. package/examples/README.md +36 -0
  127. package/examples/abac-multi-tenant/README.md +150 -0
  128. package/examples/abac-multi-tenant/entities/users-and-docs.json +33 -0
  129. package/examples/abac-multi-tenant/policies/member-read-internal.cedar +9 -0
  130. package/examples/abac-multi-tenant/policies/owner-full-access.cedar +9 -0
  131. package/examples/abac-multi-tenant/policies/premium-share-guard.cedar +9 -0
  132. package/examples/abac-multi-tenant/policies/private-doc-guard.cedar +13 -0
  133. package/examples/abac-multi-tenant/run.ts +92 -0
  134. package/examples/abac-multi-tenant/schema.json +60 -0
  135. package/examples/api-gateway-path-routing/README.md +154 -0
  136. package/examples/api-gateway-path-routing/entities/users-and-roles.json +20 -0
  137. package/examples/api-gateway-path-routing/policies/admin-full-access.cedar +6 -0
  138. package/examples/api-gateway-path-routing/policies/developer-projects.cedar +14 -0
  139. package/examples/api-gateway-path-routing/policies/viewer-readonly.cedar +10 -0
  140. package/examples/api-gateway-path-routing/run.ts +108 -0
  141. package/examples/api-gateway-path-routing/schema.json +54 -0
  142. package/examples/rbac-document-management/README.md +167 -0
  143. package/examples/rbac-document-management/entities/users-and-docs.json +43 -0
  144. package/examples/rbac-document-management/policies/admin.cedar +6 -0
  145. package/examples/rbac-document-management/policies/editor.cedar +6 -0
  146. package/examples/rbac-document-management/policies/top-secret-forbid.cedar +13 -0
  147. package/examples/rbac-document-management/policies/viewer.cedar +6 -0
  148. package/examples/rbac-document-management/run.ts +87 -0
  149. package/examples/rbac-document-management/schema.json +57 -0
  150. package/package.json +50 -0
  151. package/src/http-server.ts +239 -0
  152. package/src/index.ts +294 -0
  153. package/src/parser/policy-ast.ts +345 -0
  154. package/src/prompts/README.md +3 -0
  155. package/src/prompts/index.ts +217 -0
  156. package/src/resources/ref-resolver.ts +134 -0
  157. package/src/resources/store-manager.ts +248 -0
  158. package/src/server.ts +711 -0
  159. package/src/tools/advise/avp-rules.ts +70 -0
  160. package/src/tools/advise/cedar-patterns.ts +73 -0
  161. package/src/tools/advise/context-builder.ts +109 -0
  162. package/src/tools/advise/gotchas.ts +92 -0
  163. package/src/tools/advise.ts +366 -0
  164. package/src/tools/authorize-batch.ts +345 -0
  165. package/src/tools/authorize.ts +464 -0
  166. package/src/tools/check-change.ts +119 -0
  167. package/src/tools/diff-schema.ts +510 -0
  168. package/src/tools/diff-stores.ts +298 -0
  169. package/src/tools/explain.ts +278 -0
  170. package/src/tools/format.ts +33 -0
  171. package/src/tools/generate-sample.ts +665 -0
  172. package/src/tools/link-template.ts +109 -0
  173. package/src/tools/list-template-links.ts +41 -0
  174. package/src/tools/list-templates.ts +55 -0
  175. package/src/tools/translate.ts +66 -0
  176. package/src/tools/validate-entities.ts +125 -0
  177. package/src/tools/validate-schema.ts +128 -0
  178. package/src/tools/validate-template.ts +72 -0
  179. package/src/tools/validate.ts +459 -0
  180. package/src/utils/format-detector.ts +356 -0
  181. package/test/fixtures/docmgmt.ts +121 -0
  182. package/test/fixtures/multitenant.ts +163 -0
  183. package/test/index.test.ts +96 -0
  184. package/test/integration/e2e/behavior.test.ts +359 -0
  185. package/test/integration/e2e/edge-cases.test.ts +365 -0
  186. package/test/integration/e2e/failure-modes.test.ts +266 -0
  187. package/test/integration/e2e/protocol.test.ts +252 -0
  188. package/test/integration/http-smoke.test.ts +588 -0
  189. package/test/integration/smoke.test.ts +475 -0
  190. package/test/prompts/prompts.test.ts +173 -0
  191. package/test/property/properties.test.ts +234 -0
  192. package/test/resources/ref-resolver.test.ts +186 -0
  193. package/test/resources/store-manager.test.ts +344 -0
  194. package/test/setup.test.ts +7 -0
  195. package/test/tools/advise/avp-rules.test.ts +76 -0
  196. package/test/tools/advise.test.ts +339 -0
  197. package/test/tools/authorize-batch.test.ts +459 -0
  198. package/test/tools/authorize.test.ts +682 -0
  199. package/test/tools/check-change.test.ts +104 -0
  200. package/test/tools/cross-fixture.test.ts +170 -0
  201. package/test/tools/diff-schema.test.ts +355 -0
  202. package/test/tools/diff-stores.test.ts +291 -0
  203. package/test/tools/explain.test.ts +221 -0
  204. package/test/tools/format.test.ts +33 -0
  205. package/test/tools/generate-sample.test.ts +480 -0
  206. package/test/tools/link-template.test.ts +90 -0
  207. package/test/tools/list-templates.test.ts +151 -0
  208. package/test/tools/translate.test.ts +89 -0
  209. package/test/tools/validate-entities.test.ts +178 -0
  210. package/test/tools/validate-schema.test.ts +86 -0
  211. package/test/tools/validate-template.test.ts +89 -0
  212. package/test/tools/validate.test.ts +331 -0
  213. package/test/utils/format-detector.test.ts +518 -0
  214. package/tsconfig.json +17 -0
  215. package/vitest.config.ts +13 -0
@@ -0,0 +1,222 @@
1
+ import { isAuthorized } from "@cedar-policy/cedar-wasm/nodejs";
2
+ import { handleCheckChange } from "./check-change.js";
3
+ import { handleDiffSchema } from "./diff-schema.js";
4
+ import { normalizePrincipalRef } from "../utils/format-detector.js";
5
+ export async function handleDiffStores(input, manager) {
6
+ // Validate stores exist
7
+ try {
8
+ manager.requireStore(input.blue);
9
+ }
10
+ catch (e) {
11
+ return errorResult(input.blue, input.green, e instanceof Error ? e.message : String(e));
12
+ }
13
+ try {
14
+ manager.requireStore(input.green);
15
+ }
16
+ catch (e) {
17
+ return errorResult(input.blue, input.green, e instanceof Error ? e.message : String(e));
18
+ }
19
+ const bluePolicies = new Map();
20
+ const greenPolicies = new Map();
21
+ for (const id of manager.listPolicies(input.blue)) {
22
+ bluePolicies.set(id, manager.readPolicy(input.blue, id));
23
+ }
24
+ for (const id of manager.listPolicies(input.green)) {
25
+ greenPolicies.set(id, manager.readPolicy(input.green, id));
26
+ }
27
+ // Structural diff
28
+ const policies_added = [];
29
+ const policies_removed = [];
30
+ const policies_modified = [];
31
+ for (const [id, content] of greenPolicies) {
32
+ if (!bluePolicies.has(id)) {
33
+ policies_added.push({ policy_id: id, content });
34
+ }
35
+ }
36
+ for (const [id, content] of bluePolicies) {
37
+ if (!greenPolicies.has(id)) {
38
+ policies_removed.push({ policy_id: id, content });
39
+ }
40
+ else {
41
+ const blueContent = content;
42
+ const greenContent = greenPolicies.get(id);
43
+ if (blueContent.trim() !== greenContent.trim()) {
44
+ // Reuse check-change logic for AVP immutability classification
45
+ const changeResult = await handleCheckChange({
46
+ old_policy: blueContent,
47
+ new_policy: greenContent,
48
+ });
49
+ if (changeResult.error) {
50
+ // Parse error on one or both sides — report as modified with error context
51
+ policies_modified.push({
52
+ policy_id: id,
53
+ can_update_in_place: false,
54
+ changes: [],
55
+ recommendation: `Could not diff policy "${id}": ${changeResult.error}`,
56
+ });
57
+ }
58
+ else if (changeResult.changes.length > 0) {
59
+ policies_modified.push({
60
+ policy_id: id,
61
+ can_update_in_place: changeResult.can_update_in_place,
62
+ changes: changeResult.changes.map((c) => ({
63
+ field: c.field,
64
+ in_place_allowed: c.in_place_allowed,
65
+ reason: c.reason,
66
+ })),
67
+ recommendation: changeResult.recommendation,
68
+ });
69
+ }
70
+ // If changes.length === 0 and no error: policies differ in text but not semantically
71
+ // (formatting change). Treat as unchanged — no entry in policies_modified.
72
+ }
73
+ }
74
+ }
75
+ // Schema diff — structured via handleDiffSchema
76
+ let schema_diff;
77
+ try {
78
+ const blueSchema = manager.readSchema(input.blue);
79
+ const greenSchema = manager.readSchema(input.green);
80
+ schema_diff = await handleDiffSchema({ blue: blueSchema, green: greenSchema });
81
+ }
82
+ catch (e) {
83
+ schema_diff = emptySchemaDiff(`Schema comparison failed: ${e instanceof Error ? e.message : String(e)}`);
84
+ }
85
+ // Behavioral diff (optional)
86
+ let behavioral_diff;
87
+ if (input.behavioral_test_requests) {
88
+ behavioral_diff = await runBehavioralDiff(input.blue, input.green, input.behavioral_test_requests, manager);
89
+ }
90
+ // Summary
91
+ const totalChanges = policies_added.length + policies_removed.length + policies_modified.length;
92
+ const requiresRecreate = policies_modified.filter((p) => !p.can_update_in_place).length;
93
+ const driftCount = behavioral_diff?.filter((d) => d.drifted).length ?? 0;
94
+ const schema_changed = hasSchemaChanges(schema_diff);
95
+ const schemaBreaking = schema_diff.risk_level === "breaking";
96
+ let summary;
97
+ if (totalChanges === 0 && !schema_changed) {
98
+ summary = "No changes detected between blue and green stores.";
99
+ }
100
+ else {
101
+ const parts = [];
102
+ if (policies_added.length)
103
+ parts.push(`${policies_added.length} added`);
104
+ if (policies_removed.length)
105
+ parts.push(`${policies_removed.length} removed`);
106
+ if (policies_modified.length) {
107
+ parts.push(`${policies_modified.length} modified`);
108
+ if (requiresRecreate)
109
+ parts.push(`(${requiresRecreate} require delete-recreate in AVP)`);
110
+ }
111
+ if (schema_changed) {
112
+ parts.push(schemaBreaking ? "schema changed (BREAKING)" : "schema changed");
113
+ }
114
+ if (driftCount)
115
+ parts.push(`${driftCount} authorization decision(s) would change`);
116
+ summary = `Policy diff: ${parts.join(", ")}.`;
117
+ }
118
+ return {
119
+ blue: input.blue,
120
+ green: input.green,
121
+ policies_added,
122
+ policies_removed,
123
+ policies_modified,
124
+ schema_diff,
125
+ ...(behavioral_diff !== undefined ? { behavioral_diff } : {}),
126
+ summary,
127
+ };
128
+ }
129
+ function hasSchemaChanges(d) {
130
+ return (d.namespaces_added.length > 0 ||
131
+ d.namespaces_removed.length > 0 ||
132
+ d.entity_types.added.length > 0 ||
133
+ d.entity_types.removed.length > 0 ||
134
+ d.entity_types.modified.length > 0 ||
135
+ d.actions.added.length > 0 ||
136
+ d.actions.removed.length > 0 ||
137
+ d.actions.modified.length > 0 ||
138
+ d.common_types.added.length > 0 ||
139
+ d.common_types.removed.length > 0 ||
140
+ d.common_types.modified.length > 0);
141
+ }
142
+ function emptySchemaDiff(error) {
143
+ return {
144
+ namespaces_added: [],
145
+ namespaces_removed: [],
146
+ entity_types: { added: [], removed: [], modified: [] },
147
+ actions: { added: [], removed: [], modified: [] },
148
+ common_types: { added: [], removed: [], modified: [] },
149
+ summary: "",
150
+ risk_level: "safe",
151
+ ...(error ? { error } : {}),
152
+ };
153
+ }
154
+ async function runBehavioralDiff(blue, green, requestsJson, manager) {
155
+ let requests;
156
+ try {
157
+ requests = JSON.parse(requestsJson);
158
+ if (!Array.isArray(requests))
159
+ return [{ principal: "", action: "", resource: "", blue_decision: "Deny", green_decision: "Deny", drifted: false }];
160
+ }
161
+ catch {
162
+ return [];
163
+ }
164
+ const bluePolicies = manager.readAllPolicies(blue);
165
+ const greenPolicies = manager.readAllPolicies(green);
166
+ const entries = [];
167
+ for (const req of requests) {
168
+ const principalRef = normalizePrincipalRef(req.principal);
169
+ const actionRef = normalizePrincipalRef(req.action);
170
+ const resourceRef = normalizePrincipalRef(req.resource);
171
+ const refError = ("error" in principalRef ? principalRef.error : null) ??
172
+ ("error" in actionRef ? actionRef.error : null) ??
173
+ ("error" in resourceRef ? resourceRef.error : null);
174
+ const principalStr = typeof req.principal === "string" ? req.principal : JSON.stringify(req.principal);
175
+ const actionStr = typeof req.action === "string" ? req.action : JSON.stringify(req.action);
176
+ const resourceStr = typeof req.resource === "string" ? req.resource : JSON.stringify(req.resource);
177
+ if (refError) {
178
+ entries.push({ principal: principalStr, action: actionStr, resource: resourceStr, blue_decision: "Error", green_decision: "Error", drifted: false, error: refError });
179
+ continue;
180
+ }
181
+ let entities;
182
+ try {
183
+ entities = JSON.parse(req.entities);
184
+ }
185
+ catch {
186
+ entries.push({ principal: principalStr, action: actionStr, resource: resourceStr, blue_decision: "Error", green_decision: "Error", drifted: false, error: "Invalid entities JSON" });
187
+ continue;
188
+ }
189
+ // After the refError guard above, refs are guaranteed to be NormalizedRef (no error field)
190
+ const safeP = principalRef;
191
+ const safeA = actionRef;
192
+ const safeR = resourceRef;
193
+ const context = {};
194
+ const callBase = { principal: safeP, action: safeA, resource: safeR, context, entities };
195
+ const blueAnswer = isAuthorized({ ...callBase, policies: { staticPolicies: bluePolicies } });
196
+ const greenAnswer = isAuthorized({ ...callBase, policies: { staticPolicies: greenPolicies } });
197
+ const blueDecision = blueAnswer.type === "success" && blueAnswer.response.decision === "allow" ? "Allow" : "Deny";
198
+ const greenDecision = greenAnswer.type === "success" && greenAnswer.response.decision === "allow" ? "Allow" : "Deny";
199
+ entries.push({
200
+ principal: principalStr,
201
+ action: actionStr,
202
+ resource: resourceStr,
203
+ blue_decision: blueDecision,
204
+ green_decision: greenDecision,
205
+ drifted: blueDecision !== greenDecision,
206
+ });
207
+ }
208
+ return entries;
209
+ }
210
+ function errorResult(blue, green, error) {
211
+ return {
212
+ blue,
213
+ green,
214
+ policies_added: [],
215
+ policies_removed: [],
216
+ policies_modified: [],
217
+ schema_diff: emptySchemaDiff(),
218
+ summary: "",
219
+ error,
220
+ };
221
+ }
222
+ //# sourceMappingURL=diff-stores.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-stores.js","sourceRoot":"","sources":["../../src/tools/diff-stores.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ export interface ExplainInput {
2
+ policy: string;
3
+ schema?: string;
4
+ }
5
+ export interface ScopeDescription {
6
+ scope: string;
7
+ description: string;
8
+ }
9
+ export interface ConditionDescription {
10
+ kind: "when" | "unless";
11
+ text: string;
12
+ }
13
+ export interface ExplainResult {
14
+ effect: "permit" | "forbid";
15
+ principal: ScopeDescription;
16
+ action: ScopeDescription;
17
+ resource: ScopeDescription;
18
+ conditions: ConditionDescription[];
19
+ summary: string;
20
+ patterns_detected: string[];
21
+ error?: string;
22
+ /**
23
+ * 10d workspace auto-discovery: populated by the server.ts MCP handler when
24
+ * the schema was resolved from a loaded MCP root rather than supplied inline.
25
+ * On ExplainManyResult the field appears on the top-level result so a single
26
+ * auto-discovery decision applies to the whole policy set.
27
+ */
28
+ auto_discovered?: {
29
+ schema_from?: string;
30
+ };
31
+ }
32
+ export declare function handleExplain(input: ExplainInput): Promise<ExplainResult>;
33
+ export interface ExplainManyResult {
34
+ policy_count: number;
35
+ policies: Array<ExplainResult & {
36
+ index: number;
37
+ }>;
38
+ /**
39
+ * 10d workspace auto-discovery: see ExplainResult.auto_discovered. On the
40
+ * many-result the field lives at the top level so the auto-discovered schema
41
+ * is reported once rather than duplicated on every policy entry.
42
+ */
43
+ auto_discovered?: {
44
+ schema_from?: string;
45
+ };
46
+ }
47
+ /**
48
+ * Explains a Cedar policy set (one or more policies).
49
+ * Uses policySetTextToParts to split, then explains each individually.
50
+ * Falls back to single-policy handling when there is exactly one policy.
51
+ */
52
+ export declare function handleExplainMany(input: ExplainInput): Promise<ExplainManyResult | ExplainResult>;
53
+ /**
54
+ * Inputs accepted by the MCP-level explain entry point. Wider than
55
+ * `ExplainInput` because it also accepts the `_ref` shape the MCP layer
56
+ * resolves before reaching `handleExplainMany`.
57
+ */
58
+ export interface ExplainMcpInput {
59
+ policy: string;
60
+ schema?: string;
61
+ schema_ref?: string;
62
+ store?: string;
63
+ }
64
+ /**
65
+ * 10d workspace auto-discovery wrapper for `cedar_explain`. Resolves the
66
+ * schema from a loaded MCP root when neither `schema` nor `schema_ref` was
67
+ * supplied. The schema is optional for explain, so single-store deployments
68
+ * with no schema file just delegate to the parser without one. Multi-store
69
+ * deployments with no explicit `store` parameter return an ambiguity error.
70
+ */
71
+ export declare function handleExplainMcp(input: ExplainMcpInput, resolveRef: (uri: string) => {
72
+ content: string;
73
+ } | {
74
+ error: string;
75
+ }): Promise<{
76
+ result: ExplainResult | ExplainManyResult;
77
+ } | {
78
+ error: string;
79
+ }>;
80
+ //# sourceMappingURL=explain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.d.ts","sourceRoot":"","sources":["../../src/tools/explain.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,MAAM,EAAE,gBAAgB,CAAC;IACzB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,eAAe,CAAC,EAAE;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAoDD,wBAAsB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CA4E/E;AAID,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,KAAK,CAAC,aAAa,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD;;;;OAIG;IACH,eAAe,CAAC,EAAE;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,GAAG,aAAa,CAAC,CAoBvG;AAID;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACnE,OAAO,CAAC;IAAE,MAAM,EAAE,aAAa,GAAG,iBAAiB,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAqC5E"}
@@ -0,0 +1,187 @@
1
+ import { policyToJson, templateToJson, policySetTextToParts } from "@cedar-policy/cedar-wasm/nodejs";
2
+ import { describePrincipal, describeAction, describeResource, describeCondition, detectPatterns, } from "../parser/policy-ast.js";
3
+ import { storeManager } from "../resources/store-manager.js";
4
+ function parsePolicyJson(policyText) {
5
+ const result = policyToJson(policyText);
6
+ if (result.type === "success")
7
+ return result.json;
8
+ const errors = result.errors.map((e) => e.message).join("; ");
9
+ // Fall back to templateToJson if the error is about template slots
10
+ if (errors.includes("template") || errors.includes("slot")) {
11
+ const templateResult = templateToJson(policyText);
12
+ if (templateResult.type === "success")
13
+ return templateResult.json;
14
+ throw new Error(templateResult.errors.map((e) => e.message).join("; "));
15
+ }
16
+ throw new Error(errors);
17
+ }
18
+ function buildSummary(json, principalDesc, actionDesc, resourceDesc, conditions, isTemplate) {
19
+ const effect = json.effect === "permit" ? "PERMITS" : "FORBIDS";
20
+ const base = `${effect} ${principalDesc} to perform ${actionDesc} on ${resourceDesc}`;
21
+ if (isTemplate) {
22
+ const slots = [
23
+ json.principal.op === "==" && "slot" in json.principal ? `?principal` : null,
24
+ json.resource.op === "==" && "slot" in json.resource ? `?resource` : null,
25
+ ].filter(Boolean);
26
+ return `TEMPLATE POLICY: ${base}. Template slots: ${slots.join(", ")}.`;
27
+ }
28
+ if (conditions.length === 0)
29
+ return `${base}.`;
30
+ const whenClauses = conditions
31
+ .filter((c) => c.kind === "when")
32
+ .map((c) => c.text.replace(/^WHEN /, ""));
33
+ const unlessClauses = conditions
34
+ .filter((c) => c.kind === "unless")
35
+ .map((c) => c.text.replace(/^UNLESS /, ""));
36
+ let summary = base;
37
+ if (whenClauses.length > 0)
38
+ summary += `, when: ${whenClauses.join("; ")}`;
39
+ if (unlessClauses.length > 0)
40
+ summary += `, unless: ${unlessClauses.join("; ")}`;
41
+ return summary + ".";
42
+ }
43
+ export async function handleExplain(input) {
44
+ let json;
45
+ let isTemplate = false;
46
+ try {
47
+ const raw = policyToJson(input.policy);
48
+ if (raw.type === "failure") {
49
+ const errors = raw.errors.map((e) => e.message).join("; ");
50
+ if (errors.includes("template") || errors.includes("slot")) {
51
+ const templateResult = templateToJson(input.policy);
52
+ if (templateResult.type === "failure") {
53
+ return {
54
+ effect: "permit",
55
+ principal: { scope: "unknown", description: "unknown" },
56
+ action: { scope: "unknown", description: "unknown" },
57
+ resource: { scope: "unknown", description: "unknown" },
58
+ conditions: [],
59
+ summary: "Failed to parse policy.",
60
+ patterns_detected: [],
61
+ error: templateResult.errors.map((e) => e.message).join("; "),
62
+ };
63
+ }
64
+ json = templateResult.json;
65
+ isTemplate = true;
66
+ }
67
+ else {
68
+ return {
69
+ effect: "permit",
70
+ principal: { scope: "unknown", description: "unknown" },
71
+ action: { scope: "unknown", description: "unknown" },
72
+ resource: { scope: "unknown", description: "unknown" },
73
+ conditions: [],
74
+ summary: "Failed to parse policy.",
75
+ patterns_detected: [],
76
+ error: errors,
77
+ };
78
+ }
79
+ }
80
+ else {
81
+ json = raw.json;
82
+ }
83
+ }
84
+ catch (e) {
85
+ const msg = e instanceof Error ? e.message : String(e);
86
+ return {
87
+ effect: "permit",
88
+ principal: { scope: "unknown", description: "unknown" },
89
+ action: { scope: "unknown", description: "unknown" },
90
+ resource: { scope: "unknown", description: "unknown" },
91
+ conditions: [],
92
+ summary: "Failed to parse policy.",
93
+ patterns_detected: [],
94
+ error: msg,
95
+ };
96
+ }
97
+ const principalDesc = describePrincipal(json.principal);
98
+ const actionDesc = describeAction(json.action);
99
+ const resourceDesc = describeResource(json.resource);
100
+ const conditions = json.conditions.map((c) => ({
101
+ kind: c.kind,
102
+ text: describeCondition(c),
103
+ }));
104
+ const patterns = detectPatterns(json);
105
+ if (isTemplate && !patterns.includes("template_policy"))
106
+ patterns.unshift("template_policy");
107
+ const summary = buildSummary(json, principalDesc, actionDesc, resourceDesc, conditions, isTemplate);
108
+ return {
109
+ effect: json.effect,
110
+ principal: { scope: json.principal.op, description: principalDesc },
111
+ action: { scope: json.action.op, description: actionDesc },
112
+ resource: { scope: json.resource.op, description: resourceDesc },
113
+ conditions,
114
+ summary,
115
+ patterns_detected: patterns,
116
+ };
117
+ }
118
+ /**
119
+ * Explains a Cedar policy set (one or more policies).
120
+ * Uses policySetTextToParts to split, then explains each individually.
121
+ * Falls back to single-policy handling when there is exactly one policy.
122
+ */
123
+ export async function handleExplainMany(input) {
124
+ const parts = policySetTextToParts(input.policy);
125
+ // Single policy or unparseable — fall through to single-policy handler
126
+ if (parts.type === "failure" || (parts.policies.length + parts.policy_templates.length) <= 1) {
127
+ return handleExplain(input);
128
+ }
129
+ const allPolicies = [...parts.policies, ...parts.policy_templates];
130
+ const results = await Promise.all(allPolicies.map(async (policyText, i) => {
131
+ const result = await handleExplain({ policy: policyText, schema: input.schema });
132
+ return { ...result, index: i };
133
+ }));
134
+ return {
135
+ policy_count: allPolicies.length,
136
+ policies: results,
137
+ };
138
+ }
139
+ /**
140
+ * 10d workspace auto-discovery wrapper for `cedar_explain`. Resolves the
141
+ * schema from a loaded MCP root when neither `schema` nor `schema_ref` was
142
+ * supplied. The schema is optional for explain, so single-store deployments
143
+ * with no schema file just delegate to the parser without one. Multi-store
144
+ * deployments with no explicit `store` parameter return an ambiguity error.
145
+ */
146
+ export async function handleExplainMcp(input, resolveRef) {
147
+ let schema = input.schema;
148
+ if (!schema && input.schema_ref) {
149
+ const resolved = resolveRef(input.schema_ref);
150
+ if ("error" in resolved)
151
+ return { error: resolved.error };
152
+ schema = resolved.content;
153
+ }
154
+ let autoSchemaFrom;
155
+ if (!schema && !input.schema_ref) {
156
+ if (input.store) {
157
+ try {
158
+ schema = storeManager.readSchema(input.store);
159
+ autoSchemaFrom = input.store;
160
+ }
161
+ catch (e) {
162
+ return { error: e instanceof Error ? e.message : String(e) };
163
+ }
164
+ }
165
+ else {
166
+ const def = storeManager.getDefaultStore();
167
+ if (def.kind === "single") {
168
+ try {
169
+ schema = storeManager.readSchema(def.store.name);
170
+ autoSchemaFrom = def.store.name;
171
+ }
172
+ catch {
173
+ // Store has no schema file; explain runs without a schema.
174
+ }
175
+ }
176
+ else if (def.kind === "ambiguous") {
177
+ return { error: `Multiple stores are loaded (${def.names.join(", ")}). Pass store: "<name>" to choose.` };
178
+ }
179
+ }
180
+ }
181
+ const result = await handleExplainMany({ policy: input.policy, schema });
182
+ if (autoSchemaFrom) {
183
+ result.auto_discovered = { schema_from: autoSchemaFrom };
184
+ }
185
+ return { result };
186
+ }
187
+ //# sourceMappingURL=explain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.js","sourceRoot":"","sources":["../../src/tools/explain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACrG,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,GACf,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAqC7D,SAAS,eAAe,CAAC,UAAkB;IACzC,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IAElD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE9D,mEAAmE;IACnE,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,MAAM,cAAc,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,cAAc,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,cAAc,CAAC,IAA6B,CAAC;QAC3F,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,YAAY,CACnB,IAAgB,EAChB,aAAqB,EACrB,UAAkB,EAClB,YAAoB,EACpB,UAAkC,EAClC,UAAmB;IAEnB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,MAAM,IAAI,GAAG,GAAG,MAAM,IAAI,aAAa,eAAe,UAAU,OAAO,YAAY,EAAE,CAAC;IAEtF,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,KAAK,GAAG;YACZ,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI;YAC5E,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI;SAC1E,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClB,OAAO,oBAAoB,IAAI,qBAAqB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAC1E,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,IAAI,GAAG,CAAC;IAE/C,MAAM,WAAW,GAAG,UAAU;SAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;SAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,UAAU;SAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IAE9C,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,WAAW,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC3E,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,aAAa,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACjF,OAAO,OAAO,GAAG,GAAG,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAmB;IACrD,IAAI,IAAgB,CAAC;IACrB,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3D,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3D,MAAM,cAAc,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACpD,IAAI,cAAc,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBACtC,OAAO;wBACL,MAAM,EAAE,QAAQ;wBAChB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE;wBACvD,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE;wBACpD,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE;wBACtD,UAAU,EAAE,EAAE;wBACd,OAAO,EAAE,yBAAyB;wBAClC,iBAAiB,EAAE,EAAE;wBACrB,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;qBAC9D,CAAC;gBACJ,CAAC;gBACD,IAAI,GAAG,cAAc,CAAC,IAA6B,CAAC;gBACpD,UAAU,GAAG,IAAI,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,OAAO;oBACL,MAAM,EAAE,QAAQ;oBAChB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE;oBACvD,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE;oBACpD,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE;oBACtD,UAAU,EAAE,EAAE;oBACd,OAAO,EAAE,yBAAyB;oBAClC,iBAAiB,EAAE,EAAE;oBACrB,KAAK,EAAE,MAAM;iBACd,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE;YACvD,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE;YACpD,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE;YACtD,UAAU,EAAE,EAAE;YACd,OAAO,EAAE,yBAAyB;YAClC,iBAAiB,EAAE,EAAE;YACrB,KAAK,EAAE,GAAG;SACX,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAErD,MAAM,UAAU,GAA2B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC;KAC3B,CAAC,CAAC,CAAC;IAEJ,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,UAAU,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAAE,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAE7F,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAEpG,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE;QACnE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;QAC1D,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE;QAChE,UAAU;QACV,OAAO;QACP,iBAAiB,EAAE,QAAQ;KAC5B,CAAC;AACJ,CAAC;AAiBD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAmB;IACzD,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAEjD,uEAAuE;IACvE,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7F,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE;QACtC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACjF,OAAO,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACjC,CAAC,CAAC,CACH,CAAC;IAEF,OAAO;QACL,YAAY,EAAE,WAAW,CAAC,MAAM;QAChC,QAAQ,EAAE,OAAO;KAClB,CAAC;AACJ,CAAC;AAgBD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAsB,EACtB,UAAoE;IAEpE,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC1B,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,OAAO,IAAI,QAAQ;YAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC1D,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC;IAC5B,CAAC;IAED,IAAI,cAAkC,CAAC;IACvC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC9C,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC;YAC/B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,EAAE,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,YAAY,CAAC,eAAe,EAAE,CAAC;YAC3C,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,IAAI,CAAC;oBACH,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACjD,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAClC,CAAC;gBAAC,MAAM,CAAC;oBACP,2DAA2D;gBAC7D,CAAC;YACH,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACpC,OAAO,EAAE,KAAK,EAAE,+BAA+B,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,oCAAoC,EAAE,CAAC;YAC5G,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACzE,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,CAAC,eAAe,GAAG,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;IAC3D,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface FormatInput {
2
+ policies: string;
3
+ line_width?: number;
4
+ indent_width?: number;
5
+ }
6
+ export interface FormatResult {
7
+ formatted: string | null;
8
+ error: string | null;
9
+ }
10
+ export declare function handleFormat(input: FormatInput): Promise<FormatResult>;
11
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/tools/format.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAmB5E"}
@@ -0,0 +1,20 @@
1
+ import { formatPolicies } from "@cedar-policy/cedar-wasm/nodejs";
2
+ export async function handleFormat(input) {
3
+ // per spike-report-wasm-api.md §3: formatPolicies takes FormattingCall object, not raw string
4
+ const answer = formatPolicies({
5
+ policyText: input.policies,
6
+ ...(input.line_width !== undefined ? { lineWidth: input.line_width } : {}),
7
+ ...(input.indent_width !== undefined ? { indentWidth: input.indent_width } : {}),
8
+ });
9
+ if (answer.type === "failure") {
10
+ return {
11
+ formatted: null,
12
+ error: answer.errors.map((e) => e.message).join("; "),
13
+ };
14
+ }
15
+ return {
16
+ formatted: answer.formatted_policy,
17
+ error: null,
18
+ };
19
+ }
20
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/tools/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAajE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAkB;IACnD,8FAA8F;IAC9F,MAAM,MAAM,GAAG,cAAc,CAAC;QAC5B,UAAU,EAAE,KAAK,CAAC,QAAQ;QAC1B,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,GAAG,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjF,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO;YACL,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SACtD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,gBAAgB;QAClC,KAAK,EAAE,IAAI;KACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ export interface GenerateSampleInput {
2
+ policy: string;
3
+ schema: string;
4
+ target_decision: "allow" | "deny";
5
+ }
6
+ export interface EntityPayload {
7
+ uid: {
8
+ type: string;
9
+ id: string;
10
+ };
11
+ attrs: Record<string, unknown>;
12
+ parents: Array<{
13
+ type: string;
14
+ id: string;
15
+ }>;
16
+ }
17
+ export interface GenerateSampleResult {
18
+ principal: string;
19
+ action: string;
20
+ resource: string;
21
+ entities: EntityPayload[];
22
+ explanation: string;
23
+ decision?: "Allow" | "Deny";
24
+ ready_to_test?: boolean;
25
+ error?: string;
26
+ }
27
+ export declare function handleGenerateSample(input: GenerateSampleInput): Promise<GenerateSampleResult>;
28
+ //# sourceMappingURL=generate-sample.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-sample.d.ts","sourceRoot":"","sources":["../../src/tools/generate-sample.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,OAAO,GAAG,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAifD,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAsIpG"}