@better-openclaw/core 1.0.12 → 1.0.14

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 (75) hide show
  1. package/README.md +70 -0
  2. package/dist/composer.d.mts.map +1 -1
  3. package/dist/composer.mjs +5 -3
  4. package/dist/composer.mjs.map +1 -1
  5. package/dist/generate.d.mts.map +1 -1
  6. package/dist/generate.mjs +11 -0
  7. package/dist/generate.mjs.map +1 -1
  8. package/dist/generators/env.d.mts.map +1 -1
  9. package/dist/generators/env.mjs +21 -1
  10. package/dist/generators/env.mjs.map +1 -1
  11. package/dist/generators/get-shit-done.d.mts +10 -0
  12. package/dist/generators/get-shit-done.d.mts.map +1 -0
  13. package/dist/generators/get-shit-done.mjs +38 -0
  14. package/dist/generators/get-shit-done.mjs.map +1 -0
  15. package/dist/generators/openclaw-json.d.mts +11 -0
  16. package/dist/generators/openclaw-json.d.mts.map +1 -0
  17. package/dist/generators/openclaw-json.mjs +410 -0
  18. package/dist/generators/openclaw-json.mjs.map +1 -0
  19. package/dist/index.d.mts +2 -2
  20. package/dist/{manifest-DSGl8ITO.mjs → manifest-BjK4ALvr.mjs} +49 -1
  21. package/dist/manifest-BjK4ALvr.mjs.map +1 -0
  22. package/dist/resolver.mjs +3 -1
  23. package/dist/resolver.mjs.map +1 -1
  24. package/dist/schema.d.mts +85 -1
  25. package/dist/schema.d.mts.map +1 -1
  26. package/dist/schema.mjs +30 -3
  27. package/dist/schema.mjs.map +1 -1
  28. package/dist/services/definitions/hexstrike.d.mts +7 -0
  29. package/dist/services/definitions/hexstrike.d.mts.map +1 -0
  30. package/dist/services/definitions/hexstrike.mjs +44 -0
  31. package/dist/services/definitions/hexstrike.mjs.map +1 -0
  32. package/dist/services/definitions/index.d.mts +6 -1
  33. package/dist/services/definitions/index.d.mts.map +1 -1
  34. package/dist/services/definitions/index.mjs +12 -2
  35. package/dist/services/definitions/index.mjs.map +1 -1
  36. package/dist/services/definitions/pentagi.d.mts +7 -0
  37. package/dist/services/definitions/pentagi.d.mts.map +1 -0
  38. package/dist/services/definitions/pentagi.mjs +44 -0
  39. package/dist/services/definitions/pentagi.mjs.map +1 -0
  40. package/dist/services/definitions/pentestagent.d.mts +7 -0
  41. package/dist/services/definitions/pentestagent.d.mts.map +1 -0
  42. package/dist/services/definitions/pentestagent.mjs +39 -0
  43. package/dist/services/definitions/pentestagent.mjs.map +1 -0
  44. package/dist/services/definitions/scrapling.d.mts +7 -0
  45. package/dist/services/definitions/scrapling.d.mts.map +1 -0
  46. package/dist/services/definitions/scrapling.mjs +44 -0
  47. package/dist/services/definitions/scrapling.mjs.map +1 -0
  48. package/dist/services/definitions/solidityguard.d.mts +7 -0
  49. package/dist/services/definitions/solidityguard.d.mts.map +1 -0
  50. package/dist/services/definitions/solidityguard.mjs +49 -0
  51. package/dist/services/definitions/solidityguard.mjs.map +1 -0
  52. package/dist/skills/skill-manifest.mjs +1 -1
  53. package/dist/types.d.mts +6 -2
  54. package/dist/types.d.mts.map +1 -1
  55. package/dist/types.mjs +5 -0
  56. package/dist/types.mjs.map +1 -1
  57. package/package.json +1 -1
  58. package/src/composer.ts +12 -3
  59. package/src/generate.ts +15 -0
  60. package/src/generators/env.ts +26 -0
  61. package/src/generators/get-shit-done.ts +43 -0
  62. package/src/generators/openclaw-json.ts +406 -0
  63. package/src/index.ts +2 -0
  64. package/src/resolver.ts +10 -8
  65. package/src/schema.ts +24 -0
  66. package/src/services/definitions/hexstrike.ts +40 -0
  67. package/src/services/definitions/index.ts +15 -0
  68. package/src/services/definitions/pentagi.ts +41 -0
  69. package/src/services/definitions/pentestagent.ts +34 -0
  70. package/src/services/definitions/scrapling.ts +40 -0
  71. package/src/services/definitions/solidityguard.ts +46 -0
  72. package/src/skills/manifest.json +58 -0
  73. package/src/skills/manifest.schema.json +51 -0
  74. package/src/types.ts +7 -0
  75. package/dist/manifest-DSGl8ITO.mjs.map +0 -1
@@ -0,0 +1,406 @@
1
+ import type { AiProvider, ResolverOutput } from "../types.js";
2
+
3
+ const PROVIDER_CONFIGS: Record<AiProvider, any> = {
4
+ openai: {
5
+ baseUrl: "https://api.openai.com/v1",
6
+ api: "openai-completions",
7
+ auth: "api-key",
8
+ apiKey: "${OPENAI_API_KEY}",
9
+ models: [
10
+ {
11
+ id: "gpt-4o",
12
+ name: "GPT-4o",
13
+ api: "openai-completions",
14
+ reasoning: false,
15
+ input: ["text", "image"],
16
+ cost: { input: 2.5, output: 10, cacheRead: 1.25, cacheWrite: 2.5 },
17
+ contextWindow: 128000,
18
+ maxTokens: 16384,
19
+ },
20
+ {
21
+ id: "gpt-4o-mini",
22
+ name: "GPT-4o Mini",
23
+ api: "openai-completions",
24
+ reasoning: false,
25
+ input: ["text", "image"],
26
+ cost: { input: 0.15, output: 0.6, cacheRead: 0.075, cacheWrite: 0.15 },
27
+ contextWindow: 128000,
28
+ maxTokens: 16384,
29
+ },
30
+ ],
31
+ },
32
+ anthropic: {
33
+ baseUrl: "https://api.anthropic.com/v1/messages",
34
+ api: "anthropic-messages",
35
+ auth: "api-key",
36
+ apiKey: "${ANTHROPIC_API_KEY}",
37
+ models: [
38
+ {
39
+ id: "claude-3-5-sonnet-latest",
40
+ name: "Claude 3.5 Sonnet",
41
+ api: "anthropic-messages",
42
+ reasoning: false,
43
+ input: ["text", "image"],
44
+ cost: { input: 3.0, output: 15.0, cacheRead: 0.3, cacheWrite: 3.75 },
45
+ contextWindow: 200000,
46
+ maxTokens: 8192,
47
+ },
48
+ {
49
+ id: "claude-3-5-haiku-latest",
50
+ name: "Claude 3.5 Haiku",
51
+ api: "anthropic-messages",
52
+ reasoning: false,
53
+ input: ["text", "image"],
54
+ cost: { input: 0.8, output: 4.0, cacheRead: 0.08, cacheWrite: 1.0 },
55
+ contextWindow: 200000,
56
+ maxTokens: 8192,
57
+ },
58
+ ],
59
+ },
60
+ google: {
61
+ baseUrl: "https://generativelanguage.googleapis.com/v1beta/openai",
62
+ api: "openai-completions",
63
+ auth: "api-key",
64
+ apiKey: "${GOOGLE_API_KEY}",
65
+ models: [
66
+ {
67
+ id: "gemini-2.5-pro",
68
+ name: "Gemini 2.5 Pro",
69
+ api: "openai-completions",
70
+ reasoning: false,
71
+ input: ["text", "image"],
72
+ cost: { input: 2.0, output: 8.0, cacheRead: 0.5, cacheWrite: 2.0 },
73
+ contextWindow: 2000000,
74
+ maxTokens: 8192,
75
+ },
76
+ {
77
+ id: "gemini-2.5-flash",
78
+ name: "Gemini 2.5 Flash",
79
+ api: "openai-completions",
80
+ reasoning: false,
81
+ input: ["text", "image"],
82
+ cost: { input: 0.15, output: 0.6, cacheRead: 0.0375, cacheWrite: 0.15 },
83
+ contextWindow: 1000000,
84
+ maxTokens: 8192,
85
+ },
86
+ ],
87
+ },
88
+ xai: {
89
+ baseUrl: "https://api.x.ai/v1",
90
+ api: "openai-completions",
91
+ auth: "api-key",
92
+ apiKey: "${XAI_API_KEY}",
93
+ models: [
94
+ {
95
+ id: "grok-2-latest",
96
+ name: "Grok 2",
97
+ api: "openai-completions",
98
+ reasoning: false,
99
+ input: ["text", "image"],
100
+ cost: { input: 2.0, output: 10.0, cacheRead: 1.0, cacheWrite: 2.0 },
101
+ contextWindow: 131072,
102
+ maxTokens: 32768,
103
+ },
104
+ ],
105
+ },
106
+ deepseek: {
107
+ baseUrl: "https://api.deepseek.com/v1",
108
+ api: "openai-completions",
109
+ auth: "api-key",
110
+ apiKey: "${DEEPSEEK_API_KEY}",
111
+ models: [
112
+ {
113
+ id: "deepseek-chat",
114
+ name: "DeepSeek V3",
115
+ api: "openai-completions",
116
+ reasoning: false,
117
+ input: ["text"],
118
+ cost: { input: 0.14, output: 0.28, cacheRead: 0.014, cacheWrite: 0.14 },
119
+ contextWindow: 65536,
120
+ maxTokens: 8192,
121
+ },
122
+ {
123
+ id: "deepseek-reasoner",
124
+ name: "DeepSeek R1",
125
+ api: "openai-completions",
126
+ reasoning: true,
127
+ input: ["text"],
128
+ cost: { input: 0.55, output: 2.19, cacheRead: 0.14, cacheWrite: 0.55 },
129
+ contextWindow: 65536,
130
+ maxTokens: 8192,
131
+ },
132
+ ],
133
+ },
134
+ groq: {
135
+ baseUrl: "https://api.groq.com/openai/v1",
136
+ api: "openai-completions",
137
+ auth: "api-key",
138
+ apiKey: "${GROQ_API_KEY}",
139
+ models: [
140
+ {
141
+ id: "llama3-70b-8192",
142
+ name: "LLaMA3 70B (Groq)",
143
+ api: "openai-completions",
144
+ reasoning: false,
145
+ input: ["text"],
146
+ cost: { input: 0.59, output: 0.79 },
147
+ contextWindow: 8192,
148
+ maxTokens: 8192,
149
+ },
150
+ ],
151
+ },
152
+ openrouter: {
153
+ baseUrl: "https://openrouter.ai/api/v1",
154
+ api: "openai-completions",
155
+ auth: "api-key",
156
+ apiKey: "${OPENROUTER_API_KEY}",
157
+ models: [
158
+ {
159
+ id: "anthropic/claude-3.5-sonnet",
160
+ name: "Claude 3.5 Sonnet (OpenRouter)",
161
+ api: "openai-completions",
162
+ reasoning: false,
163
+ input: ["text", "image"],
164
+ cost: { input: 3.0, output: 15.0 },
165
+ contextWindow: 200000,
166
+ maxTokens: 8192,
167
+ },
168
+ ],
169
+ },
170
+ mistral: {
171
+ baseUrl: "https://api.mistral.ai/v1",
172
+ api: "openai-completions",
173
+ auth: "api-key",
174
+ apiKey: "${MISTRAL_API_KEY}",
175
+ models: [
176
+ {
177
+ id: "mistral-large-latest",
178
+ name: "Mistral Large",
179
+ api: "openai-completions",
180
+ reasoning: false,
181
+ input: ["text"],
182
+ cost: { input: 2.0, output: 6.0 },
183
+ contextWindow: 131000,
184
+ maxTokens: 8192,
185
+ },
186
+ ],
187
+ },
188
+ together: {
189
+ baseUrl: "https://api.together.xyz/v1",
190
+ api: "openai-completions",
191
+ auth: "api-key",
192
+ apiKey: "${TOGETHER_API_KEY}",
193
+ models: [
194
+ {
195
+ id: "meta-llama/Llama-3.3-70B-Instruct-Turbo",
196
+ name: "LLaMA 3.3 70B (Together)",
197
+ api: "openai-completions",
198
+ reasoning: false,
199
+ input: ["text"],
200
+ cost: { input: 0.88, output: 0.88 },
201
+ contextWindow: 131072,
202
+ maxTokens: 4096,
203
+ },
204
+ ],
205
+ },
206
+ ollama: {
207
+ baseUrl: "http://host.docker.internal:11434/v1",
208
+ api: "openai-completions",
209
+ auth: "none",
210
+ models: [
211
+ {
212
+ id: "llama3:latest",
213
+ name: "LLaMA 3 (Local)",
214
+ api: "openai-completions",
215
+ reasoning: false,
216
+ input: ["text"],
217
+ cost: { input: 0, output: 0 },
218
+ contextWindow: 8192,
219
+ maxTokens: 4096,
220
+ },
221
+ {
222
+ id: "deepseek-r1:latest",
223
+ name: "DeepSeek R1 (Local)",
224
+ api: "openai-completions",
225
+ reasoning: true,
226
+ input: ["text"],
227
+ cost: { input: 0, output: 0 },
228
+ contextWindow: 8192,
229
+ maxTokens: 4096,
230
+ },
231
+ ],
232
+ },
233
+ lmstudio: {
234
+ baseUrl: "http://host.docker.internal:1234/v1",
235
+ api: "openai-completions",
236
+ auth: "none",
237
+ models: [
238
+ {
239
+ id: "local-model",
240
+ name: "LM Studio Model",
241
+ api: "openai-completions",
242
+ reasoning: false,
243
+ input: ["text"],
244
+ cost: { input: 0, output: 0 },
245
+ contextWindow: 8192,
246
+ maxTokens: 4096,
247
+ },
248
+ ],
249
+ },
250
+ vllm: {
251
+ baseUrl: "http://host.docker.internal:8000/v1",
252
+ api: "openai-completions",
253
+ auth: "none",
254
+ models: [
255
+ {
256
+ id: "local-model",
257
+ name: "vLLM Model",
258
+ api: "openai-completions",
259
+ reasoning: false,
260
+ input: ["text"],
261
+ cost: { input: 0, output: 0 },
262
+ contextWindow: 8192,
263
+ maxTokens: 4096,
264
+ },
265
+ ],
266
+ },
267
+ };
268
+
269
+ /**
270
+ * Generates a default `openclaw/config/openclaw.json` tailored
271
+ * to the services installed in the stack.
272
+ */
273
+ export function generateOpenClawConfig(resolved: ResolverOutput): string {
274
+ const defaultSkills: Record<string, { enabled: boolean }> = {};
275
+
276
+ // Auto-enable any OpenClaw skills attached to installed companion services
277
+ for (const { definition } of resolved.services) {
278
+ for (const skill of definition.skills) {
279
+ if (skill.autoInstall) {
280
+ defaultSkills[skill.skillId] = { enabled: true };
281
+ }
282
+ }
283
+ }
284
+
285
+ const providers: Record<string, any> = {};
286
+ const agentsModels: Record<string, { alias: string }> = {};
287
+ let primaryModel = "";
288
+
289
+ // Always default to empty or the first choice, fallback to openai if nothing was passed
290
+ const selectedProviders =
291
+ resolved.aiProviders && resolved.aiProviders.length > 0
292
+ ? resolved.aiProviders
293
+ : (["openai"] as AiProvider[]);
294
+
295
+ for (const provider of selectedProviders) {
296
+ const meta = PROVIDER_CONFIGS[provider];
297
+ if (!meta) continue;
298
+
299
+ providers[provider] = {
300
+ baseUrl: meta.baseUrl,
301
+ api: meta.api,
302
+ auth: meta.auth,
303
+ ...(meta.apiKey ? { apiKey: meta.apiKey } : {}),
304
+ models: meta.models,
305
+ };
306
+
307
+ for (const m of meta.models) {
308
+ const fullId = `${provider}/${m.id}`;
309
+ agentsModels[fullId] = { alias: m.name };
310
+ if (!primaryModel) primaryModel = fullId; // Use the very first model mapped as the global system default
311
+ }
312
+ }
313
+
314
+ const authProfiles: Record<string, any> = {
315
+ "local:default": {
316
+ provider: "local",
317
+ mode: "token",
318
+ },
319
+ };
320
+
321
+ // Add provider auth profiles too
322
+ for (const provider of Object.keys(providers)) {
323
+ authProfiles[`${provider}:default`] = {
324
+ provider: provider,
325
+ mode: "api_key",
326
+ };
327
+ }
328
+
329
+ const config = {
330
+ wizard: {
331
+ lastRunAt: new Date().toISOString(),
332
+ lastRunVersion: "2026.2.23",
333
+ lastRunCommand: "auto-generated-by-better-openclaw",
334
+ lastRunMode: "local",
335
+ },
336
+ auth: {
337
+ profiles: authProfiles,
338
+ },
339
+ models: {
340
+ mode: "merge",
341
+ providers,
342
+ },
343
+ agents: {
344
+ defaults: {
345
+ model: {
346
+ primary: primaryModel,
347
+ },
348
+ models: agentsModels,
349
+ workspace: "/home/node/.openclaw/workspace",
350
+ compaction: { mode: "safeguard" },
351
+ maxConcurrent: 4,
352
+ subagents: { maxConcurrent: 8 },
353
+ },
354
+ },
355
+ messages: {
356
+ ackReactionScope: "group-mentions",
357
+ },
358
+ commands: {
359
+ native: "auto",
360
+ nativeSkills: "auto",
361
+ },
362
+ hooks: {
363
+ internal: {
364
+ enabled: true,
365
+ entries: {
366
+ "boot-md": { enabled: true },
367
+ "bootstrap-extra-files": { enabled: true },
368
+ "command-logger": { enabled: true },
369
+ "session-memory": { enabled: true },
370
+ },
371
+ },
372
+ },
373
+ channels: {},
374
+ gateway: {
375
+ port: 18791,
376
+ mode: "local",
377
+ bind: "loopback",
378
+ auth: {
379
+ mode: "token",
380
+ token: "${OPENCLAW_GATEWAY_TOKEN}",
381
+ },
382
+ tailscale: {
383
+ mode: "serve",
384
+ resetOnExit: true,
385
+ },
386
+ nodes: {
387
+ denyCommands: ["camera.snap", "camera.clip", "screen.record"],
388
+ },
389
+ },
390
+ skills: {
391
+ install: { nodeManager: "pnpm" },
392
+ ...(Object.keys(defaultSkills).length > 0 ? { entries: defaultSkills } : {}),
393
+ },
394
+ plugins: {
395
+ entries: {
396
+ "memory-core": { enabled: true },
397
+ },
398
+ },
399
+ meta: {
400
+ lastTouchedVersion: "2026.2.23",
401
+ lastTouchedAt: new Date().toISOString(),
402
+ },
403
+ };
404
+
405
+ return JSON.stringify(config, null, 2);
406
+ }
package/src/index.ts CHANGED
@@ -83,6 +83,7 @@ export {
83
83
  // ─── Types ──────────────────────────────────────────────────────────────────
84
84
  export type {
85
85
  AddedDependency,
86
+ AiProvider,
86
87
  ApiError,
87
88
  CategoryInfo,
88
89
  ComposeOptions,
@@ -94,6 +95,7 @@ export type {
94
95
  GenerationInput,
95
96
  GenerationMetadata,
96
97
  GenerationResult,
98
+ GsdRuntime,
97
99
  HealthCheck,
98
100
  Maturity,
99
101
  NativePlatform,
package/src/resolver.ts CHANGED
@@ -241,14 +241,16 @@ export function resolve(input: ResolverInput): ResolverOutput {
241
241
  const isValid = errors.length === 0;
242
242
 
243
243
  return {
244
- services,
245
- addedDependencies,
246
- removedConflicts: [],
247
- warnings,
248
- errors,
249
- isValid,
250
- estimatedMemoryMB,
251
- };
244
+ services,
245
+ addedDependencies,
246
+ removedConflicts: [],
247
+ warnings,
248
+ errors,
249
+ isValid,
250
+ estimatedMemoryMB,
251
+ aiProviders: input.aiProviders ?? [],
252
+ gsdRuntimes: []
253
+ };
252
254
  }
253
255
 
254
256
  /**
package/src/schema.ts CHANGED
@@ -22,6 +22,7 @@ export const ServiceCategorySchema = z.enum([
22
22
  "knowledge",
23
23
  "desktop",
24
24
  "streaming",
25
+ "security",
25
26
  ]);
26
27
 
27
28
  export const MaturitySchema = z.enum(["stable", "beta", "experimental"]);
@@ -47,6 +48,23 @@ export const DeploymentTargetSchema = z.enum(["local", "vps", "homelab", "clawex
47
48
 
48
49
  export const OutputFormatSchema = z.enum(["directory", "tar", "zip"]);
49
50
 
51
+ export const AiProviderSchema = z.enum([
52
+ "openai",
53
+ "anthropic",
54
+ "google",
55
+ "xai",
56
+ "deepseek",
57
+ "groq",
58
+ "openrouter",
59
+ "mistral",
60
+ "together",
61
+ "ollama",
62
+ "lmstudio",
63
+ "vllm",
64
+ ]);
65
+
66
+ export const GsdRuntimeSchema = z.enum(["claude", "opencode", "gemini", "codex"]);
67
+
50
68
  // ─── Sub-Schemas ────────────────────────────────────────────────────────────
51
69
 
52
70
  export const PortMappingSchema = z.object({
@@ -212,6 +230,8 @@ export const GenerationInputSchema = z.object({
212
230
  }),
213
231
  services: z.array(z.string()).default([]),
214
232
  skillPacks: z.array(z.string()).default([]),
233
+ aiProviders: z.array(AiProviderSchema).default([]),
234
+ gsdRuntimes: z.array(GsdRuntimeSchema).default([]),
215
235
  proxy: ProxyTypeSchema.default("none"),
216
236
  domain: z.string().optional(),
217
237
  gpu: z.boolean().default(false),
@@ -253,6 +273,8 @@ export const ResolverOutputSchema = z.object({
253
273
  errors: z.array(ErrorSchema),
254
274
  isValid: z.boolean(),
255
275
  estimatedMemoryMB: z.number().int().min(0),
276
+ aiProviders: z.array(AiProviderSchema).default([]),
277
+ gsdRuntimes: z.array(GsdRuntimeSchema).default([]),
256
278
  });
257
279
 
258
280
  // ─── Compose Options ────────────────────────────────────────────────────────
@@ -274,6 +296,8 @@ export const ComposeOptionsSchema = z.object({
274
296
  export const ValidateRequestSchema = z.object({
275
297
  services: z.array(z.string()),
276
298
  skillPacks: z.array(z.string()).default([]),
299
+ aiProviders: z.array(AiProviderSchema).default([]),
300
+ gsdRuntimes: z.array(GsdRuntimeSchema).default([]),
277
301
  proxy: ProxyTypeSchema.default("none"),
278
302
  domain: z.string().optional(),
279
303
  gpu: z.boolean().default(false),
@@ -0,0 +1,40 @@
1
+ import type { ServiceDefinition } from "../../types.js";
2
+
3
+ export const hexstrikeDefinition: ServiceDefinition = {
4
+ id: "hexstrike",
5
+ name: "HexStrike AI",
6
+ description: "AI-Powered MCP Cybersecurity Automation Platform with 150+ pentesting tools.",
7
+ category: "security",
8
+ icon: "⚔️",
9
+
10
+ image: "ghcr.io/0x4m4/hexstrike-ai",
11
+ imageTag: "latest",
12
+ ports: [
13
+ {
14
+ host: 8888,
15
+ container: 8888,
16
+ description: "HexStrike MCP Server",
17
+ exposed: true,
18
+ },
19
+ ],
20
+ volumes: [],
21
+ environment: [],
22
+ command: "mcp", // Instructs standard Python/Docker runtime to serve the MCP endpoint
23
+ dependsOn: [],
24
+ restartPolicy: "unless-stopped",
25
+ networks: ["openclaw-network"],
26
+
27
+ skills: [{ skillId: "hexstrike-mcp", autoInstall: true }],
28
+ openclawEnvVars: [],
29
+
30
+ docsUrl: "https://github.com/0x4m4/hexstrike-ai",
31
+ tags: ["security", "pentesting", "mcp", "agent"],
32
+ maturity: "experimental",
33
+
34
+ requires: [],
35
+ recommends: [],
36
+ conflictsWith: [],
37
+
38
+ minMemoryMB: 2048,
39
+ gpuRequired: false,
40
+ };
@@ -23,6 +23,7 @@ export { geminiCliDefinition } from "./gemini-cli.js";
23
23
  export { giteaDefinition } from "./gitea.js";
24
24
  export { gotifyDefinition } from "./gotify.js";
25
25
  export { grafanaDefinition } from "./grafana.js";
26
+ export { hexstrikeDefinition } from "./hexstrike.js";
26
27
  export { kimiDefinition } from "./kimi.js";
27
28
  export { lasuiteMeetAgentsDefinition } from "./lasuite-meet-agents.js";
28
29
  export { lasuiteMeetBackendDefinition } from "./lasuite-meet-backend.js";
@@ -49,6 +50,8 @@ export { opencodeDefinition } from "./opencode.js";
49
50
  export { openpanelDefinition } from "./openpanel.js";
50
51
  export { outlineDefinition } from "./outline.js";
51
52
  export { paperlessNgxDefinition } from "./paperless-ngx.js";
53
+ export { pentagiDefinition } from "./pentagi.js";
54
+ export { pentestagentDefinition } from "./pentestagent.js";
52
55
  export { playwrightServerDefinition } from "./playwright-server.js";
53
56
  export { portainerDefinition } from "./portainer.js";
54
57
  export { postgresqlDefinition } from "./postgresql.js";
@@ -58,7 +61,9 @@ export { qdrantDefinition } from "./qdrant.js";
58
61
  export { redisDefinition } from "./redis.js";
59
62
  export { remotionDefinition } from "./remotion.js";
60
63
  export { rocketchatDefinition } from "./rocketchat.js";
64
+ export { scraplingDefinition } from "./scrapling.js";
61
65
  export { searxngDefinition } from "./searxng.js";
66
+ export { solidityGuardDefinition } from "./solidityguard.js";
62
67
  export { stableDiffusionDefinition } from "./stable-diffusion.js";
63
68
  export { steelBrowserDefinition } from "./steel-browser.js";
64
69
  export { streamGatewayDefinition } from "./stream-gateway.js";
@@ -100,6 +105,7 @@ import { geminiCliDefinition } from "./gemini-cli.js";
100
105
  import { giteaDefinition } from "./gitea.js";
101
106
  import { gotifyDefinition } from "./gotify.js";
102
107
  import { grafanaDefinition } from "./grafana.js";
108
+ import { hexstrikeDefinition } from "./hexstrike.js";
103
109
  import { kimiDefinition } from "./kimi.js";
104
110
  import { lasuiteMeetAgentsDefinition } from "./lasuite-meet-agents.js";
105
111
  import { lasuiteMeetBackendDefinition } from "./lasuite-meet-backend.js";
@@ -126,6 +132,8 @@ import { opencodeDefinition } from "./opencode.js";
126
132
  import { openpanelDefinition } from "./openpanel.js";
127
133
  import { outlineDefinition } from "./outline.js";
128
134
  import { paperlessNgxDefinition } from "./paperless-ngx.js";
135
+ import { pentagiDefinition } from "./pentagi.js";
136
+ import { pentestagentDefinition } from "./pentestagent.js";
129
137
  import { playwrightServerDefinition } from "./playwright-server.js";
130
138
  import { portainerDefinition } from "./portainer.js";
131
139
  import { postgresqlDefinition } from "./postgresql.js";
@@ -135,7 +143,9 @@ import { qdrantDefinition } from "./qdrant.js";
135
143
  import { redisDefinition } from "./redis.js";
136
144
  import { remotionDefinition } from "./remotion.js";
137
145
  import { rocketchatDefinition } from "./rocketchat.js";
146
+ import { scraplingDefinition } from "./scrapling.js";
138
147
  import { searxngDefinition } from "./searxng.js";
148
+ import { solidityGuardDefinition } from "./solidityguard.js";
139
149
  import { stableDiffusionDefinition } from "./stable-diffusion.js";
140
150
  import { steelBrowserDefinition } from "./steel-browser.js";
141
151
  import { streamGatewayDefinition } from "./stream-gateway.js";
@@ -227,4 +237,9 @@ export const allServiceDefinitions: ServiceDefinition[] = [
227
237
  neo4jDefinition,
228
238
  calComDefinition,
229
239
  xyopsDefinition,
240
+ scraplingDefinition,
241
+ hexstrikeDefinition,
242
+ solidityGuardDefinition,
243
+ pentagiDefinition,
244
+ pentestagentDefinition,
230
245
  ];
@@ -0,0 +1,41 @@
1
+ import type { ServiceDefinition } from "../../types.js";
2
+
3
+ export const pentagiDefinition: ServiceDefinition = {
4
+ id: "pentagi",
5
+ name: "PentAGI",
6
+ description:
7
+ "Fully autonomous AI Agents system capable of performing complex penetration testing tasks.",
8
+ category: "security",
9
+ icon: "🕵️",
10
+
11
+ image: "vxcontrol/pentagi",
12
+ imageTag: "latest",
13
+ ports: [
14
+ {
15
+ host: 8080, // Assuming default or common port for web UI, might need adjustment based on their docker-compose
16
+ container: 8080,
17
+ description: "PentAGI Interface",
18
+ exposed: true,
19
+ },
20
+ ],
21
+ volumes: [],
22
+ environment: [],
23
+ command: "", // Leave empty to use default image command
24
+ dependsOn: [],
25
+ restartPolicy: "unless-stopped",
26
+ networks: ["openclaw-network"],
27
+
28
+ skills: [{ skillId: "pentagi-orchestrator", autoInstall: true }],
29
+ openclawEnvVars: [],
30
+
31
+ docsUrl: "https://pentagi.com",
32
+ tags: ["security", "pentesting", "autonomous", "agents"],
33
+ maturity: "experimental",
34
+
35
+ requires: [],
36
+ recommends: [],
37
+ conflictsWith: [],
38
+
39
+ minMemoryMB: 4096, // Documentation explicitly asks for Minimum 4GB RAM
40
+ gpuRequired: false,
41
+ };
@@ -0,0 +1,34 @@
1
+ import type { ServiceDefinition } from "../../types.js";
2
+
3
+ export const pentestagentDefinition: ServiceDefinition = {
4
+ id: "pentestagent",
5
+ name: "PentestAgent",
6
+ description:
7
+ "AI agent framework for black-box security testing via internal Docker isolated environments.",
8
+ category: "security",
9
+ icon: "🔍",
10
+
11
+ image: "ghcr.io/gh05tcrew/pentestagent",
12
+ imageTag: "latest",
13
+ ports: [], // Typically an internal CLI/TUI
14
+ volumes: [],
15
+ environment: [],
16
+ command: "tail -f /dev/null", // Keeps container alive for executing interactive TUIs
17
+ dependsOn: [],
18
+ restartPolicy: "unless-stopped",
19
+ networks: ["openclaw-network"],
20
+
21
+ skills: [{ skillId: "pentestagent-runner", autoInstall: true }],
22
+ openclawEnvVars: [],
23
+
24
+ docsUrl: "https://github.com/GH05TCREW/pentestagent",
25
+ tags: ["security", "pentesting", "tui", "framework"],
26
+ maturity: "experimental",
27
+
28
+ requires: [],
29
+ recommends: [],
30
+ conflictsWith: [],
31
+
32
+ minMemoryMB: 1024,
33
+ gpuRequired: false,
34
+ };