erosolar-cli 2.1.195 → 2.1.196
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -0
- package/dist/contracts/agent-schemas.json +0 -21
- package/dist/contracts/tools.schema.json +0 -16
- package/dist/core/agentOrchestrator.d.ts +14 -18
- package/dist/core/agentOrchestrator.d.ts.map +1 -1
- package/dist/core/agentOrchestrator.js +120 -175
- package/dist/core/agentOrchestrator.js.map +1 -1
- package/dist/plugins/tools/nodeDefaults.d.ts.map +1 -1
- package/dist/plugins/tools/nodeDefaults.js +0 -4
- package/dist/plugins/tools/nodeDefaults.js.map +1 -1
- package/dist/shell/interactiveShell.d.ts +0 -8
- package/dist/shell/interactiveShell.d.ts.map +1 -1
- package/dist/shell/interactiveShell.js +53 -285
- package/dist/shell/interactiveShell.js.map +1 -1
- package/package.json +1 -1
- package/agents/erosolar-security.rules.json +0 -147
- package/dist/capabilities/offsecOpsCapability.d.ts +0 -6
- package/dist/capabilities/offsecOpsCapability.d.ts.map +0 -1
- package/dist/capabilities/offsecOpsCapability.js +0 -19
- package/dist/capabilities/offsecOpsCapability.js.map +0 -1
- package/dist/capabilities/offsecSearchCapability.d.ts +0 -12
- package/dist/capabilities/offsecSearchCapability.d.ts.map +0 -1
- package/dist/capabilities/offsecSearchCapability.js +0 -27
- package/dist/capabilities/offsecSearchCapability.js.map +0 -1
- package/dist/core/offsecAlphaZero.d.ts +0 -59
- package/dist/core/offsecAlphaZero.d.ts.map +0 -1
- package/dist/core/offsecAlphaZero.js +0 -556
- package/dist/core/offsecAlphaZero.js.map +0 -1
- package/dist/plugins/tools/offsec/offsecOpsPlugin.d.ts +0 -3
- package/dist/plugins/tools/offsec/offsecOpsPlugin.d.ts.map +0 -1
- package/dist/plugins/tools/offsec/offsecOpsPlugin.js +0 -10
- package/dist/plugins/tools/offsec/offsecOpsPlugin.js.map +0 -1
- package/dist/plugins/tools/offsec/offsecSearchPlugin.d.ts +0 -3
- package/dist/plugins/tools/offsec/offsecSearchPlugin.d.ts.map +0 -1
- package/dist/plugins/tools/offsec/offsecSearchPlugin.js +0 -12
- package/dist/plugins/tools/offsec/offsecSearchPlugin.js.map +0 -1
- package/dist/tools/offsec/offsecOperationsTools.d.ts +0 -3
- package/dist/tools/offsec/offsecOperationsTools.d.ts.map +0 -1
- package/dist/tools/offsec/offsecOperationsTools.js +0 -333
- package/dist/tools/offsec/offsecOperationsTools.js.map +0 -1
- package/dist/tools/offsecSearchTools.d.ts +0 -3
- package/dist/tools/offsecSearchTools.d.ts.map +0 -1
- package/dist/tools/offsecSearchTools.js +0 -330
- package/dist/tools/offsecSearchTools.js.map +0 -1
|
@@ -1,330 +0,0 @@
|
|
|
1
|
-
export function createOffsecSearchTools() {
|
|
2
|
-
return [
|
|
3
|
-
{
|
|
4
|
-
name: 'attack_path_search',
|
|
5
|
-
description: 'Best-first search over an attack graph to propose an exploitation path. Provide nodes/edges JSON (ids, costs, gains, detection) and optional start/goal nodes.',
|
|
6
|
-
parameters: {
|
|
7
|
-
type: 'object',
|
|
8
|
-
properties: {
|
|
9
|
-
graph: {
|
|
10
|
-
type: 'string',
|
|
11
|
-
description: 'Attack graph as JSON with nodes/edges (or pass object via structured args)',
|
|
12
|
-
},
|
|
13
|
-
start: {
|
|
14
|
-
type: 'string',
|
|
15
|
-
description: 'Optional starting node id',
|
|
16
|
-
},
|
|
17
|
-
goals: {
|
|
18
|
-
type: 'array',
|
|
19
|
-
items: { type: 'string' },
|
|
20
|
-
description: 'Optional list of goal node ids (privileged assets/targets)',
|
|
21
|
-
},
|
|
22
|
-
beam_width: {
|
|
23
|
-
type: 'number',
|
|
24
|
-
description: 'Beam width / frontier cap (default 8, max 32)',
|
|
25
|
-
},
|
|
26
|
-
max_expansions: {
|
|
27
|
-
type: 'number',
|
|
28
|
-
description: 'Safety cap on node expansions (default 200)',
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
required: ['graph'],
|
|
32
|
-
additionalProperties: false,
|
|
33
|
-
},
|
|
34
|
-
handler: async (args) => runAttackPathSearch(args),
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
name: 'payload_scheduler',
|
|
38
|
-
description: 'Ranks exploit payload families using UCB-style scoring to focus on high-yield probes while keeping exploration. Input payload stats (successes/attempts/signals).',
|
|
39
|
-
parameters: {
|
|
40
|
-
type: 'object',
|
|
41
|
-
properties: {
|
|
42
|
-
payloads: {
|
|
43
|
-
type: 'array',
|
|
44
|
-
description: 'List of payload stats with id, optional family, successes, attempts, and recentSignals.',
|
|
45
|
-
items: {
|
|
46
|
-
type: 'object',
|
|
47
|
-
properties: {
|
|
48
|
-
id: { type: 'string' },
|
|
49
|
-
family: { type: 'string' },
|
|
50
|
-
successes: { type: 'number' },
|
|
51
|
-
attempts: { type: 'number' },
|
|
52
|
-
recentSignals: {
|
|
53
|
-
type: 'array',
|
|
54
|
-
items: { type: 'number' },
|
|
55
|
-
},
|
|
56
|
-
},
|
|
57
|
-
required: ['id'],
|
|
58
|
-
additionalProperties: false,
|
|
59
|
-
},
|
|
60
|
-
},
|
|
61
|
-
exploration: {
|
|
62
|
-
type: 'number',
|
|
63
|
-
description: 'Exploration factor for UCB scoring (default 1.4).',
|
|
64
|
-
},
|
|
65
|
-
},
|
|
66
|
-
required: ['payloads'],
|
|
67
|
-
additionalProperties: false,
|
|
68
|
-
},
|
|
69
|
-
handler: async (args) => rankPayloads(args),
|
|
70
|
-
},
|
|
71
|
-
];
|
|
72
|
-
}
|
|
73
|
-
async function runAttackPathSearch(args) {
|
|
74
|
-
const parsed = parseGraph(args['graph']);
|
|
75
|
-
if (typeof parsed === 'string') {
|
|
76
|
-
return parsed;
|
|
77
|
-
}
|
|
78
|
-
const beamWidth = sanitizeNumber(args['beam_width'], 8, 1, 32);
|
|
79
|
-
const maxExpansions = sanitizeNumber(args['max_expansions'], 200, 10, 1000);
|
|
80
|
-
const startId = typeof args['start'] === 'string' && args['start'].trim() ? args['start'].trim() : parsed.start;
|
|
81
|
-
const goalsArg = Array.isArray(args['goals']) ? args['goals'].filter((g) => typeof g === 'string') : null;
|
|
82
|
-
const goals = (goalsArg && goalsArg.length ? goalsArg : parsed.goals) ?? inferGoalIds(parsed.nodes);
|
|
83
|
-
const startNodes = resolveStarts(parsed.nodes, startId);
|
|
84
|
-
if (startNodes.length === 0) {
|
|
85
|
-
return 'Error: No starting node found. Provide start or mark a node with start=true.';
|
|
86
|
-
}
|
|
87
|
-
if (goals.length === 0) {
|
|
88
|
-
return 'Error: No goal nodes provided or inferable. Add goals or mark nodes with goal=true.';
|
|
89
|
-
}
|
|
90
|
-
const adjacency = buildAdjacency(parsed.edges);
|
|
91
|
-
const results = bestFirstSearch({
|
|
92
|
-
starts: startNodes,
|
|
93
|
-
goals: new Set(goals),
|
|
94
|
-
adjacency,
|
|
95
|
-
nodes: new Map(parsed.nodes.map((n) => [n.id, n])),
|
|
96
|
-
beamWidth,
|
|
97
|
-
maxExpansions,
|
|
98
|
-
});
|
|
99
|
-
if (!results.path.length) {
|
|
100
|
-
return 'No viable path found within expansion limits.';
|
|
101
|
-
}
|
|
102
|
-
const lines = [];
|
|
103
|
-
lines.push(`Attack path found (${results.expansions} expansions, beam ${beamWidth}):`);
|
|
104
|
-
for (let i = 0; i < results.path.length; i += 1) {
|
|
105
|
-
const step = results.path[i];
|
|
106
|
-
if (!step)
|
|
107
|
-
continue;
|
|
108
|
-
const node = parsed.nodes.find((n) => n.id === step.nodeId);
|
|
109
|
-
const label = node?.label || node?.id || 'node';
|
|
110
|
-
if (i === 0) {
|
|
111
|
-
lines.push(` • START ${step.nodeId} (${label})`);
|
|
112
|
-
continue;
|
|
113
|
-
}
|
|
114
|
-
const edge = step.via;
|
|
115
|
-
const action = edge?.action ? ` via ${edge.action}` : '';
|
|
116
|
-
lines.push(` • ${edge?.from ?? '?'} -> ${step.nodeId}${action} ` +
|
|
117
|
-
`(cost ${formatNumber(edge?.cost ?? 1)}, gain ${formatNumber(edge?.gain ?? 0)}, likelihood ${formatNumber(edge?.likelihood ?? 0.5)})`);
|
|
118
|
-
}
|
|
119
|
-
lines.push('');
|
|
120
|
-
lines.push(`Score: ${formatNumber(results.score)} | Cost: ${formatNumber(results.cost)} | Reward: ${formatNumber(results.reward)} | Detection: ${formatNumber(results.detection)}`);
|
|
121
|
-
return lines.join('\n');
|
|
122
|
-
}
|
|
123
|
-
function bestFirstSearch(input) {
|
|
124
|
-
const visited = new Set();
|
|
125
|
-
const frontier = [];
|
|
126
|
-
for (const start of input.starts) {
|
|
127
|
-
const node = input.nodes.get(start);
|
|
128
|
-
const baseReward = nodeReward(node);
|
|
129
|
-
frontier.push({
|
|
130
|
-
nodeId: start,
|
|
131
|
-
path: [{ nodeId: start }],
|
|
132
|
-
cost: 0,
|
|
133
|
-
reward: baseReward,
|
|
134
|
-
detection: node?.detection ?? 0,
|
|
135
|
-
score: heuristicScore({ cost: 0, reward: baseReward, detection: node?.detection ?? 0, node }),
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
let expansions = 0;
|
|
139
|
-
let best = null;
|
|
140
|
-
while (frontier.length && expansions < input.maxExpansions) {
|
|
141
|
-
frontier.sort((a, b) => a.score - b.score);
|
|
142
|
-
const current = frontier.shift();
|
|
143
|
-
if (!current) {
|
|
144
|
-
break;
|
|
145
|
-
}
|
|
146
|
-
expansions += 1;
|
|
147
|
-
const bestScore = best !== null ? best.score : Number.POSITIVE_INFINITY;
|
|
148
|
-
if (best !== null && current.score >= bestScore && frontier.length >= input.beamWidth) {
|
|
149
|
-
// Frontier already has better scores and beam is saturated
|
|
150
|
-
continue;
|
|
151
|
-
}
|
|
152
|
-
if (input.goals.has(current.nodeId)) {
|
|
153
|
-
best = current;
|
|
154
|
-
break;
|
|
155
|
-
}
|
|
156
|
-
visited.add(current.nodeId);
|
|
157
|
-
const edges = input.adjacency.get(current.nodeId) ?? [];
|
|
158
|
-
for (const edge of edges) {
|
|
159
|
-
if (visited.has(edge.to))
|
|
160
|
-
continue;
|
|
161
|
-
const node = input.nodes.get(edge.to);
|
|
162
|
-
const stepReward = (edge.gain ?? 0) + nodeReward(node);
|
|
163
|
-
const stepCost = edge.cost ?? 1;
|
|
164
|
-
const detection = (edge.detection ?? 0) + (node?.detection ?? 0);
|
|
165
|
-
const next = {
|
|
166
|
-
nodeId: edge.to,
|
|
167
|
-
path: [...current.path, { nodeId: edge.to, via: edge }],
|
|
168
|
-
cost: current.cost + stepCost,
|
|
169
|
-
reward: current.reward + stepReward,
|
|
170
|
-
detection: current.detection + detection,
|
|
171
|
-
score: heuristicScore({
|
|
172
|
-
cost: current.cost + stepCost,
|
|
173
|
-
reward: current.reward + stepReward,
|
|
174
|
-
detection: current.detection + detection,
|
|
175
|
-
node,
|
|
176
|
-
}),
|
|
177
|
-
};
|
|
178
|
-
frontier.push(next);
|
|
179
|
-
}
|
|
180
|
-
if (frontier.length > input.beamWidth) {
|
|
181
|
-
frontier.sort((a, b) => a.score - b.score);
|
|
182
|
-
frontier.splice(input.beamWidth);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
if (!best) {
|
|
186
|
-
frontier.sort((a, b) => a.score - b.score);
|
|
187
|
-
best = frontier[0] ?? null;
|
|
188
|
-
}
|
|
189
|
-
if (!best) {
|
|
190
|
-
return { path: [], score: 0, cost: 0, reward: 0, detection: 0, expansions };
|
|
191
|
-
}
|
|
192
|
-
return {
|
|
193
|
-
path: best.path,
|
|
194
|
-
score: best.score,
|
|
195
|
-
cost: best.cost,
|
|
196
|
-
reward: best.reward,
|
|
197
|
-
detection: best.detection,
|
|
198
|
-
expansions,
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
function heuristicScore(input) {
|
|
202
|
-
const criticality = input.node?.criticality ?? 1;
|
|
203
|
-
const privilege = input.node?.privilege ?? 1;
|
|
204
|
-
const valueBoost = (criticality + privilege) * 0.4;
|
|
205
|
-
const detectionPenalty = input.detection * 0.3;
|
|
206
|
-
// Lower is better
|
|
207
|
-
return input.cost - input.reward * 0.6 - valueBoost + detectionPenalty;
|
|
208
|
-
}
|
|
209
|
-
function buildAdjacency(edges) {
|
|
210
|
-
const adj = new Map();
|
|
211
|
-
for (const edge of edges) {
|
|
212
|
-
if (!edge.from || !edge.to)
|
|
213
|
-
continue;
|
|
214
|
-
const list = adj.get(edge.from) ?? [];
|
|
215
|
-
list.push(edge);
|
|
216
|
-
adj.set(edge.from, list);
|
|
217
|
-
}
|
|
218
|
-
return adj;
|
|
219
|
-
}
|
|
220
|
-
function resolveStarts(nodes, startId) {
|
|
221
|
-
if (startId) {
|
|
222
|
-
return nodes.some((n) => n.id === startId) ? [startId] : [];
|
|
223
|
-
}
|
|
224
|
-
const flagged = nodes.filter((n) => n.start).map((n) => n.id);
|
|
225
|
-
if (flagged.length)
|
|
226
|
-
return flagged;
|
|
227
|
-
return nodes.length ? [nodes[0].id] : [];
|
|
228
|
-
}
|
|
229
|
-
function inferGoalIds(nodes) {
|
|
230
|
-
const flagged = nodes.filter((n) => n.goal).map((n) => n.id);
|
|
231
|
-
if (flagged.length)
|
|
232
|
-
return flagged;
|
|
233
|
-
const critical = [...nodes].sort((a, b) => (b.criticality ?? 0) - (a.criticality ?? 0));
|
|
234
|
-
return critical.slice(0, Math.min(2, critical.length)).map((n) => n.id);
|
|
235
|
-
}
|
|
236
|
-
function nodeReward(node) {
|
|
237
|
-
if (!node)
|
|
238
|
-
return 0;
|
|
239
|
-
const base = node.reward ?? 0;
|
|
240
|
-
const privilege = node.privilege ?? 0;
|
|
241
|
-
const criticality = node.criticality ?? 0;
|
|
242
|
-
return base + privilege * 0.6 + criticality * 0.8;
|
|
243
|
-
}
|
|
244
|
-
function parseGraph(raw) {
|
|
245
|
-
if (!raw) {
|
|
246
|
-
return 'Error: graph is required.';
|
|
247
|
-
}
|
|
248
|
-
if (typeof raw === 'object' && raw !== null && !Array.isArray(raw)) {
|
|
249
|
-
const obj = raw;
|
|
250
|
-
if (Array.isArray(obj.nodes) && Array.isArray(obj.edges)) {
|
|
251
|
-
return obj;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
if (typeof raw === 'string') {
|
|
255
|
-
try {
|
|
256
|
-
const parsed = JSON.parse(raw);
|
|
257
|
-
if (!Array.isArray(parsed.nodes) || !Array.isArray(parsed.edges)) {
|
|
258
|
-
return 'Error: graph JSON must include nodes and edges arrays.';
|
|
259
|
-
}
|
|
260
|
-
return parsed;
|
|
261
|
-
}
|
|
262
|
-
catch (error) {
|
|
263
|
-
return `Error: failed to parse graph JSON: ${error?.message ?? String(error)}`;
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
return 'Error: graph must be a JSON string or object with nodes and edges.';
|
|
267
|
-
}
|
|
268
|
-
async function rankPayloads(args) {
|
|
269
|
-
const payloads = Array.isArray(args['payloads']) ? args['payloads'] : null;
|
|
270
|
-
if (!payloads || payloads.length === 0) {
|
|
271
|
-
return 'Error: payloads must be a non-empty array.';
|
|
272
|
-
}
|
|
273
|
-
const exploration = sanitizeNumber(args['exploration'], 1.4, 0.1, 5);
|
|
274
|
-
const stats = [];
|
|
275
|
-
for (const entry of payloads) {
|
|
276
|
-
if (!entry || typeof entry !== 'object')
|
|
277
|
-
continue;
|
|
278
|
-
const id = entry.id;
|
|
279
|
-
if (typeof id !== 'string' || !id.trim())
|
|
280
|
-
continue;
|
|
281
|
-
stats.push({
|
|
282
|
-
id: id.trim(),
|
|
283
|
-
family: typeof entry.family === 'string' ? entry.family : undefined,
|
|
284
|
-
successes: typeof entry.successes === 'number' ? entry.successes : 0,
|
|
285
|
-
attempts: typeof entry.attempts === 'number' ? entry.attempts : 0,
|
|
286
|
-
recentSignals: Array.isArray(entry.recentSignals)
|
|
287
|
-
? entry.recentSignals.filter((n) => typeof n === 'number')
|
|
288
|
-
: [],
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
if (!stats.length) {
|
|
292
|
-
return 'Error: no valid payload entries found.';
|
|
293
|
-
}
|
|
294
|
-
const totalAttempts = stats.reduce((sum, p) => sum + Math.max(p.attempts ?? 0, 0), 0) + 1;
|
|
295
|
-
const ranked = stats
|
|
296
|
-
.map((p) => {
|
|
297
|
-
const attempts = Math.max(p.attempts ?? 0, 0);
|
|
298
|
-
const successes = Math.max(p.successes ?? 0, 0);
|
|
299
|
-
const rate = (successes + 1) / (attempts + 2); // Laplace smoothing
|
|
300
|
-
const signal = p.recentSignals && p.recentSignals.length
|
|
301
|
-
? p.recentSignals.reduce((sum, v) => sum + v, 0) / p.recentSignals.length
|
|
302
|
-
: 0;
|
|
303
|
-
const ucb = rate + exploration * Math.sqrt((2 * Math.log(totalAttempts)) / (attempts + 1));
|
|
304
|
-
const score = ucb + signal * 0.1;
|
|
305
|
-
return { ...p, score, rate, signal };
|
|
306
|
-
})
|
|
307
|
-
.sort((a, b) => b.score - a.score);
|
|
308
|
-
const lines = [];
|
|
309
|
-
lines.push('Payload scheduling (higher first):');
|
|
310
|
-
for (const entry of ranked) {
|
|
311
|
-
const family = entry.family ? ` [${entry.family}]` : '';
|
|
312
|
-
lines.push(` • ${entry.id}${family} | score ${formatNumber(entry.score)} | success ${formatNumber(entry.rate)} | signal ${formatNumber(entry.signal)} | attempts ${entry.attempts ?? 0}`);
|
|
313
|
-
}
|
|
314
|
-
return lines.join('\n');
|
|
315
|
-
}
|
|
316
|
-
function sanitizeNumber(value, fallback, min, max) {
|
|
317
|
-
if (typeof value !== 'number' || Number.isNaN(value))
|
|
318
|
-
return fallback;
|
|
319
|
-
return Math.min(Math.max(value, min), max);
|
|
320
|
-
}
|
|
321
|
-
function formatNumber(value) {
|
|
322
|
-
if (!Number.isFinite(value))
|
|
323
|
-
return '0';
|
|
324
|
-
if (Math.abs(value) >= 100)
|
|
325
|
-
return value.toFixed(0);
|
|
326
|
-
if (Math.abs(value) >= 10)
|
|
327
|
-
return value.toFixed(1);
|
|
328
|
-
return value.toFixed(2);
|
|
329
|
-
}
|
|
330
|
-
//# sourceMappingURL=offsecSearchTools.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"offsecSearchTools.js","sourceRoot":"","sources":["../../src/tools/offsecSearchTools.ts"],"names":[],"mappings":"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"}
|