@trenchwork/erosolar 1.1.31 → 1.1.32

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 (44) hide show
  1. package/dist/bin/deepseek.js +13 -0
  2. package/dist/bin/deepseek.js.map +1 -1
  3. package/dist/capabilities/_binaryRequirements.d.ts +101 -0
  4. package/dist/capabilities/_binaryRequirements.d.ts.map +1 -0
  5. package/dist/capabilities/_binaryRequirements.js +288 -0
  6. package/dist/capabilities/_binaryRequirements.js.map +1 -0
  7. package/dist/capabilities/_opsContext.d.ts +129 -0
  8. package/dist/capabilities/_opsContext.d.ts.map +1 -0
  9. package/dist/capabilities/_opsContext.js +274 -0
  10. package/dist/capabilities/_opsContext.js.map +1 -0
  11. package/dist/capabilities/_processRunner.d.ts +32 -0
  12. package/dist/capabilities/_processRunner.d.ts.map +1 -1
  13. package/dist/capabilities/_processRunner.js +126 -0
  14. package/dist/capabilities/_processRunner.js.map +1 -1
  15. package/dist/capabilities/engagementCapability.d.ts.map +1 -1
  16. package/dist/capabilities/engagementCapability.js +14 -3
  17. package/dist/capabilities/engagementCapability.js.map +1 -1
  18. package/dist/capabilities/index.d.ts +1 -0
  19. package/dist/capabilities/index.d.ts.map +1 -1
  20. package/dist/capabilities/index.js +1 -0
  21. package/dist/capabilities/index.js.map +1 -1
  22. package/dist/capabilities/llmRedteamCapability.d.ts +38 -0
  23. package/dist/capabilities/llmRedteamCapability.d.ts.map +1 -0
  24. package/dist/capabilities/llmRedteamCapability.js +340 -0
  25. package/dist/capabilities/llmRedteamCapability.js.map +1 -0
  26. package/dist/cli/offsecInstall.d.ts +43 -0
  27. package/dist/cli/offsecInstall.d.ts.map +1 -0
  28. package/dist/cli/offsecInstall.js +258 -0
  29. package/dist/cli/offsecInstall.js.map +1 -0
  30. package/dist/headless/interactiveShell.d.ts.map +1 -1
  31. package/dist/headless/interactiveShell.js +25 -0
  32. package/dist/headless/interactiveShell.js.map +1 -1
  33. package/dist/runtime/node.d.ts.map +1 -1
  34. package/dist/runtime/node.js +58 -2
  35. package/dist/runtime/node.js.map +1 -1
  36. package/dist/runtime/phaseEmitter.d.ts +63 -0
  37. package/dist/runtime/phaseEmitter.d.ts.map +1 -0
  38. package/dist/runtime/phaseEmitter.js +207 -0
  39. package/dist/runtime/phaseEmitter.js.map +1 -0
  40. package/dist/tools/engagementTools.d.ts +23 -0
  41. package/dist/tools/engagementTools.d.ts.map +1 -1
  42. package/dist/tools/engagementTools.js +45 -0
  43. package/dist/tools/engagementTools.js.map +1 -1
  44. package/package.json +1 -1
@@ -0,0 +1,258 @@
1
+ /**
2
+ * `erosolar offsec install` — operator-facing self-bootstrap.
3
+ *
4
+ * Reads the BinaryRequirement manifest, scans PATH for each entry,
5
+ * and installs every missing binary using the channel that's
6
+ * appropriate for the operator's platform (apt on Linux/Kali,
7
+ * Homebrew on macOS, winget on Windows, with pipx/pip/npm/cargo/go/
8
+ * gem as cross-platform fallbacks).
9
+ *
10
+ * Two key invariants:
11
+ *
12
+ * 1. **Idempotent.** Already-on-PATH binaries are skipped. Re-running
13
+ * after a partial install is safe.
14
+ *
15
+ * 2. **Cross-platform graceful.** Binaries with no plausibly-native
16
+ * install path on the operator's OS (e.g. afl-fuzz on Windows)
17
+ * are skipped with a clear message pointing at WSL2 / Docker
18
+ * instead of crashing the whole bootstrap.
19
+ *
20
+ * Two confirmation modes:
21
+ *
22
+ * • Default (interactive TTY): each install command is shown and
23
+ * the operator confirms with [y/N]. Defaults to skip — destructive
24
+ * by default = safer.
25
+ * • `--yes` / `-y`: auto-confirm every install. Used in CI / Docker
26
+ * image builds where there's no TTY to prompt against.
27
+ *
28
+ * Filtering:
29
+ *
30
+ * • `--capability <id>` (repeatable) — install only the bins for
31
+ * these capabilities. Default = all.
32
+ * • `--bin <name>` (repeatable) — install a specific binary.
33
+ * • `--missing-only` — skip if already on PATH (this is the default;
34
+ * flag exists so the inverse is explicit when scripting).
35
+ * • `--dry-run` — list what would be installed, run nothing.
36
+ */
37
+ import { spawn } from 'node:child_process';
38
+ import { promisify } from 'node:util';
39
+ import { execFile } from 'node:child_process';
40
+ import * as readline from 'node:readline';
41
+ import { BINARY_REQUIREMENTS, pickInstallCommand, isNativelyAvailable, platformNote, } from '../capabilities/_binaryRequirements.js';
42
+ import { clearBinaryAvailabilityCache } from '../capabilities/_processRunner.js';
43
+ const execFileP = promisify(execFile);
44
+ function parseArgs(argv) {
45
+ const out = { capabilities: [], bins: [] };
46
+ for (let i = 0; i < argv.length; i++) {
47
+ const a = argv[i];
48
+ if (a === '--yes' || a === '-y')
49
+ out.yes = true;
50
+ else if (a === '--dry-run')
51
+ out.dryRun = true;
52
+ else if (a === '--missing-only') { /* default; flag accepted as noop */ }
53
+ else if (a === '--capability' || a === '-c') {
54
+ const v = argv[++i];
55
+ if (v)
56
+ out.capabilities.push(v);
57
+ }
58
+ else if (a?.startsWith('--capability=')) {
59
+ out.capabilities.push(a.slice('--capability='.length));
60
+ }
61
+ else if (a === '--bin' || a === '-b') {
62
+ const v = argv[++i];
63
+ if (v)
64
+ out.bins.push(v);
65
+ }
66
+ else if (a?.startsWith('--bin=')) {
67
+ out.bins.push(a.slice('--bin='.length));
68
+ }
69
+ }
70
+ return out;
71
+ }
72
+ async function whichBin(bin) {
73
+ const cmd = process.platform === 'win32' ? 'where' : 'which';
74
+ try {
75
+ await execFileP(cmd, [bin], { timeout: 3000 });
76
+ return true;
77
+ }
78
+ catch {
79
+ return false;
80
+ }
81
+ }
82
+ async function askYesNo(prompt, defaultYes = false) {
83
+ // Non-TTY → fall back to default (safer to skip in CI without --yes).
84
+ if (!process.stdin.isTTY)
85
+ return defaultYes;
86
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
87
+ try {
88
+ const suffix = defaultYes ? ' [Y/n] ' : ' [y/N] ';
89
+ const answer = await new Promise((resolve) => rl.question(prompt + suffix, resolve));
90
+ const a = answer.trim().toLowerCase();
91
+ if (!a)
92
+ return defaultYes;
93
+ return a === 'y' || a === 'yes';
94
+ }
95
+ finally {
96
+ rl.close();
97
+ }
98
+ }
99
+ /** Run an install command via `bash -lc` (POSIX) or `cmd /c` (Windows). */
100
+ async function runInstallCommand(cmd) {
101
+ return new Promise((resolve) => {
102
+ const isWin = process.platform === 'win32';
103
+ const child = isWin
104
+ ? spawn('cmd.exe', ['/c', cmd], { stdio: 'inherit', shell: false })
105
+ : spawn('bash', ['-lc', cmd], { stdio: 'inherit', shell: false });
106
+ child.on('close', (code) => resolve({ ok: code === 0, code }));
107
+ child.on('error', () => resolve({ ok: false, code: null }));
108
+ });
109
+ }
110
+ function filterRequirements(opts) {
111
+ let reqs = [...BINARY_REQUIREMENTS];
112
+ if (opts.capabilities && opts.capabilities.length) {
113
+ const set = new Set(opts.capabilities);
114
+ reqs = reqs.filter((r) => set.has(r.capability));
115
+ }
116
+ if (opts.bins && opts.bins.length) {
117
+ const set = new Set(opts.bins);
118
+ reqs = reqs.filter((r) => set.has(r.bin));
119
+ }
120
+ return reqs;
121
+ }
122
+ export async function runOffsecInstall(rawArgs) {
123
+ if (rawArgs[0] === 'help' || rawArgs[0] === '-h' || rawArgs[0] === '--help') {
124
+ console.log(`Usage: erosolar offsec install [options]
125
+
126
+ Installs the binaries the offsec capability surface needs (Kali / AFL++ /
127
+ gdb / pwntools / binary-analysis / Ghidra / llmRedteam). Cross-platform —
128
+ runs on Linux, macOS, and Windows. Tools without a native install path
129
+ on the current OS are skipped with a pointer to WSL2 / Docker.
130
+
131
+ Options:
132
+ --capability, -c <id> Limit to one capability (repeatable). Ids:
133
+ kali, aflpp, gdb, pwntools, binaryAnalysis,
134
+ ghidra, llmRedteam.
135
+ --bin, -b <name> Limit to a specific binary (repeatable).
136
+ --yes, -y Auto-confirm every install (no prompt).
137
+ --dry-run List what would be installed, run nothing.
138
+
139
+ Examples:
140
+ erosolar offsec install --capability llmRedteam
141
+ erosolar offsec install -c kali -c llmRedteam --yes
142
+ erosolar offsec install --bin garak --bin promptfoo
143
+ erosolar offsec install --dry-run
144
+ `);
145
+ return 0;
146
+ }
147
+ const opts = parseArgs(rawArgs);
148
+ const reqs = filterRequirements(opts);
149
+ if (reqs.length === 0) {
150
+ console.error('No matching binaries found in the manifest. Check --capability / --bin spellings.');
151
+ return 1;
152
+ }
153
+ console.log(`erosolar offsec install · platform=${process.platform} · candidates=${reqs.length}`);
154
+ const summary = {
155
+ installed: [], skippedAlreadyPresent: [], skippedNoNativeChannel: [], failed: [],
156
+ };
157
+ for (const req of reqs) {
158
+ process.stdout.write(`\n[${req.capability}] ${req.bin} — ${req.description}\n`);
159
+ if (await whichBin(req.bin)) {
160
+ console.log(' ✓ already on PATH — skipping');
161
+ summary.skippedAlreadyPresent.push(req.bin);
162
+ continue;
163
+ }
164
+ const native = isNativelyAvailable(req);
165
+ const note = platformNote(req);
166
+ const pick = pickInstallCommand(req);
167
+ if (!native || !pick) {
168
+ const optionalTag = req.optional ? ' (optional)' : '';
169
+ console.log(` ⊘ no native install path on ${process.platform}${optionalTag}`);
170
+ if (note)
171
+ console.log(` note: ${note}`);
172
+ summary.skippedNoNativeChannel.push(req.bin);
173
+ continue;
174
+ }
175
+ console.log(` → ${pick.channel}: ${pick.cmd}`);
176
+ if (note)
177
+ console.log(` note: ${note}`);
178
+ if (opts.dryRun) {
179
+ console.log(' (dry-run — not executed)');
180
+ continue;
181
+ }
182
+ const confirmed = opts.yes
183
+ ? true
184
+ : await askYesNo(' install?', false);
185
+ if (!confirmed) {
186
+ console.log(' skipped by operator');
187
+ continue;
188
+ }
189
+ const result = await runInstallCommand(pick.cmd);
190
+ if (result.ok) {
191
+ console.log(' ✓ installed');
192
+ summary.installed.push(req.bin);
193
+ }
194
+ else {
195
+ console.log(` ✗ install failed (exit ${result.code})`);
196
+ summary.failed.push({ bin: req.bin, reason: `exit ${result.code}` });
197
+ }
198
+ }
199
+ // Reset the in-process availability cache so subsequent agent runs
200
+ // pick up the just-installed binaries.
201
+ clearBinaryAvailabilityCache();
202
+ console.log('\n── summary ────────────────────────────────────');
203
+ console.log(`installed: ${summary.installed.length}`);
204
+ console.log(`already present: ${summary.skippedAlreadyPresent.length}`);
205
+ console.log(`skipped (no native): ${summary.skippedNoNativeChannel.length}`);
206
+ console.log(`failed: ${summary.failed.length}`);
207
+ if (summary.failed.length) {
208
+ for (const f of summary.failed)
209
+ console.log(` · ${f.bin}: ${f.reason}`);
210
+ return 1;
211
+ }
212
+ return 0;
213
+ }
214
+ /**
215
+ * Top-level dispatch for `erosolar offsec <verb>`. Currently only
216
+ * `install` is implemented; reserve `status` / `update` for follow-ups.
217
+ */
218
+ export async function runOffsecCommand(rawArgs) {
219
+ const verb = rawArgs[0] || 'install';
220
+ if (verb === 'help' || verb === '-h' || verb === '--help') {
221
+ console.log(`Usage: erosolar offsec <verb> [args]
222
+
223
+ Verbs:
224
+ install [opts] Install missing offsec binaries (cross-platform).
225
+ status Show which offsec binaries are present / missing.
226
+ help Show this message.
227
+
228
+ Run \`erosolar offsec install --help\` for install-specific options.
229
+ `);
230
+ return 0;
231
+ }
232
+ if (verb === 'install')
233
+ return runOffsecInstall(rawArgs.slice(1));
234
+ if (verb === 'status')
235
+ return runOffsecStatus(rawArgs.slice(1));
236
+ console.error(`Unknown offsec verb: ${verb}\nRun \`erosolar offsec help\` for usage.`);
237
+ return 1;
238
+ }
239
+ async function runOffsecStatus(_args) {
240
+ console.log(`erosolar offsec status · platform=${process.platform}`);
241
+ let present = 0, missingNative = 0, missingUnsupported = 0;
242
+ for (const req of BINARY_REQUIREMENTS) {
243
+ const onPath = await whichBin(req.bin);
244
+ const native = isNativelyAvailable(req);
245
+ const tag = onPath ? '✓' : (native ? '✗' : '⊘');
246
+ const status = onPath ? 'present' : (native ? 'missing — installable' : 'missing — no native channel');
247
+ console.log(` [${tag}] [${req.capability}] ${req.bin.padEnd(20)} ${status}`);
248
+ if (onPath)
249
+ present += 1;
250
+ else if (native)
251
+ missingNative += 1;
252
+ else
253
+ missingUnsupported += 1;
254
+ }
255
+ console.log(`\npresent ${present} · missing ${missingNative} · unsupported-here ${missingUnsupported}`);
256
+ return 0;
257
+ }
258
+ //# sourceMappingURL=offsecInstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offsecInstall.js","sourceRoot":"","sources":["../../src/cli/offsecInstall.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"interactiveShell.d.ts","sourceRoot":"","sources":["../../src/headless/interactiveShell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAuJH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAMD;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDzF"}
1
+ {"version":3,"file":"interactiveShell.d.ts","sourceRoot":"","sources":["../../src/headless/interactiveShell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAuJH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAMD;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+EzF"}
@@ -180,6 +180,31 @@ export async function runInteractiveShell(options) {
180
180
  if (parsed.initialPrompt) {
181
181
  shell.queuePrompt(parsed.initialPrompt);
182
182
  }
183
+ // Portal kickoff — when the operator launched this engagement from
184
+ // the portal, the engagement carries a one-shot prompt explaining
185
+ // what to do. Claim it (atomic consume on the Lambda side) and pre-
186
+ // queue it as the first user prompt so the agent starts hunting
187
+ // immediately instead of dropping the operator at an empty shell.
188
+ // Best-effort: if the network or auth fails, the shell still boots
189
+ // normally, and the operator can type their own prompt.
190
+ try {
191
+ const { isOffsecProfile } = await import('../runtime/profileGates.js');
192
+ if (isOffsecProfile(profile)) {
193
+ const { getEngagementSelection, consumeKickoffPrompt } = await import('../tools/engagementTools.js');
194
+ const sel = getEngagementSelection();
195
+ if (sel.engagementId) {
196
+ const kickoff = await consumeKickoffPrompt(sel.engagementId);
197
+ if (kickoff?.prompt) {
198
+ process.stderr.write(`[engagement] Kickoff loaded — first prompt seeded ` +
199
+ `(${kickoff.prompt.length} chars).\n`);
200
+ shell.queuePrompt(kickoff.prompt);
201
+ }
202
+ }
203
+ }
204
+ }
205
+ catch {
206
+ // Best-effort. Shell boots normally on any failure.
207
+ }
183
208
  await shell.run();
184
209
  }
185
210
  class InteractiveShell {