@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,274 @@
1
+ /**
2
+ * Operations-Center wiring for offsec capabilities.
3
+ *
4
+ * Every offsec tool wrapper (recon / web / llmRedteam / network / mobile)
5
+ * shares this single helper. It abstracts:
6
+ *
7
+ * • Engagement-scope enforcement (defence-in-depth — the Lambda
8
+ * re-checks server-side, but a CLI-side gate trips faster + emits
9
+ * a clearer error before any process spawns).
10
+ * • Long-running job lifecycle (start → append-log → progress →
11
+ * complete) routed through the existing cliJob* Lambda surface,
12
+ * which the portal's #jobsList rail listens to via Firestore.
13
+ * • HITL approval prompts (cliQuestionCreate / cliQuestionPoll) for
14
+ * destructive ops, so the operator can veto from the portal.
15
+ * • Findings emission with a unified schema — every tool's output
16
+ * normalised so the portal's #findingsList rail renders without
17
+ * per-tool special-casing.
18
+ *
19
+ * Tools that own a long-running scan should:
20
+ *
21
+ * const job = await opsCtx.startJob({ tool: 'garak', kind: 'llmRedteam',
22
+ * targetId, cmd: ['garak', ...] });
23
+ * for await (const line of job.lines()) {
24
+ * await job.appendLog(line);
25
+ * const finding = parse(line);
26
+ * if (finding) await opsCtx.emitFinding(finding);
27
+ * }
28
+ * await job.complete('done', { probesRun: N, findingsEmitted: M });
29
+ *
30
+ * The `lines()` iterator is backed by the existing Monitor capability
31
+ * (background spawn + streaming reader). Multiple jobs run concurrently
32
+ * without blocking the agent loop.
33
+ */
34
+ import { spawn } from 'node:child_process';
35
+ import { callLambda } from '../utils/lambdaClient.js';
36
+ import { logDebug } from '../utils/debugLogger.js';
37
+ import { ensureBinary } from './_processRunner.js';
38
+ // ── Implementation ────────────────────────────────────────────────
39
+ const FINDING_SEVERITIES = new Set(['info', 'low', 'medium', 'high', 'critical']);
40
+ const FINDING_SOURCES = new Set(['recon', 'web', 'llmRedteam', 'network', 'mobile', 'manual']);
41
+ function validateFindingDraft(d) {
42
+ if (!FINDING_SOURCES.has(d.source))
43
+ throw new Error(`invalid finding.source: ${d.source}`);
44
+ if (!FINDING_SEVERITIES.has(d.severity))
45
+ throw new Error(`invalid finding.severity: ${d.severity}`);
46
+ if (typeof d.tool !== 'string' || !d.tool)
47
+ throw new Error('finding.tool required');
48
+ if (typeof d.title !== 'string' || !d.title)
49
+ throw new Error('finding.title required');
50
+ if (typeof d.replication !== 'string')
51
+ throw new Error('finding.replication required');
52
+ }
53
+ /**
54
+ * Engagement scope cache. Reused across many startJob/assertInScope calls
55
+ * within a single agent turn so we don't hammer Firestore for the same
56
+ * scope doc. Cleared whenever the engagementId changes.
57
+ */
58
+ class ScopeCache {
59
+ cached = null;
60
+ async load(engagementId) {
61
+ if (this.cached && this.cached.engagementId === engagementId)
62
+ return this.cached.scope;
63
+ const r = await callLambda('cliEngagementGetScope', { engagementId });
64
+ if (!r.ok)
65
+ throw new Error(`scope fetch failed: ${r.error}`);
66
+ const scope = r.result?.scope || { hosts: [], cidrs: [], allowedTools: [] };
67
+ this.cached = { engagementId, scope };
68
+ return scope;
69
+ }
70
+ invalidate() { this.cached = null; }
71
+ }
72
+ function hostMatchesPattern(host, pattern) {
73
+ // Exact match.
74
+ if (host === pattern)
75
+ return true;
76
+ // Wildcard pattern like *.example.com.
77
+ if (pattern.startsWith('*.')) {
78
+ const suffix = pattern.slice(1); // ".example.com"
79
+ return host.endsWith(suffix) && host.length > suffix.length;
80
+ }
81
+ return false;
82
+ }
83
+ function isInScope(target, scope) {
84
+ const candidate = (target.host || (target.url && hostFromUrl(target.url)) ||
85
+ (target.endpoint && hostFromUrl(target.endpoint)) || '').toLowerCase();
86
+ if (!candidate)
87
+ return false;
88
+ if ((scope.deniedHosts || []).some((p) => hostMatchesPattern(candidate, p.toLowerCase())))
89
+ return false;
90
+ const hostHits = (scope.hosts || []).some((p) => hostMatchesPattern(candidate, p.toLowerCase()));
91
+ if (hostHits)
92
+ return true;
93
+ // CIDR check is best-effort — if the operator wrote one, we ask the
94
+ // Lambda to evaluate it (it has the IP-math lib loaded). Local check
95
+ // here would duplicate logic.
96
+ return false;
97
+ }
98
+ function hostFromUrl(value) {
99
+ try {
100
+ return new URL(value).hostname;
101
+ }
102
+ catch {
103
+ return null;
104
+ }
105
+ }
106
+ class NodeOpsContext {
107
+ engagementId;
108
+ uid;
109
+ scopeCache = new ScopeCache();
110
+ constructor(opts = {}) {
111
+ this.engagementId = opts.engagementId ?? null;
112
+ this.uid = opts.uid ?? null;
113
+ }
114
+ async assertInScope(target) {
115
+ if (!this.engagementId) {
116
+ // No engagement selected = no scope. Refuse — the operator must
117
+ // pick an engagement before any offsec tool fires. This also
118
+ // means the Lambda's defence-in-depth check has a non-null
119
+ // engagementId to evaluate against.
120
+ throw new Error('no engagement selected — pick one in the portal before running offsec tools');
121
+ }
122
+ const scope = await this.scopeCache.load(this.engagementId);
123
+ if (!isInScope(target, scope)) {
124
+ const t = target.host || target.url || target.endpoint || '<unknown>';
125
+ throw new Error(`target ${t} is OUT OF SCOPE for engagement ${this.engagementId}. ` +
126
+ `Edit the engagement scope in the portal before retrying.`);
127
+ }
128
+ }
129
+ async startJob(spec) {
130
+ // Cross-platform preflight (see _processRunner.ts comment): throws
131
+ // BinaryMissingError with the install hint for this operator's OS
132
+ // BEFORE we register a Job doc, so a missing binary doesn't leave
133
+ // a phantom "running" row in the portal that never completes.
134
+ await ensureBinary(spec.cmd[0]);
135
+ if (this.engagementId && (spec.engagementId == null))
136
+ spec.engagementId = this.engagementId;
137
+ const r = await callLambda('cliJobStart', {
138
+ tool: spec.tool, kind: spec.kind,
139
+ engagementId: spec.engagementId ?? null, targetId: spec.targetId ?? null,
140
+ status: 'running',
141
+ cmd: spec.cmd.slice(0, 64), // truncate long argv
142
+ });
143
+ if (!r.ok || !r.result?.id)
144
+ throw new Error(`cliJobStart failed: ${r.error}`);
145
+ const jobId = r.result.id;
146
+ const child = spawn(spec.cmd[0], spec.cmd.slice(1), {
147
+ cwd: spec.cwd, env: { ...process.env, ...(spec.env || {}) },
148
+ stdio: ['ignore', 'pipe', 'pipe'],
149
+ });
150
+ const timeoutMs = spec.timeoutMs ?? 30 * 60 * 1000;
151
+ const killTimer = setTimeout(() => {
152
+ try {
153
+ child.kill('SIGTERM');
154
+ }
155
+ catch (_) { }
156
+ setTimeout(() => { try {
157
+ child.kill('SIGKILL');
158
+ }
159
+ catch (_) { } }, 1500);
160
+ }, timeoutMs);
161
+ const handle = {
162
+ id: jobId,
163
+ lines: () => readlines(child),
164
+ appendLog: (line) => callLambda('cliJobAppendLog', { jobId, line: String(line).slice(0, 8 * 1024) })
165
+ .then((res) => { if (!res.ok)
166
+ logDebug('[Ops] appendLog failed', res.error); }),
167
+ setProgress: (pct, lastLine) => callLambda('cliJobUpdate', {
168
+ id: jobId, pct: Math.max(0, Math.min(100, Math.round(pct))),
169
+ lastLine: lastLine ? String(lastLine).slice(0, 1024) : null,
170
+ }).then((res) => { if (!res.ok)
171
+ logDebug('[Ops] setProgress failed', res.error); }),
172
+ complete: async (status, summary = {}) => {
173
+ clearTimeout(killTimer);
174
+ await callLambda('cliJobComplete', { id: jobId, status, summary });
175
+ },
176
+ cancel: () => {
177
+ clearTimeout(killTimer);
178
+ try {
179
+ child.kill('SIGTERM');
180
+ }
181
+ catch (_) { }
182
+ },
183
+ };
184
+ return handle;
185
+ }
186
+ async requestApproval(req) {
187
+ if (!Array.isArray(req.options) || req.options.length < 2) {
188
+ throw new Error('requestApproval needs ≥2 options');
189
+ }
190
+ const create = await callLambda('cliQuestionCreate', {
191
+ question: `[${req.severity.toUpperCase()}] ${req.question}`,
192
+ header: req.severity,
193
+ multiSelect: false,
194
+ options: req.options.map((o) => ({ label: o.label, description: o.description || '' })),
195
+ });
196
+ if (!create.ok || !create.result?.id)
197
+ throw new Error(`HITL create failed: ${create.error}`);
198
+ const id = create.result.id;
199
+ const timeoutSec = req.timeoutSec ?? 300;
200
+ const deadline = Date.now() + timeoutSec * 1000;
201
+ while (Date.now() < deadline) {
202
+ await new Promise((r) => setTimeout(r, 2000));
203
+ const poll = await callLambda('cliQuestionPoll', { id });
204
+ if (poll.ok && poll.result?.answered) {
205
+ const sel = poll.result.selected?.[0];
206
+ if (typeof sel === 'string')
207
+ return sel;
208
+ }
209
+ }
210
+ if (req.defaultOnTimeout === 'proceed')
211
+ return req.options[0].label;
212
+ throw new Error(`HITL timed out after ${timeoutSec}s — operator did not answer in the portal`);
213
+ }
214
+ async emitFinding(draft) {
215
+ if (this.engagementId && draft.engagementId == null)
216
+ draft.engagementId = this.engagementId;
217
+ validateFindingDraft(draft);
218
+ const r = await callLambda('cliFindingEmit', draft);
219
+ if (!r.ok || !r.result?.id)
220
+ throw new Error(`emitFinding failed: ${r.error}`);
221
+ return r.result.id;
222
+ }
223
+ }
224
+ /**
225
+ * Async iterator over a child's stdout + stderr, yielding one line at a
226
+ * time. Both streams are merged so the order in `lines()` matches the
227
+ * order the process actually printed them.
228
+ */
229
+ async function* readlines(child) {
230
+ const queue = [];
231
+ let resolveNext = null;
232
+ let done = false;
233
+ function pushChunk(buf) {
234
+ const text = buf.toString('utf8');
235
+ for (const line of text.split(/\r?\n/))
236
+ if (line.length)
237
+ queue.push(line);
238
+ if (resolveNext) {
239
+ const r = resolveNext;
240
+ resolveNext = null;
241
+ r();
242
+ }
243
+ }
244
+ child.stdout.on('data', pushChunk);
245
+ child.stderr.on('data', pushChunk);
246
+ child.on('close', () => { done = true; if (resolveNext) {
247
+ const r = resolveNext;
248
+ resolveNext = null;
249
+ r();
250
+ } });
251
+ child.on('error', () => { done = true; if (resolveNext) {
252
+ const r = resolveNext;
253
+ resolveNext = null;
254
+ r();
255
+ } });
256
+ while (true) {
257
+ if (queue.length) {
258
+ yield queue.shift();
259
+ continue;
260
+ }
261
+ if (done)
262
+ return;
263
+ await new Promise((r) => { resolveNext = r; });
264
+ }
265
+ }
266
+ /**
267
+ * Build an OpsContext for a CLI agent session. The engagementId can be
268
+ * threaded in from the active engagement (set via the portal or
269
+ * EngagementCapability tool calls).
270
+ */
271
+ export function createOpsContext(opts = {}) {
272
+ return new NodeOpsContext(opts);
273
+ }
274
+ //# sourceMappingURL=_opsContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_opsContext.js","sourceRoot":"","sources":["../../src/capabilities/_opsContext.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,35 @@
1
+ export interface BinaryMissingErrorInfo {
2
+ bin: string;
3
+ message: string;
4
+ installCommand: string | null;
5
+ installChannel: string | null;
6
+ platformNote: string | null;
7
+ capability: string | null;
8
+ /** True when the bin has no plausibly-native install path on this platform. */
9
+ unsupportedOnPlatform: boolean;
10
+ }
11
+ export declare class BinaryMissingError extends Error {
12
+ readonly code = "binary-missing";
13
+ readonly info: BinaryMissingErrorInfo;
14
+ constructor(info: BinaryMissingErrorInfo);
15
+ }
16
+ /**
17
+ * Throws `BinaryMissingError` if the binary isn't on PATH. Every
18
+ * offsec capability tool handler should call this first.
19
+ *
20
+ * Tool handlers should NOT catch the error themselves — let it
21
+ * propagate so the agent loop's tool-error formatter wraps it
22
+ * uniformly.
23
+ */
24
+ export declare function ensureBinary(bin: string): Promise<void>;
25
+ /**
26
+ * Non-throwing variant — returns true/false. Use when the caller
27
+ * wants to render a "(unavailable)" badge in the tool inventory
28
+ * rather than fail the call.
29
+ */
30
+ export declare function isBinaryAvailable(bin: string): Promise<boolean>;
31
+ /** Reset the availability cache. Tests + the post-`offsec install` flow use this. */
32
+ export declare function clearBinaryAvailabilityCache(): void;
1
33
  export interface RunResult {
2
34
  stdout: string;
3
35
  stderr: string;
@@ -1 +1 @@
1
- {"version":3,"file":"_processRunner.d.ts","sourceRoot":"","sources":["../../src/capabilities/_processRunner.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAKD,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,SAAS,CAAC,CA4DpB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,GAAG,MAAM,CAQvF"}
1
+ {"version":3,"file":"_processRunner.d.ts","sourceRoot":"","sources":["../../src/capabilities/_processRunner.ts"],"names":[],"mappings":"AAkCA,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,+EAA+E;IAC/E,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,oBAAoB;IACjC,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;gBAC1B,IAAI,EAAE,sBAAsB;CAKzC;AAmBD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ7D;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMrE;AAED,qFAAqF;AACrF,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AAuDD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAKD,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,SAAS,CAAC,CAkEpB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,GAAG,MAAM,CAQvF"}
@@ -1,7 +1,133 @@
1
1
  import { spawn } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import { execFile } from 'node:child_process';
4
+ import { findRequirement, pickInstallCommand, isNativelyAvailable, platformNote, } from './_binaryRequirements.js';
5
+ const execFileP = promisify(execFile);
6
+ export class BinaryMissingError extends Error {
7
+ code = 'binary-missing';
8
+ info;
9
+ constructor(info) {
10
+ super(info.message);
11
+ this.info = info;
12
+ this.name = 'BinaryMissingError';
13
+ }
14
+ }
15
+ const BINARY_AVAILABILITY_CACHE = new Map();
16
+ async function checkPathBinary(bin) {
17
+ // `which` (POSIX) / `where` (Windows) — both exit 0 when the
18
+ // executable is found on PATH. We use the OS lookup rather than
19
+ // probing `bin --version` because some offsec tools (afl-fuzz,
20
+ // ghidra) take seconds to print --version, which would gate the
21
+ // agent loop on cold-start runtime cost.
22
+ const cmd = process.platform === 'win32' ? 'where' : 'which';
23
+ try {
24
+ await execFileP(cmd, [bin], { timeout: 3000 });
25
+ return true;
26
+ }
27
+ catch {
28
+ return false;
29
+ }
30
+ }
31
+ /**
32
+ * Throws `BinaryMissingError` if the binary isn't on PATH. Every
33
+ * offsec capability tool handler should call this first.
34
+ *
35
+ * Tool handlers should NOT catch the error themselves — let it
36
+ * propagate so the agent loop's tool-error formatter wraps it
37
+ * uniformly.
38
+ */
39
+ export async function ensureBinary(bin) {
40
+ const cached = BINARY_AVAILABILITY_CACHE.get(bin);
41
+ if (cached === true)
42
+ return;
43
+ if (cached === false)
44
+ throw makeMissingError(bin);
45
+ const present = await checkPathBinary(bin);
46
+ BINARY_AVAILABILITY_CACHE.set(bin, present);
47
+ if (!present)
48
+ throw makeMissingError(bin);
49
+ }
50
+ /**
51
+ * Non-throwing variant — returns true/false. Use when the caller
52
+ * wants to render a "(unavailable)" badge in the tool inventory
53
+ * rather than fail the call.
54
+ */
55
+ export async function isBinaryAvailable(bin) {
56
+ const cached = BINARY_AVAILABILITY_CACHE.get(bin);
57
+ if (cached !== undefined)
58
+ return cached;
59
+ const present = await checkPathBinary(bin);
60
+ BINARY_AVAILABILITY_CACHE.set(bin, present);
61
+ return present;
62
+ }
63
+ /** Reset the availability cache. Tests + the post-`offsec install` flow use this. */
64
+ export function clearBinaryAvailabilityCache() {
65
+ BINARY_AVAILABILITY_CACHE.clear();
66
+ }
67
+ function makeMissingError(bin) {
68
+ const req = findRequirement(bin);
69
+ if (!req) {
70
+ // Bin we don't track — agent capability is calling something
71
+ // outside the manifest. Surface that explicitly so the operator
72
+ // can add it to _binaryRequirements.ts.
73
+ return new BinaryMissingError({
74
+ bin,
75
+ message: `Binary "${bin}" not found on PATH and not in the offsec requirements manifest. Add it to src/capabilities/_binaryRequirements.ts.`,
76
+ installCommand: null,
77
+ installChannel: null,
78
+ platformNote: null,
79
+ capability: null,
80
+ unsupportedOnPlatform: false,
81
+ });
82
+ }
83
+ const native = isNativelyAvailable(req);
84
+ const note = platformNote(req);
85
+ const pick = pickInstallCommand(req);
86
+ // Build the message body. Three branches matching the table above.
87
+ let message;
88
+ if (native && pick) {
89
+ message =
90
+ `Binary "${bin}" required by capability "${req.capability}" but not on PATH.\n\n` +
91
+ `${req.description}\n\n` +
92
+ `Install (${pick.channel}):\n` +
93
+ ` ${pick.cmd}\n\n` +
94
+ `Or run: erosolar offsec install --capability ${req.capability}`;
95
+ }
96
+ else if (note) {
97
+ message =
98
+ `Binary "${bin}" required by capability "${req.capability}" is not natively packaged for ${process.platform}.\n\n` +
99
+ `${req.description}\n\n` +
100
+ `${note}`;
101
+ }
102
+ else if (pick) {
103
+ message =
104
+ `Binary "${bin}" required by capability "${req.capability}" but not on PATH.\n` +
105
+ `Install (${pick.channel}): ${pick.cmd}`;
106
+ }
107
+ else {
108
+ message =
109
+ `Binary "${bin}" required by capability "${req.capability}" but no install path is registered for ${process.platform}. ` +
110
+ `Use WSL2 (Windows) or a Docker container.`;
111
+ }
112
+ return new BinaryMissingError({
113
+ bin,
114
+ message,
115
+ installCommand: pick?.cmd ?? null,
116
+ installChannel: pick?.channel ?? null,
117
+ platformNote: note,
118
+ capability: req.capability,
119
+ unsupportedOnPlatform: !native,
120
+ });
121
+ }
2
122
  const DEFAULT_TIMEOUT_MS = 5 * 60 * 1000;
3
123
  const DEFAULT_MAX_OUTPUT = 1 * 1024 * 1024;
4
124
  export async function runBinary(command, args, options = {}) {
125
+ // Cross-platform preflight: refuse with a clean BinaryMissingError
126
+ // (carrying the install hint for the operator's OS, or the
127
+ // 'use WSL2' note when no native channel exists) instead of letting
128
+ // ENOENT bubble. Bins not in the manifest fall through with a
129
+ // descriptive error pointing at _binaryRequirements.ts.
130
+ await ensureBinary(command);
5
131
  return new Promise((resolve, reject) => {
6
132
  const maxBytes = options.maxOutputBytes ?? DEFAULT_MAX_OUTPUT;
7
133
  const spawnOpts = {
@@ -1 +1 @@
1
- {"version":3,"file":"_processRunner.js","sourceRoot":"","sources":["../../src/capabilities/_processRunner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"_processRunner.js","sourceRoot":"","sources":["../../src/capabilities/_processRunner.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"engagementCapability.d.ts","sourceRoot":"","sources":["../../src/capabilities/engagementCapability.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3G,qBAAa,0BAA2B,YAAW,gBAAgB;IACjE,QAAQ,CAAC,EAAE,2BAA2B;IAEhC,MAAM,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,sBAAsB,CAAC;CAgB3E"}
1
+ {"version":3,"file":"engagementCapability.d.ts","sourceRoot":"","sources":["../../src/capabilities/engagementCapability.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3G,qBAAa,0BAA2B,YAAW,gBAAgB;IACjE,QAAQ,CAAC,EAAE,2BAA2B;IAEhC,MAAM,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,sBAAsB,CAAC;CA6B3E"}
@@ -7,17 +7,28 @@
7
7
  * (erosolar-code) cannot see these tools — see CLAUDE.md "Capability
8
8
  * separation" + the v1.5 hardening test.
9
9
  */
10
- import { createEngagementTools } from '../tools/engagementTools.js';
10
+ import { createEngagementTools, loadSelectionFromPortal } from '../tools/engagementTools.js';
11
11
  export class EngagementCapabilityModule {
12
12
  id = 'capability.engagement';
13
13
  async create(_context) {
14
14
  void _context;
15
+ // Resume whatever selection the portal (or another CLI session)
16
+ // last wrote to users/<uid>/cli_state/selection. Best-effort —
17
+ // if auth is missing or the network is offline, the session
18
+ // still boots normally with no active selection.
19
+ const resumed = await loadSelectionFromPortal();
20
+ if (resumed?.engagementId) {
21
+ const trail = [resumed.engagementId, resumed.targetId, resumed.findingId]
22
+ .filter(Boolean).join(' › ');
23
+ process.stderr.write(`[engagement] Resumed from portal: ${trail}\n`);
24
+ }
15
25
  return {
16
26
  id: 'engagement.tools',
17
27
  description: 'Engagement → Target → Finding pipeline. Manages contracts / task-orders / ' +
18
28
  'bug-bounty programs and the variant-research lifecycle. Writes to ' +
19
- 'users/<uid>/engagements/<id>/targets/<tid>/findings/<fid> via Lambda; ' +
20
- 'the portal renders the rail + phase-tabbed detail pane.',
29
+ 'users/<uid>/engagements/<id>/targets/<tid>/findings/<fid> via Lambda. ' +
30
+ 'Selection is auto-resumed from users/<uid>/cli_state/selection on boot, ' +
31
+ 'so a portal-launched hunt lands directly in this session.',
21
32
  toolSuite: {
22
33
  id: 'engagement',
23
34
  description: 'Engagement / target / finding tools',
@@ -1 +1 @@
1
- {"version":3,"file":"engagementCapability.js","sourceRoot":"","sources":["../../src/capabilities/engagementCapability.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,MAAM,OAAO,0BAA0B;IAC5B,EAAE,GAAG,uBAAuB,CAAC;IAEtC,KAAK,CAAC,MAAM,CAAC,QAA2B;QACtC,KAAK,QAAQ,CAAC;QACd,OAAO;YACL,EAAE,EAAE,kBAAkB;YACtB,WAAW,EACT,4EAA4E;gBAC5E,oEAAoE;gBACpE,wEAAwE;gBACxE,yDAAyD;YAC3D,SAAS,EAAE;gBACT,EAAE,EAAE,YAAY;gBAChB,WAAW,EAAE,qCAAqC;gBAClD,KAAK,EAAE,qBAAqB,EAAE;aAC/B;SACF,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"engagementCapability.js","sourceRoot":"","sources":["../../src/capabilities/engagementCapability.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAE7F,MAAM,OAAO,0BAA0B;IAC5B,EAAE,GAAG,uBAAuB,CAAC;IAEtC,KAAK,CAAC,MAAM,CAAC,QAA2B;QACtC,KAAK,QAAQ,CAAC;QAEd,gEAAgE;QAChE,+DAA+D;QAC/D,4DAA4D;QAC5D,iDAAiD;QACjD,MAAM,OAAO,GAAG,MAAM,uBAAuB,EAAE,CAAC;QAChD,IAAI,OAAO,EAAE,YAAY,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC;iBACtE,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,KAAK,IAAI,CAAC,CAAC;QACvE,CAAC;QAED,OAAO;YACL,EAAE,EAAE,kBAAkB;YACtB,WAAW,EACT,4EAA4E;gBAC5E,oEAAoE;gBACpE,wEAAwE;gBACxE,0EAA0E;gBAC1E,2DAA2D;YAC7D,SAAS,EAAE;gBACT,EAAE,EAAE,YAAY;gBAChB,WAAW,EAAE,qCAAqC;gBAClD,KAAK,EAAE,qBAAqB,EAAE;aAC/B;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -14,6 +14,7 @@ export { GdbCapabilityModule } from './gdbCapability.js';
14
14
  export { BinaryAnalysisCapabilityModule } from './binaryAnalysisCapability.js';
15
15
  export { PwntoolsCapabilityModule } from './pwntoolsCapability.js';
16
16
  export { GhidraHeadlessCapabilityModule } from './ghidraHeadlessCapability.js';
17
+ export { LlmRedteamCapabilityModule } from './llmRedteamCapability.js';
17
18
  export { WorktreeCapabilityModule } from './worktreeCapability.js';
18
19
  export { PlanModeCapabilityModule } from './planModeCapability.js';
19
20
  export { MonitorCapabilityModule } from './monitorCapability.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/capabilities/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAGvI,OAAO,EAAE,0BAA0B,EAAE,KAAK,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACzG,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAIvE,OAAO,EAAE,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/capabilities/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAGvI,OAAO,EAAE,0BAA0B,EAAE,KAAK,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACzG,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAIvE,OAAO,EAAE,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
@@ -16,6 +16,7 @@ export { GdbCapabilityModule } from './gdbCapability.js';
16
16
  export { BinaryAnalysisCapabilityModule } from './binaryAnalysisCapability.js';
17
17
  export { PwntoolsCapabilityModule } from './pwntoolsCapability.js';
18
18
  export { GhidraHeadlessCapabilityModule } from './ghidraHeadlessCapability.js';
19
+ export { LlmRedteamCapabilityModule } from './llmRedteamCapability.js';
19
20
  export { WorktreeCapabilityModule } from './worktreeCapability.js';
20
21
  export { PlanModeCapabilityModule } from './planModeCapability.js';
21
22
  export { MonitorCapabilityModule } from './monitorCapability.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/capabilities/index.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,6BAA6B,EAAE,6BAA6B,EAA6B,MAAM,8BAA8B,CAAC;AAEvI,4BAA4B;AAC5B,OAAO,EAAE,0BAA0B,EAAoC,MAAM,2BAA2B,CAAC;AACzG,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAA8B,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAgC,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAA6B,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAA8B,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,uEAAuE;AACvE,oEAAoE;AACpE,yCAAyC;AACzC,OAAO,EAAE,oBAAoB,EAA8B,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/capabilities/index.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EAAE,6BAA6B,EAAE,6BAA6B,EAA6B,MAAM,8BAA8B,CAAC;AAEvI,4BAA4B;AAC5B,OAAO,EAAE,0BAA0B,EAAoC,MAAM,2BAA2B,CAAC;AACzG,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAA8B,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAgC,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAA6B,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAA8B,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,uEAAuE;AACvE,oEAAoE;AACpE,yCAAyC;AACzC,OAAO,EAAE,oBAAoB,EAA8B,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * llmRedteam — phishing-resistant LLM probing for variant-research +
3
+ * engagement-delivery profiles.
4
+ *
5
+ * Wraps the canonical open-source LLM red-team toolchain:
6
+ *
7
+ * • garak — NVIDIA / Leon Derczynski's vulnerability scanner
8
+ * for LLMs. Probes for prompt injection, jailbreak
9
+ * (DAN family), encoding tricks, training-data
10
+ * leakage, toxicity. Single Python binary; OpenAI
11
+ * and HTTP-REST model types built in.
12
+ * • promptfoo — Eval framework with a `redteam` subcommand that
13
+ * auto-generates jailbreak / harmful-content / PII-
14
+ * extraction probes against a configured target.
15
+ *
16
+ * Tools route every spawn through OpsContext, so:
17
+ * • Targets are scope-checked against the active engagement BEFORE
18
+ * the process starts (cheap fail-fast; Lambda re-checks server-
19
+ * side as defence-in-depth).
20
+ * • Each run is a Job in users/{uid}/jobs — visible in the portal's
21
+ * #jobsList rail with live log streaming.
22
+ * • Hits parsed from tool stdout become Findings under
23
+ * users/{uid}/findings — the portal's #findingsList rail renders
24
+ * them as they land.
25
+ * • Risky operations gate on operator HITL via the portal's
26
+ * pending-questions strip — no probe fires until approved.
27
+ *
28
+ * Profile gating: only registered for `variant-research` and
29
+ * `engagement-delivery`. The default coding profile sees zero of these
30
+ * tools (CLAUDE.md "Capability separation").
31
+ */
32
+ import type { CapabilityContext, CapabilityContribution, CapabilityModule } from '../runtime/agentHost.js';
33
+ export declare class LlmRedteamCapabilityModule implements CapabilityModule {
34
+ readonly id = "capability.llmRedteam";
35
+ readonly description: string;
36
+ create(context: CapabilityContext): Promise<CapabilityContribution>;
37
+ }
38
+ //# sourceMappingURL=llmRedteamCapability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llmRedteamCapability.d.ts","sourceRoot":"","sources":["../../src/capabilities/llmRedteamCapability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAmV3G,qBAAa,0BAA2B,YAAW,gBAAgB;IACjE,QAAQ,CAAC,EAAE,2BAA2B;IACtC,QAAQ,CAAC,WAAW,SAEgF;IAE9F,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,sBAAsB,CAAC;CAiB1E"}