@weave_protocol/ward 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +214 -0
- package/SKILL.md +84 -0
- package/SPEC.md +258 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +465 -0
- package/dist/cli.js.map +1 -0
- package/dist/enforcer/index.d.ts +41 -0
- package/dist/enforcer/index.d.ts.map +1 -0
- package/dist/enforcer/index.js +225 -0
- package/dist/enforcer/index.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/index.d.ts +17 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +326 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/markdown.d.ts +24 -0
- package/dist/parser/markdown.d.ts.map +1 -0
- package/dist/parser/markdown.js +52 -0
- package/dist/parser/markdown.js.map +1 -0
- package/dist/parser/yaml.d.ts +23 -0
- package/dist/parser/yaml.d.ts.map +1 -0
- package/dist/parser/yaml.js +134 -0
- package/dist/parser/yaml.js.map +1 -0
- package/dist/types.d.ts +184 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -0
- package/examples/basic.WARD.md +74 -0
- package/examples/compliance.WARD.md +108 -0
- package/examples/strict.WARD.md +127 -0
- package/package.json +64 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime policy checks.
|
|
3
|
+
*
|
|
4
|
+
* The enforcer doesn't execute anything itself — it answers questions like
|
|
5
|
+
* "is this proposed file write allowed?" given a parsed WardPolicy. Hosts
|
|
6
|
+
* (Mund, Hundredmen, custom harnesses) plug this in at the right points in
|
|
7
|
+
* their agent loop.
|
|
8
|
+
*
|
|
9
|
+
* Decisions are explicit: ALLOW, DENY, REQUIRE_APPROVAL. Hosts decide what
|
|
10
|
+
* to do with a REQUIRE_APPROVAL result (human-in-the-loop, etc.).
|
|
11
|
+
*/
|
|
12
|
+
// ─────────────────────────────────────────────────────────
|
|
13
|
+
// Filesystem
|
|
14
|
+
// ─────────────────────────────────────────────────────────
|
|
15
|
+
export function checkFilesystem(policy, op, path) {
|
|
16
|
+
const fs = policy.filesystem;
|
|
17
|
+
if (!fs)
|
|
18
|
+
return { decision: "allow", reason: "No filesystem policy declared (default allow)." };
|
|
19
|
+
// Deny rules take precedence
|
|
20
|
+
for (const rule of fs.deny || []) {
|
|
21
|
+
if (rule.op === op && matchGlob(path, rule.path)) {
|
|
22
|
+
return {
|
|
23
|
+
decision: "deny",
|
|
24
|
+
reason: `Denied by filesystem rule: ${rule.op} ${rule.path}`,
|
|
25
|
+
matchedRule: `${rule.op}: ${rule.path}`,
|
|
26
|
+
severity: "high",
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Allow rules
|
|
31
|
+
for (const rule of fs.allow || []) {
|
|
32
|
+
if (rule.op === op && matchGlob(path, rule.path)) {
|
|
33
|
+
return {
|
|
34
|
+
decision: "allow",
|
|
35
|
+
reason: `Allowed by filesystem rule: ${rule.op} ${rule.path}`,
|
|
36
|
+
matchedRule: `${rule.op}: ${rule.path}`,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const def = fs.default ?? "deny";
|
|
41
|
+
return {
|
|
42
|
+
decision: def,
|
|
43
|
+
reason: `No matching rule; default action is ${def}.`,
|
|
44
|
+
severity: def === "deny" ? "medium" : undefined,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
// ─────────────────────────────────────────────────────────
|
|
48
|
+
// Network
|
|
49
|
+
// ─────────────────────────────────────────────────────────
|
|
50
|
+
export function checkNetwork(policy, url, method = "GET") {
|
|
51
|
+
const net = policy.network;
|
|
52
|
+
if (!net)
|
|
53
|
+
return { decision: "allow", reason: "No network policy declared (default allow)." };
|
|
54
|
+
const matchesRule = (rule) => {
|
|
55
|
+
if (!matchGlob(url, rule.url))
|
|
56
|
+
return false;
|
|
57
|
+
if (rule.methods && rule.methods.length > 0 && !rule.methods.includes(method))
|
|
58
|
+
return false;
|
|
59
|
+
return true;
|
|
60
|
+
};
|
|
61
|
+
for (const rule of net.deny || []) {
|
|
62
|
+
if (matchesRule(rule)) {
|
|
63
|
+
return {
|
|
64
|
+
decision: "deny",
|
|
65
|
+
reason: `Denied by network rule: ${rule.url}`,
|
|
66
|
+
matchedRule: rule.url,
|
|
67
|
+
severity: "high",
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
for (const rule of net.allow || []) {
|
|
72
|
+
if (matchesRule(rule)) {
|
|
73
|
+
return {
|
|
74
|
+
decision: "allow",
|
|
75
|
+
reason: `Allowed by network rule: ${rule.url}`,
|
|
76
|
+
matchedRule: rule.url,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const def = net.default ?? "deny";
|
|
81
|
+
return {
|
|
82
|
+
decision: def,
|
|
83
|
+
reason: `No matching network rule; default action is ${def}.`,
|
|
84
|
+
severity: def === "deny" ? "medium" : undefined,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// ─────────────────────────────────────────────────────────
|
|
88
|
+
// Capabilities (tools)
|
|
89
|
+
// ─────────────────────────────────────────────────────────
|
|
90
|
+
export function checkCapability(policy, toolName) {
|
|
91
|
+
const caps = policy.capabilities;
|
|
92
|
+
if (!caps)
|
|
93
|
+
return { decision: "allow", reason: "No capabilities policy declared (default allow)." };
|
|
94
|
+
if (caps.deny?.some((t) => t === toolName || matchGlob(toolName, t))) {
|
|
95
|
+
return {
|
|
96
|
+
decision: "deny",
|
|
97
|
+
reason: `Tool '${toolName}' is in the deny list.`,
|
|
98
|
+
matchedRule: toolName,
|
|
99
|
+
severity: "high",
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
if (caps.requireApproval?.some((t) => t === toolName || matchGlob(toolName, t))) {
|
|
103
|
+
return {
|
|
104
|
+
decision: "require_approval",
|
|
105
|
+
reason: `Tool '${toolName}' requires human approval before execution.`,
|
|
106
|
+
matchedRule: toolName,
|
|
107
|
+
severity: "medium",
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
if (caps.allow && caps.allow.length > 0) {
|
|
111
|
+
if (caps.allow.some((t) => t === toolName || matchGlob(toolName, t))) {
|
|
112
|
+
return {
|
|
113
|
+
decision: "allow",
|
|
114
|
+
reason: `Tool '${toolName}' is in the allow list.`,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
const def = caps.default ?? "deny";
|
|
118
|
+
return {
|
|
119
|
+
decision: def,
|
|
120
|
+
reason: `Tool '${toolName}' is not in the allow list; default is ${def}.`,
|
|
121
|
+
severity: def === "deny" ? "medium" : undefined,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
return { decision: caps.default ?? "allow", reason: "No allow/deny list; default action applied." };
|
|
125
|
+
}
|
|
126
|
+
// ─────────────────────────────────────────────────────────
|
|
127
|
+
// Data egress
|
|
128
|
+
// ─────────────────────────────────────────────────────────
|
|
129
|
+
export function checkDataEgress(policy, classification) {
|
|
130
|
+
const db = policy.dataBoundaries;
|
|
131
|
+
if (!db)
|
|
132
|
+
return { decision: "allow", reason: "No data boundary policy declared." };
|
|
133
|
+
if (db.egressDeny?.includes(classification)) {
|
|
134
|
+
return {
|
|
135
|
+
decision: "deny",
|
|
136
|
+
reason: `Data classification '${classification}' is denied egress.`,
|
|
137
|
+
matchedRule: classification,
|
|
138
|
+
severity: classification === "credentials" || classification === "secret" ? "critical" : "high",
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
if (db.egressAllow && db.egressAllow.length > 0) {
|
|
142
|
+
if (db.egressAllow.includes(classification)) {
|
|
143
|
+
return { decision: "allow", reason: `Egress allowed for '${classification}'.` };
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
decision: "deny",
|
|
147
|
+
reason: `Data classification '${classification}' is not in the egress allow list.`,
|
|
148
|
+
matchedRule: classification,
|
|
149
|
+
severity: "medium",
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
return { decision: "allow", reason: "No egress rules matched (default allow)." };
|
|
153
|
+
}
|
|
154
|
+
export function checkBehavioral(policy, state) {
|
|
155
|
+
const b = policy.behavioral;
|
|
156
|
+
if (!b)
|
|
157
|
+
return { decision: "allow", reason: "No behavioral limits declared." };
|
|
158
|
+
if (b.maxIterations !== undefined && state.iterations >= b.maxIterations) {
|
|
159
|
+
return {
|
|
160
|
+
decision: "deny",
|
|
161
|
+
reason: `Max iterations exceeded (${state.iterations} >= ${b.maxIterations}).`,
|
|
162
|
+
severity: "high",
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
if (b.maxRuntimeSeconds !== undefined && state.runtimeSeconds >= b.maxRuntimeSeconds) {
|
|
166
|
+
return {
|
|
167
|
+
decision: "deny",
|
|
168
|
+
reason: `Max runtime exceeded (${state.runtimeSeconds}s >= ${b.maxRuntimeSeconds}s).`,
|
|
169
|
+
severity: "high",
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
if (b.maxCostUSD !== undefined && state.costUSD >= b.maxCostUSD) {
|
|
173
|
+
return {
|
|
174
|
+
decision: "deny",
|
|
175
|
+
reason: `Max cost exceeded ($${state.costUSD.toFixed(2)} >= $${b.maxCostUSD.toFixed(2)}).`,
|
|
176
|
+
severity: "critical",
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
if (b.maxTokens !== undefined && state.tokens >= b.maxTokens) {
|
|
180
|
+
return {
|
|
181
|
+
decision: "deny",
|
|
182
|
+
reason: `Max tokens exceeded (${state.tokens} >= ${b.maxTokens}).`,
|
|
183
|
+
severity: "medium",
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
if (b.maxToolCalls !== undefined && state.toolCalls >= b.maxToolCalls) {
|
|
187
|
+
return {
|
|
188
|
+
decision: "deny",
|
|
189
|
+
reason: `Max tool calls exceeded (${state.toolCalls} >= ${b.maxToolCalls}).`,
|
|
190
|
+
severity: "medium",
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
if (b.maxExternalServices !== undefined &&
|
|
194
|
+
state.externalServices.size >= b.maxExternalServices) {
|
|
195
|
+
return {
|
|
196
|
+
decision: "deny",
|
|
197
|
+
reason: `Max external services exceeded (${state.externalServices.size} >= ${b.maxExternalServices}).`,
|
|
198
|
+
severity: "high",
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
return { decision: "allow", reason: "Within all behavioral limits." };
|
|
202
|
+
}
|
|
203
|
+
// ─────────────────────────────────────────────────────────
|
|
204
|
+
// Glob matcher (minimal, no deps)
|
|
205
|
+
// ─────────────────────────────────────────────────────────
|
|
206
|
+
/**
|
|
207
|
+
* Match a string against a glob pattern.
|
|
208
|
+
* * matches anything except "/"
|
|
209
|
+
* ** matches anything including "/"
|
|
210
|
+
* ? matches a single char
|
|
211
|
+
* any other char matches literally
|
|
212
|
+
*/
|
|
213
|
+
export function matchGlob(input, pattern) {
|
|
214
|
+
// Escape regex special chars except our glob ones
|
|
215
|
+
const regexSource = "^" +
|
|
216
|
+
pattern
|
|
217
|
+
.replace(/[.+^${}()|[\]\\]/g, "\\$&")
|
|
218
|
+
.replace(/\*\*/g, "::DOUBLESTAR::")
|
|
219
|
+
.replace(/\*/g, "[^/]*")
|
|
220
|
+
.replace(/::DOUBLESTAR::/g, ".*")
|
|
221
|
+
.replace(/\?/g, ".") +
|
|
222
|
+
"$";
|
|
223
|
+
return new RegExp(regexSource).test(input);
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/enforcer/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @weave_protocol/ward - Public API
|
|
3
|
+
*
|
|
4
|
+
* WARD.md is an infrastructure-as-code standard for declaring AI agent
|
|
5
|
+
* security policies. It pairs with AGENTS.md (Google's agent definition
|
|
6
|
+
* format) and SKILL.md (Anthropic's skill format) to give every agent in
|
|
7
|
+
* a repo a version-controlled, machine-readable set of guardrails.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { parseWard, checkFilesystem } from '@weave_protocol/ward';
|
|
12
|
+
* import { readFileSync } from 'node:fs';
|
|
13
|
+
*
|
|
14
|
+
* const policy = parseWard(readFileSync('./WARD.md', 'utf8'));
|
|
15
|
+
* const result = checkFilesystem(policy, 'read', '/workspace/secrets/keys.txt');
|
|
16
|
+
* if (result.decision === 'deny') {
|
|
17
|
+
* throw new Error(result.reason);
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export type * from "./types.js";
|
|
22
|
+
export { parseWard, parseAndValidate } from "./parser/index.js";
|
|
23
|
+
export { splitFrontmatter, parseYAML } from "./parser/yaml.js";
|
|
24
|
+
export { splitSections, normalizeKey } from "./parser/markdown.js";
|
|
25
|
+
export { checkFilesystem, checkNetwork, checkCapability, checkDataEgress, checkBehavioral, matchGlob, } from "./enforcer/index.js";
|
|
26
|
+
export type { Decision, CheckResult, RuntimeState } from "./enforcer/index.js";
|
|
27
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,mBAAmB,YAAY,CAAC;AAGhC,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGnE,OAAO,EACL,eAAe,EACf,YAAY,EACZ,eAAe,EACf,eAAe,EACf,eAAe,EACf,SAAS,GACV,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @weave_protocol/ward - Public API
|
|
3
|
+
*
|
|
4
|
+
* WARD.md is an infrastructure-as-code standard for declaring AI agent
|
|
5
|
+
* security policies. It pairs with AGENTS.md (Google's agent definition
|
|
6
|
+
* format) and SKILL.md (Anthropic's skill format) to give every agent in
|
|
7
|
+
* a repo a version-controlled, machine-readable set of guardrails.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { parseWard, checkFilesystem } from '@weave_protocol/ward';
|
|
12
|
+
* import { readFileSync } from 'node:fs';
|
|
13
|
+
*
|
|
14
|
+
* const policy = parseWard(readFileSync('./WARD.md', 'utf8'));
|
|
15
|
+
* const result = checkFilesystem(policy, 'read', '/workspace/secrets/keys.txt');
|
|
16
|
+
* if (result.decision === 'deny') {
|
|
17
|
+
* throw new Error(result.reason);
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
// Parser
|
|
22
|
+
export { parseWard, parseAndValidate } from "./parser/index.js";
|
|
23
|
+
export { splitFrontmatter, parseYAML } from "./parser/yaml.js";
|
|
24
|
+
export { splitSections, normalizeKey } from "./parser/markdown.js";
|
|
25
|
+
// Enforcer
|
|
26
|
+
export { checkFilesystem, checkNetwork, checkCapability, checkDataEgress, checkBehavioral, matchGlob, } from "./enforcer/index.js";
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,SAAS;AACT,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEnE,WAAW;AACX,OAAO,EACL,eAAe,EACf,YAAY,EACZ,eAAe,EACf,eAAe,EACf,eAAe,EACf,SAAS,GACV,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main WARD.md parser.
|
|
3
|
+
*
|
|
4
|
+
* Reads a WARD.md file (frontmatter + sections), interprets each known
|
|
5
|
+
* section into the typed sub-policy, and returns a fully-typed WardPolicy.
|
|
6
|
+
*/
|
|
7
|
+
import type { WardPolicy, ValidationResult } from "../types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Parse a WARD.md source string into a typed policy object.
|
|
10
|
+
* Throws if the document is fundamentally malformed (not just invalid policy).
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseWard(source: string): WardPolicy;
|
|
13
|
+
/**
|
|
14
|
+
* Parse + validate. Returns a structured result with errors and warnings.
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseAndValidate(source: string): ValidationResult;
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,UAAU,EAaV,gBAAgB,EAEjB,MAAM,aAAa,CAAC;AAMrB;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAkBpD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAoEjE"}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main WARD.md parser.
|
|
3
|
+
*
|
|
4
|
+
* Reads a WARD.md file (frontmatter + sections), interprets each known
|
|
5
|
+
* section into the typed sub-policy, and returns a fully-typed WardPolicy.
|
|
6
|
+
*/
|
|
7
|
+
import { splitFrontmatter, parseYAML } from "./yaml.js";
|
|
8
|
+
import { splitSections, extractStructuredBlock } from "./markdown.js";
|
|
9
|
+
// ─────────────────────────────────────────────────────────
|
|
10
|
+
// Public API
|
|
11
|
+
// ─────────────────────────────────────────────────────────
|
|
12
|
+
/**
|
|
13
|
+
* Parse a WARD.md source string into a typed policy object.
|
|
14
|
+
* Throws if the document is fundamentally malformed (not just invalid policy).
|
|
15
|
+
*/
|
|
16
|
+
export function parseWard(source) {
|
|
17
|
+
const { frontmatter, body } = splitFrontmatter(source);
|
|
18
|
+
const fm = frontmatter ? parseYAML(frontmatter) : {};
|
|
19
|
+
const sections = splitSections(body);
|
|
20
|
+
const policy = {
|
|
21
|
+
version: fm.ward || "1.0",
|
|
22
|
+
agent: fm.agent,
|
|
23
|
+
name: fm.name,
|
|
24
|
+
description: fm.description,
|
|
25
|
+
raw: {},
|
|
26
|
+
};
|
|
27
|
+
for (const section of sections) {
|
|
28
|
+
applySection(policy, section);
|
|
29
|
+
}
|
|
30
|
+
return policy;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Parse + validate. Returns a structured result with errors and warnings.
|
|
34
|
+
*/
|
|
35
|
+
export function parseAndValidate(source) {
|
|
36
|
+
const errors = [];
|
|
37
|
+
const warnings = [];
|
|
38
|
+
let policy;
|
|
39
|
+
try {
|
|
40
|
+
policy = parseWard(source);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
return {
|
|
44
|
+
valid: false,
|
|
45
|
+
errors: [
|
|
46
|
+
{
|
|
47
|
+
level: "error",
|
|
48
|
+
message: `Failed to parse WARD.md: ${err instanceof Error ? err.message : String(err)}`,
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
warnings: [],
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// Validation rules
|
|
55
|
+
if (policy.version !== "1.0") {
|
|
56
|
+
errors.push({
|
|
57
|
+
level: "error",
|
|
58
|
+
section: "frontmatter",
|
|
59
|
+
message: `Unsupported WARD version: ${policy.version}`,
|
|
60
|
+
suggestion: "Use 'ward: 1.0' in the frontmatter.",
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
if (!policy.filesystem && !policy.network && !policy.capabilities) {
|
|
64
|
+
warnings.push({
|
|
65
|
+
level: "warning",
|
|
66
|
+
message: "Policy declares no filesystem, network, or capability constraints — this agent will be unrestricted on those dimensions.",
|
|
67
|
+
suggestion: "Add at least one of `## Filesystem`, `## Network`, or `## Capabilities` to define what the agent is allowed to do.",
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
if (policy.verification?.required &&
|
|
71
|
+
!policy.verification.backend &&
|
|
72
|
+
!policy.verification.blockchain) {
|
|
73
|
+
warnings.push({
|
|
74
|
+
level: "warning",
|
|
75
|
+
section: "verification",
|
|
76
|
+
message: "Verification is required but no backend or blockchain is specified.",
|
|
77
|
+
suggestion: "Set `backend: domere` and `blockchain: solana` (or similar).",
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
if (policy.behavioral?.maxCostUSD === undefined && policy.behavioral?.maxRuntimeSeconds === undefined) {
|
|
81
|
+
warnings.push({
|
|
82
|
+
level: "warning",
|
|
83
|
+
section: "behavioral",
|
|
84
|
+
message: "No cost or runtime limits — runaway agents can incur unbounded charges.",
|
|
85
|
+
suggestion: "Set `maxCostUSD` or `maxRuntimeSeconds` in the Behavioral Limits section.",
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
valid: errors.length === 0,
|
|
90
|
+
errors,
|
|
91
|
+
warnings,
|
|
92
|
+
policy,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// ─────────────────────────────────────────────────────────
|
|
96
|
+
// Section dispatch
|
|
97
|
+
// ─────────────────────────────────────────────────────────
|
|
98
|
+
function applySection(policy, section) {
|
|
99
|
+
const yaml = parseYAML(extractStructuredBlock(section.body));
|
|
100
|
+
switch (section.key) {
|
|
101
|
+
case "filesystem":
|
|
102
|
+
policy.filesystem = parseFilesystem(yaml);
|
|
103
|
+
break;
|
|
104
|
+
case "network":
|
|
105
|
+
policy.network = parseNetwork(yaml);
|
|
106
|
+
break;
|
|
107
|
+
case "capabilities":
|
|
108
|
+
case "tools":
|
|
109
|
+
policy.capabilities = parseCapabilities(yaml);
|
|
110
|
+
break;
|
|
111
|
+
case "databoundaries":
|
|
112
|
+
case "egress":
|
|
113
|
+
policy.dataBoundaries = parseDataBoundaries(yaml);
|
|
114
|
+
break;
|
|
115
|
+
case "behavioral":
|
|
116
|
+
case "behaviorallimits":
|
|
117
|
+
case "limits":
|
|
118
|
+
policy.behavioral = parseBehavioral(yaml);
|
|
119
|
+
break;
|
|
120
|
+
case "multiagent":
|
|
121
|
+
policy.multiAgent = parseMultiAgent(yaml);
|
|
122
|
+
break;
|
|
123
|
+
case "compliance":
|
|
124
|
+
policy.compliance = parseCompliance(yaml);
|
|
125
|
+
break;
|
|
126
|
+
case "verification":
|
|
127
|
+
case "attestation":
|
|
128
|
+
policy.verification = parseVerification(yaml);
|
|
129
|
+
break;
|
|
130
|
+
case "threatmodel":
|
|
131
|
+
policy.threatModel = parseThreatModel(yaml);
|
|
132
|
+
break;
|
|
133
|
+
case "incidentresponse":
|
|
134
|
+
case "onviolation":
|
|
135
|
+
policy.incidentResponse = parseIncidentResponse(yaml);
|
|
136
|
+
break;
|
|
137
|
+
default:
|
|
138
|
+
// Preserve unknown sections so callers don't lose data
|
|
139
|
+
if (policy.raw)
|
|
140
|
+
policy.raw[section.key] = section.body;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// ─────────────────────────────────────────────────────────
|
|
144
|
+
// Section parsers
|
|
145
|
+
// ─────────────────────────────────────────────────────────
|
|
146
|
+
function parseFilesystem(y) {
|
|
147
|
+
return {
|
|
148
|
+
allow: parseFilesystemRules(y.allow),
|
|
149
|
+
deny: parseFilesystemRules(y.deny),
|
|
150
|
+
default: y.default,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
function parseFilesystemRules(raw) {
|
|
154
|
+
if (!Array.isArray(raw))
|
|
155
|
+
return undefined;
|
|
156
|
+
const rules = [];
|
|
157
|
+
for (const entry of raw) {
|
|
158
|
+
// Supports both "read: /path/**" string form and {op, path} object form
|
|
159
|
+
if (typeof entry === "string") {
|
|
160
|
+
const colon = entry.indexOf(":");
|
|
161
|
+
if (colon === -1)
|
|
162
|
+
continue;
|
|
163
|
+
const op = entry.slice(0, colon).trim().toLowerCase();
|
|
164
|
+
const path = entry.slice(colon + 1).trim();
|
|
165
|
+
if (isFilesystemOp(op))
|
|
166
|
+
rules.push({ op, path });
|
|
167
|
+
}
|
|
168
|
+
else if (entry && typeof entry === "object") {
|
|
169
|
+
const obj = entry;
|
|
170
|
+
if (isFilesystemOp(obj.op)) {
|
|
171
|
+
rules.push({ op: obj.op, path: String(obj.path || "") });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return rules.length > 0 ? rules : undefined;
|
|
176
|
+
}
|
|
177
|
+
function isFilesystemOp(op) {
|
|
178
|
+
return ["read", "write", "execute", "delete", "list"].includes(op);
|
|
179
|
+
}
|
|
180
|
+
function parseNetwork(y) {
|
|
181
|
+
const toRules = (raw) => {
|
|
182
|
+
if (!Array.isArray(raw))
|
|
183
|
+
return undefined;
|
|
184
|
+
return raw
|
|
185
|
+
.map((entry) => {
|
|
186
|
+
if (typeof entry === "string") {
|
|
187
|
+
// Handle "url: https://..." form (string with leading url: key)
|
|
188
|
+
if (entry.startsWith("url:") || entry.startsWith("url ")) {
|
|
189
|
+
const colon = entry.indexOf(":");
|
|
190
|
+
const url = entry.slice(colon + 1).trim().replace(/^["']|["']$/g, "");
|
|
191
|
+
return { url };
|
|
192
|
+
}
|
|
193
|
+
// Plain URL string
|
|
194
|
+
return { url: entry };
|
|
195
|
+
}
|
|
196
|
+
if (entry && typeof entry === "object") {
|
|
197
|
+
const obj = entry;
|
|
198
|
+
return { url: String(obj.url || ""), methods: obj.methods };
|
|
199
|
+
}
|
|
200
|
+
return null;
|
|
201
|
+
})
|
|
202
|
+
.filter((r) => r !== null && !!r.url);
|
|
203
|
+
};
|
|
204
|
+
return {
|
|
205
|
+
allow: toRules(y.allow),
|
|
206
|
+
deny: toRules(y.deny),
|
|
207
|
+
default: y.default,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function parseCapabilities(y) {
|
|
211
|
+
const toStringList = (raw) => {
|
|
212
|
+
if (!Array.isArray(raw))
|
|
213
|
+
return undefined;
|
|
214
|
+
return raw.map(String).filter(Boolean);
|
|
215
|
+
};
|
|
216
|
+
return {
|
|
217
|
+
allow: toStringList(y.allow),
|
|
218
|
+
deny: toStringList(y.deny),
|
|
219
|
+
requireApproval: toStringList(y.requireApproval ?? y.require_approval),
|
|
220
|
+
default: y.default,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
function parseDataBoundaries(y) {
|
|
224
|
+
const toClassList = (raw) => {
|
|
225
|
+
if (!Array.isArray(raw))
|
|
226
|
+
return undefined;
|
|
227
|
+
return raw.map((v) => String(v).toLowerCase());
|
|
228
|
+
};
|
|
229
|
+
return {
|
|
230
|
+
egressAllow: toClassList(y.egressAllow ?? y.egress_allow ?? y.allow),
|
|
231
|
+
egressDeny: toClassList(y.egressDeny ?? y.egress_deny ?? y.deny),
|
|
232
|
+
redact: Array.isArray(y.redact)
|
|
233
|
+
? y.redact.map((r) => typeof r === "string"
|
|
234
|
+
? { type: r }
|
|
235
|
+
: { type: String(r.type), replacement: String(r.replacement || "[REDACTED]") })
|
|
236
|
+
: undefined,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
function parseBehavioral(y) {
|
|
240
|
+
const num = (k, alt) => {
|
|
241
|
+
const v = y[k] ?? (alt ? y[alt] : undefined);
|
|
242
|
+
return typeof v === "number" ? v : undefined;
|
|
243
|
+
};
|
|
244
|
+
return {
|
|
245
|
+
maxIterations: num("maxIterations", "max_iterations"),
|
|
246
|
+
maxRuntimeSeconds: num("maxRuntimeSeconds", "max_runtime_seconds"),
|
|
247
|
+
maxCostUSD: num("maxCostUSD", "max_cost_usd"),
|
|
248
|
+
maxTokens: num("maxTokens", "max_tokens"),
|
|
249
|
+
maxToolCalls: num("maxToolCalls", "max_tool_calls"),
|
|
250
|
+
maxExternalServices: num("maxExternalServices", "max_external_services"),
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
function parseMultiAgent(y) {
|
|
254
|
+
const tc = y.trustChain ?? y.trust_chain;
|
|
255
|
+
const trustChain = tc && typeof tc === "object"
|
|
256
|
+
? {
|
|
257
|
+
upstream: Array.isArray(tc.upstream)
|
|
258
|
+
? tc.upstream
|
|
259
|
+
: undefined,
|
|
260
|
+
downstream: Array.isArray(tc.downstream)
|
|
261
|
+
? tc.downstream
|
|
262
|
+
: undefined,
|
|
263
|
+
}
|
|
264
|
+
: undefined;
|
|
265
|
+
return {
|
|
266
|
+
trustChain,
|
|
267
|
+
isolation: y.isolation,
|
|
268
|
+
maxSemanticDrift: typeof y.maxSemanticDrift === "number" ? y.maxSemanticDrift : undefined,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
function parseCompliance(y) {
|
|
272
|
+
return {
|
|
273
|
+
frameworks: Array.isArray(y.frameworks)
|
|
274
|
+
? y.frameworks.map((f) => String(f).toLowerCase())
|
|
275
|
+
: undefined,
|
|
276
|
+
backend: y.backend,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
function parseVerification(y) {
|
|
280
|
+
return {
|
|
281
|
+
required: y.required === true,
|
|
282
|
+
backend: y.backend,
|
|
283
|
+
blockchain: y.blockchain,
|
|
284
|
+
frequency: y.frequency?.replace(/-/g, "_"),
|
|
285
|
+
attestor: y.attestor,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
function parseThreatModel(y) {
|
|
289
|
+
return {
|
|
290
|
+
inScope: Array.isArray(y.inScope ?? y.in_scope)
|
|
291
|
+
? (y.inScope ?? y.in_scope)
|
|
292
|
+
: undefined,
|
|
293
|
+
outOfScope: Array.isArray(y.outOfScope ?? y.out_of_scope)
|
|
294
|
+
? (y.outOfScope ?? y.out_of_scope)
|
|
295
|
+
: undefined,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
function parseIncidentResponse(y) {
|
|
299
|
+
const onViolation = y.onViolation ?? y.on_violation;
|
|
300
|
+
let actions;
|
|
301
|
+
if (Array.isArray(onViolation)) {
|
|
302
|
+
const collected = [];
|
|
303
|
+
for (const a of onViolation) {
|
|
304
|
+
if (typeof a === "string") {
|
|
305
|
+
collected.push({ type: a });
|
|
306
|
+
}
|
|
307
|
+
else if (a && typeof a === "object") {
|
|
308
|
+
const obj = a;
|
|
309
|
+
if (obj.type) {
|
|
310
|
+
collected.push({
|
|
311
|
+
type: obj.type,
|
|
312
|
+
minSeverity: obj.minSeverity,
|
|
313
|
+
target: obj.target,
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
if (collected.length > 0)
|
|
319
|
+
actions = collected;
|
|
320
|
+
}
|
|
321
|
+
return {
|
|
322
|
+
onViolation: actions,
|
|
323
|
+
severityThreshold: y.severityThreshold,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAwB,MAAM,eAAe,CAAC;AAmB5F,4DAA4D;AAC5D,aAAa;AACb,4DAA4D;AAE5D;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAErC,MAAM,MAAM,GAAe;QACzB,OAAO,EAAG,EAAE,CAAC,IAAc,IAAI,KAAK;QACpC,KAAK,EAAE,EAAE,CAAC,KAA2B;QACrC,IAAI,EAAE,EAAE,CAAC,IAA0B;QACnC,WAAW,EAAE,EAAE,CAAC,WAAiC;QACjD,GAAG,EAAE,EAAE;KACR,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAsB,EAAE,CAAC;IAEvC,IAAI,MAAkB,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE;gBACN;oBACE,KAAK,EAAE,OAAO;oBACd,OAAO,EAAE,4BAA4B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;iBACxF;aACF;YACD,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IAED,mBAAmB;IACnB,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,aAAa;YACtB,OAAO,EAAE,6BAA6B,MAAM,CAAC,OAAO,EAAE;YACtD,UAAU,EAAE,qCAAqC;SAClD,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAClE,QAAQ,CAAC,IAAI,CAAC;YACZ,KAAK,EAAE,SAAS;YAChB,OAAO,EACL,0HAA0H;YAC5H,UAAU,EACR,oHAAoH;SACvH,CAAC,CAAC;IACL,CAAC;IAED,IACE,MAAM,CAAC,YAAY,EAAE,QAAQ;QAC7B,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO;QAC5B,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,EAC/B,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC;YACZ,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,cAAc;YACvB,OAAO,EAAE,qEAAqE;YAC9E,UAAU,EAAE,8DAA8D;SAC3E,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,EAAE,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACtG,QAAQ,CAAC,IAAI,CAAC;YACZ,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,YAAY;YACrB,OAAO,EAAE,yEAAyE;YAClF,UAAU,EAAE,2EAA2E;SACxF,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;QACN,QAAQ;QACR,MAAM;KACP,CAAC;AACJ,CAAC;AAED,4DAA4D;AAC5D,mBAAmB;AACnB,4DAA4D;AAE5D,SAAS,YAAY,CAAC,MAAkB,EAAE,OAAwB;IAChE,MAAM,IAAI,GAAG,SAAS,CAAC,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAE7D,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC;QACpB,KAAK,YAAY;YACf,MAAM,CAAC,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,CAAC,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM;QACR,KAAK,cAAc,CAAC;QACpB,KAAK,OAAO;YACV,MAAM,CAAC,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM;QACR,KAAK,gBAAgB,CAAC;QACtB,KAAK,QAAQ;YACX,MAAM,CAAC,cAAc,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM;QACR,KAAK,YAAY,CAAC;QAClB,KAAK,kBAAkB,CAAC;QACxB,KAAK,QAAQ;YACX,MAAM,CAAC,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM;QACR,KAAK,YAAY;YACf,MAAM,CAAC,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM;QACR,KAAK,YAAY;YACf,MAAM,CAAC,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM;QACR,KAAK,cAAc,CAAC;QACpB,KAAK,aAAa;YAChB,MAAM,CAAC,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM;QACR,KAAK,aAAa;YAChB,MAAM,CAAC,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM;QACR,KAAK,kBAAkB,CAAC;QACxB,KAAK,aAAa;YAChB,MAAM,CAAC,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACtD,MAAM;QACR;YACE,uDAAuD;YACvD,IAAI,MAAM,CAAC,GAAG;gBAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,kBAAkB;AAClB,4DAA4D;AAE5D,SAAS,eAAe,CAAC,CAA0B;IACjD,OAAO;QACL,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC;QACpC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC;QAClC,OAAO,EAAE,CAAC,CAAC,OAAuC;KACnD,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAY;IACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QACxB,wEAAwE;QACxE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,KAAK,KAAK,CAAC,CAAC;gBAAE,SAAS;YAC3B,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACtD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3C,IAAI,cAAc,CAAC,EAAE,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9C,MAAM,GAAG,GAAG,KAAgC,CAAC;YAC7C,IAAI,cAAc,CAAC,GAAG,CAAC,EAAY,CAAC,EAAE,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAW,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC;AAED,SAAS,cAAc,CAAC,EAAU;IAChC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,YAAY,CAAC,CAA0B;IAC9C,MAAM,OAAO,GAAG,CAAC,GAAY,EAAE,EAAE;QAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAC1C,OAAO,GAAG;aACP,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,gEAAgE;gBAChE,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;oBACzD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBACjC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;oBACtE,OAAO,EAAE,GAAG,EAAE,CAAC;gBACjB,CAAC;gBACD,mBAAmB;gBACnB,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;YACxB,CAAC;YACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACvC,MAAM,GAAG,GAAG,KAAgC,CAAC;gBAC7C,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAgB,EAAE,CAAC;YACvE,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAwB,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChE,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QACvB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QACrB,OAAO,EAAE,CAAC,CAAC,OAAuC;KACnD,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,CAA0B;IACnD,MAAM,YAAY,GAAG,CAAC,GAAY,EAAwB,EAAE;QAC1D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAC1C,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;QAC5B,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1B,eAAe,EAAE,YAAY,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,gBAAgB,CAAC;QACtE,OAAO,EAAE,CAAC,CAAC,OAAuC;KACnD,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,CAA0B;IACrD,MAAM,WAAW,GAAG,CAAC,GAAY,EAAE,EAAE;QACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAC1C,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAU,CAAC;IAC1D,CAAC,CAAC;IAEF,OAAO;QACL,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,KAAK,CAAC;QACpE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC;QAChE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;YAC7B,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACjB,OAAO,CAAC,KAAK,QAAQ;gBACnB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;gBACb,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAE,CAA6B,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,MAAM,CAAE,CAA6B,CAAC,WAAW,IAAI,YAAY,CAAC,EAAE,CAC3I;YACH,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,CAA0B;IACjD,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,GAAY,EAAE,EAAE;QACtC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC7C,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,CAAC,CAAC;IACF,OAAO;QACL,aAAa,EAAE,GAAG,CAAC,eAAe,EAAE,gBAAgB,CAAC;QACrD,iBAAiB,EAAE,GAAG,CAAC,mBAAmB,EAAE,qBAAqB,CAAC;QAClE,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE,cAAc,CAAC;QAC7C,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC;QACzC,YAAY,EAAE,GAAG,CAAC,cAAc,EAAE,gBAAgB,CAAC;QACnD,mBAAmB,EAAE,GAAG,CAAC,qBAAqB,EAAE,uBAAuB,CAAC;KACzE,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,CAA0B;IACjD,MAAM,EAAE,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,WAAW,CAAC;IACzC,MAAM,UAAU,GACd,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ;QAC1B,CAAC,CAAC;YACE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAE,EAA8B,CAAC,QAAQ,CAAC;gBAC/D,CAAC,CAAG,EAA8B,CAAC,QAAqB;gBACxD,CAAC,CAAC,SAAS;YACb,UAAU,EAAE,KAAK,CAAC,OAAO,CAAE,EAA8B,CAAC,UAAU,CAAC;gBACnE,CAAC,CAAG,EAA8B,CAAC,UAAuB;gBAC1D,CAAC,CAAC,SAAS;SACd;QACH,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO;QACL,UAAU;QACV,SAAS,EAAE,CAAC,CAAC,SAAkB;QAC/B,gBAAgB,EAAE,OAAO,CAAC,CAAC,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC,gBAA2B,CAAC,CAAC,CAAC,SAAS;KACtG,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,CAA0B;IACjD,OAAO;QACL,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;YACrC,CAAC,CAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAW;YAC7D,CAAC,CAAC,SAAS;QACb,OAAO,EAAE,CAAC,CAAC,OAAgB;KAC5B,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,CAA0B;IACnD,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,QAAQ,KAAK,IAAI;QAC7B,OAAO,EAAE,CAAC,CAAC,OAAgB;QAC3B,UAAU,EAAE,CAAC,CAAC,UAAmB;QACjC,SAAS,EAAG,CAAC,CAAC,SAAoB,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,CAAU;QAC/D,QAAQ,EAAE,CAAC,CAAC,QAA8B;KAC3C,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,CAA0B;IAClD,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC;YAC7C,CAAC,CAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAc;YACzC,CAAC,CAAC,SAAS;QACb,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,YAAY,CAAC;YACvD,CAAC,CAAE,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,YAAY,CAAc;YAChD,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,CAA0B;IACvD,MAAM,WAAW,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,YAAY,CAAC;IACpD,IAAI,OAAsC,CAAC;IAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAsB,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC1B,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAA4B,EAAE,CAAC,CAAC;YACzD,CAAC;iBAAM,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACtC,MAAM,GAAG,GAAG,CAA4B,CAAC;gBACzC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;oBACb,SAAS,CAAC,IAAI,CAAC;wBACb,IAAI,EAAE,GAAG,CAAC,IAA+B;wBACzC,WAAW,EAAE,GAAG,CAAC,WAA6C;wBAC9D,MAAM,EAAE,GAAG,CAAC,MAA4B;qBACzC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,GAAG,SAAS,CAAC;IAChD,CAAC;IAED,OAAO;QACL,WAAW,EAAE,OAAO;QACpB,iBAAiB,EAAE,CAAC,CAAC,iBAA0B;KAChD,CAAC;AACJ,CAAC"}
|