@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.
- package/authorize.scm +4 -0
- package/dist/acknowledge.d.ts +70 -0
- package/dist/acknowledge.d.ts.map +1 -0
- package/dist/acknowledge.js +162 -0
- package/dist/acknowledge.js.map +1 -0
- package/dist/authorize.d.ts +8 -0
- package/dist/authorize.d.ts.map +1 -0
- package/dist/authorize.js +39 -0
- package/dist/authorize.js.map +1 -0
- package/dist/bind.d.ts +6 -0
- package/dist/bind.d.ts.map +1 -0
- package/dist/bind.js +45 -0
- package/dist/bind.js.map +1 -0
- package/dist/check.d.ts +30 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +389 -0
- package/dist/check.js.map +1 -0
- package/dist/classes.d.ts +23 -0
- package/dist/classes.d.ts.map +1 -0
- package/dist/classes.js +139 -0
- package/dist/classes.js.map +1 -0
- package/dist/compile.d.ts +40 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +311 -0
- package/dist/compile.js.map +1 -0
- package/dist/deadline.d.ts +5 -0
- package/dist/deadline.d.ts.map +1 -0
- package/dist/deadline.js +17 -0
- package/dist/deadline.js.map +1 -0
- package/dist/decide.d.ts +64 -0
- package/dist/decide.d.ts.map +1 -0
- package/dist/decide.js +482 -0
- package/dist/decide.js.map +1 -0
- package/dist/error-with-invariant.d.ts +9 -0
- package/dist/error-with-invariant.d.ts.map +1 -0
- package/dist/error-with-invariant.js +12 -0
- package/dist/error-with-invariant.js.map +1 -0
- package/dist/floor.d.ts +9 -0
- package/dist/floor.d.ts.map +1 -0
- package/dist/floor.js +9 -0
- package/dist/floor.js.map +1 -0
- package/dist/glob-expand.d.ts +10 -0
- package/dist/glob-expand.d.ts.map +1 -0
- package/dist/glob-expand.js +132 -0
- package/dist/glob-expand.js.map +1 -0
- package/dist/guards.d.ts +26 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/guards.js +419 -0
- package/dist/guards.js.map +1 -0
- package/dist/identity.d.ts +11 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +23 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/license-law.d.ts +43 -0
- package/dist/license-law.d.ts.map +1 -0
- package/dist/license-law.js +129 -0
- package/dist/license-law.js.map +1 -0
- package/dist/license.d.ts +3 -0
- package/dist/license.d.ts.map +1 -0
- package/dist/license.js +2 -0
- package/dist/license.js.map +1 -0
- package/dist/lift.d.ts +4 -0
- package/dist/lift.d.ts.map +1 -0
- package/dist/lift.js +14 -0
- package/dist/lift.js.map +1 -0
- package/dist/path-policy.d.ts +53 -0
- package/dist/path-policy.d.ts.map +1 -0
- package/dist/path-policy.js +248 -0
- package/dist/path-policy.js.map +1 -0
- package/dist/peel-cwd.d.ts +8 -0
- package/dist/peel-cwd.d.ts.map +1 -0
- package/dist/peel-cwd.js +120 -0
- package/dist/peel-cwd.js.map +1 -0
- package/dist/prep.d.ts +58 -0
- package/dist/prep.d.ts.map +1 -0
- package/dist/prep.js +690 -0
- package/dist/prep.js.map +1 -0
- package/dist/processor.d.ts +71 -0
- package/dist/processor.d.ts.map +1 -0
- package/dist/processor.js +132 -0
- package/dist/processor.js.map +1 -0
- package/dist/reasonable-defaults.d.ts +1448 -0
- package/dist/reasonable-defaults.d.ts.map +1 -0
- package/dist/reasonable-defaults.js +6 -0
- package/dist/reasonable-defaults.js.map +1 -0
- package/dist/reasonable-defaults.json +1662 -0
- package/dist/run-authorization.d.ts +8 -0
- package/dist/run-authorization.d.ts.map +1 -0
- package/dist/run-authorization.js +16 -0
- package/dist/run-authorization.js.map +1 -0
- package/dist/schemas/tirith.d.ts +58 -0
- package/dist/schemas/tirith.d.ts.map +1 -0
- package/dist/schemas/tirith.js +23 -0
- package/dist/schemas/tirith.js.map +1 -0
- package/dist/tirith-units.d.ts +2 -0
- package/dist/tirith-units.d.ts.map +1 -0
- package/dist/tirith-units.js +227 -0
- package/dist/tirith-units.js.map +1 -0
- package/dist/tirith.d.ts +24 -0
- package/dist/tirith.d.ts.map +1 -0
- package/dist/tirith.js +311 -0
- package/dist/tirith.js.map +1 -0
- package/dist/tool-path.d.ts +8 -0
- package/dist/tool-path.d.ts.map +1 -0
- package/dist/tool-path.js +38 -0
- package/dist/tool-path.js.map +1 -0
- package/dist/types.d.ts +87 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +14 -0
- package/dist/types.js.map +1 -0
- package/dist/verdict.d.ts +15 -0
- package/dist/verdict.d.ts.map +1 -0
- package/dist/verdict.js +55 -0
- package/dist/verdict.js.map +1 -0
- package/package.json +62 -3
- package/src/acknowledge.ts +206 -0
- package/src/authorize.ts +38 -0
- package/src/bind.ts +58 -0
- package/src/check.ts +552 -0
- package/src/classes.ts +156 -0
- package/src/compile.ts +370 -0
- package/src/deadline.ts +15 -0
- package/src/floor.ts +16 -0
- package/src/glob-expand.ts +137 -0
- package/src/guards.ts +428 -0
- package/src/identity.ts +26 -0
- package/src/index.ts +24 -0
- package/src/lift.ts +15 -0
- package/src/path-policy.ts +280 -0
- package/src/processor.ts +187 -0
- package/src/reasonable-defaults.json +1662 -0
- package/src/reasonable-defaults.ts +8 -0
- package/src/run-authorization.ts +23 -0
- package/src/tool-path.ts +43 -0
- package/src/types.ts +102 -0
- package/src/verdict.ts +63 -0
- package/README.md +0 -3
package/dist/tirith.js
ADDED
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-side command inspection. The command is data, never shell source
|
|
3
|
+
* for the child. `analysis_incomplete` is not one threat: intel-gap
|
|
4
|
+
* (offline package lookup) is not a vote, nested-incomplete-only is
|
|
5
|
+
* remainder ask, concrete rules and scanner error keep today's map.
|
|
6
|
+
*/
|
|
7
|
+
import { execFile } from "node:child_process";
|
|
8
|
+
import { mkdtemp, realpath, rm } from "node:fs/promises";
|
|
9
|
+
import { createRequire } from "node:module";
|
|
10
|
+
import { tmpdir } from "node:os";
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
import { fileURLToPath } from "node:url";
|
|
13
|
+
import { findingSchema, outputSchema } from "./schemas/tirith.js";
|
|
14
|
+
import { tirithUnits } from "./tirith-units.js";
|
|
15
|
+
const policyRoot = fileURLToPath(new URL("../tirith-policy/", import.meta.url));
|
|
16
|
+
const policyPath = path.join(policyRoot, ".tirith", "policy.yaml");
|
|
17
|
+
const codes = { allow: 0, warn: 2, block: 1 };
|
|
18
|
+
export function parseTirithOutput(stdout, code) {
|
|
19
|
+
const output = outputSchema.parse(JSON.parse(stdout));
|
|
20
|
+
if (codes[output.action] !== code)
|
|
21
|
+
throw new Error(`Tirith verdict disagrees with exit code ${code}`);
|
|
22
|
+
return output;
|
|
23
|
+
}
|
|
24
|
+
export function tirithFailure(error) {
|
|
25
|
+
return { action: "error", findings: [], error: error instanceof Error ? error.message : String(error) };
|
|
26
|
+
}
|
|
27
|
+
const INCOMPLETE_RULE = "analysis_incomplete";
|
|
28
|
+
const INTERNAL_COPY = /tirith|getvet\.sh|policy\.yaml|scan\.require|operator policy|capsule command|--suggest/i;
|
|
29
|
+
const BUDGET_NOTE = /nested body suffix omitted|bounded analysis|coverage gap/i;
|
|
30
|
+
const INCOMPLETE_MESSAGE = "Policy safeguards were unable to classify this shell script's safety. It may be correct to use, but it is too complex for static analysis; try to produce a simpler or more explicit shell script that will do the same thing.";
|
|
31
|
+
export function tirithCoverage(report) {
|
|
32
|
+
if (report.action === "error")
|
|
33
|
+
return "error";
|
|
34
|
+
if (report.findings.length === 0)
|
|
35
|
+
return "none";
|
|
36
|
+
if (report.findings.some((finding) => finding.rule_id !== INCOMPLETE_RULE))
|
|
37
|
+
return "concrete";
|
|
38
|
+
if (report.findings.every(isIntelGapFinding))
|
|
39
|
+
return "intel-gap";
|
|
40
|
+
return "incomplete";
|
|
41
|
+
}
|
|
42
|
+
function isIntelGapFinding(finding) {
|
|
43
|
+
const evidence = finding.evidence ?? [];
|
|
44
|
+
return evidence.length > 0 && evidence.every((item) => item.type === "threat_intel");
|
|
45
|
+
}
|
|
46
|
+
/** A block only when a finding is the attack itself. A coarse shape stays a question. */
|
|
47
|
+
const HARD_BLOCK = new Set([
|
|
48
|
+
"pipe_to_interpreter",
|
|
49
|
+
"curl_pipe_shell",
|
|
50
|
+
"wget_pipe_shell",
|
|
51
|
+
"httpie_pipe_shell",
|
|
52
|
+
"xh_pipe_shell",
|
|
53
|
+
"base64_decode_execute",
|
|
54
|
+
"sudo_download_install",
|
|
55
|
+
"reverse_shell",
|
|
56
|
+
"proc_mem_access",
|
|
57
|
+
"docker_remote_priv_esc",
|
|
58
|
+
"plain_http_to_sink",
|
|
59
|
+
"schemeless_to_sink",
|
|
60
|
+
"insecure_tls_flags",
|
|
61
|
+
"userinfo_trick",
|
|
62
|
+
"non_ascii_hostname",
|
|
63
|
+
"shortened_url",
|
|
64
|
+
"metadata_endpoint",
|
|
65
|
+
"private_network_access",
|
|
66
|
+
"data_exfiltration",
|
|
67
|
+
"dotfile_overwrite",
|
|
68
|
+
"private_key_exposed",
|
|
69
|
+
"sudo_shell_spawn",
|
|
70
|
+
"sudo_env_preserve_sensitive",
|
|
71
|
+
"sudo_tee_system_file",
|
|
72
|
+
"sudo_recursive_perms_broad_path",
|
|
73
|
+
"blast_writes_system_path",
|
|
74
|
+
"blast_find_delete",
|
|
75
|
+
"blast_rsync_delete",
|
|
76
|
+
"wrapper_chain_too_deep",
|
|
77
|
+
]);
|
|
78
|
+
function hardBlock(report) {
|
|
79
|
+
return report.findings.some((finding) => HARD_BLOCK.has(finding.rule_id));
|
|
80
|
+
}
|
|
81
|
+
export function tirithDisposition(report) {
|
|
82
|
+
switch (tirithCoverage(report)) {
|
|
83
|
+
case "error":
|
|
84
|
+
return "block";
|
|
85
|
+
case "intel-gap":
|
|
86
|
+
case "none":
|
|
87
|
+
return "approve";
|
|
88
|
+
case "incomplete":
|
|
89
|
+
return "ask";
|
|
90
|
+
case "concrete":
|
|
91
|
+
if (report.action === "allow")
|
|
92
|
+
return "approve";
|
|
93
|
+
if (report.action === "warn")
|
|
94
|
+
return "ask";
|
|
95
|
+
return hardBlock(report) ? "block" : "ask";
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** Model-facing. Scanner identity stays in `policyEvidenceJson`. */
|
|
99
|
+
export function tirithMessage(report) {
|
|
100
|
+
switch (tirithCoverage(report)) {
|
|
101
|
+
case "error":
|
|
102
|
+
return "Policy safeguards could not inspect this command.";
|
|
103
|
+
case "intel-gap":
|
|
104
|
+
case "none":
|
|
105
|
+
return null;
|
|
106
|
+
case "incomplete":
|
|
107
|
+
return withFragments(INCOMPLETE_MESSAGE, commandSnippets(report.findings));
|
|
108
|
+
case "concrete": {
|
|
109
|
+
const concrete = report.findings.filter((finding) => finding.rule_id !== INCOMPLETE_RULE);
|
|
110
|
+
const parts = concrete.map(findingAdvice).filter((part) => part !== "");
|
|
111
|
+
return parts.length === 0 ? null : parts.join("\n\n");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/** Classifier PIP. Concrete findings only — no-verdicts are not threats. */
|
|
116
|
+
export function tirithPolicyCut(report) {
|
|
117
|
+
if (tirithCoverage(report) !== "concrete")
|
|
118
|
+
return "";
|
|
119
|
+
return tirithMessage(report) ?? "";
|
|
120
|
+
}
|
|
121
|
+
export function parseTirithEvidence(json) {
|
|
122
|
+
if (json == null || json === "")
|
|
123
|
+
return null;
|
|
124
|
+
try {
|
|
125
|
+
const parsed = JSON.parse(json);
|
|
126
|
+
if (!isRecord(parsed))
|
|
127
|
+
return null;
|
|
128
|
+
return asReport(parsed.tirith);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function isRecord(value) {
|
|
135
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
136
|
+
}
|
|
137
|
+
function asReport(value) {
|
|
138
|
+
if (!isRecord(value))
|
|
139
|
+
return null;
|
|
140
|
+
const action = value.action;
|
|
141
|
+
if (action !== "allow" && action !== "warn" && action !== "block" && action !== "error")
|
|
142
|
+
return null;
|
|
143
|
+
if (!Array.isArray(value.findings))
|
|
144
|
+
return null;
|
|
145
|
+
const findings = [];
|
|
146
|
+
for (const item of value.findings) {
|
|
147
|
+
const parsed = findingSchema.safeParse(item);
|
|
148
|
+
if (!parsed.success)
|
|
149
|
+
return null;
|
|
150
|
+
findings.push(parsed.data);
|
|
151
|
+
}
|
|
152
|
+
const error = value.error;
|
|
153
|
+
return typeof error === "string" ? { action, findings, error } : { action, findings };
|
|
154
|
+
}
|
|
155
|
+
function recoveryScript(ruleId) {
|
|
156
|
+
if (ruleId === "interpreter_suspicious_inline_exec") {
|
|
157
|
+
return "Drop the spawn, socket, or eval, or move that part into a file and run the file. A one-liner that only computes is already allowed.";
|
|
158
|
+
}
|
|
159
|
+
if (ruleId === "mass_file_deletion") {
|
|
160
|
+
return "Delete fewer than three files in one step, or name the build directory you mean (node_modules, dist, target). Do not chain the rest into one command.";
|
|
161
|
+
}
|
|
162
|
+
return "";
|
|
163
|
+
}
|
|
164
|
+
function findingAdvice(finding) {
|
|
165
|
+
const body = modelSentences(finding.description) || modelSentences(finding.title);
|
|
166
|
+
const rem = finding.remediation === undefined ? "" : modelSentences(finding.remediation);
|
|
167
|
+
const snips = commandSnippets([finding]);
|
|
168
|
+
const hit = finding.evidence?.find((item) => item.pattern != null && item.pattern !== "")?.pattern;
|
|
169
|
+
const parts = [];
|
|
170
|
+
if (body !== "")
|
|
171
|
+
parts.push(body);
|
|
172
|
+
if (snips.length > 0)
|
|
173
|
+
parts.push(`This fragment:\n${snips.map((snip) => ` ${snip}`).join("\n")}`);
|
|
174
|
+
if (hit !== undefined)
|
|
175
|
+
parts.push(`Why: it matches ${hit}.`);
|
|
176
|
+
const script = recoveryScript(finding.rule_id);
|
|
177
|
+
if (script !== "")
|
|
178
|
+
parts.push(script);
|
|
179
|
+
else if (rem !== "" && rem !== body)
|
|
180
|
+
parts.push(rem);
|
|
181
|
+
return parts.join("\n");
|
|
182
|
+
}
|
|
183
|
+
function withFragments(lead, snips) {
|
|
184
|
+
if (snips.length === 0)
|
|
185
|
+
return lead;
|
|
186
|
+
return `${lead}\n\nThis fragment could not be classified:\n${snips.map((snip) => ` ${snip}`).join("\n")}`;
|
|
187
|
+
}
|
|
188
|
+
function commandSnippets(findings) {
|
|
189
|
+
const seen = new Set();
|
|
190
|
+
const out = [];
|
|
191
|
+
for (const finding of findings) {
|
|
192
|
+
for (const item of finding.evidence ?? []) {
|
|
193
|
+
const text = item.matched ?? item.raw;
|
|
194
|
+
if (text == null || text === "" || BUDGET_NOTE.test(text) || seen.has(text))
|
|
195
|
+
continue;
|
|
196
|
+
seen.add(text);
|
|
197
|
+
out.push(text);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return out;
|
|
201
|
+
}
|
|
202
|
+
function modelSentences(text) {
|
|
203
|
+
return text
|
|
204
|
+
.split(/(?<=\.)\s+/)
|
|
205
|
+
.filter((sentence) => sentence !== "" && !INTERNAL_COPY.test(sentence))
|
|
206
|
+
.join(" ")
|
|
207
|
+
.trim();
|
|
208
|
+
}
|
|
209
|
+
function binaryPath() {
|
|
210
|
+
const require = createRequire(import.meta.url);
|
|
211
|
+
const fromTirith = createRequire(require.resolve("tirith/package.json"));
|
|
212
|
+
const platform = `${process.platform}-${process.arch}`;
|
|
213
|
+
if (!["darwin-arm64", "darwin-x64", "linux-arm64", "linux-x64", "win32-x64"].includes(platform)) {
|
|
214
|
+
throw new Error(`Unsupported Tirith platform: ${platform}`);
|
|
215
|
+
}
|
|
216
|
+
const root = path.dirname(fromTirith.resolve(`@sheeki03/tirith-${platform}/package.json`));
|
|
217
|
+
return path.join(root, "bin", process.platform === "win32" ? "tirith.exe" : "tirith");
|
|
218
|
+
}
|
|
219
|
+
/** Do not inherit TIRITH*, loader injection, user allowlists, or project policy discovery. */
|
|
220
|
+
function scannerEnv(state) {
|
|
221
|
+
const env = {
|
|
222
|
+
HOME: state,
|
|
223
|
+
USERPROFILE: state,
|
|
224
|
+
XDG_CONFIG_HOME: state,
|
|
225
|
+
XDG_DATA_HOME: state,
|
|
226
|
+
XDG_CACHE_HOME: state,
|
|
227
|
+
APPDATA: state,
|
|
228
|
+
LOCALAPPDATA: state,
|
|
229
|
+
TIRITH_POLICY_ROOT: policyRoot,
|
|
230
|
+
TIRITH_LOG: "0",
|
|
231
|
+
TIRITH_OFFLINE: "1",
|
|
232
|
+
};
|
|
233
|
+
for (const name of ["PATH", "SystemRoot", "SYSTEMROOT", "WINDIR", "TMPDIR", "TEMP", "TMP"]) {
|
|
234
|
+
if (process.env[name] !== undefined)
|
|
235
|
+
env[name] = process.env[name];
|
|
236
|
+
}
|
|
237
|
+
return env;
|
|
238
|
+
}
|
|
239
|
+
function joinTirithReports(reports) {
|
|
240
|
+
const findings = reports.flatMap((report) => report.findings);
|
|
241
|
+
if (reports.some((report) => report.action === "block"))
|
|
242
|
+
return { action: "block", findings };
|
|
243
|
+
const failed = reports.find((report) => report.action === "error");
|
|
244
|
+
if (failed !== undefined)
|
|
245
|
+
return { action: "error", findings, error: failed.error };
|
|
246
|
+
if (reports.some((report) => report.action === "warn"))
|
|
247
|
+
return { action: "warn", findings };
|
|
248
|
+
return { action: "allow", findings };
|
|
249
|
+
}
|
|
250
|
+
function inspectCommand(binary, command, cwd, env, signal) {
|
|
251
|
+
return new Promise((resolve, reject) => {
|
|
252
|
+
execFile(binary, ["check", "--format", "json", "--non-interactive", "--no-daemon", "--offline", "--shell", "posix", "--", command], {
|
|
253
|
+
cwd,
|
|
254
|
+
env,
|
|
255
|
+
signal,
|
|
256
|
+
timeout: 5000,
|
|
257
|
+
killSignal: "SIGKILL",
|
|
258
|
+
maxBuffer: 1024 * 1024,
|
|
259
|
+
encoding: "utf8",
|
|
260
|
+
windowsHide: true,
|
|
261
|
+
}, (error, stdout) => {
|
|
262
|
+
try {
|
|
263
|
+
if (error == null) {
|
|
264
|
+
resolve(parseTirithOutput(stdout, 0));
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const code = error.code;
|
|
268
|
+
if (error.killed || error.signal || typeof code !== "number")
|
|
269
|
+
throw error;
|
|
270
|
+
resolve(parseTirithOutput(stdout, code));
|
|
271
|
+
}
|
|
272
|
+
catch (error_) {
|
|
273
|
+
reject(error_);
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
export const checkTirith = async (command, { cwd, signal }) => {
|
|
279
|
+
let state;
|
|
280
|
+
try {
|
|
281
|
+
signal?.throwIfAborted();
|
|
282
|
+
const binary = binaryPath();
|
|
283
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- fixed package asset, never caller input
|
|
284
|
+
await realpath(policyPath);
|
|
285
|
+
const home = await mkdtemp(path.join(tmpdir(), "harness-tirith-"));
|
|
286
|
+
state = home;
|
|
287
|
+
signal?.throwIfAborted();
|
|
288
|
+
const env = scannerEnv(home);
|
|
289
|
+
const reports = await Promise.all(tirithUnits(command).map(async (unit) => {
|
|
290
|
+
try {
|
|
291
|
+
const output = await inspectCommand(binary, unit, cwd, env, signal);
|
|
292
|
+
if (!output.policy_path_used) {
|
|
293
|
+
throw new Error("Tirith did not use the package-owned policy");
|
|
294
|
+
}
|
|
295
|
+
return { action: output.action, findings: output.findings };
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
return tirithFailure(error);
|
|
299
|
+
}
|
|
300
|
+
}));
|
|
301
|
+
return joinTirithReports(reports);
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
return tirithFailure(error);
|
|
305
|
+
}
|
|
306
|
+
finally {
|
|
307
|
+
if (state !== undefined)
|
|
308
|
+
await rm(state, { recursive: true, force: true });
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
//# sourceMappingURL=tirith.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tirith.js","sourceRoot":"","sources":["../src/tirith.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Disposition } from "./types.js";
|
|
2
|
+
export declare function normalizeToolPath(raw: string, cwd?: string, home?: string): string;
|
|
3
|
+
/** Strictest dist-floor answer for a model-supplied path, after host normalisation. */
|
|
4
|
+
export declare function checkToolPath(operation: "read" | "write", raw: string, options?: {
|
|
5
|
+
readonly cwd?: string;
|
|
6
|
+
readonly home?: string;
|
|
7
|
+
}): Disposition;
|
|
8
|
+
//# sourceMappingURL=tool-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-path.d.ts","sourceRoot":"","sources":["../src/tool-path.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAM9C,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,EAAE,IAAI,GAAE,MAAkB,GAAG,MAAM,CAU5G;AAED,uFAAuF;AACvF,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,GAAG,OAAO,EAC3B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D,WAAW,CAIb"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host path preparation for the file floor, for hosts that hand the model's path
|
|
3
|
+
* string straight to the adapter. Mirrors the harness's `workspacePath`: resolve
|
|
4
|
+
* against the working directory, collapse `.` / `..`, make in-root paths relative,
|
|
5
|
+
* leave extra-root paths absolute (so a miss is `deny`, never `..` ask).
|
|
6
|
+
* Lexical only: no realpath, so a symlink inside the tree is not followed.
|
|
7
|
+
* The floor matches case-sensitively, so `checkToolPath` also asks about the
|
|
8
|
+
* lower-cased path and keeps the stricter answer (`.GIT/hooks` is `.git/hooks`
|
|
9
|
+
* on APFS and NTFS).
|
|
10
|
+
*/
|
|
11
|
+
import { homedir } from "node:os";
|
|
12
|
+
import path from "node:path";
|
|
13
|
+
import { defaultPolicy } from "./bind.js";
|
|
14
|
+
import { lattice } from "./lift.js";
|
|
15
|
+
function slash(text) {
|
|
16
|
+
return text.replaceAll("\\", "/");
|
|
17
|
+
}
|
|
18
|
+
export function normalizeToolPath(raw, cwd = process.cwd(), home = homedir()) {
|
|
19
|
+
let written = slash(raw.trim() === "" ? "." : raw.trim());
|
|
20
|
+
if (written === "~" || written.startsWith("~/"))
|
|
21
|
+
written = `${slash(home)}${written.slice(1)}`;
|
|
22
|
+
const root = path.posix.normalize(slash(cwd.startsWith("/") || /^[a-z]:/i.test(cwd) ? cwd : `/${cwd}`));
|
|
23
|
+
const resolved = path.posix.normalize(written.startsWith("/") ? written : path.posix.join(root, written));
|
|
24
|
+
const trimmed = resolved.length > 1 && resolved.endsWith("/") ? resolved.slice(0, -1) : resolved;
|
|
25
|
+
const rel = path.posix.relative(root, trimmed);
|
|
26
|
+
if (rel === "")
|
|
27
|
+
return ".";
|
|
28
|
+
if (rel === ".." || rel.startsWith("../") || rel.startsWith("/"))
|
|
29
|
+
return trimmed;
|
|
30
|
+
return rel;
|
|
31
|
+
}
|
|
32
|
+
/** Strictest dist-floor answer for a model-supplied path, after host normalisation. */
|
|
33
|
+
export function checkToolPath(operation, raw, options) {
|
|
34
|
+
const prepared = normalizeToolPath(raw, options?.cwd, options?.home);
|
|
35
|
+
const check = operation === "read" ? defaultPolicy.read : defaultPolicy.write;
|
|
36
|
+
return lattice([check(prepared), check(prepared.toLowerCase())]);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=tool-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-path.js","sourceRoot":"","sources":["../src/tool-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,SAAS,KAAK,CAAC,IAAY;IACzB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE,EAAE,OAAe,OAAO,EAAE;IAClG,IAAI,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/F,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IACxG,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1G,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACjG,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/C,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,GAAG,CAAC;IAC3B,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IACjF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,aAAa,CAC3B,SAA2B,EAC3B,GAAW,EACX,OAA2D;IAE3D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC;IAC9E,OAAO,OAAO,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Floor carriers. `policyApprove` is the positive vote. Stored `approve` and `allow` parse as it.
|
|
3
|
+
* `block` is unliftable. `deny` is overridable by descending arms.
|
|
4
|
+
* File effects (`read_path` / `write_path`) join on their own lattice, apart from bash
|
|
5
|
+
* shape — they cannot lift `ask`.
|
|
6
|
+
*/
|
|
7
|
+
import type { ClassId } from "./classes.js";
|
|
8
|
+
export type Disposition = "policyApprove" | "ask" | "deny" | "block";
|
|
9
|
+
/** Write-deny remainder intern. Null when the floor is not deny. */
|
|
10
|
+
export type WriteRemainderKind = "protected" | "outside" | "risky";
|
|
11
|
+
export type ArgType = "read_path" | "write_path";
|
|
12
|
+
/** Why an approve became ask without a rule saying so. A lifted vote is never grantable. */
|
|
13
|
+
export type LiftKind = "env" | "xargs" | "nonliteral" | "unparsed" | "overflow" | "readings";
|
|
14
|
+
/** Grant family of one shell unit: program, recognized subcommand spine, `family_args` positionals. */
|
|
15
|
+
export type UnitIdentity = {
|
|
16
|
+
readonly argv0: string;
|
|
17
|
+
readonly spine: readonly string[];
|
|
18
|
+
readonly familyArgs: readonly string[];
|
|
19
|
+
};
|
|
20
|
+
/** One rule's vote, with the class that says why it voted. Only votes at the call's tier are reported. */
|
|
21
|
+
export type FloorVote = {
|
|
22
|
+
readonly disposition: Disposition;
|
|
23
|
+
readonly class: ClassId;
|
|
24
|
+
/** Stable rule identity: `bash:git/push[--force]`, `write_block:.git/hooks`, `lift:env`. */
|
|
25
|
+
readonly ruleId: string;
|
|
26
|
+
/** Shell votes only: the unit that voted. Absent for path and host votes. */
|
|
27
|
+
readonly unit?: UnitIdentity;
|
|
28
|
+
readonly lift?: LiftKind;
|
|
29
|
+
/** Path votes only: the prepared path and the cluster it was judged in. */
|
|
30
|
+
readonly path?: {
|
|
31
|
+
readonly cluster: "read" | "write";
|
|
32
|
+
readonly path: string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
/** The tier and the votes that decided it. `votes` is empty for `policyApprove`. */
|
|
36
|
+
export type FloorVerdict = {
|
|
37
|
+
readonly disposition: Disposition;
|
|
38
|
+
readonly votes: readonly FloorVote[];
|
|
39
|
+
/**
|
|
40
|
+
* Every shell unit the call runs, at any tier (an approve names none in `votes`). Only a shell verdict
|
|
41
|
+
* has it. An acknowledgement flag on a command family needs it to see an approved call.
|
|
42
|
+
*/
|
|
43
|
+
readonly seen?: readonly UnitIdentity[];
|
|
44
|
+
};
|
|
45
|
+
export type Policy = {
|
|
46
|
+
/** `cwd`: workspace-relative directory the shell runs in; relative path words re-base on it. */
|
|
47
|
+
readonly bash: (command: string, cwd?: string) => Disposition;
|
|
48
|
+
readonly explainBash: (command: string, cwd?: string) => FloorVerdict;
|
|
49
|
+
readonly read: (path: string) => Disposition;
|
|
50
|
+
readonly explainRead: (path: string) => FloorVerdict;
|
|
51
|
+
readonly write: (path: string) => Disposition;
|
|
52
|
+
readonly explainWrite: (path: string) => FloorVerdict;
|
|
53
|
+
/** Write-deny remainder intern. Null when the floor is not deny. */
|
|
54
|
+
readonly writeKind: (path: string) => WriteRemainderKind | null;
|
|
55
|
+
};
|
|
56
|
+
export type FlagConstraint = {
|
|
57
|
+
readonly names: readonly string[];
|
|
58
|
+
readonly vals: readonly string[];
|
|
59
|
+
readonly takesValue: boolean;
|
|
60
|
+
};
|
|
61
|
+
export type Matcher = {
|
|
62
|
+
readonly class?: ClassId;
|
|
63
|
+
readonly flags: Readonly<Record<string, FlagConstraint>>;
|
|
64
|
+
readonly globs: readonly string[];
|
|
65
|
+
readonly toks: readonly string[];
|
|
66
|
+
readonly matchers: readonly Matcher[];
|
|
67
|
+
readonly policy?: Disposition;
|
|
68
|
+
};
|
|
69
|
+
export type CommandNode = {
|
|
70
|
+
readonly policy?: Disposition;
|
|
71
|
+
/** Why this node votes what it votes. Inherited from the nearest ancestor that names one. */
|
|
72
|
+
readonly class?: ClassId;
|
|
73
|
+
/** Leading positionals (after the spine) that belong to the grant family. Does not affect the tier. */
|
|
74
|
+
readonly familyArgs: number;
|
|
75
|
+
readonly argTypes: readonly ArgType[];
|
|
76
|
+
readonly argRestType?: ArgType;
|
|
77
|
+
readonly matchers: readonly Matcher[];
|
|
78
|
+
/** Option whose value is a path (`--output=F`, glued `-oF`). Long names carry their prefixes. */
|
|
79
|
+
readonly flagPaths: Readonly<Record<string, ArgType>>;
|
|
80
|
+
/** Named argument guards (see guards.ts) for what flags and positionals cannot express. */
|
|
81
|
+
readonly guards: readonly string[];
|
|
82
|
+
readonly dash?: CommandNode;
|
|
83
|
+
readonly subcommands: Readonly<Record<string, CommandNode>>;
|
|
84
|
+
};
|
|
85
|
+
/** Classes of the votes that decided the tier. A tier with no voting rule is `unmodelled`. */
|
|
86
|
+
export declare function classesOf(verdict: FloorVerdict): readonly ClassId[];
|
|
87
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Floor carriers. `policyApprove` is the positive vote. Stored `approve` and `allow` parse as it.
|
|
3
|
+
* `block` is unliftable. `deny` is overridable by descending arms.
|
|
4
|
+
* File effects (`read_path` / `write_path`) join on their own lattice, apart from bash
|
|
5
|
+
* shape — they cannot lift `ask`.
|
|
6
|
+
*/
|
|
7
|
+
/** Classes of the votes that decided the tier. A tier with no voting rule is `unmodelled`. */
|
|
8
|
+
export function classesOf(verdict) {
|
|
9
|
+
if (verdict.disposition === "policyApprove")
|
|
10
|
+
return [];
|
|
11
|
+
const classes = new Set(verdict.votes.filter((vote) => vote.disposition === verdict.disposition).map((vote) => vote.class));
|
|
12
|
+
return classes.size === 0 ? ["unmodelled"] : [...classes];
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyFH,8FAA8F;AAC9F,MAAM,UAAU,SAAS,CAAC,OAAqB;IAC7C,IAAI,OAAO,CAAC,WAAW,KAAK,eAAe;QAAE,OAAO,EAAE,CAAC;IACvD,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CACnG,CAAC;IACF,OAAO,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Votes on the strict lattice. `join` is `lattice` that keeps the rules which decided the tier:
|
|
3
|
+
* the result is the strictest disposition and the union of the votes at exactly that disposition.
|
|
4
|
+
*/
|
|
5
|
+
import type { ClassId } from "./classes.js";
|
|
6
|
+
import type { Disposition, FloorVerdict, FloorVote } from "./types.js";
|
|
7
|
+
export declare const APPROVE: FloorVerdict;
|
|
8
|
+
export declare function rank(disposition: Disposition): number;
|
|
9
|
+
/** A single vote. An approve carries no vote: it names no class. */
|
|
10
|
+
export declare function cast(disposition: Disposition, cls: ClassId, ruleId: string, extra?: Pick<FloorVote, "unit" | "lift" | "path">): FloorVerdict;
|
|
11
|
+
/** Strictest of the verdicts, with the votes at that tier (deduplicated by rule, class and unit). */
|
|
12
|
+
export declare function join(verdicts: readonly FloorVerdict[]): FloorVerdict;
|
|
13
|
+
/** Same verdict with every vote stamped with a unit (shell units only). */
|
|
14
|
+
export declare function withUnit(verdict: FloorVerdict, unit: FloorVote["unit"]): FloorVerdict;
|
|
15
|
+
//# sourceMappingURL=verdict.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verdict.d.ts","sourceRoot":"","sources":["../src/verdict.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAgB,MAAM,YAAY,CAAC;AAIrF,eAAO,MAAM,OAAO,EAAE,YAA0D,CAAC;AAEjF,wBAAgB,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAErD;AAED,oEAAoE;AACpE,wBAAgB,IAAI,CAClB,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,GAChD,YAAY,CAGd;AAED,qGAAqG;AACrG,wBAAgB,IAAI,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,CAIpE;AA2BD,2EAA2E;AAC3E,wBAAgB,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,YAAY,CAGrF"}
|
package/dist/verdict.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
const RANK = { policyApprove: 0, ask: 1, deny: 2, block: 3 };
|
|
2
|
+
export const APPROVE = { disposition: "policyApprove", votes: [] };
|
|
3
|
+
export function rank(disposition) {
|
|
4
|
+
return RANK[disposition];
|
|
5
|
+
}
|
|
6
|
+
/** A single vote. An approve carries no vote: it names no class. */
|
|
7
|
+
export function cast(disposition, cls, ruleId, extra) {
|
|
8
|
+
if (disposition === "policyApprove")
|
|
9
|
+
return APPROVE;
|
|
10
|
+
return { disposition, votes: [{ disposition, class: cls, ruleId, ...extra }] };
|
|
11
|
+
}
|
|
12
|
+
/** Strictest of the verdicts, with the votes at that tier (deduplicated by rule, class and unit). */
|
|
13
|
+
export function join(verdicts) {
|
|
14
|
+
const joined = joinVotes(verdicts);
|
|
15
|
+
const seen = mergeSeen(verdicts);
|
|
16
|
+
return seen === undefined ? joined : { ...joined, seen };
|
|
17
|
+
}
|
|
18
|
+
function mergeSeen(verdicts) {
|
|
19
|
+
const out = new Map();
|
|
20
|
+
for (const verdict of verdicts)
|
|
21
|
+
for (const unit of verdict.seen ?? [])
|
|
22
|
+
out.set(JSON.stringify(unit), unit);
|
|
23
|
+
return out.size === 0 ? undefined : [...out.values()];
|
|
24
|
+
}
|
|
25
|
+
function joinVotes(verdicts) {
|
|
26
|
+
let top = "policyApprove";
|
|
27
|
+
for (const verdict of verdicts)
|
|
28
|
+
if (rank(verdict.disposition) > rank(top))
|
|
29
|
+
top = verdict.disposition;
|
|
30
|
+
if (top === "policyApprove")
|
|
31
|
+
return APPROVE;
|
|
32
|
+
const seen = new Set();
|
|
33
|
+
const votes = [];
|
|
34
|
+
for (const verdict of verdicts) {
|
|
35
|
+
if (verdict.disposition !== top)
|
|
36
|
+
continue;
|
|
37
|
+
for (const vote of verdict.votes) {
|
|
38
|
+
if (vote.disposition !== top)
|
|
39
|
+
continue;
|
|
40
|
+
const key = JSON.stringify([vote.ruleId, vote.class, vote.unit, vote.lift, vote.path]);
|
|
41
|
+
if (seen.has(key))
|
|
42
|
+
continue;
|
|
43
|
+
seen.add(key);
|
|
44
|
+
votes.push(vote);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return { disposition: top, votes };
|
|
48
|
+
}
|
|
49
|
+
/** Same verdict with every vote stamped with a unit (shell units only). */
|
|
50
|
+
export function withUnit(verdict, unit) {
|
|
51
|
+
if (unit === undefined || verdict.votes.length === 0)
|
|
52
|
+
return verdict;
|
|
53
|
+
return { disposition: verdict.disposition, votes: verdict.votes.map((vote) => ({ unit, ...vote })) };
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=verdict.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verdict.js","sourceRoot":"","sources":["../src/verdict.ts"],"names":[],"mappings":"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"}
|