@better-openclaw/core 1.0.25 → 1.0.26
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/dist/addon-stack.cjs +55 -3
- package/dist/addon-stack.cjs.map +1 -1
- package/dist/addon-stack.d.cts.map +1 -1
- package/dist/addon-stack.d.mts.map +1 -1
- package/dist/addon-stack.mjs +54 -2
- package/dist/addon-stack.mjs.map +1 -1
- package/dist/addon-stack.test.cjs +113 -1
- package/dist/addon-stack.test.cjs.map +1 -1
- package/dist/addon-stack.test.mjs +112 -0
- package/dist/addon-stack.test.mjs.map +1 -1
- package/dist/compose-validation.test.cjs +1 -1
- package/dist/composer.cjs +1 -1
- package/dist/composer.test.cjs +1 -1
- package/dist/deployers/strip-host-ports.cjs +1 -1
- package/dist/generate.cjs +1 -1
- package/dist/generate.test.cjs +1 -1
- package/dist/generators/env.cjs +1 -1
- package/dist/generators/postgres-init.cjs +5 -0
- package/dist/generators/postgres-init.cjs.map +1 -1
- package/dist/generators/postgres-init.d.cts.map +1 -1
- package/dist/generators/postgres-init.d.mts.map +1 -1
- package/dist/generators/postgres-init.mjs +5 -0
- package/dist/generators/postgres-init.mjs.map +1 -1
- package/dist/generators/skills.cjs +1 -1
- package/dist/generators/skills.d.cts.map +1 -1
- package/dist/generators/skills.d.mts.map +1 -1
- package/dist/generators/skills.mjs +141 -0
- package/dist/generators/skills.mjs.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/presets/presets.test.cjs +1 -1
- package/dist/{schema-CKBRu-Rt.d.cts → schema-BQnZrcw8.d.cts} +6 -1
- package/dist/{schema-CKBRu-Rt.d.cts.map → schema-BQnZrcw8.d.cts.map} +1 -1
- package/dist/{schema-Dn-_Jpb6.d.mts → schema-SBpL0bdI.d.mts} +6 -1
- package/dist/{schema-Dn-_Jpb6.d.mts.map → schema-SBpL0bdI.d.mts.map} +1 -1
- package/dist/schema.cjs +11 -2
- package/dist/schema.cjs.map +1 -1
- package/dist/schema.d.cts +1 -1
- package/dist/schema.d.mts +1 -1
- package/dist/schema.mjs +10 -1
- package/dist/schema.mjs.map +1 -1
- package/dist/services/definitions/burnlink.cjs +142 -0
- package/dist/services/definitions/burnlink.cjs.map +1 -0
- package/dist/services/definitions/burnlink.d.cts +7 -0
- package/dist/services/definitions/burnlink.d.cts.map +1 -0
- package/dist/services/definitions/burnlink.d.mts +7 -0
- package/dist/services/definitions/burnlink.d.mts.map +1 -0
- package/dist/services/definitions/burnlink.mjs +141 -0
- package/dist/services/definitions/burnlink.mjs.map +1 -0
- package/dist/services/definitions/hindsight.cjs +130 -0
- package/dist/services/definitions/hindsight.cjs.map +1 -0
- package/dist/services/definitions/hindsight.d.cts +7 -0
- package/dist/services/definitions/hindsight.d.cts.map +1 -0
- package/dist/services/definitions/hindsight.d.mts +7 -0
- package/dist/services/definitions/hindsight.d.mts.map +1 -0
- package/dist/services/definitions/hindsight.mjs +129 -0
- package/dist/services/definitions/hindsight.mjs.map +1 -0
- package/dist/services/definitions/index.cjs +9 -0
- package/dist/services/definitions/index.cjs.map +1 -1
- package/dist/services/definitions/index.d.cts +4 -1
- package/dist/services/definitions/index.d.cts.map +1 -1
- package/dist/services/definitions/index.d.mts +4 -1
- package/dist/services/definitions/index.d.mts.map +1 -1
- package/dist/services/definitions/index.mjs +7 -1
- package/dist/services/definitions/index.mjs.map +1 -1
- package/dist/services/definitions/opensandbox.cjs +149 -0
- package/dist/services/definitions/opensandbox.cjs.map +1 -0
- package/dist/services/definitions/opensandbox.d.cts +7 -0
- package/dist/services/definitions/opensandbox.d.cts.map +1 -0
- package/dist/services/definitions/opensandbox.d.mts +7 -0
- package/dist/services/definitions/opensandbox.d.mts.map +1 -0
- package/dist/services/definitions/opensandbox.mjs +148 -0
- package/dist/services/definitions/opensandbox.mjs.map +1 -0
- package/dist/{skills-BlzpHmpH.cjs → skills-BSF7iNa4.cjs} +142 -1
- package/dist/{skills-BlzpHmpH.cjs.map → skills-BSF7iNa4.cjs.map} +1 -1
- package/dist/types.d.cts +1 -1
- package/dist/types.d.mts +1 -1
- package/dist/validator.cjs +1 -1
- package/package.json +1 -1
- package/src/addon-stack.test.ts +158 -0
- package/src/addon-stack.ts +48 -0
- package/src/generators/postgres-init.ts +2 -0
- package/src/generators/skills.ts +142 -0
- package/src/schema.ts +7 -0
- package/src/services/definitions/burnlink.ts +142 -0
- package/src/services/definitions/hindsight.ts +131 -0
- package/src/services/definitions/index.ts +10 -0
- package/src/services/definitions/opensandbox.ts +156 -0
package/src/generators/skills.ts
CHANGED
|
@@ -535,6 +535,148 @@ curl -X POST http://{{STEEL_HOST}}:{{STEEL_PORT}}/v1/scrape \\
|
|
|
535
535
|
- Proxy support and IP rotation
|
|
536
536
|
- Auto CAPTCHA solving
|
|
537
537
|
- Puppeteer/Playwright/Selenium compatible
|
|
538
|
+
`,
|
|
539
|
+
|
|
540
|
+
"code-sandbox": `---
|
|
541
|
+
name: code-sandbox
|
|
542
|
+
description: "Execute code safely in an isolated OpenSandbox container"
|
|
543
|
+
metadata:
|
|
544
|
+
openclaw:
|
|
545
|
+
emoji: "📦"
|
|
546
|
+
---
|
|
547
|
+
|
|
548
|
+
# Code Sandbox
|
|
549
|
+
|
|
550
|
+
Execute code safely in an isolated OpenSandbox container.
|
|
551
|
+
|
|
552
|
+
## Description
|
|
553
|
+
|
|
554
|
+
This skill provides secure, containerized code execution for AI agents. Code runs in ephemeral Docker containers with resource limits, network isolation, and automatic cleanup.
|
|
555
|
+
|
|
556
|
+
## Connection Details
|
|
557
|
+
|
|
558
|
+
- **Host:** \`{{OPENSANDBOX_HOST}}\`
|
|
559
|
+
- **Port:** \`{{OPENSANDBOX_PORT}}\`
|
|
560
|
+
- **Auth:** API key (auto-configured)
|
|
561
|
+
|
|
562
|
+
## Supported Languages
|
|
563
|
+
|
|
564
|
+
- Python 3.12
|
|
565
|
+
- JavaScript / TypeScript (Node.js 22)
|
|
566
|
+
- Java 21
|
|
567
|
+
- Go 1.24
|
|
568
|
+
- Bash
|
|
569
|
+
|
|
570
|
+
## Available Actions
|
|
571
|
+
|
|
572
|
+
### execute_code
|
|
573
|
+
|
|
574
|
+
Run a code snippet in a fresh sandbox.
|
|
575
|
+
|
|
576
|
+
**Parameters:**
|
|
577
|
+
- \`language\` (required): Programming language ("python", "javascript", "typescript", "java", "go", "bash")
|
|
578
|
+
- \`code\` (required): The code to execute
|
|
579
|
+
- \`timeout_seconds\` (optional): Max execution time (default: 60, max: 300)
|
|
580
|
+
|
|
581
|
+
**Returns:** stdout, stderr, exit_code, execution_time_ms
|
|
582
|
+
|
|
583
|
+
### execute_shell
|
|
584
|
+
|
|
585
|
+
Run a shell command in an existing or new sandbox.
|
|
586
|
+
|
|
587
|
+
**Parameters:**
|
|
588
|
+
- \`command\` (required): Shell command to execute
|
|
589
|
+
- \`sandbox_id\` (optional): Reuse an existing sandbox (for multi-step workflows)
|
|
590
|
+
- \`background\` (optional): Run in background (default: false)
|
|
591
|
+
|
|
592
|
+
**Returns:** stdout, stderr, exit_code
|
|
593
|
+
|
|
594
|
+
### upload_file
|
|
595
|
+
|
|
596
|
+
Upload a file to a sandbox for processing.
|
|
597
|
+
|
|
598
|
+
**Parameters:**
|
|
599
|
+
- \`sandbox_id\` (required): Target sandbox
|
|
600
|
+
- \`path\` (required): Destination path inside sandbox
|
|
601
|
+
- \`content\` (required): File content (text or base64 for binary)
|
|
602
|
+
|
|
603
|
+
### download_file
|
|
604
|
+
|
|
605
|
+
Download a file from a sandbox.
|
|
606
|
+
|
|
607
|
+
**Parameters:**
|
|
608
|
+
- \`sandbox_id\` (required): Source sandbox
|
|
609
|
+
- \`path\` (required): File path inside sandbox
|
|
610
|
+
|
|
611
|
+
**Returns:** File content
|
|
612
|
+
|
|
613
|
+
### list_sandboxes
|
|
614
|
+
|
|
615
|
+
List active sandboxes on this instance.
|
|
616
|
+
|
|
617
|
+
**Returns:** Array of { id, status, image, created_at, expires_at }
|
|
618
|
+
|
|
619
|
+
### terminate_sandbox
|
|
620
|
+
|
|
621
|
+
Terminate a running sandbox immediately.
|
|
622
|
+
|
|
623
|
+
**Parameters:**
|
|
624
|
+
- \`sandbox_id\` (required): Sandbox to terminate
|
|
625
|
+
|
|
626
|
+
### create_desktop
|
|
627
|
+
|
|
628
|
+
Create a GUI desktop sandbox with VNC access (for Homespace live preview).
|
|
629
|
+
|
|
630
|
+
**Parameters:**
|
|
631
|
+
- \`image\` (optional): Desktop image (default: "opensandbox/desktop:latest", also: "opensandbox/chrome:latest", "opensandbox/vscode:latest")
|
|
632
|
+
- \`resolution\` (optional): Screen resolution (default: "1280x800x24")
|
|
633
|
+
|
|
634
|
+
**Returns:** sandbox_id, vnc_endpoint (port 5900), novnc_url (port 6080 WebSocket), devtools_url (port 9222, chrome only)
|
|
635
|
+
|
|
636
|
+
### get_preview_url
|
|
637
|
+
|
|
638
|
+
Get the browser-accessible noVNC URL for an existing desktop sandbox.
|
|
639
|
+
|
|
640
|
+
**Parameters:**
|
|
641
|
+
- \`sandbox_id\` (required): Desktop sandbox ID
|
|
642
|
+
|
|
643
|
+
**Returns:** novnc_url (embeddable in iframe), vnc_endpoint, status
|
|
644
|
+
|
|
645
|
+
## Examples
|
|
646
|
+
|
|
647
|
+
### Run Python code
|
|
648
|
+
|
|
649
|
+
\`\`\`bash
|
|
650
|
+
curl -X POST http://{{OPENSANDBOX_HOST}}:{{OPENSANDBOX_PORT}}/v1/sandboxes \\
|
|
651
|
+
-H "Authorization: Bearer $OPENSANDBOX_API_KEY" \\
|
|
652
|
+
-H "Content-Type: application/json" \\
|
|
653
|
+
-d '{"image": "opensandbox/code-interpreter:python"}'
|
|
654
|
+
\`\`\`
|
|
655
|
+
|
|
656
|
+
### Execute code in a sandbox
|
|
657
|
+
|
|
658
|
+
\`\`\`bash
|
|
659
|
+
curl -X POST http://{{OPENSANDBOX_HOST}}:{{OPENSANDBOX_PORT}}/v1/sandboxes/{id}/code \\
|
|
660
|
+
-H "Authorization: Bearer $OPENSANDBOX_API_KEY" \\
|
|
661
|
+
-H "Content-Type: application/json" \\
|
|
662
|
+
-d '{"language": "python", "code": "print(42 * 42)"}'
|
|
663
|
+
\`\`\`
|
|
664
|
+
|
|
665
|
+
## Configuration
|
|
666
|
+
|
|
667
|
+
- **Default timeout:** 60 seconds
|
|
668
|
+
- **Max concurrent sandboxes:** Determined by VPS RAM
|
|
669
|
+
- **Idle cleanup:** Sandboxes with no activity for 30 minutes are auto-terminated
|
|
670
|
+
- **Network:** Bridge mode (isolated from host services)
|
|
671
|
+
- **Security:** gVisor runtime, capability dropping, PID limits
|
|
672
|
+
|
|
673
|
+
## Limitations
|
|
674
|
+
|
|
675
|
+
- No persistent storage between sandbox sessions (ephemeral by design)
|
|
676
|
+
- No GPU access (CPU-only execution)
|
|
677
|
+
- No outbound network access by default (egress blocked)
|
|
678
|
+
- Max 512 PIDs per sandbox (fork bomb protection)
|
|
679
|
+
- Memory capped per sandbox (default 512MB)
|
|
538
680
|
`,
|
|
539
681
|
};
|
|
540
682
|
|
package/src/schema.ts
CHANGED
|
@@ -475,6 +475,8 @@ export const AddonStackResultSchema = z.object({
|
|
|
475
475
|
}),
|
|
476
476
|
/** Port mapping for reverse proxy configuration. */
|
|
477
477
|
proxyRoutes: z.array(ProxyRouteSchema),
|
|
478
|
+
/** Additional files to write alongside compose (e.g. sandbox.toml). Keyed by filename. */
|
|
479
|
+
additionalFiles: z.record(z.string(), z.string()).default({}),
|
|
478
480
|
/** Metadata. */
|
|
479
481
|
metadata: z.object({
|
|
480
482
|
serviceCount: z.number(),
|
|
@@ -484,6 +486,11 @@ export const AddonStackResultSchema = z.object({
|
|
|
484
486
|
skippedServices: z.array(SkippedServiceSchema),
|
|
485
487
|
generatedSecretKeys: z.array(z.string()),
|
|
486
488
|
portAssignments: z.record(z.string(), z.number()),
|
|
489
|
+
/** Docker images to pre-pull during cloud-init, grouped by priority. */
|
|
490
|
+
prePullImages: z.array(z.object({
|
|
491
|
+
image: z.string(),
|
|
492
|
+
priority: z.union([z.literal(1), z.literal(2), z.literal(3)]),
|
|
493
|
+
})).default([]),
|
|
487
494
|
}),
|
|
488
495
|
/** Warnings (non-fatal issues). */
|
|
489
496
|
warnings: z.array(z.string()),
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import type { ServiceDefinition } from "../../types.js";
|
|
2
|
+
|
|
3
|
+
export const burnlinkDefinition: ServiceDefinition = {
|
|
4
|
+
id: "burnlink",
|
|
5
|
+
name: "BurnLink",
|
|
6
|
+
description:
|
|
7
|
+
"Privacy-first, zero-knowledge file sharing with end-to-end browser-side AES-256-GCM encryption, one-time downloads, view-once mode, and brute-force protection.",
|
|
8
|
+
category: "storage",
|
|
9
|
+
icon: "🔥",
|
|
10
|
+
|
|
11
|
+
image: "diopisemou/burnlink",
|
|
12
|
+
imageTag: "latest",
|
|
13
|
+
ports: [
|
|
14
|
+
{
|
|
15
|
+
host: 3250,
|
|
16
|
+
container: 3000,
|
|
17
|
+
description: "BurnLink web interface",
|
|
18
|
+
exposed: true,
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
volumes: [],
|
|
22
|
+
environment: [
|
|
23
|
+
{
|
|
24
|
+
key: "PORT",
|
|
25
|
+
defaultValue: "3000",
|
|
26
|
+
secret: false,
|
|
27
|
+
description: "Server listen port",
|
|
28
|
+
required: false,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
key: "SUPABASE_URL",
|
|
32
|
+
defaultValue: "",
|
|
33
|
+
secret: false,
|
|
34
|
+
description: "Supabase project URL for metadata storage",
|
|
35
|
+
required: true,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
key: "SUPABASE_SERVICE_ROLE_KEY",
|
|
39
|
+
defaultValue: "",
|
|
40
|
+
secret: true,
|
|
41
|
+
description: "Supabase service role key",
|
|
42
|
+
required: true,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
key: "R2_ACCOUNT_ID",
|
|
46
|
+
defaultValue: "",
|
|
47
|
+
secret: false,
|
|
48
|
+
description: "Cloudflare R2 account ID (or MinIO endpoint for self-hosted)",
|
|
49
|
+
required: true,
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
key: "R2_ACCESS_KEY_ID",
|
|
53
|
+
defaultValue: "",
|
|
54
|
+
secret: true,
|
|
55
|
+
description: "S3-compatible storage access key",
|
|
56
|
+
required: true,
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
key: "R2_SECRET_ACCESS_KEY",
|
|
60
|
+
defaultValue: "",
|
|
61
|
+
secret: true,
|
|
62
|
+
description: "S3-compatible storage secret key",
|
|
63
|
+
required: true,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
key: "R2_BUCKET_NAME",
|
|
67
|
+
defaultValue: "burnlink",
|
|
68
|
+
secret: false,
|
|
69
|
+
description: "Storage bucket name for encrypted files",
|
|
70
|
+
required: true,
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
key: "CANONICAL_BASE_URL",
|
|
74
|
+
defaultValue: "",
|
|
75
|
+
secret: false,
|
|
76
|
+
description: "Public URL for share links (e.g., https://burn.example.com)",
|
|
77
|
+
required: false,
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
key: "MAX_UPLOAD_BYTES",
|
|
81
|
+
defaultValue: "1073741824",
|
|
82
|
+
secret: false,
|
|
83
|
+
description: "Max file upload size in bytes (default 1 GB)",
|
|
84
|
+
required: false,
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
key: "NODE_ENV",
|
|
88
|
+
defaultValue: "production",
|
|
89
|
+
secret: false,
|
|
90
|
+
description: "Node environment (production enables rate limiting)",
|
|
91
|
+
required: false,
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
healthcheck: {
|
|
95
|
+
test: "wget -q --spider http://localhost:3000/ || exit 1",
|
|
96
|
+
interval: "30s",
|
|
97
|
+
timeout: "10s",
|
|
98
|
+
retries: 3,
|
|
99
|
+
startPeriod: "15s",
|
|
100
|
+
},
|
|
101
|
+
dependsOn: [],
|
|
102
|
+
restartPolicy: "unless-stopped",
|
|
103
|
+
networks: ["openclaw-network"],
|
|
104
|
+
|
|
105
|
+
skills: [],
|
|
106
|
+
openclawEnvVars: [
|
|
107
|
+
{
|
|
108
|
+
key: "BURNLINK_HOST",
|
|
109
|
+
defaultValue: "burnlink",
|
|
110
|
+
secret: false,
|
|
111
|
+
description: "BurnLink hostname",
|
|
112
|
+
required: false,
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
key: "BURNLINK_PORT",
|
|
116
|
+
defaultValue: "3000",
|
|
117
|
+
secret: false,
|
|
118
|
+
description: "BurnLink internal port",
|
|
119
|
+
required: false,
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
|
|
123
|
+
docsUrl: "https://github.com/diopisemou/BurnLink",
|
|
124
|
+
tags: ["file-sharing", "encryption", "privacy", "zero-knowledge", "self-destruct"],
|
|
125
|
+
maturity: "beta",
|
|
126
|
+
|
|
127
|
+
requires: [],
|
|
128
|
+
recommends: ["supabase", "minio"],
|
|
129
|
+
conflictsWith: [],
|
|
130
|
+
|
|
131
|
+
minMemoryMB: 128,
|
|
132
|
+
gpuRequired: false,
|
|
133
|
+
capDropCompatible: true,
|
|
134
|
+
proxyPath: "/burnlink",
|
|
135
|
+
envQuirks: [
|
|
136
|
+
{
|
|
137
|
+
key: "R2_SECRET_ACCESS_KEY",
|
|
138
|
+
issue: "min_length" as const,
|
|
139
|
+
fix: { type: "generate_base64url" as const, minBytes: 24 },
|
|
140
|
+
},
|
|
141
|
+
],
|
|
142
|
+
};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import type { ServiceDefinition } from "../../types.js";
|
|
2
|
+
|
|
3
|
+
export const hindsightDefinition: ServiceDefinition = {
|
|
4
|
+
id: "hindsight",
|
|
5
|
+
name: "Hindsight",
|
|
6
|
+
description:
|
|
7
|
+
"Open-source agent memory system with Retain/Recall/Reflect operations, multi-strategy retrieval (semantic, keyword, graph, temporal), and MCP server support.",
|
|
8
|
+
category: "ai",
|
|
9
|
+
icon: "🧠",
|
|
10
|
+
|
|
11
|
+
image: "ghcr.io/vectorize-io/hindsight",
|
|
12
|
+
imageTag: "latest",
|
|
13
|
+
ports: [
|
|
14
|
+
{
|
|
15
|
+
host: 8889,
|
|
16
|
+
container: 8888,
|
|
17
|
+
description: "Hindsight API and MCP endpoint",
|
|
18
|
+
exposed: true,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
host: 9998,
|
|
22
|
+
container: 9999,
|
|
23
|
+
description: "Hindsight admin web UI",
|
|
24
|
+
exposed: true,
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
volumes: [
|
|
28
|
+
{
|
|
29
|
+
name: "hindsight-data",
|
|
30
|
+
containerPath: "/home/hindsight/.pg0",
|
|
31
|
+
description: "Embedded PostgreSQL data (used when no external DB configured)",
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
environment: [
|
|
35
|
+
{
|
|
36
|
+
key: "HINDSIGHT_API_LLM_PROVIDER",
|
|
37
|
+
defaultValue: "openai",
|
|
38
|
+
secret: false,
|
|
39
|
+
description: "LLM provider (openai, anthropic, gemini, groq, ollama, lmstudio)",
|
|
40
|
+
required: true,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
key: "HINDSIGHT_API_LLM_API_KEY",
|
|
44
|
+
defaultValue: "",
|
|
45
|
+
secret: true,
|
|
46
|
+
description: "API key for the configured LLM provider",
|
|
47
|
+
required: true,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
key: "HINDSIGHT_API_LLM_MODEL",
|
|
51
|
+
defaultValue: "o3-mini",
|
|
52
|
+
secret: false,
|
|
53
|
+
description: "LLM model to use for memory operations (e.g., o3-mini, claude-sonnet-4-20250514)",
|
|
54
|
+
required: true,
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
key: "HINDSIGHT_API_DATABASE_URL",
|
|
58
|
+
defaultValue: "postgresql://hindsight:${HINDSIGHT_DB_PASSWORD}@postgresql:5432/hindsight",
|
|
59
|
+
secret: false,
|
|
60
|
+
description: "PostgreSQL connection string (leave empty to use embedded pg0 for dev)",
|
|
61
|
+
required: false,
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
key: "HINDSIGHT_API_MCP_ENABLED",
|
|
65
|
+
defaultValue: "true",
|
|
66
|
+
secret: false,
|
|
67
|
+
description: "Enable MCP server for agent tool integration",
|
|
68
|
+
required: false,
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
key: "HINDSIGHT_API_SKIP_LLM_VERIFICATION",
|
|
72
|
+
defaultValue: "false",
|
|
73
|
+
secret: false,
|
|
74
|
+
description: "Skip LLM connection verification on startup",
|
|
75
|
+
required: false,
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
healthcheck: {
|
|
79
|
+
test: "wget -q --spider http://localhost:8888/metrics || exit 1",
|
|
80
|
+
interval: "30s",
|
|
81
|
+
timeout: "10s",
|
|
82
|
+
retries: 5,
|
|
83
|
+
startPeriod: "30s",
|
|
84
|
+
},
|
|
85
|
+
dependsOn: [],
|
|
86
|
+
restartPolicy: "unless-stopped",
|
|
87
|
+
networks: ["openclaw-network"],
|
|
88
|
+
|
|
89
|
+
skills: [],
|
|
90
|
+
openclawEnvVars: [
|
|
91
|
+
{
|
|
92
|
+
key: "HINDSIGHT_HOST",
|
|
93
|
+
defaultValue: "hindsight",
|
|
94
|
+
secret: false,
|
|
95
|
+
description: "Hindsight hostname for agent memory operations",
|
|
96
|
+
required: false,
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
key: "HINDSIGHT_API_PORT",
|
|
100
|
+
defaultValue: "8888",
|
|
101
|
+
secret: false,
|
|
102
|
+
description: "Hindsight API port",
|
|
103
|
+
required: false,
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
|
|
107
|
+
docsUrl: "https://hindsight.vectorize.io/",
|
|
108
|
+
tags: ["agent-memory", "mcp", "recall", "knowledge-graph", "semantic-search"],
|
|
109
|
+
maturity: "beta",
|
|
110
|
+
|
|
111
|
+
requires: ["postgresql"],
|
|
112
|
+
recommends: ["ollama"],
|
|
113
|
+
conflictsWith: [],
|
|
114
|
+
|
|
115
|
+
minMemoryMB: 512,
|
|
116
|
+
gpuRequired: false,
|
|
117
|
+
capDropCompatible: true,
|
|
118
|
+
proxyPath: "/hindsight",
|
|
119
|
+
envQuirks: [
|
|
120
|
+
{
|
|
121
|
+
key: "HINDSIGHT_API_LLM_API_KEY",
|
|
122
|
+
issue: "min_length" as const,
|
|
123
|
+
fix: { type: "generate_base64url" as const, minBytes: 16 },
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
key: "HINDSIGHT_API_DATABASE_URL",
|
|
127
|
+
issue: "must_sync" as const,
|
|
128
|
+
fix: { type: "sync_with" as const, syncKey: "HINDSIGHT_DB_PASSWORD" },
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
};
|
|
@@ -11,6 +11,7 @@ export { axolotlDefinition } from "./axolotl.js";
|
|
|
11
11
|
export { baserowDefinition } from "./baserow.js";
|
|
12
12
|
export { beszelDefinition } from "./beszel.js";
|
|
13
13
|
export { browserlessDefinition } from "./browserless.js";
|
|
14
|
+
export { burnlinkDefinition } from "./burnlink.js";
|
|
14
15
|
export { caddyDefinition } from "./caddy.js";
|
|
15
16
|
export { calComDefinition } from "./cal-com.js";
|
|
16
17
|
export { calibreWebDefinition } from "./calibre-web.js";
|
|
@@ -58,6 +59,7 @@ export { grafanaDefinition } from "./grafana.js";
|
|
|
58
59
|
export { graylogDefinition } from "./graylog.js";
|
|
59
60
|
export { headscaleDefinition } from "./headscale.js";
|
|
60
61
|
export { hedgedocDefinition } from "./hedgedoc.js";
|
|
62
|
+
export { hindsightDefinition } from "./hindsight.js";
|
|
61
63
|
export { hexstrikeDefinition } from "./hexstrike.js";
|
|
62
64
|
export { heyformDefinition } from "./heyform.js";
|
|
63
65
|
export { homeassistantDefinition } from "./homeassistant.js";
|
|
@@ -115,6 +117,7 @@ export { openWebuiDefinition } from "./open-webui.js";
|
|
|
115
117
|
export { opencodeDefinition } from "./opencode.js";
|
|
116
118
|
export { openhandsDefinition } from "./openhands.js";
|
|
117
119
|
export { openpanelDefinition } from "./openpanel.js";
|
|
120
|
+
export { opensandboxDefinition } from "./opensandbox.js";
|
|
118
121
|
export { opensearchDefinition } from "./opensearch.js";
|
|
119
122
|
export { outlineDefinition } from "./outline.js";
|
|
120
123
|
export { paperlessNgxDefinition } from "./paperless-ngx.js";
|
|
@@ -201,6 +204,7 @@ import { axolotlDefinition } from "./axolotl.js";
|
|
|
201
204
|
import { baserowDefinition } from "./baserow.js";
|
|
202
205
|
import { beszelDefinition } from "./beszel.js";
|
|
203
206
|
import { browserlessDefinition } from "./browserless.js";
|
|
207
|
+
import { burnlinkDefinition } from "./burnlink.js";
|
|
204
208
|
import { caddyDefinition } from "./caddy.js";
|
|
205
209
|
import { calComDefinition } from "./cal-com.js";
|
|
206
210
|
import { calibreWebDefinition } from "./calibre-web.js";
|
|
@@ -248,6 +252,7 @@ import { grafanaDefinition } from "./grafana.js";
|
|
|
248
252
|
import { graylogDefinition } from "./graylog.js";
|
|
249
253
|
import { headscaleDefinition } from "./headscale.js";
|
|
250
254
|
import { hedgedocDefinition } from "./hedgedoc.js";
|
|
255
|
+
import { hindsightDefinition } from "./hindsight.js";
|
|
251
256
|
import { hexstrikeDefinition } from "./hexstrike.js";
|
|
252
257
|
import { heyformDefinition } from "./heyform.js";
|
|
253
258
|
import { homeassistantDefinition } from "./homeassistant.js";
|
|
@@ -305,6 +310,7 @@ import { openWebuiDefinition } from "./open-webui.js";
|
|
|
305
310
|
import { opencodeDefinition } from "./opencode.js";
|
|
306
311
|
import { openhandsDefinition } from "./openhands.js";
|
|
307
312
|
import { openpanelDefinition } from "./openpanel.js";
|
|
313
|
+
import { opensandboxDefinition } from "./opensandbox.js";
|
|
308
314
|
import { opensearchDefinition } from "./opensearch.js";
|
|
309
315
|
import { outlineDefinition } from "./outline.js";
|
|
310
316
|
import { paperlessNgxDefinition } from "./paperless-ngx.js";
|
|
@@ -561,6 +567,10 @@ export const allServiceDefinitions: ServiceDefinition[] = [
|
|
|
561
567
|
vikunjaDefinition,
|
|
562
568
|
wireguardDefinition,
|
|
563
569
|
woodpeckerCiDefinition,
|
|
570
|
+
// ── New Integrations ────────────────────────────────────────────────────
|
|
571
|
+
hindsightDefinition,
|
|
572
|
+
burnlinkDefinition,
|
|
573
|
+
opensandboxDefinition,
|
|
564
574
|
// ── SaaS Boilerplates ────────────────────────────────────────────────────
|
|
565
575
|
openSaasDefinition,
|
|
566
576
|
apptensionSaasDefinition,
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import type { ServiceDefinition } from "../../types.js";
|
|
2
|
+
|
|
3
|
+
export const opensandboxDefinition: ServiceDefinition = {
|
|
4
|
+
id: "opensandbox",
|
|
5
|
+
name: "OpenSandbox",
|
|
6
|
+
description:
|
|
7
|
+
"Secure containerized code execution for AI agents. Multi-language sandboxes (Python, JS/TS, Java, Go, Bash) with file operations, resource limits, and network isolation.",
|
|
8
|
+
category: "dev-tools",
|
|
9
|
+
icon: "📦",
|
|
10
|
+
|
|
11
|
+
image: "opensandbox/server",
|
|
12
|
+
imageTag: "v1.0.6",
|
|
13
|
+
ports: [
|
|
14
|
+
{
|
|
15
|
+
host: 8080,
|
|
16
|
+
container: 8080,
|
|
17
|
+
description: "OpenSandbox Lifecycle API (FastAPI)",
|
|
18
|
+
exposed: true,
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
volumes: [
|
|
22
|
+
{
|
|
23
|
+
name: "/var/run/docker.sock",
|
|
24
|
+
containerPath: "/var/run/docker.sock",
|
|
25
|
+
description:
|
|
26
|
+
"Docker socket (required for managing sandbox containers)",
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: "./sandbox.toml",
|
|
30
|
+
containerPath: "/root/.sandbox.toml:ro",
|
|
31
|
+
description: "OpenSandbox configuration file (read-only bind mount)",
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
environment: [
|
|
35
|
+
{
|
|
36
|
+
key: "OPEN_SANDBOX_API_KEY",
|
|
37
|
+
defaultValue: "",
|
|
38
|
+
secret: true,
|
|
39
|
+
description:
|
|
40
|
+
"API key for OpenSandbox lifecycle API authentication (min 32 chars)",
|
|
41
|
+
required: true,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
key: "OPENSANDBOX_LOG_LEVEL",
|
|
45
|
+
defaultValue: "INFO",
|
|
46
|
+
secret: false,
|
|
47
|
+
description: "Log verbosity (DEBUG, INFO, WARNING, ERROR)",
|
|
48
|
+
required: false,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
key: "OPENSANDBOX_RUNTIME_TYPE",
|
|
52
|
+
defaultValue: "docker",
|
|
53
|
+
secret: false,
|
|
54
|
+
description: "Runtime backend (always docker for VPS deployments)",
|
|
55
|
+
required: false,
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
key: "OPENSANDBOX_EXECD_IMAGE",
|
|
59
|
+
defaultValue: "opensandbox/execd:v1.0.6",
|
|
60
|
+
secret: false,
|
|
61
|
+
description:
|
|
62
|
+
"Execution daemon image injected into sandbox containers",
|
|
63
|
+
required: false,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
key: "OPENSANDBOX_NETWORK_MODE",
|
|
67
|
+
defaultValue: "bridge",
|
|
68
|
+
secret: false,
|
|
69
|
+
description:
|
|
70
|
+
"Container networking mode (always bridge for isolation)",
|
|
71
|
+
required: false,
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
key: "OPENSANDBOX_PIDS_LIMIT",
|
|
75
|
+
defaultValue: "512",
|
|
76
|
+
secret: false,
|
|
77
|
+
description: "Max PIDs per sandbox (fork bomb protection)",
|
|
78
|
+
required: false,
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
key: "OPENSANDBOX_NO_NEW_PRIVILEGES",
|
|
82
|
+
defaultValue: "true",
|
|
83
|
+
secret: false,
|
|
84
|
+
description: "Security: prevent privilege escalation in sandboxes",
|
|
85
|
+
required: false,
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
key: "OPENSANDBOX_SECURE_RUNTIME",
|
|
89
|
+
defaultValue: "gvisor",
|
|
90
|
+
secret: false,
|
|
91
|
+
description: "Secure container runtime (gVisor for sandbox isolation)",
|
|
92
|
+
required: false,
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
healthcheck: {
|
|
96
|
+
test: "curl --fail http://localhost:8080/health || exit 1",
|
|
97
|
+
interval: "30s",
|
|
98
|
+
timeout: "10s",
|
|
99
|
+
retries: 3,
|
|
100
|
+
startPeriod: "15s",
|
|
101
|
+
},
|
|
102
|
+
dependsOn: [],
|
|
103
|
+
restartPolicy: "unless-stopped",
|
|
104
|
+
networks: ["openclaw-network"],
|
|
105
|
+
|
|
106
|
+
skills: [{ skillId: "code-sandbox", autoInstall: true }],
|
|
107
|
+
openclawEnvVars: [
|
|
108
|
+
{
|
|
109
|
+
key: "OPENSANDBOX_HOST",
|
|
110
|
+
defaultValue: "opensandbox",
|
|
111
|
+
secret: false,
|
|
112
|
+
description: "OpenSandbox hostname for OpenClaw",
|
|
113
|
+
required: true,
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
key: "OPENSANDBOX_PORT",
|
|
117
|
+
defaultValue: "8080",
|
|
118
|
+
secret: false,
|
|
119
|
+
description: "OpenSandbox port for OpenClaw",
|
|
120
|
+
required: true,
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
key: "OPENSANDBOX_API_KEY",
|
|
124
|
+
defaultValue: "${OPEN_SANDBOX_API_KEY}",
|
|
125
|
+
secret: true,
|
|
126
|
+
description: "OpenSandbox API key for OpenClaw",
|
|
127
|
+
required: true,
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
|
|
131
|
+
docsUrl: "https://github.com/anthropics/OpenSandbox",
|
|
132
|
+
tags: [
|
|
133
|
+
"sandbox",
|
|
134
|
+
"code-execution",
|
|
135
|
+
"security",
|
|
136
|
+
"ai-agent",
|
|
137
|
+
"isolation",
|
|
138
|
+
],
|
|
139
|
+
maturity: "stable",
|
|
140
|
+
|
|
141
|
+
requires: [],
|
|
142
|
+
recommends: [],
|
|
143
|
+
conflictsWith: [],
|
|
144
|
+
|
|
145
|
+
minMemoryMB: 768,
|
|
146
|
+
gpuRequired: false,
|
|
147
|
+
capDropCompatible: true,
|
|
148
|
+
proxyPath: "/sandbox",
|
|
149
|
+
envQuirks: [
|
|
150
|
+
{
|
|
151
|
+
key: "OPEN_SANDBOX_API_KEY",
|
|
152
|
+
issue: "min_length",
|
|
153
|
+
fix: { type: "generate_base64url", minBytes: 32 },
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
};
|