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,568 @@
1
+ import { policyToJson, isAuthorized, schemaToJsonWithResolvedTypes, } from "@cedar-policy/cedar-wasm/nodejs";
2
+ import { extractLikeConstraints, patternToString, } from "../parser/policy-ast.js";
3
+ function extractConstraints(conditions) {
4
+ const constraints = [];
5
+ for (const clause of conditions) {
6
+ walkExpr(clause.body, clause.kind, constraints);
7
+ }
8
+ return constraints;
9
+ }
10
+ function walkExpr(expr, clauseKind, constraints) {
11
+ if (typeof expr !== "object" || expr === null)
12
+ return;
13
+ const e = expr;
14
+ // "like" is handled separately via extractLikeConstraints — skip here
15
+ if ("like" in e)
16
+ return;
17
+ if ("&&" in e || "||" in e) {
18
+ const key = "&&" in e ? "&&" : "||";
19
+ const node = e[key];
20
+ walkExpr(node.left, clauseKind, constraints);
21
+ walkExpr(node.right, clauseKind, constraints);
22
+ return;
23
+ }
24
+ // Equality: principal.attr == value or resource.attr == value
25
+ if ("==" in e) {
26
+ const node = e["=="];
27
+ const attr = extractAttrAccess(node.left);
28
+ if (attr && clauseKind === "when") {
29
+ const value = extractValue(node.right);
30
+ if (value !== undefined) {
31
+ constraints.push({ variable: attr.variable, attr: attr.attr, op: "eq", value });
32
+ }
33
+ }
34
+ return;
35
+ }
36
+ // Has (optional attribute guard): resource has attr
37
+ if ("has" in e) {
38
+ const node = e["has"];
39
+ const varName = extractVar(node.left);
40
+ if (varName && (varName === "principal" || varName === "resource")) {
41
+ if (clauseKind === "when") {
42
+ constraints.push({ variable: varName, attr: node.attr, op: "has" });
43
+ }
44
+ else {
45
+ constraints.push({ variable: varName, attr: node.attr, op: "not_has" });
46
+ }
47
+ }
48
+ return;
49
+ }
50
+ // in (set membership in condition body): { "in": { left: attrExpr, right: SetExpr } }
51
+ // e.g. resource.status in ["active", "pending"]
52
+ if ("in" in e && clauseKind === "when") {
53
+ const node = e["in"];
54
+ const attr = extractAttrAccess(node.left);
55
+ const right = node.right;
56
+ if (attr && "Set" in right) {
57
+ const values = right["Set"].map(extractValue).filter((v) => v !== undefined);
58
+ if (values.length > 0) {
59
+ constraints.push({ variable: attr.variable, attr: attr.attr, op: "contains", values });
60
+ }
61
+ }
62
+ return;
63
+ }
64
+ // contains(): { "contains": { "left": setExpr, "right": attrExpr } }
65
+ // e.g. ["active", "pending"].contains(resource.status)
66
+ if ("contains" in e && !Array.isArray(e["contains"]) && typeof e["contains"] === "object") {
67
+ const node = e["contains"];
68
+ const setExpr = node.left;
69
+ const attrExpr = node.right;
70
+ if ("Set" in setExpr && clauseKind === "when") {
71
+ const attr = extractAttrAccess(attrExpr);
72
+ const values = setExpr["Set"].map(extractValue).filter((v) => v !== undefined);
73
+ if (attr && values.length > 0) {
74
+ constraints.push({ variable: attr.variable, attr: attr.attr, op: "contains", values });
75
+ }
76
+ }
77
+ return;
78
+ }
79
+ }
80
+ function extractAttrAccess(expr) {
81
+ if (typeof expr !== "object" || expr === null)
82
+ return null;
83
+ const e = expr;
84
+ if ("." in e) {
85
+ const node = e["."];
86
+ const varName = extractVar(node.left);
87
+ if (varName === "principal" || varName === "resource" || varName === "context") {
88
+ return { variable: varName, attr: node.attr };
89
+ }
90
+ }
91
+ return null;
92
+ }
93
+ function extractVar(expr) {
94
+ if (typeof expr === "object" && expr !== null && "Var" in expr) {
95
+ return expr["Var"] ?? null;
96
+ }
97
+ return null;
98
+ }
99
+ function extractValue(expr) {
100
+ if (typeof expr !== "object" || expr === null)
101
+ return undefined;
102
+ const e = expr;
103
+ if ("Value" in e) {
104
+ const v = e["Value"];
105
+ if (v !== null && typeof v === "object" && "__entity" in v) {
106
+ return undefined; // entity reference — skip for simple attr matching
107
+ }
108
+ return v;
109
+ }
110
+ return undefined;
111
+ }
112
+ /**
113
+ * Returns required attributes for an entity type from the (resolved) schema JSON.
114
+ * Only includes `required: true` attributes — optional ones are omitted unless
115
+ * the policy conditions explicitly reference them.
116
+ * Returns a map of attrName → default value based on Cedar type.
117
+ */
118
+ function requiredAttrsFromSchema(schemaJson, namespace, entityTypeName) {
119
+ try {
120
+ const ns = schemaJson?.[namespace];
121
+ const entityTypes = ns?.["entityTypes"];
122
+ // entityTypeName may be fully-qualified "Ns::Type" or just "Type"
123
+ const simpleTypeName = entityTypeName.includes("::")
124
+ ? entityTypeName.split("::").pop()
125
+ : entityTypeName;
126
+ const entityDef = entityTypes?.[simpleTypeName];
127
+ const shape = entityDef?.["shape"];
128
+ const attributes = shape?.["attributes"];
129
+ if (!attributes)
130
+ return {};
131
+ const defaults = {};
132
+ for (const [attrName, attrDef] of Object.entries(attributes)) {
133
+ // Cedar JSON-schema default for `required` is true (per the official
134
+ // spec); only attributes with an explicit `required: false` are optional.
135
+ // The old `!== true` check skipped attributes when the JSON omitted the
136
+ // flag entirely, which is the shape `schemaToJsonWithResolvedTypes`
137
+ // emits for cedarschema-text input like `entity User { name: String }`.
138
+ // Empty-attrs entities then failed `validateRequest` once the schema
139
+ // was supplied to the internal verification call (kickoff-14 14d audit
140
+ // Finding F3 follow-on).
141
+ if (attrDef["required"] === false)
142
+ continue;
143
+ const typeName = attrDef["type"]?.toLowerCase() ?? "";
144
+ if (typeName === "string")
145
+ defaults[attrName] = "";
146
+ else if (typeName === "long")
147
+ defaults[attrName] = 0;
148
+ else if (typeName === "boolean")
149
+ defaults[attrName] = false;
150
+ // Records, Sets, extension types: leave to the caller to set meaningfully
151
+ }
152
+ return defaults;
153
+ }
154
+ catch {
155
+ return {};
156
+ }
157
+ }
158
+ /**
159
+ * Qualify a bare entity-type name with the schema's namespace. If the name
160
+ * already carries a `::` separator (which `schemaToJsonWithResolvedTypes`
161
+ * emits for entries declared inside `namespace X { ... }` cedarschema text),
162
+ * return it verbatim — re-prefixing produces `MyApp::MyApp::User` style
163
+ * double-namespace artifacts (kickoff-14 14b).
164
+ */
165
+ function qualifyEntityType(typeName, namespace) {
166
+ if (typeName.includes("::"))
167
+ return typeName;
168
+ return namespace ? `${namespace}::${typeName}` : typeName;
169
+ }
170
+ function entityTypesFromSchema(schemaJson, namespace, actionId) {
171
+ try {
172
+ const ns = schemaJson?.[namespace];
173
+ const actions = ns?.["actions"];
174
+ const actionKey = actionId ? actions?.[actionId] : Object.values(actions ?? {})[0];
175
+ const appliesTo = actionKey?.["appliesTo"];
176
+ const principalTypes = appliesTo?.["principalTypes"];
177
+ const resourceTypes = appliesTo?.["resourceTypes"];
178
+ return {
179
+ principalType: principalTypes?.[0] ? qualifyEntityType(principalTypes[0], namespace) : qualifyEntityType("User", namespace),
180
+ resourceType: resourceTypes?.[0] ? qualifyEntityType(resourceTypes[0], namespace) : qualifyEntityType("Resource", namespace),
181
+ };
182
+ }
183
+ catch {
184
+ return { principalType: qualifyEntityType("User", namespace), resourceType: qualifyEntityType("Resource", namespace) };
185
+ }
186
+ }
187
+ function extractScope(json, schemaNamespace, schemaJson) {
188
+ // qualifyEntityType handles the empty-namespace case (Cedar's "" namespace
189
+ // for namespaceless schemas) by returning bare "Action" instead of "::Action".
190
+ const actionType = qualifyEntityType("Action", schemaNamespace);
191
+ let actionId;
192
+ let principalRoleType;
193
+ let principalRoleId;
194
+ // Direct principal/resource type pins (from `principal == Type::"id"` /
195
+ // `resource == Type::"id"`). When present, these override the
196
+ // schema-derived defaults so the generated request matches what the
197
+ // policy explicitly scoped to.
198
+ let pinnedPrincipalType;
199
+ let pinnedResourceType;
200
+ // Extract action from scope
201
+ if (json.action.op === "==") {
202
+ const e = "entity" in json.action ? json.action["entity"] : null;
203
+ if (e)
204
+ actionId = e.id;
205
+ }
206
+ else if (json.action.op === "in") {
207
+ const entities = "entities" in json.action
208
+ ? json.action["entities"]
209
+ : "entity" in json.action
210
+ ? [json.action["entity"]]
211
+ : [];
212
+ if (entities[0])
213
+ actionId = entities[0].id;
214
+ }
215
+ // Extract principal from scope.
216
+ //
217
+ // `op === "in"` is the role-membership pattern: principal in Role::"X".
218
+ // We record principalRoleType + principalRoleId so the entity builder
219
+ // can attach the role as a parent.
220
+ //
221
+ // `op === "=="` is the direct pin: principal == User::"alice".
222
+ // The principal type itself is information the generator needs (it
223
+ // tells us which entity type to instantiate). Without this, the
224
+ // generator fell back to schema-derived defaults that didn't always
225
+ // match the policy's principal pin — caught by a regression test on
226
+ // defaultActionIdFromSchema when the schema's first action's
227
+ // appliesTo.principalTypes disagreed with the policy's pinned type.
228
+ if (json.principal.op === "in") {
229
+ const e = "entity" in json.principal ? json.principal["entity"] : null;
230
+ if (e) {
231
+ principalRoleType = e.type;
232
+ principalRoleId = e.id;
233
+ }
234
+ }
235
+ else if (json.principal.op === "==") {
236
+ const e = "entity" in json.principal ? json.principal["entity"] : null;
237
+ if (e) {
238
+ pinnedPrincipalType = e.type;
239
+ }
240
+ }
241
+ // Same handling for resource direct-pin.
242
+ if (json.resource.op === "==") {
243
+ const e = "entity" in json.resource ? json.resource["entity"] : null;
244
+ if (e) {
245
+ pinnedResourceType = e.type;
246
+ }
247
+ }
248
+ const derived = entityTypesFromSchema(schemaJson, schemaNamespace, actionId);
249
+ const principalType = pinnedPrincipalType ?? derived.principalType;
250
+ const resourceType = pinnedResourceType ?? derived.resourceType;
251
+ return {
252
+ principalType,
253
+ principalRoleType,
254
+ principalRoleId,
255
+ actionType,
256
+ actionId,
257
+ resourceType,
258
+ };
259
+ }
260
+ // ─── Entity building ──────────────────────────────────────────────────────────
261
+ /**
262
+ * Pick a default action id when the policy scope doesn't specify one.
263
+ *
264
+ * Original fallback was a hardcoded `"READ"` (uppercase) which mismatched
265
+ * schemas declaring lowercase action keys (e.g. `actions: { read: { ... } }`).
266
+ * Cedar's request validator then rejected the request because `Action::"READ"`
267
+ * isn't declared, causing a default-deny that contradicted the generator's
268
+ * own `decision: "Allow"` self-report. Caught by e2e behavior test B3.
269
+ *
270
+ * The fix evolved through two iterations:
271
+ *
272
+ * v1: return Object.keys(actions)[0] — picked the first declared action.
273
+ * Broke when the schema's first action had `appliesTo.principalTypes`
274
+ * that didn't include the scope's principal type. Example:
275
+ * { adminOnly: { appliesTo: ["Admin"] }, read: { appliesTo: ["User"] } }
276
+ * with a policy targeting `User` would pick `adminOnly`, then schema
277
+ * validation rejects because the principal type doesn't apply.
278
+ *
279
+ * v2 (this version): find an action whose `appliesTo.principalTypes` includes
280
+ * the scope's bare principal type (e.g. "User" extracted from
281
+ * "DocMgmt::User"). Falls back to the first action only if no match.
282
+ * Final fallback is lowercase "read" when no schema is supplied at all.
283
+ */
284
+ function defaultActionIdFromSchema(schemaJson, namespace, principalType // full namespaced form like "DocMgmt::User"
285
+ ) {
286
+ try {
287
+ const ns = schemaJson?.[namespace];
288
+ const actions = ns?.["actions"];
289
+ if (!actions)
290
+ return "read";
291
+ const keys = Object.keys(actions);
292
+ if (keys.length === 0)
293
+ return "read";
294
+ // Extract bare principal type name ("User" from "DocMgmt::User") for matching
295
+ // against the schema's appliesTo.principalTypes (which are stored unprefixed).
296
+ const barePrincipalType = principalType
297
+ ? principalType.split("::").pop()
298
+ : undefined;
299
+ if (barePrincipalType) {
300
+ for (const key of keys) {
301
+ const appliesTo = actions[key]?.["appliesTo"];
302
+ const principalTypes = appliesTo?.["principalTypes"];
303
+ if (principalTypes && principalTypes.includes(barePrincipalType)) {
304
+ return key;
305
+ }
306
+ }
307
+ }
308
+ // No action has appliesTo matching the scope's principal type, OR no principal
309
+ // type was passed. Fall back to first declared action — better than the old
310
+ // hardcoded "READ" because at least it's a real declared action.
311
+ return keys[0];
312
+ }
313
+ catch { /* fall through */ }
314
+ return "read";
315
+ }
316
+ function buildEntities(scope, constraints, targetDecision, schemaNamespace, likeConstraints = [], schemaJson) {
317
+ const principalId = "sample-principal";
318
+ const resourceId = "sample-resource";
319
+ const actionId = scope.actionId ?? defaultActionIdFromSchema(schemaJson, schemaNamespace, scope.principalType);
320
+ // Seed required attributes from schema so validateRequest: true doesn't fail on missing fields.
321
+ // Condition-derived values (eq, has, contains, like) overwrite these defaults below.
322
+ const principalAttrs = schemaJson
323
+ ? requiredAttrsFromSchema(schemaJson, schemaNamespace, scope.principalType)
324
+ : {};
325
+ const resourceAttrs = schemaJson
326
+ ? requiredAttrsFromSchema(schemaJson, schemaNamespace, scope.resourceType)
327
+ : {};
328
+ // For deny, prefer violating a "has" constraint first, then "contains"/"eq".
329
+ // Omitting an optional attribute is the clearest deny signal.
330
+ let violatedConstraint = null;
331
+ if (targetDecision === "deny") {
332
+ violatedConstraint =
333
+ constraints.find((c) => c.op === "has" && c.variable === "resource") ??
334
+ constraints.find((c) => c.op === "has" && c.variable === "principal") ??
335
+ constraints.find((c) => c.op === "contains") ??
336
+ constraints.find((c) => c.op === "eq") ??
337
+ null;
338
+ }
339
+ for (const c of constraints) {
340
+ const shouldSatisfy = targetDecision === "allow" || c !== violatedConstraint;
341
+ if (c.variable === "principal") {
342
+ if (c.op === "eq" && shouldSatisfy)
343
+ principalAttrs[c.attr] = c.value;
344
+ if (c.op === "eq" && !shouldSatisfy)
345
+ principalAttrs[c.attr] = `__deny_${c.attr}`;
346
+ if (c.op === "contains" && shouldSatisfy)
347
+ principalAttrs[c.attr] = c.values?.[0];
348
+ if (c.op === "contains" && !shouldSatisfy)
349
+ principalAttrs[c.attr] = `__deny_not_in_set`;
350
+ }
351
+ if (c.variable === "resource") {
352
+ // If we're denying by omitting this attr (has-violated), skip its eq constraint too
353
+ const attrOmittedByDeny = violatedConstraint?.op === "has" &&
354
+ violatedConstraint.variable === "resource" &&
355
+ violatedConstraint.attr === c.attr;
356
+ if (c.op === "eq" && shouldSatisfy && !attrOmittedByDeny)
357
+ resourceAttrs[c.attr] = c.value;
358
+ if (c.op === "eq" && !shouldSatisfy)
359
+ resourceAttrs[c.attr] = `__deny_${c.attr}`;
360
+ // contains/in: pick first value from set for allow, sentinel not in set for deny
361
+ if (c.op === "contains" && shouldSatisfy)
362
+ resourceAttrs[c.attr] = c.values?.[0];
363
+ if (c.op === "contains" && !shouldSatisfy)
364
+ resourceAttrs[c.attr] = `__deny_not_in_set`;
365
+ if (c.op === "has" && shouldSatisfy) {
366
+ // Include the optional attr — set to a neutral value if no eq constraint follows
367
+ const eqForAttr = constraints.find((x) => x.op === "eq" && x.variable === "resource" && x.attr === c.attr);
368
+ if (!eqForAttr)
369
+ resourceAttrs[c.attr] = "present";
370
+ }
371
+ if (c.op === "has" && !shouldSatisfy) {
372
+ // Omit the optional attribute — deny by not having it
373
+ delete resourceAttrs[c.attr];
374
+ }
375
+ if (c.op === "not_has") {
376
+ // This is from an "unless" clause — omit the attr to satisfy the denial condition
377
+ delete resourceAttrs[c.attr];
378
+ }
379
+ }
380
+ }
381
+ // Apply like-based attribute generation.
382
+ // For deny: negative like (depth-limit) takes priority over eq-violation for the same attribute —
383
+ // it produces a more educational value (e.g. "/api/v1/projects/x/x" beats "__deny_path").
384
+ const attrsWithNegativeLike = new Set(likeConstraints
385
+ .filter((lc) => lc.negated && targetDecision === "deny")
386
+ .map((lc) => `${lc.variable}.${lc.attr}`));
387
+ for (const lc of likeConstraints) {
388
+ const target = lc.variable === "resource" ? resourceAttrs : principalAttrs;
389
+ const key = `${lc.variable}.${lc.attr}`;
390
+ // Allow: skip if already set by an eq constraint (== covers the allow case via ||)
391
+ // Deny: skip only if there's no negative like for this attr (eq-violation is the fallback)
392
+ if (target[lc.attr] !== undefined && !(targetDecision === "deny" && attrsWithNegativeLike.has(key)))
393
+ continue;
394
+ if (targetDecision === "allow" && !lc.negated) {
395
+ target[lc.attr] = patternToString(lc.pattern, "x");
396
+ }
397
+ else if (targetDecision === "deny" && lc.negated) {
398
+ // Satisfying the negative pattern makes !like false → deny
399
+ target[lc.attr] = patternToString(lc.pattern, "x");
400
+ }
401
+ else if (targetDecision === "deny" && !lc.negated) {
402
+ // No negative pattern to exploit — use a non-matching prefix
403
+ // Validation loop will catch if this doesn't produce a deny
404
+ if (target[lc.attr] === undefined)
405
+ target[lc.attr] = "/deny/path";
406
+ }
407
+ }
408
+ const principalEntity = {
409
+ uid: { type: scope.principalType, id: principalId },
410
+ attrs: principalAttrs,
411
+ parents: scope.principalRoleType && scope.principalRoleId
412
+ ? [{ type: scope.principalRoleType, id: scope.principalRoleId }]
413
+ : [],
414
+ };
415
+ const resourceEntity = {
416
+ uid: { type: scope.resourceType, id: resourceId },
417
+ attrs: resourceAttrs,
418
+ parents: [],
419
+ };
420
+ const entities = [principalEntity, resourceEntity];
421
+ // Add role entity if needed
422
+ if (scope.principalRoleType && scope.principalRoleId) {
423
+ entities.push({
424
+ uid: { type: scope.principalRoleType, id: scope.principalRoleId },
425
+ attrs: {},
426
+ parents: [],
427
+ });
428
+ }
429
+ return {
430
+ entities,
431
+ principalId,
432
+ actionId,
433
+ resourceId,
434
+ };
435
+ }
436
+ // ─── Handler ──────────────────────────────────────────────────────────────────
437
+ export async function handleGenerateSample(input) {
438
+ // Parse policy
439
+ const policyResult = policyToJson(input.policy);
440
+ if (policyResult.type === "failure") {
441
+ return { principal: "", action: "", resource: "", entities: [], explanation: "", error: policyResult.errors.map((e) => e.message).join("; ") };
442
+ }
443
+ const json = policyResult.json;
444
+ // Extract namespace and schema JSON for entity type lookup.
445
+ // schemaToJsonWithResolvedTypes only accepts Cedar text — for JSON schemas, parse directly.
446
+ //
447
+ // Cedar's "namespaceless" schema uses an empty-string namespace key:
448
+ // `{"": {entityTypes: {...}}}`. Object.keys returns `[""]`, and treating
449
+ // that as truthy via `if (ns)` previously fell through to the hardcoded
450
+ // "MyApp" default, hallucinating a namespace the schema didn't declare.
451
+ // `if (ns !== undefined)` keeps the empty string as a legitimate namespace
452
+ // that downstream `qualifyEntityType` rewrites as no prefix at all
453
+ // (kickoff-14 14d audit Finding F2).
454
+ let schemaNamespace = "MyApp";
455
+ let schemaJson = undefined;
456
+ try {
457
+ const parsed = JSON.parse(input.schema);
458
+ const ns = Object.keys(parsed)[0];
459
+ if (ns !== undefined) {
460
+ schemaNamespace = ns;
461
+ schemaJson = parsed;
462
+ }
463
+ }
464
+ catch {
465
+ // Not JSON — try Cedar text schema
466
+ try {
467
+ const schemaResult = schemaToJsonWithResolvedTypes(input.schema);
468
+ if (schemaResult.type === "success") {
469
+ const ns = Object.keys(schemaResult.json)[0];
470
+ if (ns !== undefined) {
471
+ schemaNamespace = ns;
472
+ schemaJson = schemaResult.json;
473
+ }
474
+ }
475
+ }
476
+ catch {
477
+ // Non-fatal — proceed with default namespace
478
+ }
479
+ }
480
+ // Extract equality/has constraints and like constraints separately
481
+ const constraints = extractConstraints(json.conditions);
482
+ const likeConstraints = extractLikeConstraints(json.conditions);
483
+ const scope = extractScope(json, schemaNamespace, schemaJson);
484
+ // Build entities, passing like constraints for path-matching generation
485
+ const { entities, principalId, actionId, resourceId } = buildEntities(scope, constraints, input.target_decision, schemaNamespace, likeConstraints, schemaJson);
486
+ const principalRef = `${scope.principalType}::"${principalId}"`;
487
+ const actionRef = `${scope.actionType}::"${actionId}"`;
488
+ const resourceRef = `${scope.resourceType}::"${resourceId}"`;
489
+ // Validate the generated payload with isAuthorized. Pass the user's schema
490
+ // with `validateRequest: true` so a generator-fabricated entity type that
491
+ // doesn't exist in the schema (e.g. when the schema has no namespace and
492
+ // an earlier code path leaked a default like `MyApp::Resource`) flips
493
+ // `ready_to_test` to false instead of falsely claiming the payload is
494
+ // ready (kickoff-14 14d audit Finding F3).
495
+ let verifySchema;
496
+ try {
497
+ verifySchema = JSON.parse(input.schema);
498
+ }
499
+ catch {
500
+ verifySchema = input.schema;
501
+ }
502
+ const authResult = isAuthorized({
503
+ principal: { type: scope.principalType, id: principalId },
504
+ action: { type: scope.actionType, id: actionId },
505
+ resource: { type: scope.resourceType, id: resourceId },
506
+ context: {},
507
+ policies: { staticPolicies: input.policy },
508
+ entities: entities,
509
+ schema: verifySchema,
510
+ validateRequest: true,
511
+ });
512
+ if (authResult.type === "failure") {
513
+ return {
514
+ principal: principalRef,
515
+ action: actionRef,
516
+ resource: resourceRef,
517
+ entities,
518
+ explanation: "Authorization check failed during validation.",
519
+ error: authResult.errors.map((e) => e.message).join("; "),
520
+ };
521
+ }
522
+ let actualDecision = authResult.response.decision === "allow" ? "Allow" : "Deny";
523
+ const targetLabel = input.target_decision === "allow" ? "Allow" : "Deny";
524
+ // Retry once with fallback if initial generation missed the target.
525
+ // For like-deny with no negative pattern, try the opposite wildcard count.
526
+ if (actualDecision !== targetLabel && likeConstraints.length > 0) {
527
+ const fallbackAttrs = { ...entities.find(e => e.uid.type === scope.resourceType)?.attrs ?? {} };
528
+ for (const lc of likeConstraints.filter(l => !l.negated && l.variable === "resource")) {
529
+ // For deny fallback: try a completely off-prefix path
530
+ if (input.target_decision === "deny")
531
+ fallbackAttrs[lc.attr] = "/deny/path/mismatch";
532
+ // For allow fallback: try two wildcard segments (sometimes needed for complex patterns)
533
+ if (input.target_decision === "allow")
534
+ fallbackAttrs[lc.attr] = patternToString(lc.pattern, "sample");
535
+ }
536
+ const retryEntities = entities.map(e => e.uid.type === scope.resourceType ? { ...e, attrs: fallbackAttrs } : e);
537
+ const retryResult = isAuthorized({
538
+ principal: { type: scope.principalType, id: principalId },
539
+ action: { type: scope.actionType, id: actionId },
540
+ resource: { type: scope.resourceType, id: resourceId },
541
+ context: {},
542
+ policies: { staticPolicies: input.policy },
543
+ entities: retryEntities,
544
+ schema: verifySchema,
545
+ validateRequest: true,
546
+ });
547
+ if (retryResult.type === "success") {
548
+ const retryDecision = retryResult.response.decision === "allow" ? "Allow" : "Deny";
549
+ if (retryDecision === targetLabel) {
550
+ actualDecision = retryDecision;
551
+ entities.splice(0, entities.length, ...retryEntities);
552
+ }
553
+ }
554
+ }
555
+ const explanation = actualDecision === targetLabel
556
+ ? `This request will be ${actualDecision.toUpperCase()} as expected.`
557
+ : `Generated payload produced ${actualDecision} instead of expected ${targetLabel}. The policy conditions may be more complex than automated extraction supports.`;
558
+ return {
559
+ principal: principalRef,
560
+ action: actionRef,
561
+ resource: resourceRef,
562
+ entities,
563
+ explanation,
564
+ decision: actualDecision,
565
+ ready_to_test: actualDecision === targetLabel,
566
+ };
567
+ }
568
+ //# sourceMappingURL=generate-sample.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-sample.js","sourceRoot":"","sources":["../../src/tools/generate-sample.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface LinkTemplateInput {
2
+ template: string;
3
+ principal?: string;
4
+ resource?: string;
5
+ schema?: string;
6
+ }
7
+ export interface LinkTemplateResult {
8
+ linked_policy?: string;
9
+ slots_bound: Record<string, string>;
10
+ valid?: boolean;
11
+ errors?: Array<{
12
+ message: string;
13
+ }>;
14
+ error?: string;
15
+ }
16
+ export declare function handleLinkTemplate(input: LinkTemplateInput): Promise<LinkTemplateResult>;
17
+ //# sourceMappingURL=link-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-template.d.ts","sourceRoot":"","sources":["../../src/tools/link-template.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAcD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA8E9F"}