@inhuman.tools/policy 0.0.0-stage → 0.2.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 (106) hide show
  1. package/LICENSE.md +7 -0
  2. package/authorize.scm +4 -0
  3. package/dist/acknowledge.d.ts +70 -0
  4. package/dist/acknowledge.d.ts.map +1 -0
  5. package/dist/acknowledge.js +162 -0
  6. package/dist/acknowledge.js.map +1 -0
  7. package/dist/authorize.d.ts +8 -0
  8. package/dist/authorize.d.ts.map +1 -0
  9. package/dist/authorize.js +39 -0
  10. package/dist/authorize.js.map +1 -0
  11. package/dist/bind.d.ts +6 -0
  12. package/dist/bind.d.ts.map +1 -0
  13. package/dist/bind.js +45 -0
  14. package/dist/bind.js.map +1 -0
  15. package/dist/check.d.ts +30 -0
  16. package/dist/check.d.ts.map +1 -0
  17. package/dist/check.js +389 -0
  18. package/dist/check.js.map +1 -0
  19. package/dist/classes.d.ts +23 -0
  20. package/dist/classes.d.ts.map +1 -0
  21. package/dist/classes.js +139 -0
  22. package/dist/classes.js.map +1 -0
  23. package/dist/compile.d.ts +40 -0
  24. package/dist/compile.d.ts.map +1 -0
  25. package/dist/compile.js +311 -0
  26. package/dist/compile.js.map +1 -0
  27. package/dist/deadline.d.ts +5 -0
  28. package/dist/deadline.d.ts.map +1 -0
  29. package/dist/deadline.js +17 -0
  30. package/dist/deadline.js.map +1 -0
  31. package/dist/floor.d.ts +9 -0
  32. package/dist/floor.d.ts.map +1 -0
  33. package/dist/floor.js +9 -0
  34. package/dist/floor.js.map +1 -0
  35. package/dist/glob-expand.d.ts +10 -0
  36. package/dist/glob-expand.d.ts.map +1 -0
  37. package/dist/glob-expand.js +132 -0
  38. package/dist/glob-expand.js.map +1 -0
  39. package/dist/guards.d.ts +26 -0
  40. package/dist/guards.d.ts.map +1 -0
  41. package/dist/guards.js +419 -0
  42. package/dist/guards.js.map +1 -0
  43. package/dist/identity.d.ts +11 -0
  44. package/dist/identity.d.ts.map +1 -0
  45. package/dist/identity.js +23 -0
  46. package/dist/identity.js.map +1 -0
  47. package/dist/index.d.ts +8 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +8 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/lift.d.ts +4 -0
  52. package/dist/lift.d.ts.map +1 -0
  53. package/dist/lift.js +14 -0
  54. package/dist/lift.js.map +1 -0
  55. package/dist/path-policy.d.ts +53 -0
  56. package/dist/path-policy.d.ts.map +1 -0
  57. package/dist/path-policy.js +248 -0
  58. package/dist/path-policy.js.map +1 -0
  59. package/dist/processor.d.ts +71 -0
  60. package/dist/processor.d.ts.map +1 -0
  61. package/dist/processor.js +132 -0
  62. package/dist/processor.js.map +1 -0
  63. package/dist/reasonable-defaults.d.ts +1448 -0
  64. package/dist/reasonable-defaults.d.ts.map +1 -0
  65. package/dist/reasonable-defaults.js +6 -0
  66. package/dist/reasonable-defaults.js.map +1 -0
  67. package/dist/reasonable-defaults.json +1662 -0
  68. package/dist/run-authorization.d.ts +8 -0
  69. package/dist/run-authorization.d.ts.map +1 -0
  70. package/dist/run-authorization.js +16 -0
  71. package/dist/run-authorization.js.map +1 -0
  72. package/dist/tool-path.d.ts +8 -0
  73. package/dist/tool-path.d.ts.map +1 -0
  74. package/dist/tool-path.js +38 -0
  75. package/dist/tool-path.js.map +1 -0
  76. package/dist/types.d.ts +87 -0
  77. package/dist/types.d.ts.map +1 -0
  78. package/dist/types.js +14 -0
  79. package/dist/types.js.map +1 -0
  80. package/dist/verdict.d.ts +15 -0
  81. package/dist/verdict.d.ts.map +1 -0
  82. package/dist/verdict.js +55 -0
  83. package/dist/verdict.js.map +1 -0
  84. package/package.json +62 -3
  85. package/src/acknowledge.ts +206 -0
  86. package/src/authorize.ts +38 -0
  87. package/src/bind.ts +58 -0
  88. package/src/check.ts +552 -0
  89. package/src/classes.ts +156 -0
  90. package/src/compile.ts +370 -0
  91. package/src/deadline.ts +15 -0
  92. package/src/floor.ts +16 -0
  93. package/src/glob-expand.ts +137 -0
  94. package/src/guards.ts +428 -0
  95. package/src/identity.ts +26 -0
  96. package/src/index.ts +24 -0
  97. package/src/lift.ts +15 -0
  98. package/src/path-policy.ts +280 -0
  99. package/src/processor.ts +187 -0
  100. package/src/reasonable-defaults.json +1662 -0
  101. package/src/reasonable-defaults.ts +8 -0
  102. package/src/run-authorization.ts +23 -0
  103. package/src/tool-path.ts +43 -0
  104. package/src/types.ts +102 -0
  105. package/src/verdict.ts +63 -0
  106. package/README.md +0 -3
@@ -0,0 +1,311 @@
1
+ /**
2
+ * Compile a policy.json document into CommandNode + path terms.
3
+ * `"--"` is a handle, not a subcommand: omitted `policy` inherits.
4
+ * Extra keys on a command object are refused — verbs live under `subcommands`.
5
+ */
6
+ import { ErrorWithInvariant } from "@inhuman.tools/error-with-invariant";
7
+ import { isClassId } from "./classes.js";
8
+ import { GUARDS } from "./guards.js";
9
+ import { mergePathTerms, normalizePath } from "./path-policy.js";
10
+ export class PolicyCompileError extends ErrorWithInvariant {
11
+ name = "PolicyCompileError";
12
+ }
13
+ export class PolicyAssumeError extends ErrorWithInvariant {
14
+ name = "PolicyAssumeError";
15
+ expected;
16
+ actual;
17
+ command;
18
+ constructor(message, detail) {
19
+ super(message);
20
+ if (detail !== undefined) {
21
+ this.expected = detail.expected;
22
+ this.actual = detail.actual;
23
+ this.command = detail.command;
24
+ }
25
+ }
26
+ }
27
+ const DISPS = new Set(["policyApprove", "approve", "allow", "ask", "deny", "block"]);
28
+ const RESERVED = new Set([
29
+ "policy",
30
+ "class",
31
+ "family_args",
32
+ "arg_types",
33
+ "arg_rest_type",
34
+ "flag_paths",
35
+ "guard",
36
+ "matcher",
37
+ "--",
38
+ "subcommands",
39
+ ]);
40
+ export function compilePolicy(document) {
41
+ const raw = document;
42
+ if (raw === null || raw === undefined)
43
+ return { assume: [] };
44
+ PolicyCompileError.invariant(isRecord(raw), "policy.json: document must be a mapping");
45
+ const unknown = Object.keys(raw).filter((key) => !key.startsWith(".") &&
46
+ ![
47
+ "read_file",
48
+ "write_file",
49
+ "read_block",
50
+ "write_block",
51
+ "bash",
52
+ "assume",
53
+ "read_miss_class",
54
+ "write_miss_class",
55
+ ].includes(key));
56
+ PolicyCompileError.invariant(unknown.length === 0, `policy.json: unknown top-level key ${unknown[0]}`);
57
+ const readMiss = parseClass(raw.read_miss_class, "read_miss_class") ?? "envelope-read";
58
+ const writeMiss = parseClass(raw.write_miss_class, "write_miss_class") ?? "envelope-write";
59
+ return {
60
+ bash: raw.bash === undefined ? undefined : parseCommandDef(raw.bash, "bash", true),
61
+ read: mergePathTerms("read", readMiss, parsePathList(raw.read_file, "read_file", "policyApprove", "envelope-read"), parseBlockList(raw.read_block, "read_block", "credential")),
62
+ write: mergePathTerms("write", writeMiss, parsePathList(raw.write_file, "write_file", "ask", "workspace-write"), parseBlockList(raw.write_block, "write_block", "control-plane")),
63
+ assume: parseAssume(raw.assume),
64
+ };
65
+ }
66
+ /** A class id from the closed taxonomy. An unknown id is a compile error, never a new class. */
67
+ function parseClass(value, path) {
68
+ if (value === undefined)
69
+ return undefined;
70
+ PolicyCompileError.invariant(isClassId(value), `policy.json: unknown class ${String(value)} at ${path}`);
71
+ return value;
72
+ }
73
+ /** A path item is a string, or `{ path, class }` to tag the rule with a dist class. */
74
+ function pathItem(item, field) {
75
+ if (typeof item === "string")
76
+ return { pattern: item };
77
+ PolicyCompileError.invariant(isRecord(item), `${field}: each pattern is a string or { path, class }`);
78
+ const extra = Object.keys(item).filter((key) => key !== "path" && key !== "class");
79
+ PolicyCompileError.invariant(extra.length === 0, `${field}: unknown key ${extra[0]}`);
80
+ PolicyCompileError.invariant(typeof item.path === "string", `${field}: { path } is a string`);
81
+ return { pattern: item.path, class: parseClass(item.class, `${field}.class`) };
82
+ }
83
+ function parsePathList(value, field, enable, enableClass) {
84
+ if (value === undefined)
85
+ return undefined;
86
+ PolicyCompileError.invariant(Array.isArray(value), `${field}: list of strings`);
87
+ return value.map((raw) => {
88
+ const { pattern: item, class: tagged } = pathItem(raw, field);
89
+ PolicyCompileError.invariant(!item.startsWith("-"), "path pattern: - is not a prefix; ! is deny on the enable list");
90
+ const deny = item.startsWith("!");
91
+ const stem = normalizePath(deny ? item.slice(1) : item);
92
+ PolicyCompileError.invariant(stem !== undefined, "path pattern: empty or unresolvable");
93
+ return {
94
+ id: `${field}:${deny ? "!" : ""}${stem}`,
95
+ polarity: deny ? "deny" : enable,
96
+ stem,
97
+ unanchored: stem !== "." && !stem.startsWith("/") && !stem.includes("/"),
98
+ class: tagged ?? (deny ? "protected-file" : enableClass),
99
+ };
100
+ });
101
+ }
102
+ function parseBlockList(value, field, defaultClass) {
103
+ if (value === undefined)
104
+ return undefined;
105
+ PolicyCompileError.invariant(Array.isArray(value), `${field}: list of strings`);
106
+ return value.map((raw) => {
107
+ const { pattern: item, class: tagged } = pathItem(raw, field);
108
+ PolicyCompileError.invariant(!item.startsWith("!") && !item.startsWith("-"), "block list: stem without a polarity prefix");
109
+ const stem = normalizePath(item);
110
+ PolicyCompileError.invariant(stem !== undefined, "path pattern: empty or unresolvable");
111
+ return {
112
+ id: `${field}:${stem}`,
113
+ polarity: "block",
114
+ stem,
115
+ unanchored: stem !== "." && !stem.startsWith("/") && !stem.includes("/"),
116
+ class: tagged ?? defaultClass,
117
+ };
118
+ });
119
+ }
120
+ function parseAssume(value) {
121
+ if (value === undefined)
122
+ return [];
123
+ PolicyCompileError.invariant(Array.isArray(value), "assume: list of { command, expect }");
124
+ return value.map((item, i) => {
125
+ PolicyCompileError.invariant(isRecord(item), `assume[${i}]: mapping`);
126
+ PolicyCompileError.invariant(typeof item.command === "string", `assume[${i}]: command is a string`);
127
+ const expect = asDisposition(item.expect);
128
+ PolicyCompileError.invariant(expect !== undefined, `assume[${i}]: expect is approve|ask|deny|block`);
129
+ const expectClass = parseClass(item.expect_class, `assume[${i}].expect_class`);
130
+ return { command: item.command, expect, ...(expectClass === undefined ? {} : { expectClass }) };
131
+ });
132
+ }
133
+ function parseFamilyArgs(value, path) {
134
+ if (value === undefined)
135
+ return 0;
136
+ PolicyCompileError.invariant(typeof value === "number" && Number.isInteger(value) && value >= 0 && value <= 4, `${path}.family_args: integer 0..4`);
137
+ return value;
138
+ }
139
+ function parseCommandDef(value, path, policyRequired) {
140
+ const disp = asDisposition(value);
141
+ if (disp !== undefined) {
142
+ return { policy: disp, familyArgs: 0, argTypes: [], flagPaths: {}, guards: [], matchers: [], subcommands: {} };
143
+ }
144
+ PolicyCompileError.invariant(isRecord(value), `${path}: command is a disposition or a mapping`);
145
+ const extra = Object.keys(value).filter((key) => !RESERVED.has(key));
146
+ PolicyCompileError.invariant(extra.length === 0, `${path}: unknown key ${extra[0]} — verbs go under subcommands`);
147
+ const policy = value.policy === undefined ? undefined : asDisposition(value.policy);
148
+ PolicyCompileError.invariant(value.policy === undefined || policy !== undefined, `${path}.policy: approve|ask|deny|block`);
149
+ PolicyCompileError.invariant(!policyRequired || policy !== undefined, `${path}: policy is required`);
150
+ const subcommands = {};
151
+ if (value.subcommands !== undefined) {
152
+ PolicyCompileError.invariant(isRecord(value.subcommands), `${path}.subcommands: mapping`);
153
+ for (const [name, def] of Object.entries(value.subcommands)) {
154
+ subcommands[String(name)] = parseCommandDef(def, `${path}.subcommands.${name}`, true);
155
+ }
156
+ }
157
+ return {
158
+ policy,
159
+ class: parseClass(value.class, `${path}.class`),
160
+ familyArgs: parseFamilyArgs(value.family_args, path),
161
+ argTypes: parseArgTypes(value.arg_types, `${path}.arg_types`),
162
+ argRestType: parseArgType(value.arg_rest_type, `${path}.arg_rest_type`),
163
+ flagPaths: parseFlagPaths(value.flag_paths, `${path}.flag_paths`),
164
+ guards: parseGuards(value.guard, `${path}.guard`),
165
+ matchers: parseMatchers(value.matcher, `${path}.matcher`),
166
+ dash: value["--"] === undefined ? undefined : parseCommandDef(value["--"], `${path}.--`, false),
167
+ subcommands,
168
+ };
169
+ }
170
+ function parseArgTypes(value, path) {
171
+ if (value === undefined)
172
+ return [];
173
+ PolicyCompileError.invariant(Array.isArray(value), `${path}: list`);
174
+ return value.map((item, i) => {
175
+ const parsed = parseArgType(item, `${path}[${i}]`);
176
+ PolicyCompileError.invariant(parsed !== undefined, `${path}[${i}]: missing`);
177
+ return parsed;
178
+ });
179
+ }
180
+ function parseArgType(value, path) {
181
+ if (value === undefined)
182
+ return undefined;
183
+ PolicyCompileError.invariant(value === "read_path" || value === "write_path", `${path}: read_path|write_path`);
184
+ return value;
185
+ }
186
+ /** `{ "--output": "write_path", "-o": "write_path" }`. Long names also match every unambiguous-prefix spelling. */
187
+ function parseFlagPaths(value, path) {
188
+ if (value === undefined)
189
+ return {};
190
+ PolicyCompileError.invariant(isRecord(value), `${path}: mapping of option to read_path|write_path`);
191
+ const out = {};
192
+ for (const [name, kind] of Object.entries(value)) {
193
+ PolicyCompileError.invariant(name.startsWith("-"), `${path}.${name}: option name`);
194
+ const parsed = parseArgType(kind, `${path}.${name}`);
195
+ PolicyCompileError.invariant(parsed !== undefined, `${path}.${name}: missing`);
196
+ for (const spelling of withPrefixes([name]))
197
+ out[spelling] = parsed;
198
+ }
199
+ return out;
200
+ }
201
+ function parseGuards(value, path) {
202
+ const names = stringList(value, path);
203
+ for (const name of names)
204
+ PolicyCompileError.invariant(GUARDS.has(name), `${path}: unknown guard ${name}`);
205
+ return names;
206
+ }
207
+ /** getopt_long accepts any unique prefix of a long option; the policy treats every prefix as the option. */
208
+ function withPrefixes(names) {
209
+ const out = new Set(names);
210
+ for (const name of names) {
211
+ if (!name.startsWith("--"))
212
+ continue;
213
+ for (let end = 3; end < name.length; end += 1)
214
+ out.add(name.slice(0, end));
215
+ }
216
+ return [...out];
217
+ }
218
+ function parseMatchers(value, path) {
219
+ if (value === undefined)
220
+ return [];
221
+ PolicyCompileError.invariant(Array.isArray(value), `${path}: list`);
222
+ return value.map((item, i) => {
223
+ const here = `${path}[${i}]`;
224
+ PolicyCompileError.invariant(isRecord(item), `${here}: mapping`);
225
+ const extra = Object.keys(item).filter((key) => !["flags", "glob", "tok", "matcher", "policy", "class"].includes(key));
226
+ PolicyCompileError.invariant(extra.length === 0, `${here}: unknown key ${extra[0]}`);
227
+ const policy = item.policy === undefined ? undefined : asDisposition(item.policy);
228
+ PolicyCompileError.invariant(item.policy === undefined || policy !== undefined, `${here}.policy: approve|ask|deny|block`);
229
+ return {
230
+ class: parseClass(item.class, `${here}.class`),
231
+ flags: parseFlags(item.flags, `${here}.flags`),
232
+ globs: stringList(item.glob, `${here}.glob`),
233
+ toks: stringList(item.tok, `${here}.tok`),
234
+ matchers: parseMatchers(item.matcher, `${here}.matcher`),
235
+ policy,
236
+ };
237
+ });
238
+ }
239
+ function parseFlags(value, path) {
240
+ if (value === undefined)
241
+ return {};
242
+ PolicyCompileError.invariant(isRecord(value), `${path}: mapping`);
243
+ const out = {};
244
+ for (const [raw, spec] of Object.entries(value)) {
245
+ const canonical = String(raw);
246
+ out[canonical] = parseFlagConstraint(spec, canonical, `${path}.${canonical}`);
247
+ }
248
+ return out;
249
+ }
250
+ function parseFlagConstraint(value, canonical, path) {
251
+ if (value === true || value === null) {
252
+ return { names: [canonical], vals: [], takesValue: false };
253
+ }
254
+ PolicyCompileError.invariant(isRecord(value), `${path}: true or { alias, value, value_type }`);
255
+ const extra = Object.keys(value).filter((key) => !["alias", "value", "value_type", "abbrev"].includes(key));
256
+ PolicyCompileError.invariant(extra.length === 0, `${path}: unknown key ${extra[0]}`);
257
+ const aliases = stringList(value.alias, `${path}.alias`);
258
+ const vals = stringList(value.value, `${path}.value`);
259
+ const takesValue = vals.length > 0 || value.value_type !== undefined;
260
+ if (value.value_type !== undefined) {
261
+ PolicyCompileError.invariant(typeof value.value_type === "string", `${path}.value_type: string`);
262
+ }
263
+ PolicyCompileError.invariant(value.abbrev === undefined || typeof value.abbrev === "boolean", `${path}.abbrev: boolean`);
264
+ const names = [canonical, ...aliases];
265
+ return { names: value.abbrev === true ? withPrefixes(names) : names, vals, takesValue };
266
+ }
267
+ function stringList(value, path) {
268
+ if (value === undefined)
269
+ return [];
270
+ if (typeof value === "string")
271
+ return [value];
272
+ PolicyCompileError.invariant(Array.isArray(value), `${path}: string or list of strings`);
273
+ return value.map((item, i) => {
274
+ PolicyCompileError.invariant(typeof item === "string", `${path}[${i}]: string`);
275
+ return item;
276
+ });
277
+ }
278
+ function asDisposition(value) {
279
+ if (typeof value !== "string" || !DISPS.has(value))
280
+ return undefined;
281
+ if (value === "allow" || value === "approve" || value === "policyApprove")
282
+ return "policyApprove";
283
+ return value;
284
+ }
285
+ export function flagVocab(node) {
286
+ const names = new Set();
287
+ addMatcherFlags(node.matchers, names, false);
288
+ return names;
289
+ }
290
+ export function valueFlagNames(node) {
291
+ const names = new Set();
292
+ addMatcherFlags(node.matchers, names, true);
293
+ for (const name of Object.keys(node.flagPaths))
294
+ names.add(name);
295
+ return names;
296
+ }
297
+ function addMatcherFlags(matchers, names, valueOnly) {
298
+ for (const matcher of matchers) {
299
+ for (const flag of Object.values(matcher.flags)) {
300
+ if (valueOnly && !flag.takesValue)
301
+ continue;
302
+ for (const name of flag.names)
303
+ names.add(name);
304
+ }
305
+ addMatcherFlags(matcher.matchers, names, valueOnly);
306
+ }
307
+ }
308
+ function isRecord(value) {
309
+ return value !== null && typeof value === "object" && !Array.isArray(value);
310
+ }
311
+ //# sourceMappingURL=compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Judge budget shared by the adapters. Crush's hook self-bounds at the same 20 s. */
2
+ export declare const JUDGE_DEADLINE_MS = 20000;
3
+ /** Reject when `work` has not settled in `ms`; the caller maps a rejection to deny. */
4
+ export declare function withDeadline<T>(work: Promise<T>, ms?: number): Promise<T>;
5
+ //# sourceMappingURL=deadline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deadline.d.ts","sourceRoot":"","sources":["../src/deadline.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,eAAO,MAAM,iBAAiB,QAAS,CAAC;AAExC,uFAAuF;AACvF,wBAAsB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,GAAE,MAA0B,GAAG,OAAO,CAAC,CAAC,CAAC,CAUlG"}
@@ -0,0 +1,17 @@
1
+ /** Judge budget shared by the adapters. Crush's hook self-bounds at the same 20 s. */
2
+ export const JUDGE_DEADLINE_MS = 20_000;
3
+ /** Reject when `work` has not settled in `ms`; the caller maps a rejection to deny. */
4
+ export async function withDeadline(work, ms = JUDGE_DEADLINE_MS) {
5
+ let timer;
6
+ const expired = new Promise((_resolve, reject) => {
7
+ timer = setTimeout(() => reject(new Error("authorization timed out")), ms);
8
+ });
9
+ try {
10
+ return await Promise.race([work, expired]);
11
+ }
12
+ finally {
13
+ if (timer !== undefined)
14
+ clearTimeout(timer);
15
+ }
16
+ }
17
+ //# sourceMappingURL=deadline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deadline.js","sourceRoot":"","sources":["../src/deadline.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAExC,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,IAAgB,EAAE,KAAa,iBAAiB;IACpF,IAAI,KAAgD,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;QACtD,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IACH,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7C,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,KAAK,SAAS;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { bindPolicy } from "./bind.js";
2
+ export { CLASS_IDS, CLASSES, isClassId, TIER_NAMES, type ClassId, type ClassInfo } from "./classes.js";
3
+ export { whichOnPath, type Which } from "./identity.js";
4
+ export { lattice } from "./lift.js";
5
+ export { classifierResources, policyEnvCapability, processorCapability } from "./processor.js";
6
+ export { reasonableDefaultsSource } from "./reasonable-defaults.js";
7
+ export { classesOf, type Disposition, type FloorVerdict, type FloorVote, type LiftKind, type Policy, type UnitIdentity, } from "./types.js";
8
+ export { APPROVE, cast, join } from "./verdict.js";
9
+ //# sourceMappingURL=floor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floor.d.ts","sourceRoot":"","sources":["../src/floor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AACvG,OAAO,EAAE,WAAW,EAAE,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EACL,SAAS,EACT,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC"}
package/dist/floor.js ADDED
@@ -0,0 +1,9 @@
1
+ export { bindPolicy } from "./bind.js";
2
+ export { CLASS_IDS, CLASSES, isClassId, TIER_NAMES } from "./classes.js";
3
+ export { whichOnPath } from "./identity.js";
4
+ export { lattice } from "./lift.js";
5
+ export { classifierResources, policyEnvCapability, processorCapability } from "./processor.js";
6
+ export { reasonableDefaultsSource } from "./reasonable-defaults.js";
7
+ export { classesOf, } from "./types.js";
8
+ export { APPROVE, cast, join } from "./verdict.js";
9
+ //# sourceMappingURL=floor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floor.js","sourceRoot":"","sources":["../src/floor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAgC,MAAM,cAAc,CAAC;AACvG,OAAO,EAAE,WAAW,EAAc,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EACL,SAAS,GAOV,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Lexical brace expansion (`.e{nv,x}`, `a{1..3}`, `{a,b}{c,d}`), the way bash does it before
3
+ * globbing. Used to judge a shell word as every word it could become. Bounded: past `limit`
4
+ * words the caller falls back to a wildcard superset.
5
+ */
6
+ export declare function expandBraces(word: string, limit?: number): {
7
+ readonly words: readonly string[];
8
+ readonly overflow: boolean;
9
+ };
10
+ //# sourceMappingURL=glob-expand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob-expand.d.ts","sourceRoot":"","sources":["../src/glob-expand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAsB,GAC5B;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAgBnE"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Lexical brace expansion (`.e{nv,x}`, `a{1..3}`, `{a,b}{c,d}`), the way bash does it before
3
+ * globbing. Used to judge a shell word as every word it could become. Bounded: past `limit`
4
+ * words the caller falls back to a wildcard superset.
5
+ */
6
+ const DEFAULT_LIMIT = 256;
7
+ export function expandBraces(word, limit = DEFAULT_LIMIT) {
8
+ const done = [];
9
+ const work = [word];
10
+ while (work.length > 0) {
11
+ const next = work.pop();
12
+ const group = firstGroup(next);
13
+ if (group === undefined) {
14
+ done.push(next);
15
+ }
16
+ else {
17
+ const head = next.slice(0, group.start);
18
+ const tail = next.slice(group.end + 1);
19
+ for (const item of group.items)
20
+ work.push(`${head}${item}${tail}`);
21
+ }
22
+ if (done.length + work.length > limit)
23
+ return { words: [], overflow: true };
24
+ }
25
+ return { words: done.toReversed(), overflow: false };
26
+ }
27
+ /** The first top-level `{...}` that bash would expand (a comma list or a range), or undefined. */
28
+ function firstGroup(text) {
29
+ for (let start = 0; start < text.length; start += 1) {
30
+ if (text[start] === "\\") {
31
+ start += 1;
32
+ continue;
33
+ }
34
+ if (text[start] !== "{")
35
+ continue;
36
+ const end = matchingBrace(text, start);
37
+ if (end === undefined)
38
+ continue;
39
+ const body = text.slice(start + 1, end);
40
+ const items = commaItems(body) ?? rangeItems(body);
41
+ if (items !== undefined)
42
+ return { start, end, items };
43
+ }
44
+ return undefined;
45
+ }
46
+ function matchingBrace(text, start) {
47
+ let depth = 0;
48
+ for (let i = start; i < text.length; i += 1) {
49
+ const ch = text[i];
50
+ switch (ch) {
51
+ case "\\": {
52
+ i += 1;
53
+ break;
54
+ }
55
+ case "{": {
56
+ depth += 1;
57
+ break;
58
+ }
59
+ case "}": {
60
+ depth -= 1;
61
+ if (depth === 0)
62
+ return i;
63
+ break;
64
+ }
65
+ // No default
66
+ }
67
+ }
68
+ return undefined;
69
+ }
70
+ /** Items of a top-level comma list. Undefined when there is no top-level comma. */
71
+ function commaItems(body) {
72
+ const items = [];
73
+ let depth = 0;
74
+ let from = 0;
75
+ for (let i = 0; i < body.length; i += 1) {
76
+ const ch = body[i];
77
+ switch (ch) {
78
+ case "\\": {
79
+ i += 1;
80
+ break;
81
+ }
82
+ case "{": {
83
+ depth += 1;
84
+ break;
85
+ }
86
+ case "}": {
87
+ depth -= 1;
88
+ break;
89
+ }
90
+ default:
91
+ if (ch === "," && depth === 0) {
92
+ items.push(body.slice(from, i));
93
+ from = i + 1;
94
+ }
95
+ }
96
+ }
97
+ if (items.length === 0)
98
+ return undefined;
99
+ items.push(body.slice(from));
100
+ return items;
101
+ }
102
+ const RANGE = /^(-?\d+|[A-Z])\.\.(-?\d+|[A-Z])(?:\.\.(-?\d+))?$/i;
103
+ const MAX_RANGE = 1024;
104
+ function rangeItems(body) {
105
+ const match = RANGE.exec(body);
106
+ if (match === null)
107
+ return undefined;
108
+ const [, a, b, stepText] = match;
109
+ const step = Math.max(1, Math.abs(Number(stepText ?? "1")) || 1);
110
+ const out = [];
111
+ if (/^-?\d+$/.test(a) && /^-?\d+$/.test(b)) {
112
+ const from = Number(a);
113
+ const to = Number(b);
114
+ const width = /^-?0\d/.test(a) || /^-?0\d/.test(b) ? Math.max(a.replace("-", "").length, b.replace("-", "").length) : 0;
115
+ if (Math.abs(to - from) / step > MAX_RANGE)
116
+ return Array.from({ length: MAX_RANGE + 1 }, (_, i) => String(i));
117
+ for (let n = from; from <= to ? n <= to : n >= to; n += from <= to ? step : -step) {
118
+ const text = String(Math.abs(n)).padStart(width, "0");
119
+ out.push(n < 0 ? `-${text}` : text);
120
+ }
121
+ return out;
122
+ }
123
+ if (a.length === 1 && b.length === 1 && !/\d/.test(a + b)) {
124
+ const from = a.codePointAt(0);
125
+ const to = b.codePointAt(0);
126
+ for (let c = from; from <= to ? c <= to : c >= to; c += from <= to ? step : -step)
127
+ out.push(String.fromCodePoint(c));
128
+ return out;
129
+ }
130
+ return undefined;
131
+ }
132
+ //# sourceMappingURL=glob-expand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob-expand.js","sourceRoot":"","sources":["../src/glob-expand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Argument guards: what an option table cannot say. A guard sees the command
3
+ * node's positionals and flag bag and returns extra votes that join the node's
4
+ * own vote on the strict lattice, so a guard can tighten a verdict, never lift it.
5
+ *
6
+ * `flag_paths` (option values typed as paths, glued short values included) is
7
+ * a guard that every node gets for free.
8
+ */
9
+ import { type PathTerm } from "./path-policy.js";
10
+ import type { ArgType, CommandNode, FloorVerdict } from "./types.js";
11
+ export type GuardPaths = {
12
+ readonly read?: PathTerm;
13
+ readonly write?: PathTerm;
14
+ /** The shell would expand this question's words: judge braces and globs as what they could become. */
15
+ readonly expand?: boolean;
16
+ /** `dotglob` is set somewhere in the command: `*` may match a leading dot. */
17
+ readonly dotglob?: boolean;
18
+ };
19
+ type Flags = Readonly<Record<string, readonly string[]>>;
20
+ export declare function guardVotes(node: CommandNode, toks: readonly string[], flags: Flags, paths: GuardPaths): FloorVerdict[];
21
+ export declare function pathVote(kind: ArgType, path: string, paths: GuardPaths): FloorVerdict;
22
+ /** Conservative sed parser: true only for scripts it fully understands and finds inert. */
23
+ export declare function sedScriptIsPlain(script: string): boolean;
24
+ export declare const GUARDS: ReadonlySet<string>;
25
+ export {};
26
+ //# sourceMappingURL=guards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../src/guards.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAiC,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAe,YAAY,EAAE,MAAM,YAAY,CAAC;AAGlF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;IAC1B,sGAAsG;IACtG,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,KAAK,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;AAIzD,wBAAgB,UAAU,CACxB,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,UAAU,GAChB,YAAY,EAAE,CAMhB;AAMD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,YAAY,CAMrF;AAwKD,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CA2GxD;AAoGD,eAAO,MAAM,MAAM,EAAE,WAAW,CAAC,MAAM,CAAqC,CAAC"}