@taliesinb/mash 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 (203) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +275 -2
  3. package/bin/mash.ts +253 -0
  4. package/dist/bin/mash.d.ts +39 -0
  5. package/dist/bin/mash.d.ts.map +1 -0
  6. package/dist/bin/mash.js +281 -0
  7. package/dist/bin/mash.js.map +1 -0
  8. package/dist/src/analysis/analyze.d.ts +97 -0
  9. package/dist/src/analysis/analyze.d.ts.map +1 -0
  10. package/dist/src/analysis/analyze.js +1406 -0
  11. package/dist/src/analysis/analyze.js.map +1 -0
  12. package/dist/src/analysis/fs.d.ts +39 -0
  13. package/dist/src/analysis/fs.d.ts.map +1 -0
  14. package/dist/src/analysis/fs.js +117 -0
  15. package/dist/src/analysis/fs.js.map +1 -0
  16. package/dist/src/analysis/outputs.d.ts +16 -0
  17. package/dist/src/analysis/outputs.d.ts.map +1 -0
  18. package/dist/src/analysis/outputs.js +277 -0
  19. package/dist/src/analysis/outputs.js.map +1 -0
  20. package/dist/src/analysis/value.d.ts +76 -0
  21. package/dist/src/analysis/value.d.ts.map +1 -0
  22. package/dist/src/analysis/value.js +248 -0
  23. package/dist/src/analysis/value.js.map +1 -0
  24. package/dist/src/behaviors/defs/core.d.ts +15 -0
  25. package/dist/src/behaviors/defs/core.d.ts.map +1 -0
  26. package/dist/src/behaviors/defs/core.js +1084 -0
  27. package/dist/src/behaviors/defs/core.js.map +1 -0
  28. package/dist/src/behaviors/defs/devtools.d.ts +9 -0
  29. package/dist/src/behaviors/defs/devtools.d.ts.map +1 -0
  30. package/dist/src/behaviors/defs/devtools.js +432 -0
  31. package/dist/src/behaviors/defs/devtools.js.map +1 -0
  32. package/dist/src/behaviors/defs/macos.d.ts +12 -0
  33. package/dist/src/behaviors/defs/macos.d.ts.map +1 -0
  34. package/dist/src/behaviors/defs/macos.js +454 -0
  35. package/dist/src/behaviors/defs/macos.js.map +1 -0
  36. package/dist/src/behaviors/defs/tools.d.ts +9 -0
  37. package/dist/src/behaviors/defs/tools.d.ts.map +1 -0
  38. package/dist/src/behaviors/defs/tools.js +639 -0
  39. package/dist/src/behaviors/defs/tools.js.map +1 -0
  40. package/dist/src/behaviors/dsl.d.ts +95 -0
  41. package/dist/src/behaviors/dsl.d.ts.map +1 -0
  42. package/dist/src/behaviors/dsl.js +267 -0
  43. package/dist/src/behaviors/dsl.js.map +1 -0
  44. package/dist/src/behaviors/index.d.ts +12 -0
  45. package/dist/src/behaviors/index.d.ts.map +1 -0
  46. package/dist/src/behaviors/index.js +18 -0
  47. package/dist/src/behaviors/index.js.map +1 -0
  48. package/dist/src/behaviors/registry.d.ts +45 -0
  49. package/dist/src/behaviors/registry.d.ts.map +1 -0
  50. package/dist/src/behaviors/registry.js +266 -0
  51. package/dist/src/behaviors/registry.js.map +1 -0
  52. package/dist/src/behaviors/roles.d.ts +29 -0
  53. package/dist/src/behaviors/roles.d.ts.map +1 -0
  54. package/dist/src/behaviors/roles.js +198 -0
  55. package/dist/src/behaviors/roles.js.map +1 -0
  56. package/dist/src/behaviors/types.d.ts +120 -0
  57. package/dist/src/behaviors/types.d.ts.map +1 -0
  58. package/dist/src/behaviors/types.js +12 -0
  59. package/dist/src/behaviors/types.js.map +1 -0
  60. package/dist/src/index.d.ts +27 -0
  61. package/dist/src/index.d.ts.map +1 -0
  62. package/dist/src/index.js +24 -0
  63. package/dist/src/index.js.map +1 -0
  64. package/dist/src/integrations/deepsea.d.ts +121 -0
  65. package/dist/src/integrations/deepsea.d.ts.map +1 -0
  66. package/dist/src/integrations/deepsea.js +199 -0
  67. package/dist/src/integrations/deepsea.js.map +1 -0
  68. package/dist/src/machine.d.ts +139 -0
  69. package/dist/src/machine.d.ts.map +1 -0
  70. package/dist/src/machine.js +400 -0
  71. package/dist/src/machine.js.map +1 -0
  72. package/dist/src/parser/ast.d.ts +369 -0
  73. package/dist/src/parser/ast.d.ts.map +1 -0
  74. package/dist/src/parser/ast.js +17 -0
  75. package/dist/src/parser/ast.js.map +1 -0
  76. package/dist/src/parser/parser.d.ts +48 -0
  77. package/dist/src/parser/parser.d.ts.map +1 -0
  78. package/dist/src/parser/parser.js +1950 -0
  79. package/dist/src/parser/parser.js.map +1 -0
  80. package/dist/src/policy/effects.d.ts +86 -0
  81. package/dist/src/policy/effects.d.ts.map +1 -0
  82. package/dist/src/policy/effects.js +53 -0
  83. package/dist/src/policy/effects.js.map +1 -0
  84. package/dist/src/policy/policy.d.ts +130 -0
  85. package/dist/src/policy/policy.d.ts.map +1 -0
  86. package/dist/src/policy/policy.js +532 -0
  87. package/dist/src/policy/policy.js.map +1 -0
  88. package/dist/src/printer/doc.d.ts +151 -0
  89. package/dist/src/printer/doc.d.ts.map +1 -0
  90. package/dist/src/printer/doc.js +409 -0
  91. package/dist/src/printer/doc.js.map +1 -0
  92. package/dist/src/printer/highlight.d.ts +53 -0
  93. package/dist/src/printer/highlight.d.ts.map +1 -0
  94. package/dist/src/printer/highlight.js +339 -0
  95. package/dist/src/printer/highlight.js.map +1 -0
  96. package/dist/src/printer/html.d.ts +72 -0
  97. package/dist/src/printer/html.d.ts.map +1 -0
  98. package/dist/src/printer/html.js +423 -0
  99. package/dist/src/printer/html.js.map +1 -0
  100. package/dist/src/printer/print.d.ts +63 -0
  101. package/dist/src/printer/print.d.ts.map +1 -0
  102. package/dist/src/printer/print.js +484 -0
  103. package/dist/src/printer/print.js.map +1 -0
  104. package/dist/src/printer/summary.d.ts +50 -0
  105. package/dist/src/printer/summary.d.ts.map +1 -0
  106. package/dist/src/printer/summary.js +621 -0
  107. package/dist/src/printer/summary.js.map +1 -0
  108. package/dist/src/trace/events.d.ts +183 -0
  109. package/dist/src/trace/events.d.ts.map +1 -0
  110. package/dist/src/trace/events.js +9 -0
  111. package/dist/src/trace/events.js.map +1 -0
  112. package/dist/src/trace/progress.d.ts +58 -0
  113. package/dist/src/trace/progress.d.ts.map +1 -0
  114. package/dist/src/trace/progress.js +83 -0
  115. package/dist/src/trace/progress.js.map +1 -0
  116. package/dist/src/vm/arith.d.ts +29 -0
  117. package/dist/src/vm/arith.d.ts.map +1 -0
  118. package/dist/src/vm/arith.js +258 -0
  119. package/dist/src/vm/arith.js.map +1 -0
  120. package/dist/src/vm/builtins.d.ts +31 -0
  121. package/dist/src/vm/builtins.d.ts.map +1 -0
  122. package/dist/src/vm/builtins.js +1773 -0
  123. package/dist/src/vm/builtins.js.map +1 -0
  124. package/dist/src/vm/emulate.d.ts +75 -0
  125. package/dist/src/vm/emulate.d.ts.map +1 -0
  126. package/dist/src/vm/emulate.js +380 -0
  127. package/dist/src/vm/emulate.js.map +1 -0
  128. package/dist/src/vm/expand.d.ts +68 -0
  129. package/dist/src/vm/expand.d.ts.map +1 -0
  130. package/dist/src/vm/expand.js +744 -0
  131. package/dist/src/vm/expand.js.map +1 -0
  132. package/dist/src/vm/external.d.ts +34 -0
  133. package/dist/src/vm/external.d.ts.map +1 -0
  134. package/dist/src/vm/external.js +228 -0
  135. package/dist/src/vm/external.js.map +1 -0
  136. package/dist/src/vm/fifo.d.ts +66 -0
  137. package/dist/src/vm/fifo.d.ts.map +1 -0
  138. package/dist/src/vm/fifo.js +232 -0
  139. package/dist/src/vm/fifo.js.map +1 -0
  140. package/dist/src/vm/interp.d.ts +209 -0
  141. package/dist/src/vm/interp.d.ts.map +1 -0
  142. package/dist/src/vm/interp.js +1641 -0
  143. package/dist/src/vm/interp.js.map +1 -0
  144. package/dist/src/vm/io.d.ts +180 -0
  145. package/dist/src/vm/io.d.ts.map +1 -0
  146. package/dist/src/vm/io.js +502 -0
  147. package/dist/src/vm/io.js.map +1 -0
  148. package/dist/src/vm/pattern.d.ts +46 -0
  149. package/dist/src/vm/pattern.d.ts.map +1 -0
  150. package/dist/src/vm/pattern.js +498 -0
  151. package/dist/src/vm/pattern.js.map +1 -0
  152. package/dist/src/vm/proc.d.ts +94 -0
  153. package/dist/src/vm/proc.d.ts.map +1 -0
  154. package/dist/src/vm/proc.js +130 -0
  155. package/dist/src/vm/proc.js.map +1 -0
  156. package/dist/src/vm/state.d.ts +104 -0
  157. package/dist/src/vm/state.d.ts.map +1 -0
  158. package/dist/src/vm/state.js +233 -0
  159. package/dist/src/vm/state.js.map +1 -0
  160. package/dist/src/vm/test.d.ts +11 -0
  161. package/dist/src/vm/test.d.ts.map +1 -0
  162. package/dist/src/vm/test.js +277 -0
  163. package/dist/src/vm/test.js.map +1 -0
  164. package/package.json +63 -4
  165. package/src/analysis/analyze.ts +1395 -0
  166. package/src/analysis/fs.ts +121 -0
  167. package/src/analysis/outputs.ts +242 -0
  168. package/src/analysis/value.ts +264 -0
  169. package/src/behaviors/defs/core.ts +970 -0
  170. package/src/behaviors/defs/devtools.ts +400 -0
  171. package/src/behaviors/defs/macos.ts +426 -0
  172. package/src/behaviors/defs/tools.ts +596 -0
  173. package/src/behaviors/dsl.ts +293 -0
  174. package/src/behaviors/index.ts +19 -0
  175. package/src/behaviors/registry.ts +261 -0
  176. package/src/behaviors/roles.ts +187 -0
  177. package/src/behaviors/types.ts +127 -0
  178. package/src/index.ts +27 -0
  179. package/src/integrations/deepsea.ts +259 -0
  180. package/src/machine.ts +483 -0
  181. package/src/parser/ast.ts +472 -0
  182. package/src/parser/parser.ts +1826 -0
  183. package/src/policy/effects.ts +102 -0
  184. package/src/policy/policy.ts +578 -0
  185. package/src/printer/doc.ts +454 -0
  186. package/src/printer/highlight.ts +283 -0
  187. package/src/printer/html.ts +441 -0
  188. package/src/printer/print.ts +528 -0
  189. package/src/printer/summary.ts +601 -0
  190. package/src/trace/events.ts +102 -0
  191. package/src/trace/progress.ts +119 -0
  192. package/src/vm/arith.ts +236 -0
  193. package/src/vm/builtins.ts +1590 -0
  194. package/src/vm/emulate.ts +337 -0
  195. package/src/vm/expand.ts +721 -0
  196. package/src/vm/external.ts +265 -0
  197. package/src/vm/fifo.ts +226 -0
  198. package/src/vm/interp.ts +1623 -0
  199. package/src/vm/io.ts +570 -0
  200. package/src/vm/pattern.ts +477 -0
  201. package/src/vm/proc.ts +147 -0
  202. package/src/vm/state.ts +267 -0
  203. package/src/vm/test.ts +253 -0
@@ -0,0 +1,139 @@
1
+ /**
2
+ * The public entry point: a {@link Machine} runs bash snippets under a policy,
3
+ * with behavior definitions, hooks and a trace event stream.
4
+ *
5
+ * ```ts
6
+ * const m = new Machine({ cwd, policy: { mode: 'workspace-write', workspaceRoot: cwd } })
7
+ * m.on((e) => console.log(e.type))
8
+ * const r = await m.run('ls | wc -l')
9
+ * ```
10
+ */
11
+ import type * as A from './parser/ast.ts';
12
+ import { BehaviorRegistry } from './behaviors/registry.ts';
13
+ import { type Policy } from './policy/policy.ts';
14
+ import type { Hooks, TraceListener } from './trace/events.ts';
15
+ import { type SpawnFn } from './vm/external.ts';
16
+ import { type FdPassing } from './vm/fifo.ts';
17
+ import { Capture, type DataListener } from './vm/io.ts';
18
+ import { type AnalysisReport, type AnalyzeOptions } from './analysis/analyze.ts';
19
+ export interface MachineOptions {
20
+ /** Initial working directory (default: process.cwd()). */
21
+ cwd?: string;
22
+ /** Environment (default: process.env). */
23
+ env?: Record<string, string | undefined>;
24
+ /** Sandbox policy (default: workspace-write rooted at cwd). */
25
+ policy?: Policy;
26
+ behaviors?: BehaviorRegistry;
27
+ hooks?: Hooks;
28
+ /** Host stdin (default: empty). */
29
+ stdin?: AsyncIterable<Uint8Array | string>;
30
+ /** Host stdout/stderr sinks. Default: captured and returned by `run`. */
31
+ stdout?: (chunk: Uint8Array) => void | Promise<void>;
32
+ stderr?: (chunk: Uint8Array) => void | Promise<void>;
33
+ /** Spawn function for external commands (wrap it to confine children). */
34
+ spawn?: SpawnFn;
35
+ /** Report `data` events for every channel (pipes, redirections, captures). Default false. */
36
+ traceData?: boolean;
37
+ /**
38
+ * What to do with background jobs still running when the script ends:
39
+ * `detach` (like bash: leave them running), `wait`, or `kill`. Default `wait`.
40
+ */
41
+ background?: 'detach' | 'wait' | 'kill';
42
+ /**
43
+ * Deny commands whose policy verdict is `unknown` (effects not provably
44
+ * allowed). Default false: unknown effects are allowed (the OS sandbox
45
+ * still confines them) but reported.
46
+ */
47
+ denyUnknown?: boolean;
48
+ /** Status of a denied command (default 126). */
49
+ deniedStatus?: number;
50
+ /** Abort the whole run on the first denial instead of failing the command. */
51
+ abortOnDeny?: boolean;
52
+ /** Dry run: never execute external commands; report their predicted effects instead. */
53
+ dryRun?: boolean;
54
+ /** `$0` (default `mash`). */
55
+ arg0?: string;
56
+ /**
57
+ * Run nested `bash -c`, `bash file` and bash/sh shebang scripts inside the
58
+ * VM so their commands are traced and checked individually (default true).
59
+ */
60
+ inlineScripts?: boolean;
61
+ /**
62
+ * Emulate `xargs` and `find -exec/-delete` inside the VM so every command
63
+ * they run is traced and checked individually (default true).
64
+ */
65
+ emulate?: boolean;
66
+ /**
67
+ * How process substitutions and other `/dev/fd/N` arguments naming VM fds
68
+ * reach external commands. `devfd`: an extra stdio slot, passed as
69
+ * `/dev/fd/K` (works on macOS, where the child can open a socket by that
70
+ * name). `fifo`: a named FIFO in a private temp dir, passed by path (needed
71
+ * on Linux, where opening `/dev/fd/K` on a socket fails with ENXIO).
72
+ * Default: the `MASH_PROCSUBST` environment variable (`fifo`|`devfd`), else
73
+ * `devfd` on macOS and `fifo` elsewhere.
74
+ */
75
+ procSubst?: FdPassing;
76
+ }
77
+ export interface RunOptions {
78
+ /** Positional parameters ($1...). */
79
+ args?: string[];
80
+ signal?: AbortSignal;
81
+ }
82
+ export interface RunResult {
83
+ status: number;
84
+ /** Captured output when no stdout/stderr sink was configured. */
85
+ stdout: string;
86
+ stderr: string;
87
+ /** Set when the run was aborted (policy abort or signal). */
88
+ aborted?: string;
89
+ /** Commands denied by policy or hooks during the run. */
90
+ denials: {
91
+ argv: string[];
92
+ reason: string;
93
+ }[];
94
+ }
95
+ export declare class Machine {
96
+ readonly options: MachineOptions;
97
+ readonly policy: Policy;
98
+ readonly behaviors: BehaviorRegistry;
99
+ private readonly listeners;
100
+ private readonly dataListeners;
101
+ private nextId;
102
+ private readonly sources;
103
+ private channelCounter;
104
+ private pidCounter;
105
+ private execCounter;
106
+ private runCounter;
107
+ private readonly contexts;
108
+ constructor(options?: MachineOptions);
109
+ /** Subscribe to trace events. Returns an unsubscribe function. */
110
+ on(listener: TraceListener): () => void;
111
+ /** Tap the bytes flowing through every channel (pipes, redirections, captures, stdio). */
112
+ tap(listener: DataListener): () => void;
113
+ private emit;
114
+ /** Parse source, registering it so trace consumers can map node ids back to text. */
115
+ parse(source: string, origin?: string, opts?: {
116
+ partial?: boolean;
117
+ }): A.Script;
118
+ private sourceOf;
119
+ /** Source text of a node. */
120
+ textOf(node: {
121
+ id: number;
122
+ span: A.Span;
123
+ }): string;
124
+ /** Static analysis: predicted commands, effects and policy findings, without running anything. */
125
+ analyze(source: string | A.Script, options?: Partial<AnalyzeOptions>): AnalysisReport;
126
+ private analyzeNested;
127
+ private initialEnv;
128
+ /** Run a snippet. */
129
+ run(source: string | A.Script, opts?: RunOptions): Promise<RunResult>;
130
+ private nextPidValue;
131
+ private channel;
132
+ /** Effects of a builtin (most have none). */
133
+ private builtinEffects;
134
+ private invocation;
135
+ private assess;
136
+ private assessEffectsOnly;
137
+ }
138
+ export { Capture };
139
+ //# sourceMappingURL=machine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machine.d.ts","sourceRoot":"","sources":["../../src/machine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,400 @@
1
+ /**
2
+ * The public entry point: a {@link Machine} runs bash snippets under a policy,
3
+ * with behavior definitions, hooks and a trace event stream.
4
+ *
5
+ * ```ts
6
+ * const m = new Machine({ cwd, policy: { mode: 'workspace-write', workspaceRoot: cwd } })
7
+ * m.on((e) => console.log(e.type))
8
+ * const r = await m.run('ls | wc -l')
9
+ * ```
10
+ */
11
+ import * as os from 'node:os';
12
+ import * as path from 'node:path';
13
+ import { parse, lineColumn } from "./parser/parser.js";
14
+ import { known } from "./analysis/value.js";
15
+ import { BehaviorRegistry, basename } from "./behaviors/registry.js";
16
+ import { defaultBehaviors } from "./behaviors/index.js";
17
+ import { checkCommandName, checkEffects, checkExecEffects, defaultPolicy } from "./policy/policy.js";
18
+ import { asPossible, viaSuffix, withVia } from "./policy/effects.js";
19
+ import { defaultSpawn } from "./vm/external.js";
20
+ import { defaultFdPassing } from "./vm/fifo.js";
21
+ import { Interpreter } from "./vm/interp.js";
22
+ import { Capture, FdTable, HostStream } from "./vm/io.js";
23
+ import { AbortRun, Proc } from "./vm/proc.js";
24
+ import { initShellVars, newVar, ShellState } from "./vm/state.js";
25
+ import { analyzeScript } from "./analysis/analyze.js";
26
+ export class Machine {
27
+ options;
28
+ policy;
29
+ behaviors;
30
+ listeners = [];
31
+ dataListeners = [];
32
+ nextId = 1;
33
+ sources = [];
34
+ channelCounter = 0;
35
+ pidCounter = 0;
36
+ execCounter = 0;
37
+ runCounter = 0;
38
+ contexts = new Map();
39
+ constructor(options = {}) {
40
+ this.options = options;
41
+ const cwd = path.resolve(options.cwd ?? process.cwd());
42
+ this.policy = options.policy ?? defaultPolicy(cwd);
43
+ this.behaviors = options.behaviors ?? defaultBehaviors();
44
+ this.behaviors.scriptAnalyzer ??= (source, positional, inv, info) => this.analyzeNested(source, positional, inv, info);
45
+ if (options.traceData) {
46
+ this.dataListeners.push((channel, bytes, direction) => this.emit({ type: 'data', channel, bytes, direction }));
47
+ }
48
+ this.pidCounter = 10000 + (process.pid % 1000) * 10;
49
+ }
50
+ /** Subscribe to trace events. Returns an unsubscribe function. */
51
+ on(listener) {
52
+ this.listeners.push(listener);
53
+ return () => {
54
+ const i = this.listeners.indexOf(listener);
55
+ if (i >= 0)
56
+ this.listeners.splice(i, 1);
57
+ };
58
+ }
59
+ /** Tap the bytes flowing through every channel (pipes, redirections, captures, stdio). */
60
+ tap(listener) {
61
+ this.dataListeners.push(listener);
62
+ return () => {
63
+ const i = this.dataListeners.indexOf(listener);
64
+ if (i >= 0)
65
+ this.dataListeners.splice(i, 1);
66
+ };
67
+ }
68
+ emit(e) {
69
+ for (const l of this.listeners) {
70
+ try {
71
+ l(e);
72
+ }
73
+ catch {
74
+ // listeners must not break execution
75
+ }
76
+ }
77
+ }
78
+ /** Parse source, registering it so trace consumers can map node ids back to text. */
79
+ parse(source, origin = 'script', opts = {}) {
80
+ const firstId = this.nextId;
81
+ const script = parse(source, { firstId, partial: opts.partial });
82
+ this.nextId = script.id + 1;
83
+ this.sources.push({ firstId, lastId: script.id, text: source, origin });
84
+ return script;
85
+ }
86
+ sourceOf(id) {
87
+ for (let i = this.sources.length - 1; i >= 0; i--) {
88
+ const s = this.sources[i];
89
+ if (id >= s.firstId && id <= s.lastId)
90
+ return s;
91
+ }
92
+ return undefined;
93
+ }
94
+ /** Source text of a node. */
95
+ textOf(node) {
96
+ const s = this.sourceOf(node.id);
97
+ return s ? s.text.slice(node.span.start, node.span.end) : '';
98
+ }
99
+ /** Static analysis: predicted commands, effects and policy findings, without running anything. */
100
+ analyze(source, options = {}) {
101
+ const script = typeof source === 'string' ? this.parse(source, 'analysis') : source;
102
+ const text = typeof source === 'string' ? source : this.sourceOf(source.id)?.text ?? '';
103
+ const cwd = path.resolve(this.options.cwd ?? process.cwd());
104
+ return analyzeScript(script, text, {
105
+ cwd: known(cwd),
106
+ env: this.initialEnv(),
107
+ policy: this.policy,
108
+ behaviors: this.behaviors,
109
+ ...options,
110
+ });
111
+ }
112
+ analyzeNested(source, positional, inv, info = {}) {
113
+ const text = source.alts.length === 1 && source.alts[0].every((s) => typeof s === 'string') ? source.alts[0].join('') : undefined;
114
+ if (text === undefined)
115
+ return { effects: [{ kind: 'unknown', detail: 'script text is not known statically' }], complete: false };
116
+ const file = info.file ? path.normalize(info.file) : undefined;
117
+ if (file && inv.mayHaveChanged?.(file))
118
+ return { effects: [{ kind: 'unknown', detail: `script ${file} may be changed by the snippet before it runs` }], complete: false };
119
+ let script;
120
+ try {
121
+ script = parse(text, { firstId: 2_000_000_000 });
122
+ }
123
+ catch (e) {
124
+ return { effects: [{ kind: 'unknown', detail: `script does not parse: ${e.message}` }], complete: false };
125
+ }
126
+ const env = {};
127
+ const report = analyzeScript(script, text, {
128
+ cwd: inv.cwd,
129
+ env,
130
+ envValues: (n) => inv.env(n),
131
+ policy: this.policy,
132
+ behaviors: this.behaviors,
133
+ positional,
134
+ nested: true,
135
+ });
136
+ // Every effect says which inner command it comes from. Conditional (`may`)
137
+ // effects are only possible effects of the outer command: never a definite
138
+ // violation, and checked individually when the script runs.
139
+ // External commands become `exec` effects, so denied command names are seen.
140
+ const effects = report.commands.flatMap((c) => {
141
+ const own = c.kind === 'external' || c.kind === 'not-found' ? [{ kind: 'exec', argv: c.argv }, ...c.effects] : c.effects;
142
+ return own.map((e) => {
143
+ const nested = withVia(e, { text: c.text, line: c.line, ...(file ? { file } : {}) });
144
+ return c.reach === 'may' ? asPossible(nested) : nested;
145
+ });
146
+ });
147
+ return { effects, complete: report.commands.every((c) => c.complete), readsStdin: 'maybe' };
148
+ }
149
+ initialEnv() {
150
+ const env = {};
151
+ for (const [k, v] of Object.entries(this.options.env ?? process.env))
152
+ if (v !== undefined)
153
+ env[k] = v;
154
+ return env;
155
+ }
156
+ /** Run a snippet. */
157
+ async run(source, opts = {}) {
158
+ // bash reads scripts line by line: lines before a syntax error still run
159
+ const script = typeof source === 'string' ? this.parse(source, 'script', { partial: true }) : source;
160
+ const runId = ++this.runCounter;
161
+ const controller = new AbortController();
162
+ const external = opts.signal;
163
+ const onExternalAbort = () => controller.abort();
164
+ external?.addEventListener('abort', onExternalAbort, { once: true });
165
+ if (external?.aborted)
166
+ controller.abort();
167
+ const cwd = path.resolve(this.options.cwd ?? process.cwd());
168
+ const state = new ShellState(cwd);
169
+ for (const [k, v] of Object.entries(this.initialEnv()))
170
+ state.globals.set(k, newVar({ kind: 'string', value: v }, { exported: true }));
171
+ state.globals.set('PWD', newVar({ kind: 'string', value: cwd }, { exported: true }));
172
+ if (!state.globals.has('HOME'))
173
+ state.globals.set('HOME', newVar({ kind: 'string', value: os.homedir() }, { exported: true }));
174
+ const shlvl = Number(state.getString('SHLVL') ?? '0') + 1;
175
+ state.globals.set('SHLVL', newVar({ kind: 'string', value: String(shlvl) }, { exported: true }));
176
+ initShellVars(state);
177
+ state.positional = opts.args ?? [];
178
+ state.arg0 = this.options.arg0 ?? 'mash';
179
+ const stdoutCapture = [];
180
+ const stderrCapture = [];
181
+ const denials = [];
182
+ const fds = new FdTable();
183
+ const dl = this.dataListeners;
184
+ fds.set(0, new HostStream(this.channel('host', 'stdin'), dl, { input: this.options.stdin ?? (async function* () { })() }));
185
+ fds.set(1, new HostStream(this.channel('host', 'stdout'), dl, { write: this.options.stdout ?? ((c) => void stdoutCapture.push(c)) }));
186
+ fds.set(2, new HostStream(this.channel('host', 'stderr'), dl, { write: this.options.stderr ?? ((c) => void stderrCapture.push(c)) }));
187
+ const shellPid = this.nextPidValue();
188
+ const jobs = new Map();
189
+ const allJobs = [];
190
+ const tracked = [];
191
+ const proc = new Proc(state, fds, shellPid, process.pid, 0, jobs, false);
192
+ const rt = {
193
+ emit: (e) => this.emit(e),
194
+ listeners: dl,
195
+ channel: (kind, label, extra) => this.channel(kind, label, extra),
196
+ nextPid: () => this.nextPidValue(),
197
+ nextExecId: () => ++this.execCounter,
198
+ shellPid,
199
+ assess: async (intent) => {
200
+ const a = await this.assess(intent);
201
+ if (a.action === 'deny' || a.action === 'abort')
202
+ denials.push({ argv: intent.argv, reason: a.reason });
203
+ return a;
204
+ },
205
+ assessRedirects: async (effects, node, p) => {
206
+ const a = await this.assessEffectsOnly(effects, node);
207
+ if (a.action === 'deny' || a.action === 'abort')
208
+ denials.push({ argv: [this.textOf(node)], reason: a.reason });
209
+ return a;
210
+ },
211
+ afterCommand: async (execId, status) => {
212
+ const ctx = this.contexts.get(execId);
213
+ this.contexts.delete(execId);
214
+ if (ctx && this.options.hooks?.afterCommand)
215
+ await this.options.hooks.afterCommand(ctx, status);
216
+ },
217
+ spawn: this.options.spawn ?? defaultSpawn,
218
+ signal: controller.signal,
219
+ text: (node) => this.textOf(node),
220
+ line: (node) => {
221
+ const s = this.sourceOf(node.id);
222
+ return s ? lineColumn(s.text, node.span.start).line : 0;
223
+ },
224
+ parse: (text, origin, opts) => this.parse(text, origin, opts),
225
+ findJob: (pid) => allJobs.find((j) => j.pid === pid),
226
+ track: (p) => void tracked.push(p.catch(() => { })),
227
+ registerJob: (job) => void allJobs.push(job),
228
+ inlineScripts: this.options.inlineScripts ?? true,
229
+ emulate: this.options.emulate ?? true,
230
+ fdPassing: this.options.procSubst ?? defaultFdPassing(),
231
+ };
232
+ const interp = new Interpreter(rt);
233
+ this.emit({ type: 'run:start', runId, pid: shellPid });
234
+ let status;
235
+ let aborted;
236
+ try {
237
+ status = await interp.runTop(script, proc);
238
+ }
239
+ catch (e) {
240
+ if (e instanceof AbortRun) {
241
+ status = e.status;
242
+ aborted = e.message;
243
+ controller.abort();
244
+ for (const j of allJobs)
245
+ j.kill();
246
+ const errText = `mash: aborted: ${e.message}\n`;
247
+ await fds.get(2)?.write(errText).catch(() => { });
248
+ }
249
+ else {
250
+ throw e;
251
+ }
252
+ }
253
+ const bg = this.options.background ?? 'wait';
254
+ if (bg === 'wait')
255
+ await Promise.all(allJobs.map((j) => j.done.catch(() => 0)));
256
+ else if (bg === 'kill') {
257
+ for (const j of allJobs)
258
+ if (j.status === null)
259
+ j.kill();
260
+ await Promise.all(allJobs.map((j) => j.done.catch(() => 0)));
261
+ }
262
+ if (bg !== 'detach')
263
+ await Promise.all(tracked);
264
+ fds.closeAll();
265
+ external?.removeEventListener('abort', onExternalAbort);
266
+ this.emit({ type: 'run:end', runId, status });
267
+ const dec = new TextDecoder();
268
+ const join = (chunks) => chunks.map((c) => dec.decode(c, { stream: true })).join('') + dec.decode();
269
+ return { status, stdout: join(stdoutCapture), stderr: join(stderrCapture), aborted, denials };
270
+ }
271
+ nextPidValue() {
272
+ return ++this.pidCounter;
273
+ }
274
+ channel(kind, label, extra = {}) {
275
+ const ch = { id: ++this.channelCounter, kind, label, ...extra };
276
+ if (kind !== 'host' && kind !== 'null')
277
+ this.emit({ type: 'channel:open', channel: ch });
278
+ return ch;
279
+ }
280
+ // -------------------------------------------------------------------------
281
+ // Assessment: behavior → effects → policy → hooks
282
+ // -------------------------------------------------------------------------
283
+ /** Effects of a builtin (most have none). */
284
+ builtinEffects(argv, cwd, env) {
285
+ const name = argv[0];
286
+ const resolve = (p) => known(path.resolve(cwd, p));
287
+ switch (name) {
288
+ case 'cd':
289
+ case 'pushd':
290
+ return { effects: argv[1] && argv[1] !== '-' ? [{ kind: 'chdir', path: resolve(argv[1]) }] : [] };
291
+ case 'source':
292
+ case '.':
293
+ return { effects: argv[1] ? [{ kind: 'read', path: resolve(argv[1]) }] : [] };
294
+ case 'exec':
295
+ case 'command':
296
+ case 'builtin': {
297
+ const rest = argv.slice(1).filter((a, i) => !(i === 0 && a.startsWith('-')));
298
+ if (rest.length === 0 || argv.slice(1).some((a) => a === '-v' || a === '-V'))
299
+ return { effects: [] };
300
+ return this.behaviors.analyze(this.invocation(rest, cwd, env));
301
+ }
302
+ case 'kill':
303
+ return { effects: [{ kind: 'process', detail: `kill ${argv.slice(1).join(' ')}` }] };
304
+ default:
305
+ return { effects: [] };
306
+ }
307
+ }
308
+ invocation(argv, cwd, env, stdin = 'unknown') {
309
+ return {
310
+ name: basename(argv[0]),
311
+ argv: argv.map(known),
312
+ cwd: known(cwd),
313
+ env: (n) => (env[n] === undefined ? undefined : known(env[n])),
314
+ stdin,
315
+ };
316
+ }
317
+ async assess(intent) {
318
+ const policy = this.policy;
319
+ let result;
320
+ if (intent.kind === 'external') {
321
+ result = this.behaviors.analyze(this.invocation(intent.argv, intent.cwd, intent.env, intent.stdinKind));
322
+ }
323
+ else if (intent.kind === 'builtin') {
324
+ result = this.builtinEffects(intent.argv, intent.cwd, intent.env);
325
+ }
326
+ else {
327
+ result = { effects: [] };
328
+ }
329
+ const effects = [...intent.redirectEffects, ...result.effects];
330
+ const findings = checkEffects(effects, policy, { runtime: true });
331
+ const nameFinding = intent.kind === 'external' || intent.kind === 'not-found' ? checkCommandName(intent.argv[0], policy) : null;
332
+ if (nameFinding)
333
+ findings.unshift(nameFinding);
334
+ findings.unshift(...checkExecEffects(result.effects, policy));
335
+ const denied = findings.filter((f) => f.verdict === 'deny');
336
+ const unknown = findings.filter((f) => f.verdict === 'unknown');
337
+ let decision = denied.length > 0 || (this.options.denyUnknown && unknown.length > 0) ? 'deny' : 'allow';
338
+ const ctx = {
339
+ execId: intent.execId,
340
+ nodeId: intent.node.id,
341
+ span: intent.node.span,
342
+ text: this.textOf(intent.node),
343
+ argv: intent.argv,
344
+ kind: intent.kind,
345
+ path: intent.path,
346
+ cwd: intent.cwd,
347
+ env: intent.env,
348
+ effects,
349
+ effectsComplete: result.complete !== false,
350
+ findings,
351
+ decision,
352
+ pid: intent.pid,
353
+ };
354
+ this.contexts.set(intent.execId, ctx);
355
+ let hook = undefined;
356
+ if (this.options.hooks?.beforeCommand)
357
+ hook = await this.options.hooks.beforeCommand(ctx);
358
+ const reasonOf = () => (denied.length > 0 ? denied : unknown).map((f) => f.reason + viaSuffix(f.effect)).join('; ') || 'denied by policy';
359
+ const status = this.options.deniedStatus ?? 126;
360
+ if (hook) {
361
+ switch (hook.action) {
362
+ case 'allow':
363
+ decision = 'allow';
364
+ break;
365
+ case 'deny':
366
+ this.emit({ type: 'command:denied', execId: intent.execId, nodeId: intent.node.id, argv: intent.argv, reason: hook.reason, findings });
367
+ return { action: 'deny', reason: hook.reason, status: hook.status ?? status };
368
+ case 'abort':
369
+ this.emit({ type: 'command:denied', execId: intent.execId, nodeId: intent.node.id, argv: intent.argv, reason: hook.reason, findings });
370
+ return { action: 'abort', reason: hook.reason, status: hook.status ?? status };
371
+ case 'simulate':
372
+ return { action: 'simulate', stdout: hook.stdout ?? '', stderr: hook.stderr ?? '', status: hook.status ?? 0 };
373
+ }
374
+ }
375
+ if (decision === 'deny') {
376
+ const reason = `denied by policy: ${reasonOf()}`;
377
+ this.emit({ type: 'command:denied', execId: intent.execId, nodeId: intent.node.id, argv: intent.argv, reason, findings });
378
+ return this.options.abortOnDeny ? { action: 'abort', reason, status } : { action: 'deny', reason, status };
379
+ }
380
+ if (this.options.dryRun && intent.kind === 'external') {
381
+ return { action: 'simulate', stdout: '', stderr: '', status: 0 };
382
+ }
383
+ return { action: 'run', readsStdin: result.readsStdin ?? 'maybe' };
384
+ }
385
+ async assessEffectsOnly(effects, node) {
386
+ if (effects.length === 0)
387
+ return { action: 'run', readsStdin: 'maybe' };
388
+ const findings = checkEffects(effects, this.policy, { runtime: true });
389
+ const denied = findings.filter((f) => f.verdict === 'deny');
390
+ if (denied.length > 0) {
391
+ const reason = `denied by policy: ${denied.map((f) => f.reason + viaSuffix(f.effect)).join('; ')}`;
392
+ this.emit({ type: 'command:denied', execId: 0, nodeId: node.id, argv: [this.textOf(node)], reason, findings });
393
+ const status = this.options.deniedStatus ?? 126;
394
+ return this.options.abortOnDeny ? { action: 'abort', reason, status } : { action: 'deny', reason, status };
395
+ }
396
+ return { action: 'run', readsStdin: 'maybe' };
397
+ }
398
+ }
399
+ export { Capture };
400
+ //# sourceMappingURL=machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machine.js","sourceRoot":"","sources":["../../src/machine.ts"],"names":[],"mappings":"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"}