erosolar-cli 2.1.195 → 2.1.197

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 (48) hide show
  1. package/README.md +14 -0
  2. package/dist/contracts/agent-schemas.json +0 -21
  3. package/dist/contracts/tools.schema.json +0 -16
  4. package/dist/core/agentOrchestrator.d.ts +20 -18
  5. package/dist/core/agentOrchestrator.d.ts.map +1 -1
  6. package/dist/core/agentOrchestrator.js +154 -181
  7. package/dist/core/agentOrchestrator.js.map +1 -1
  8. package/dist/plugins/tools/nodeDefaults.d.ts.map +1 -1
  9. package/dist/plugins/tools/nodeDefaults.js +0 -4
  10. package/dist/plugins/tools/nodeDefaults.js.map +1 -1
  11. package/dist/shell/interactiveShell.d.ts +0 -8
  12. package/dist/shell/interactiveShell.d.ts.map +1 -1
  13. package/dist/shell/interactiveShell.js +53 -285
  14. package/dist/shell/interactiveShell.js.map +1 -1
  15. package/dist/ui/UnifiedUIRenderer.d.ts +1 -0
  16. package/dist/ui/UnifiedUIRenderer.d.ts.map +1 -1
  17. package/dist/ui/UnifiedUIRenderer.js +7 -1
  18. package/dist/ui/UnifiedUIRenderer.js.map +1 -1
  19. package/package.json +1 -1
  20. package/agents/erosolar-security.rules.json +0 -147
  21. package/dist/capabilities/offsecOpsCapability.d.ts +0 -6
  22. package/dist/capabilities/offsecOpsCapability.d.ts.map +0 -1
  23. package/dist/capabilities/offsecOpsCapability.js +0 -19
  24. package/dist/capabilities/offsecOpsCapability.js.map +0 -1
  25. package/dist/capabilities/offsecSearchCapability.d.ts +0 -12
  26. package/dist/capabilities/offsecSearchCapability.d.ts.map +0 -1
  27. package/dist/capabilities/offsecSearchCapability.js +0 -27
  28. package/dist/capabilities/offsecSearchCapability.js.map +0 -1
  29. package/dist/core/offsecAlphaZero.d.ts +0 -59
  30. package/dist/core/offsecAlphaZero.d.ts.map +0 -1
  31. package/dist/core/offsecAlphaZero.js +0 -556
  32. package/dist/core/offsecAlphaZero.js.map +0 -1
  33. package/dist/plugins/tools/offsec/offsecOpsPlugin.d.ts +0 -3
  34. package/dist/plugins/tools/offsec/offsecOpsPlugin.d.ts.map +0 -1
  35. package/dist/plugins/tools/offsec/offsecOpsPlugin.js +0 -10
  36. package/dist/plugins/tools/offsec/offsecOpsPlugin.js.map +0 -1
  37. package/dist/plugins/tools/offsec/offsecSearchPlugin.d.ts +0 -3
  38. package/dist/plugins/tools/offsec/offsecSearchPlugin.d.ts.map +0 -1
  39. package/dist/plugins/tools/offsec/offsecSearchPlugin.js +0 -12
  40. package/dist/plugins/tools/offsec/offsecSearchPlugin.js.map +0 -1
  41. package/dist/tools/offsec/offsecOperationsTools.d.ts +0 -3
  42. package/dist/tools/offsec/offsecOperationsTools.d.ts.map +0 -1
  43. package/dist/tools/offsec/offsecOperationsTools.js +0 -333
  44. package/dist/tools/offsec/offsecOperationsTools.js.map +0 -1
  45. package/dist/tools/offsecSearchTools.d.ts +0 -3
  46. package/dist/tools/offsecSearchTools.d.ts.map +0 -1
  47. package/dist/tools/offsecSearchTools.js +0 -330
  48. 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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"}