@inhuman.tools/policy 0.0.0-stage → 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.
Files changed (141) hide show
  1. package/authorize.scm +4 -0
  2. package/dist/acknowledge.d.ts +70 -0
  3. package/dist/acknowledge.d.ts.map +1 -0
  4. package/dist/acknowledge.js +162 -0
  5. package/dist/acknowledge.js.map +1 -0
  6. package/dist/authorize.d.ts +8 -0
  7. package/dist/authorize.d.ts.map +1 -0
  8. package/dist/authorize.js +39 -0
  9. package/dist/authorize.js.map +1 -0
  10. package/dist/bind.d.ts +6 -0
  11. package/dist/bind.d.ts.map +1 -0
  12. package/dist/bind.js +45 -0
  13. package/dist/bind.js.map +1 -0
  14. package/dist/check.d.ts +30 -0
  15. package/dist/check.d.ts.map +1 -0
  16. package/dist/check.js +389 -0
  17. package/dist/check.js.map +1 -0
  18. package/dist/classes.d.ts +23 -0
  19. package/dist/classes.d.ts.map +1 -0
  20. package/dist/classes.js +139 -0
  21. package/dist/classes.js.map +1 -0
  22. package/dist/compile.d.ts +40 -0
  23. package/dist/compile.d.ts.map +1 -0
  24. package/dist/compile.js +311 -0
  25. package/dist/compile.js.map +1 -0
  26. package/dist/deadline.d.ts +5 -0
  27. package/dist/deadline.d.ts.map +1 -0
  28. package/dist/deadline.js +17 -0
  29. package/dist/deadline.js.map +1 -0
  30. package/dist/decide.d.ts +64 -0
  31. package/dist/decide.d.ts.map +1 -0
  32. package/dist/decide.js +482 -0
  33. package/dist/decide.js.map +1 -0
  34. package/dist/error-with-invariant.d.ts +9 -0
  35. package/dist/error-with-invariant.d.ts.map +1 -0
  36. package/dist/error-with-invariant.js +12 -0
  37. package/dist/error-with-invariant.js.map +1 -0
  38. package/dist/floor.d.ts +9 -0
  39. package/dist/floor.d.ts.map +1 -0
  40. package/dist/floor.js +9 -0
  41. package/dist/floor.js.map +1 -0
  42. package/dist/glob-expand.d.ts +10 -0
  43. package/dist/glob-expand.d.ts.map +1 -0
  44. package/dist/glob-expand.js +132 -0
  45. package/dist/glob-expand.js.map +1 -0
  46. package/dist/guards.d.ts +26 -0
  47. package/dist/guards.d.ts.map +1 -0
  48. package/dist/guards.js +419 -0
  49. package/dist/guards.js.map +1 -0
  50. package/dist/identity.d.ts +11 -0
  51. package/dist/identity.d.ts.map +1 -0
  52. package/dist/identity.js +23 -0
  53. package/dist/identity.js.map +1 -0
  54. package/dist/index.d.ts +8 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +8 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/license-law.d.ts +43 -0
  59. package/dist/license-law.d.ts.map +1 -0
  60. package/dist/license-law.js +129 -0
  61. package/dist/license-law.js.map +1 -0
  62. package/dist/license.d.ts +3 -0
  63. package/dist/license.d.ts.map +1 -0
  64. package/dist/license.js +2 -0
  65. package/dist/license.js.map +1 -0
  66. package/dist/lift.d.ts +4 -0
  67. package/dist/lift.d.ts.map +1 -0
  68. package/dist/lift.js +14 -0
  69. package/dist/lift.js.map +1 -0
  70. package/dist/path-policy.d.ts +53 -0
  71. package/dist/path-policy.d.ts.map +1 -0
  72. package/dist/path-policy.js +248 -0
  73. package/dist/path-policy.js.map +1 -0
  74. package/dist/peel-cwd.d.ts +8 -0
  75. package/dist/peel-cwd.d.ts.map +1 -0
  76. package/dist/peel-cwd.js +120 -0
  77. package/dist/peel-cwd.js.map +1 -0
  78. package/dist/prep.d.ts +58 -0
  79. package/dist/prep.d.ts.map +1 -0
  80. package/dist/prep.js +690 -0
  81. package/dist/prep.js.map +1 -0
  82. package/dist/processor.d.ts +71 -0
  83. package/dist/processor.d.ts.map +1 -0
  84. package/dist/processor.js +132 -0
  85. package/dist/processor.js.map +1 -0
  86. package/dist/reasonable-defaults.d.ts +1448 -0
  87. package/dist/reasonable-defaults.d.ts.map +1 -0
  88. package/dist/reasonable-defaults.js +6 -0
  89. package/dist/reasonable-defaults.js.map +1 -0
  90. package/dist/reasonable-defaults.json +1662 -0
  91. package/dist/run-authorization.d.ts +8 -0
  92. package/dist/run-authorization.d.ts.map +1 -0
  93. package/dist/run-authorization.js +16 -0
  94. package/dist/run-authorization.js.map +1 -0
  95. package/dist/schemas/tirith.d.ts +58 -0
  96. package/dist/schemas/tirith.d.ts.map +1 -0
  97. package/dist/schemas/tirith.js +23 -0
  98. package/dist/schemas/tirith.js.map +1 -0
  99. package/dist/tirith-units.d.ts +2 -0
  100. package/dist/tirith-units.d.ts.map +1 -0
  101. package/dist/tirith-units.js +227 -0
  102. package/dist/tirith-units.js.map +1 -0
  103. package/dist/tirith.d.ts +24 -0
  104. package/dist/tirith.d.ts.map +1 -0
  105. package/dist/tirith.js +311 -0
  106. package/dist/tirith.js.map +1 -0
  107. package/dist/tool-path.d.ts +8 -0
  108. package/dist/tool-path.d.ts.map +1 -0
  109. package/dist/tool-path.js +38 -0
  110. package/dist/tool-path.js.map +1 -0
  111. package/dist/types.d.ts +87 -0
  112. package/dist/types.d.ts.map +1 -0
  113. package/dist/types.js +14 -0
  114. package/dist/types.js.map +1 -0
  115. package/dist/verdict.d.ts +15 -0
  116. package/dist/verdict.d.ts.map +1 -0
  117. package/dist/verdict.js +55 -0
  118. package/dist/verdict.js.map +1 -0
  119. package/package.json +62 -3
  120. package/src/acknowledge.ts +206 -0
  121. package/src/authorize.ts +38 -0
  122. package/src/bind.ts +58 -0
  123. package/src/check.ts +552 -0
  124. package/src/classes.ts +156 -0
  125. package/src/compile.ts +370 -0
  126. package/src/deadline.ts +15 -0
  127. package/src/floor.ts +16 -0
  128. package/src/glob-expand.ts +137 -0
  129. package/src/guards.ts +428 -0
  130. package/src/identity.ts +26 -0
  131. package/src/index.ts +24 -0
  132. package/src/lift.ts +15 -0
  133. package/src/path-policy.ts +280 -0
  134. package/src/processor.ts +187 -0
  135. package/src/reasonable-defaults.json +1662 -0
  136. package/src/reasonable-defaults.ts +8 -0
  137. package/src/run-authorization.ts +23 -0
  138. package/src/tool-path.ts +43 -0
  139. package/src/types.ts +102 -0
  140. package/src/verdict.ts +63 -0
  141. package/README.md +0 -3
@@ -0,0 +1,8 @@
1
+ import { type EnvCapability } from "@here.build/arrival";
2
+ export declare function authorize(document: string, options: {
3
+ readonly capability: EnvCapability;
4
+ readonly config?: Readonly<Record<string, unknown>>;
5
+ readonly program?: string;
6
+ readonly env?: NodeJS.ProcessEnv;
7
+ }): Promise<"allow" | "deny" | null>;
8
+ //# sourceMappingURL=run-authorization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-authorization.d.ts","sourceRoot":"","sources":["../src/run-authorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAI1E,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IACP,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAClC,GACA,OAAO,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,CAUlC"}
@@ -0,0 +1,16 @@
1
+ import { execState, toJS } from "@here.build/arrival";
2
+ import { authorizationSource } from "./authorize.js";
3
+ export async function authorize(document, options) {
4
+ const state = await execState(authorizationSource(options.program, options.env), {
5
+ capabilities: [options.capability],
6
+ config: { ...options.config, document },
7
+ });
8
+ const value = state.values.at(0);
9
+ if (value === undefined)
10
+ return null;
11
+ const decided = toJS(value);
12
+ if (decided === "allow" || decided === "deny")
13
+ return decided;
14
+ return null;
15
+ }
16
+ //# sourceMappingURL=run-authorization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-authorization.js","sourceRoot":"","sources":["../src/run-authorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAsB,MAAM,qBAAqB,CAAC;AAE1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAAgB,EAChB,OAKC;IAED,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE;QAC/E,YAAY,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;QAClC,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE;KACxC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,OAAO,CAAC;IAC9D,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { z } from "zod";
2
+ export declare const findingEvidenceSchema: z.ZodObject<{
3
+ matched: z.ZodOptional<z.ZodString>;
4
+ raw: z.ZodOptional<z.ZodString>;
5
+ pattern: z.ZodOptional<z.ZodString>;
6
+ type: z.ZodOptional<z.ZodString>;
7
+ }, z.core.$strip>;
8
+ export declare const findingSchema: z.ZodObject<{
9
+ rule_id: z.ZodString;
10
+ severity: z.ZodEnum<{
11
+ INFO: "INFO";
12
+ LOW: "LOW";
13
+ MEDIUM: "MEDIUM";
14
+ HIGH: "HIGH";
15
+ CRITICAL: "CRITICAL";
16
+ }>;
17
+ title: z.ZodString;
18
+ description: z.ZodString;
19
+ remediation: z.ZodOptional<z.ZodString>;
20
+ evidence: z.ZodOptional<z.ZodArray<z.ZodObject<{
21
+ matched: z.ZodOptional<z.ZodString>;
22
+ raw: z.ZodOptional<z.ZodString>;
23
+ pattern: z.ZodOptional<z.ZodString>;
24
+ type: z.ZodOptional<z.ZodString>;
25
+ }, z.core.$strip>>>;
26
+ }, z.core.$strip>;
27
+ export declare const outputSchema: z.ZodObject<{
28
+ schema_version: z.ZodLiteral<3>;
29
+ action: z.ZodEnum<{
30
+ block: "block";
31
+ allow: "allow";
32
+ warn: "warn";
33
+ }>;
34
+ findings: z.ZodArray<z.ZodObject<{
35
+ rule_id: z.ZodString;
36
+ severity: z.ZodEnum<{
37
+ INFO: "INFO";
38
+ LOW: "LOW";
39
+ MEDIUM: "MEDIUM";
40
+ HIGH: "HIGH";
41
+ CRITICAL: "CRITICAL";
42
+ }>;
43
+ title: z.ZodString;
44
+ description: z.ZodString;
45
+ remediation: z.ZodOptional<z.ZodString>;
46
+ evidence: z.ZodOptional<z.ZodArray<z.ZodObject<{
47
+ matched: z.ZodOptional<z.ZodString>;
48
+ raw: z.ZodOptional<z.ZodString>;
49
+ pattern: z.ZodOptional<z.ZodString>;
50
+ type: z.ZodOptional<z.ZodString>;
51
+ }, z.core.$strip>>>;
52
+ }, z.core.$strip>>;
53
+ bypass_honored: z.ZodLiteral<false>;
54
+ policy_path_used: z.ZodOptional<z.ZodNullable<z.ZodString>>;
55
+ }, z.core.$strip>;
56
+ export type TirithFinding = z.infer<typeof findingSchema>;
57
+ export type TirithOutput = z.infer<typeof outputSchema>;
58
+ //# sourceMappingURL=tirith.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tirith.d.ts","sourceRoot":"","sources":["../../src/schemas/tirith.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,qBAAqB;;;;;iBAKhC,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;iBAOxB,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAMvB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { z } from "zod";
2
+ export const findingEvidenceSchema = z.object({
3
+ matched: z.string().optional(),
4
+ raw: z.string().optional(),
5
+ pattern: z.string().optional(),
6
+ type: z.string().optional(),
7
+ });
8
+ export const findingSchema = z.object({
9
+ rule_id: z.string(),
10
+ severity: z.enum(["INFO", "LOW", "MEDIUM", "HIGH", "CRITICAL"]),
11
+ title: z.string(),
12
+ description: z.string(),
13
+ remediation: z.string().optional(),
14
+ evidence: z.array(findingEvidenceSchema).optional(),
15
+ });
16
+ export const outputSchema = z.object({
17
+ schema_version: z.literal(3),
18
+ action: z.enum(["allow", "warn", "block"]),
19
+ findings: z.array(findingSchema),
20
+ bypass_honored: z.literal(false),
21
+ policy_path_used: z.string().nullable().optional(),
22
+ });
23
+ //# sourceMappingURL=tirith.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tirith.js","sourceRoot":"","sources":["../../src/schemas/tirith.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAC/D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,QAAQ,EAAE;CACpD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;IAChC,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAChC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CACnD,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function tirithUnits(source: string): readonly string[];
2
+ //# sourceMappingURL=tirith-units.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tirith-units.d.ts","sourceRoot":"","sources":["../src/tirith-units.ts"],"names":[],"mappings":"AA8BA,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAQ7D"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Statement units for Tirith. Unbash AST, not regex. A pipeline of
3
+ * `grep 'fn()' file | head` is two commands; Tirith's nested-body
4
+ * analyzer treats the `|` as "the RHS might execute the LHS" and
5
+ * fail-closes. Dropping a proven-pure tail and checking each
6
+ * statement separately is the host's claim, not Tirith's.
7
+ *
8
+ * Do not peel when a function, `source`/`.`/`eval`/`alias`, or a
9
+ * PATH/ENV assignment is in the script: those rebind the tail name
10
+ * for later stages. Parse failure keeps the original line.
11
+ */
12
+ import { parse } from "unbash";
13
+ const SAFE_TAILS = new Set([
14
+ "head",
15
+ "tail",
16
+ "wc",
17
+ "uniq",
18
+ "sort",
19
+ "cut",
20
+ "tr",
21
+ "cat",
22
+ "true",
23
+ "false",
24
+ ]);
25
+ const SEAL_NAMES = new Set(["source", ".", "eval", "alias"]);
26
+ const IDENTITY_VARS = new Set(["PATH", "ENV", "BASH_ENV"]);
27
+ const PARTLESS_FORBIDDEN = /[*?[\\$`]/;
28
+ export function tirithUnits(source) {
29
+ const script = parse(source);
30
+ if (script.errors !== undefined && script.errors.length > 0)
31
+ return [source];
32
+ if (script.commands.some(sealsNode))
33
+ return [source];
34
+ if (!script.commands.some(hasMultiStagePipe))
35
+ return [source];
36
+ const units = [];
37
+ for (const statement of script.commands)
38
+ collectStatement(statement, source, units);
39
+ return units.length === 0 ? [source] : units;
40
+ }
41
+ function collectStatement(statement, source, units) {
42
+ if (statement.redirects.length > 0) {
43
+ units.push(source.slice(statement.command.pos, statement.command.end));
44
+ return;
45
+ }
46
+ collectNode(statement.command, source, units);
47
+ }
48
+ function collectNode(node, source, units) {
49
+ switch (node.type) {
50
+ case "Statement":
51
+ collectStatement(node, source, units);
52
+ return;
53
+ case "CompoundList":
54
+ for (const statement of node.commands)
55
+ collectStatement(statement, source, units);
56
+ return;
57
+ case "Pipeline":
58
+ units.push(peelPipeline(node, source));
59
+ return;
60
+ case "AndOr":
61
+ for (const child of node.commands)
62
+ collectNode(child, source, units);
63
+ return;
64
+ case "Subshell":
65
+ case "BraceGroup":
66
+ collectNode(node.body, source, units);
67
+ return;
68
+ case "If":
69
+ collectNode(node.clause, source, units);
70
+ collectNode(node.then, source, units);
71
+ if (node.else !== undefined)
72
+ collectNode(node.else, source, units);
73
+ return;
74
+ case "For":
75
+ case "Select":
76
+ collectNode(node.body, source, units);
77
+ return;
78
+ case "ArithmeticFor":
79
+ case "While":
80
+ collectNode(node.body, source, units);
81
+ return;
82
+ case "Case":
83
+ for (const item of node.items)
84
+ collectNode(item.body, source, units);
85
+ return;
86
+ case "Command":
87
+ case "TestCommand":
88
+ case "ArithmeticCommand":
89
+ units.push(source.slice(node.pos, node.end));
90
+ return;
91
+ case "Function":
92
+ case "Coproc":
93
+ units.push(source.slice(node.pos, node.end));
94
+ return;
95
+ }
96
+ }
97
+ function peelPipeline(node, source) {
98
+ let keep = node.commands.length;
99
+ while (keep > 1 && node.operators[keep - 2] === "|" && isSafeTail(node.commands[keep - 1])) {
100
+ keep -= 1;
101
+ }
102
+ if (keep === node.commands.length)
103
+ return source.slice(node.pos, node.end);
104
+ return source.slice(node.pos, node.commands[keep - 1].end);
105
+ }
106
+ function isSafeTail(node) {
107
+ if (node.type === "Pipeline" && node.commands.length === 1 && node.negated !== true && node.time !== true) {
108
+ return isSafeTail(node.commands[0]);
109
+ }
110
+ if (node.type !== "Command")
111
+ return false;
112
+ if (node.redirects.length > 0 || node.prefix.length > 0 || node.name === undefined)
113
+ return false;
114
+ if (!isLiteralWord(node.name) || node.name.value.includes("/"))
115
+ return false;
116
+ const argv0 = node.name.value;
117
+ if (!SAFE_TAILS.has(argv0))
118
+ return false;
119
+ return argv0 !== "sort" || !sortWrites(node);
120
+ }
121
+ function sortWrites(command) {
122
+ for (const word of command.suffix) {
123
+ if (!isLiteralWord(word))
124
+ return true;
125
+ const value = word.value;
126
+ if (value.startsWith("-o") || value === "--output" || value.startsWith("--output="))
127
+ return true;
128
+ }
129
+ return false;
130
+ }
131
+ function hasMultiStagePipe(node) {
132
+ switch (node.type) {
133
+ case "Pipeline":
134
+ return node.commands.length > 1 || node.commands.some(hasMultiStagePipe);
135
+ case "Statement":
136
+ return hasMultiStagePipe(node.command);
137
+ case "CompoundList":
138
+ return node.commands.some(hasMultiStagePipe);
139
+ case "AndOr":
140
+ return node.commands.some(hasMultiStagePipe);
141
+ case "Subshell":
142
+ case "BraceGroup":
143
+ return hasMultiStagePipe(node.body);
144
+ case "If":
145
+ return (hasMultiStagePipe(node.clause) ||
146
+ hasMultiStagePipe(node.then) ||
147
+ (node.else !== undefined && hasMultiStagePipe(node.else)));
148
+ case "For":
149
+ case "Select":
150
+ case "While":
151
+ case "ArithmeticFor":
152
+ return hasMultiStagePipe(node.body);
153
+ case "Case":
154
+ return node.items.some((item) => hasMultiStagePipe(item.body));
155
+ case "Function":
156
+ case "Coproc":
157
+ case "Command":
158
+ case "TestCommand":
159
+ case "ArithmeticCommand":
160
+ return false;
161
+ }
162
+ }
163
+ function sealsNode(node) {
164
+ switch (node.type) {
165
+ case "Function":
166
+ case "Coproc":
167
+ return true;
168
+ case "Statement":
169
+ return sealsNode(node.command);
170
+ case "CompoundList":
171
+ return node.commands.some(sealsNode);
172
+ case "Pipeline":
173
+ case "AndOr":
174
+ return node.commands.some(sealsNode);
175
+ case "Subshell":
176
+ case "BraceGroup":
177
+ return sealsNode(node.body);
178
+ case "If":
179
+ return sealsNode(node.clause) || sealsNode(node.then) || (node.else !== undefined && sealsNode(node.else));
180
+ case "For":
181
+ case "Select":
182
+ case "While":
183
+ case "ArithmeticFor":
184
+ return sealsNode(node.body);
185
+ case "Case":
186
+ return node.items.some((item) => sealsNode(item.body));
187
+ case "Command":
188
+ return commandSeals(node);
189
+ case "TestCommand":
190
+ case "ArithmeticCommand":
191
+ return false;
192
+ }
193
+ }
194
+ function commandSeals(command) {
195
+ if (command.prefix.some((prefix) => prefix.name !== undefined && IDENTITY_VARS.has(prefix.name)))
196
+ return true;
197
+ if (command.name === undefined || !isLiteralWord(command.name))
198
+ return false;
199
+ if (SEAL_NAMES.has(command.name.value))
200
+ return true;
201
+ if (command.name.value !== "export")
202
+ return false;
203
+ return command.suffix.some((word) => {
204
+ const eq = word.value.indexOf("=");
205
+ return eq > 0 && IDENTITY_VARS.has(word.value.slice(0, eq));
206
+ });
207
+ }
208
+ function isLiteralWord(word) {
209
+ if (word.parts === undefined) {
210
+ return !PARTLESS_FORBIDDEN.test(word.text) && !word.text.startsWith("~");
211
+ }
212
+ return word.parts.every(partIsLiteral);
213
+ }
214
+ function partIsLiteral(part) {
215
+ switch (part.type) {
216
+ case "Literal":
217
+ case "SingleQuoted":
218
+ return true;
219
+ case "AnsiCQuoted":
220
+ return !part.value.includes("\0");
221
+ case "DoubleQuoted":
222
+ return part.parts.every((child) => child.type === "Literal");
223
+ default:
224
+ return false;
225
+ }
226
+ }
227
+ //# sourceMappingURL=tirith-units.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tirith-units.js","sourceRoot":"","sources":["../src/tirith-units.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { type TirithFinding, type TirithOutput } from "./schemas/tirith.js";
2
+ import type { Disposition } from "./types.js";
3
+ export type TirithReport = {
4
+ readonly action: "allow" | "warn" | "block" | "error";
5
+ readonly findings: readonly TirithFinding[];
6
+ readonly error?: string;
7
+ };
8
+ export type ShellCheckOptions = {
9
+ readonly cwd: string;
10
+ readonly signal?: AbortSignal;
11
+ };
12
+ export type ShellChecker = (command: string, options: ShellCheckOptions) => Promise<TirithReport>;
13
+ export declare function parseTirithOutput(stdout: string, code: number | null): TirithOutput;
14
+ export declare function tirithFailure(error: unknown): TirithReport;
15
+ export type TirithCoverage = "error" | "concrete" | "incomplete" | "intel-gap" | "none";
16
+ export declare function tirithCoverage(report: TirithReport): TirithCoverage;
17
+ export declare function tirithDisposition(report: TirithReport): Disposition;
18
+ /** Model-facing. Scanner identity stays in `policyEvidenceJson`. */
19
+ export declare function tirithMessage(report: TirithReport): string | null;
20
+ /** Classifier PIP. Concrete findings only — no-verdicts are not threats. */
21
+ export declare function tirithPolicyCut(report: TirithReport): string;
22
+ export declare function parseTirithEvidence(json: string | null | undefined): TirithReport | null;
23
+ export declare const checkTirith: ShellChecker;
24
+ //# sourceMappingURL=tirith.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tirith.d.ts","sourceRoot":"","sources":["../src/tirith.ts"],"names":[],"mappings":"AAaA,OAAO,EAA+B,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEzG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,CAAC;AACxF,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAMlG,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,YAAY,CAInF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAE1D;AASD,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,MAAM,CAAC;AAExF,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAMnE;AA4CD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,WAAW,CAcnE;AAED,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAejE;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAG5D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,YAAY,GAAG,IAAI,CASxF;AAuJD,eAAO,MAAM,WAAW,EAAE,YA8BzB,CAAC"}