@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,120 @@
1
+ /**
2
+ * Behavior definitions: what an executable WOULD read, write, delete,
3
+ * execute or connect to, given its argv — without running it.
4
+ *
5
+ * A behavior receives abstract argv ({@link AValue}s). At runtime every value
6
+ * is concrete; during static analysis some are unknown. Definitions should be
7
+ * conservative: when an argument they need is unknown they still report the
8
+ * effect with the unknown path (the policy then answers `unknown`), and set
9
+ * `complete: false` when they cannot tell what the command does at all.
10
+ */
11
+ import type { AValue, HoleType } from '../analysis/value.ts';
12
+ import type { Effect } from '../policy/effects.ts';
13
+ export type StdinKind = 'pipe' | 'file' | 'null' | 'terminal' | 'unknown';
14
+ export interface Invocation {
15
+ /** Basename of argv[0]. */
16
+ name: string;
17
+ /** Full argv (argv[0] included). */
18
+ argv: AValue[];
19
+ /** Working directory (absolute). */
20
+ cwd: AValue;
21
+ /** Environment lookup (exported variables). */
22
+ env(name: string): AValue | undefined;
23
+ stdin: StdinKind;
24
+ /**
25
+ * Static analysis only: did the snippet (possibly) write this concrete path
26
+ * before this command? Then the file's current contents (a script to
27
+ * follow) are not what the command will see.
28
+ */
29
+ mayHaveChanged?(path: string): boolean;
30
+ }
31
+ export interface OutputInfo {
32
+ /** Type of the command's stdout (as captured by `$(...)`, trailing newlines stripped). */
33
+ type: HoleType;
34
+ /** For `path` outputs: a directory the output lies under. */
35
+ under?: string;
36
+ /** Output is a list of lines, each of `type`. */
37
+ lines?: boolean;
38
+ /** Exactly known output (e.g. `pwd`, `basename` of a literal). */
39
+ value?: AValue;
40
+ }
41
+ /** Where nested script text came from (for effect provenance). */
42
+ export interface ScriptInfo {
43
+ /** The script file (absolute), when the text was read from one. */
44
+ file?: string;
45
+ }
46
+ export interface BehaviorResult {
47
+ effects: Effect[];
48
+ /** Does the command read stdin? Lets the VM avoid pumping stdin into commands that never read it. */
49
+ readsStdin?: boolean | 'maybe';
50
+ stdout?: OutputInfo;
51
+ /** False when the definition could not determine all effects (unknown flags, opaque arguments). */
52
+ complete?: boolean;
53
+ /** Free-form notes for reports. */
54
+ notes?: string[];
55
+ }
56
+ export interface Behavior {
57
+ /** Command basenames this definition handles. */
58
+ names: string[];
59
+ summary?: string;
60
+ analyze(inv: Invocation, h: BehaviorHelpers): BehaviorResult;
61
+ }
62
+ export interface ParsedArgs {
63
+ /** Short and long flags seen, by canonical name (value `true` or the option argument). */
64
+ flags: Map<string, AValue | true>;
65
+ /** Repeated options (`-e x -e y`), in order. */
66
+ multi: Map<string, AValue[]>;
67
+ operands: AValue[];
68
+ /** Arguments whose role could not be determined (unknown values that might be options). */
69
+ ambiguous: AValue[];
70
+ /** Flags not in the spec. */
71
+ unknownFlags: string[];
72
+ }
73
+ export interface ArgSpec {
74
+ /** Short flags without arguments, e.g. `'rfiv'`. */
75
+ short?: string;
76
+ /** Short flags taking an argument, e.g. `'tS'`. */
77
+ shortWithArg?: string;
78
+ /**
79
+ * Long options: name → takes an argument? A number is how many arguments
80
+ * it takes (`--cropOffset y x`: 2; the last one is recorded). Values may also
81
+ * be an alias (`'=r'` maps to short `r`).
82
+ */
83
+ long?: Record<string, boolean | number | string>;
84
+ /** Short flags (in `shortWithArg`) taking more than one argument: `{ c: 2 }`. The last one is recorded. */
85
+ arity?: Record<string, number>;
86
+ /** Single-dash long options (`-layout`, `-show_entries x`): `-word` is looked up in `long` first, then parsed as short flags. */
87
+ longSingle?: boolean;
88
+ /** Stop option parsing at the first operand (like POSIX getopt; default false = GNU permutation). */
89
+ posix?: boolean;
90
+ /** Accept `-<digits>` (`head -20`) as this flag with the digits as its value. */
91
+ numeric?: string;
92
+ }
93
+ export interface BehaviorHelpers {
94
+ /** Resolve a (possibly relative) path argument against the invocation's cwd. */
95
+ resolve(p: AValue): AValue;
96
+ /** GNU-style argument parsing over abstract values. */
97
+ parseArgs(args: AValue[], spec: ArgSpec): ParsedArgs;
98
+ /** Analyze a nested command (xargs, find -exec, env, timeout, sudo...). */
99
+ subcommand(argv: AValue[], opts?: {
100
+ stdin?: StdinKind;
101
+ cwd?: AValue;
102
+ }): BehaviorResult;
103
+ /** Analyze a shell script string (bash -c, sh -c, eval); `info.file` names the script file it was read from. */
104
+ script(source: AValue, positional?: AValue[], info?: ScriptInfo): BehaviorResult;
105
+ /** Home directory, if known. */
106
+ home(): AValue | undefined;
107
+ /**
108
+ * Hint what an argument *is* when no effect says so: a search pattern
109
+ * (grep, find -name) or program text (sed/awk/jq programs, `python -c`).
110
+ * Used for display (syntax highlighting, summaries); no effect on policy.
111
+ */
112
+ role(value: AValue, role: ArgRole): void;
113
+ }
114
+ /**
115
+ * What an argument is, for display. `dir`/`file` come from effects;
116
+ * `pattern`/`code`/`subcommand` from {@link BehaviorHelpers.role} (and a
117
+ * table of tools with subcommands in roles.ts).
118
+ */
119
+ export type ArgRole = 'dir' | 'file' | 'pattern' | 'code' | 'cmd' | 'subcommand';
120
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/behaviors/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Behavior definitions: what an executable WOULD read, write, delete,
3
+ * execute or connect to, given its argv — without running it.
4
+ *
5
+ * A behavior receives abstract argv ({@link AValue}s). At runtime every value
6
+ * is concrete; during static analysis some are unknown. Definitions should be
7
+ * conservative: when an argument they need is unknown they still report the
8
+ * effect with the unknown path (the policy then answers `unknown`), and set
9
+ * `complete: false` when they cannot tell what the command does at all.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/behaviors/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * mash — a bash virtual machine for agent harnesses.
3
+ *
4
+ * - `parse` → span-preserving AST (`./parser/ast.ts`)
5
+ * - `Machine.analyze` → static effect analysis and pre-flight policy verdict
6
+ * - `Machine.run` → policy-checked streaming execution with trace events and hooks
7
+ * - behavior definitions → predicted effects of executables (`./behaviors`)
8
+ */
9
+ export * as AST from './parser/ast.ts';
10
+ export { parse, ParseError, lineColumn, literalOf, staticWordValue } from './parser/parser.ts';
11
+ export { Machine, type MachineOptions, type RunOptions, type RunResult } from './machine.ts';
12
+ export * from './trace/events.ts';
13
+ export type { Channel, ChannelKind, DataListener } from './vm/io.ts';
14
+ export * from './policy/policy.ts';
15
+ export * from './policy/effects.ts';
16
+ export * from './behaviors/index.ts';
17
+ export * from './analysis/value.ts';
18
+ export { analyzeScript, analyzeSource, type AnalysisReport, type CommandSite, type Violation, type VariableInfo, type AnalyzeOptions } from './analysis/analyze.ts';
19
+ export { defaultSpawn, type SpawnFn, type SpawnRequest } from './vm/external.ts';
20
+ export type { FdPassing } from './vm/fifo.ts';
21
+ export { ProgressTracker, type ProgressSnapshot } from './trace/progress.ts';
22
+ export { format, printScript, type FormatOptions, type FormatResult } from './printer/print.ts';
23
+ export { formatHtml, printScriptHtml, attachHtmlHandlers, HTML_CSS, HTML_SCRIPT, type HtmlOptions, type HtmlResult } from './printer/html.ts';
24
+ export { summarize, summarizeScript, type SummaryOptions, type SummaryResult } from './printer/summary.ts';
25
+ export { argRoles, lexicalRole } from './behaviors/roles.ts';
26
+ export type { ArgRole } from './behaviors/types.ts';
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAA;AACtC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAC9F,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAC5F,cAAc,mBAAmB,CAAA;AACjC,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACpE,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACnK,OAAO,EAAE,YAAY,EAAE,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAChF,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC5E,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC/F,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,kBAAkB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC7I,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAC1G,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAC5D,YAAY,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * mash — a bash virtual machine for agent harnesses.
3
+ *
4
+ * - `parse` → span-preserving AST (`./parser/ast.ts`)
5
+ * - `Machine.analyze` → static effect analysis and pre-flight policy verdict
6
+ * - `Machine.run` → policy-checked streaming execution with trace events and hooks
7
+ * - behavior definitions → predicted effects of executables (`./behaviors`)
8
+ */
9
+ export * as AST from "./parser/ast.js";
10
+ export { parse, ParseError, lineColumn, literalOf, staticWordValue } from "./parser/parser.js";
11
+ export { Machine } from "./machine.js";
12
+ export * from "./trace/events.js";
13
+ export * from "./policy/policy.js";
14
+ export * from "./policy/effects.js";
15
+ export * from "./behaviors/index.js";
16
+ export * from "./analysis/value.js";
17
+ export { analyzeScript, analyzeSource } from "./analysis/analyze.js";
18
+ export { defaultSpawn } from "./vm/external.js";
19
+ export { ProgressTracker } from "./trace/progress.js";
20
+ export { format, printScript } from "./printer/print.js";
21
+ export { formatHtml, printScriptHtml, attachHtmlHandlers, HTML_CSS, HTML_SCRIPT } from "./printer/html.js";
22
+ export { summarize, summarizeScript } from "./printer/summary.js";
23
+ export { argRoles, lexicalRole } from "./behaviors/roles.js";
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAA;AACtC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAC9F,OAAO,EAAE,OAAO,EAAwD,MAAM,cAAc,CAAA;AAC5F,cAAc,mBAAmB,CAAA;AAEjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAiG,MAAM,uBAAuB,CAAA;AACnK,OAAO,EAAE,YAAY,EAAmC,MAAM,kBAAkB,CAAA;AAEhF,OAAO,EAAE,eAAe,EAAyB,MAAM,qBAAqB,CAAA;AAC5E,OAAO,EAAE,MAAM,EAAE,WAAW,EAAyC,MAAM,oBAAoB,CAAA;AAC/F,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,kBAAkB,EAAE,QAAQ,EAAE,WAAW,EAAqC,MAAM,mBAAmB,CAAA;AAC7I,OAAO,EAAE,SAAS,EAAE,eAAe,EAA2C,MAAM,sBAAsB,CAAA;AAC1G,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Adapter for the DeepSea / DeepSeek agent harness (the `deepsea-harness` repo).
3
+ *
4
+ * Dependency-free: the harness types are mirrored structurally so this file
5
+ * can be copied into a harness package (e.g. a `dsh-bash-mash` executor that
6
+ * registers `ctx.shell`) without importing mash's internals.
7
+ *
8
+ * Layering with the harness's existing confinement:
9
+ * - mash checks every command (and redirection) against the policy BEFORE it
10
+ * runs, and rejects whole snippets that would definitely violate it;
11
+ * - each external command mash spawns is still wrapped by `ctx.sandbox.confine`
12
+ * (seatbelt / bwrap / landlock / ACL), so anything mash cannot see
13
+ * (an interpreter's own file writes) remains confined by the OS.
14
+ */
15
+ import type { Policy } from '../policy/policy.ts';
16
+ import { describeEffect } from '../policy/effects.ts';
17
+ import type { SpawnFn } from '../vm/external.ts';
18
+ import { type MachineOptions } from '../machine.ts';
19
+ import type { AnalysisReport } from '../analysis/analyze.ts';
20
+ import type { TraceEvent } from '../trace/events.ts';
21
+ /** Mirrors `SandboxExecutionPolicy` from `@deepseek-ai/dsh-sandbox`. */
22
+ export interface HarnessSandboxPolicy {
23
+ mode: 'read-only' | 'workspace-write' | 'danger-full-access';
24
+ workspaceRoot: string;
25
+ additionalWritableRoots?: readonly string[];
26
+ sessionId?: string;
27
+ }
28
+ /** Mirrors `SandboxProvider.confine` (the `ctx.sandbox` service). */
29
+ export type ConfineFn = (argv: readonly string[], policy: HarnessSandboxPolicy & {
30
+ mode: 'read-only' | 'workspace-write';
31
+ }, signal?: AbortSignal) => Promise<{
32
+ argv: string[];
33
+ }>;
34
+ /**
35
+ * Map the harness policy onto a mash policy, with optional mash-only
36
+ * restrictions. Harness defaults: `rm -f` of a path that does not exist is a
37
+ * no-op, not a violation (`missingDeletes: 'allow'`; existence is re-checked
38
+ * at runtime just before each delete).
39
+ */
40
+ export declare function fromHarnessPolicy(p: HarnessSandboxPolicy, extra?: Partial<Policy>): Policy;
41
+ /**
42
+ * A spawn function that confines every external command through the
43
+ * harness sandbox provider (per command, instead of once around `bash -c`).
44
+ */
45
+ export declare function confiningSpawn(confine: ConfineFn, policy: HarnessSandboxPolicy, signal?: AbortSignal): SpawnFn;
46
+ export interface PreflightResult {
47
+ /** `reject`: refuse the tool call; `check-at-runtime`: run with per-step enforcement; `allow`. */
48
+ verdict: AnalysisReport['verdict'];
49
+ /** Model-facing explanation (one line per definite violation). */
50
+ message: string;
51
+ report: AnalysisReport;
52
+ }
53
+ /**
54
+ * Static pre-flight for the `bash` tool: call before executing a snippet and
55
+ * return `message` as the tool error when `verdict === 'reject'`.
56
+ */
57
+ export declare function preflight(command: string, opts: {
58
+ cwd: string;
59
+ policy: HarnessSandboxPolicy;
60
+ env?: Record<string, string>;
61
+ extra?: Partial<Policy>;
62
+ }): PreflightResult;
63
+ /** Mirrors the parts of `ShellRunResult` a tool renders. */
64
+ export interface HarnessRunResult {
65
+ exitCode: number | null;
66
+ signal: NodeJS.Signals | null;
67
+ timedOut: boolean;
68
+ aborted: boolean;
69
+ timeoutMs: number;
70
+ stdout: {
71
+ text: string;
72
+ truncated: boolean;
73
+ };
74
+ stderr: {
75
+ text: string;
76
+ truncated: boolean;
77
+ };
78
+ sandbox: {
79
+ mode: HarnessSandboxPolicy['mode'];
80
+ denied: boolean;
81
+ };
82
+ /** mash extras: pre-flight report and runtime denials. */
83
+ mash: {
84
+ preflight: AnalysisReport;
85
+ denials: {
86
+ argv: string[];
87
+ reason: string;
88
+ }[];
89
+ };
90
+ }
91
+ export interface HarnessRunOptions {
92
+ command: string;
93
+ workdir: string;
94
+ timeoutMs: number;
95
+ policy: HarnessSandboxPolicy;
96
+ env?: Record<string, string>;
97
+ stdin?: string;
98
+ signal?: AbortSignal;
99
+ stdoutMaxBytes?: number;
100
+ confine?: ConfineFn;
101
+ /** Live trace events (tool-card progress, stream previews). */
102
+ onEvent?: (e: TraceEvent) => void;
103
+ /** Machine options to override (hooks, denyUnknown, ...). */
104
+ machine?: Partial<MachineOptions>;
105
+ /**
106
+ * When mash cannot parse the snippet (unsupported syntax such as extglob):
107
+ * `bash` runs it with real (confined) bash instead — the current harness
108
+ * behavior; `error` returns a syntax error. Default `bash`.
109
+ */
110
+ onParseError?: 'bash' | 'error';
111
+ }
112
+ /**
113
+ * Run a `bash` tool call the way `ctx.shell.execute(spec).result()` would,
114
+ * but through mash: static pre-flight, per-command enforcement, optional
115
+ * per-command OS confinement, and a live event stream.
116
+ */
117
+ export declare function runForHarness(o: HarnessRunOptions): Promise<HarnessRunResult>;
118
+ /** One-line description of a trace event, for tool-card progress lines. */
119
+ export declare function describeEvent(e: TraceEvent): string | null;
120
+ export { describeEffect };
121
+ //# sourceMappingURL=deepsea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepsea.d.ts","sourceRoot":"","sources":["../../../src/integrations/deepsea.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Adapter for the DeepSea / DeepSeek agent harness (the `deepsea-harness` repo).
3
+ *
4
+ * Dependency-free: the harness types are mirrored structurally so this file
5
+ * can be copied into a harness package (e.g. a `dsh-bash-mash` executor that
6
+ * registers `ctx.shell`) without importing mash's internals.
7
+ *
8
+ * Layering with the harness's existing confinement:
9
+ * - mash checks every command (and redirection) against the policy BEFORE it
10
+ * runs, and rejects whole snippets that would definitely violate it;
11
+ * - each external command mash spawns is still wrapped by `ctx.sandbox.confine`
12
+ * (seatbelt / bwrap / landlock / ACL), so anything mash cannot see
13
+ * (an interpreter's own file writes) remains confined by the OS.
14
+ */
15
+ import { spawn } from 'node:child_process';
16
+ import { describeEffect } from "../policy/effects.js";
17
+ import { Machine } from "../machine.js";
18
+ import { ParseError } from "../parser/parser.js";
19
+ /**
20
+ * Map the harness policy onto a mash policy, with optional mash-only
21
+ * restrictions. Harness defaults: `rm -f` of a path that does not exist is a
22
+ * no-op, not a violation (`missingDeletes: 'allow'`; existence is re-checked
23
+ * at runtime just before each delete).
24
+ */
25
+ export function fromHarnessPolicy(p, extra = {}) {
26
+ return {
27
+ mode: p.mode,
28
+ workspaceRoot: p.workspaceRoot,
29
+ additionalWritableRoots: p.additionalWritableRoots,
30
+ writableTemp: true,
31
+ missingDeletes: 'allow',
32
+ ...extra,
33
+ };
34
+ }
35
+ /**
36
+ * A spawn function that confines every external command through the
37
+ * harness sandbox provider (per command, instead of once around `bash -c`).
38
+ */
39
+ export function confiningSpawn(confine, policy, signal) {
40
+ return async (req) => {
41
+ if (policy.mode === 'danger-full-access') {
42
+ return spawn(req.file, req.args, { argv0: req.argv0, cwd: req.cwd, env: req.env, stdio: req.stdio });
43
+ }
44
+ const { argv } = await confine([req.file, ...req.args], { ...policy, mode: policy.mode }, signal);
45
+ return spawn(argv[0], argv.slice(1), { cwd: req.cwd, env: req.env, stdio: req.stdio });
46
+ };
47
+ }
48
+ /**
49
+ * Static pre-flight for the `bash` tool: call before executing a snippet and
50
+ * return `message` as the tool error when `verdict === 'reject'`.
51
+ */
52
+ export function preflight(command, opts) {
53
+ const m = new Machine({ cwd: opts.cwd, env: opts.env, policy: fromHarnessPolicy(opts.policy, opts.extra) });
54
+ let report;
55
+ try {
56
+ report = m.analyze(command);
57
+ }
58
+ catch (e) {
59
+ if (!(e instanceof ParseError))
60
+ throw e;
61
+ // never block on mash's own parsing gaps
62
+ const r = emptyReport();
63
+ r.reasons.push(`not analyzed: ${e.message}`);
64
+ return { verdict: 'check-at-runtime', message: '', report: r };
65
+ }
66
+ const message = report.verdict === 'reject'
67
+ ? `This command was not run: it would definitely violate the ${opts.policy.mode} sandbox policy.\n${report.reasons.map((r) => `- ${r}`).join('\n')}`
68
+ : report.verdict === 'check-at-runtime'
69
+ ? `Some steps can only be checked while running:\n${report.violations.slice(0, 8).map((v) => `- line ${v.line}: ${v.effect} (${v.reach})`).join('\n')}`
70
+ : '';
71
+ return { verdict: report.verdict, message, report };
72
+ }
73
+ /**
74
+ * Run a `bash` tool call the way `ctx.shell.execute(spec).result()` would,
75
+ * but through mash: static pre-flight, per-command enforcement, optional
76
+ * per-command OS confinement, and a live event stream.
77
+ */
78
+ export async function runForHarness(o) {
79
+ const max = o.stdoutMaxBytes ?? 1024 * 1024;
80
+ const out = [];
81
+ const err = [];
82
+ let outBytes = 0;
83
+ let errBytes = 0;
84
+ const ac = new AbortController();
85
+ const timer = setTimeout(() => ac.abort(), o.timeoutMs);
86
+ const onAbort = () => ac.abort();
87
+ o.signal?.addEventListener('abort', onAbort, { once: true });
88
+ const machine = new Machine({
89
+ cwd: o.workdir,
90
+ env: o.env ?? process.env,
91
+ policy: fromHarnessPolicy(o.policy),
92
+ stdin: o.stdin ? (async function* () { yield o.stdin; })() : undefined,
93
+ stdout: (c) => {
94
+ outBytes += c.length;
95
+ if (outBytes <= max)
96
+ out.push(c);
97
+ },
98
+ stderr: (c) => {
99
+ errBytes += c.length;
100
+ if (errBytes <= max)
101
+ err.push(c);
102
+ },
103
+ spawn: o.confine ? confiningSpawn(o.confine, o.policy, ac.signal) : undefined,
104
+ background: 'detach',
105
+ ...o.machine,
106
+ });
107
+ if (o.onEvent)
108
+ machine.on(o.onEvent);
109
+ let script;
110
+ try {
111
+ script = machine.parse(o.command);
112
+ }
113
+ catch (e) {
114
+ if (!(e instanceof ParseError))
115
+ throw e;
116
+ clearTimeout(timer);
117
+ if (o.onParseError === 'error') {
118
+ return {
119
+ exitCode: 2, signal: null, timedOut: false, aborted: false, timeoutMs: o.timeoutMs,
120
+ stdout: { text: '', truncated: false }, stderr: { text: `mash: syntax error: ${e.message}\n`, truncated: false },
121
+ sandbox: { mode: o.policy.mode, denied: false }, mash: { preflight: emptyReport(), denials: [] },
122
+ };
123
+ }
124
+ return runRealBash(o, e);
125
+ }
126
+ const report = machine.analyze(script);
127
+ const dec = (cs) => Buffer.concat(cs).toString('utf8');
128
+ if (report.verdict === 'reject') {
129
+ clearTimeout(timer);
130
+ const text = `mash: refusing to run: the snippet would definitely violate the sandbox policy\n${report.reasons.map((r) => ` ✗ ${r}\n`).join('')}`;
131
+ return {
132
+ exitCode: 126, signal: null, timedOut: false, aborted: false, timeoutMs: o.timeoutMs,
133
+ stdout: { text: '', truncated: false }, stderr: { text, truncated: false },
134
+ sandbox: { mode: o.policy.mode, denied: true }, mash: { preflight: report, denials: [] },
135
+ };
136
+ }
137
+ const r = await machine.run(script, { signal: ac.signal });
138
+ clearTimeout(timer);
139
+ o.signal?.removeEventListener('abort', onAbort);
140
+ const timedOut = ac.signal.aborted && !o.signal?.aborted;
141
+ return {
142
+ exitCode: r.status,
143
+ signal: null,
144
+ timedOut,
145
+ aborted: o.signal?.aborted ?? false,
146
+ timeoutMs: o.timeoutMs,
147
+ stdout: { text: dec(out), truncated: outBytes > max },
148
+ stderr: { text: dec(err), truncated: errBytes > max },
149
+ sandbox: { mode: o.policy.mode, denied: r.denials.length > 0 },
150
+ mash: { preflight: report, denials: r.denials },
151
+ };
152
+ }
153
+ function emptyReport() {
154
+ return { commands: [], variables: [], functions: [], violations: [], verdict: 'check-at-runtime', reasons: [] };
155
+ }
156
+ /** Fallback: the snippet as one `bash -c`, confined as a whole (today's harness behavior). */
157
+ async function runRealBash(o, parseError) {
158
+ const argv = ['bash', '-c', o.command];
159
+ const confined = o.confine && o.policy.mode !== 'danger-full-access'
160
+ ? (await o.confine(argv, { ...o.policy, mode: o.policy.mode }, o.signal)).argv
161
+ : argv;
162
+ return new Promise((resolve) => {
163
+ const child = spawn(confined[0], confined.slice(1), { cwd: o.workdir, env: o.env ?? process.env, stdio: ['pipe', 'pipe', 'pipe'], signal: o.signal });
164
+ const out = [];
165
+ const err = [];
166
+ let timedOut = false;
167
+ const timer = setTimeout(() => {
168
+ timedOut = true;
169
+ child.kill('SIGKILL');
170
+ }, o.timeoutMs);
171
+ child.stdout.on('data', (d) => out.push(d));
172
+ child.stderr.on('data', (d) => err.push(d));
173
+ child.stdin.on('error', () => { }); // EPIPE when bash exits without reading stdin
174
+ child.stdin.end(o.stdin ?? '');
175
+ child.on('error', () => { });
176
+ child.on('close', (code, signal) => {
177
+ clearTimeout(timer);
178
+ const report = emptyReport();
179
+ report.reasons.push(`not analyzed: ${parseError.message}`);
180
+ resolve({
181
+ exitCode: code, signal, timedOut, aborted: o.signal?.aborted ?? false, timeoutMs: o.timeoutMs,
182
+ stdout: { text: Buffer.concat(out).toString('utf8'), truncated: false },
183
+ stderr: { text: Buffer.concat(err).toString('utf8'), truncated: false },
184
+ sandbox: { mode: o.policy.mode, denied: false }, mash: { preflight: report, denials: [] },
185
+ });
186
+ });
187
+ });
188
+ }
189
+ /** One-line description of a trace event, for tool-card progress lines. */
190
+ export function describeEvent(e) {
191
+ switch (e.type) {
192
+ case 'command:start': return `$ ${e.argv.join(' ')}`;
193
+ case 'command:denied': return `⛔ ${e.argv.join(' ')}: ${e.reason}`;
194
+ case 'loop:iteration': return `↻ ${e.variable ? `${e.variable}=${e.value}` : `iteration ${e.iteration}`}`;
195
+ default: return null;
196
+ }
197
+ }
198
+ export { describeEffect };
199
+ //# sourceMappingURL=deepsea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepsea.js","sourceRoot":"","sources":["../../../src/integrations/deepsea.ts"],"names":[],"mappings":"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"}