@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.
Files changed (89) hide show
  1. package/dist/addon-stack.cjs +55 -3
  2. package/dist/addon-stack.cjs.map +1 -1
  3. package/dist/addon-stack.d.cts.map +1 -1
  4. package/dist/addon-stack.d.mts.map +1 -1
  5. package/dist/addon-stack.mjs +54 -2
  6. package/dist/addon-stack.mjs.map +1 -1
  7. package/dist/addon-stack.test.cjs +113 -1
  8. package/dist/addon-stack.test.cjs.map +1 -1
  9. package/dist/addon-stack.test.mjs +112 -0
  10. package/dist/addon-stack.test.mjs.map +1 -1
  11. package/dist/compose-validation.test.cjs +1 -1
  12. package/dist/composer.cjs +1 -1
  13. package/dist/composer.test.cjs +1 -1
  14. package/dist/deployers/strip-host-ports.cjs +1 -1
  15. package/dist/generate.cjs +1 -1
  16. package/dist/generate.test.cjs +1 -1
  17. package/dist/generators/env.cjs +1 -1
  18. package/dist/generators/postgres-init.cjs +5 -0
  19. package/dist/generators/postgres-init.cjs.map +1 -1
  20. package/dist/generators/postgres-init.d.cts.map +1 -1
  21. package/dist/generators/postgres-init.d.mts.map +1 -1
  22. package/dist/generators/postgres-init.mjs +5 -0
  23. package/dist/generators/postgres-init.mjs.map +1 -1
  24. package/dist/generators/skills.cjs +1 -1
  25. package/dist/generators/skills.d.cts.map +1 -1
  26. package/dist/generators/skills.d.mts.map +1 -1
  27. package/dist/generators/skills.mjs +141 -0
  28. package/dist/generators/skills.mjs.map +1 -1
  29. package/dist/index.cjs +1 -1
  30. package/dist/index.d.cts +1 -1
  31. package/dist/index.d.mts +1 -1
  32. package/dist/presets/presets.test.cjs +1 -1
  33. package/dist/{schema-CKBRu-Rt.d.cts → schema-BQnZrcw8.d.cts} +6 -1
  34. package/dist/{schema-CKBRu-Rt.d.cts.map → schema-BQnZrcw8.d.cts.map} +1 -1
  35. package/dist/{schema-Dn-_Jpb6.d.mts → schema-SBpL0bdI.d.mts} +6 -1
  36. package/dist/{schema-Dn-_Jpb6.d.mts.map → schema-SBpL0bdI.d.mts.map} +1 -1
  37. package/dist/schema.cjs +11 -2
  38. package/dist/schema.cjs.map +1 -1
  39. package/dist/schema.d.cts +1 -1
  40. package/dist/schema.d.mts +1 -1
  41. package/dist/schema.mjs +10 -1
  42. package/dist/schema.mjs.map +1 -1
  43. package/dist/services/definitions/burnlink.cjs +142 -0
  44. package/dist/services/definitions/burnlink.cjs.map +1 -0
  45. package/dist/services/definitions/burnlink.d.cts +7 -0
  46. package/dist/services/definitions/burnlink.d.cts.map +1 -0
  47. package/dist/services/definitions/burnlink.d.mts +7 -0
  48. package/dist/services/definitions/burnlink.d.mts.map +1 -0
  49. package/dist/services/definitions/burnlink.mjs +141 -0
  50. package/dist/services/definitions/burnlink.mjs.map +1 -0
  51. package/dist/services/definitions/hindsight.cjs +130 -0
  52. package/dist/services/definitions/hindsight.cjs.map +1 -0
  53. package/dist/services/definitions/hindsight.d.cts +7 -0
  54. package/dist/services/definitions/hindsight.d.cts.map +1 -0
  55. package/dist/services/definitions/hindsight.d.mts +7 -0
  56. package/dist/services/definitions/hindsight.d.mts.map +1 -0
  57. package/dist/services/definitions/hindsight.mjs +129 -0
  58. package/dist/services/definitions/hindsight.mjs.map +1 -0
  59. package/dist/services/definitions/index.cjs +9 -0
  60. package/dist/services/definitions/index.cjs.map +1 -1
  61. package/dist/services/definitions/index.d.cts +4 -1
  62. package/dist/services/definitions/index.d.cts.map +1 -1
  63. package/dist/services/definitions/index.d.mts +4 -1
  64. package/dist/services/definitions/index.d.mts.map +1 -1
  65. package/dist/services/definitions/index.mjs +7 -1
  66. package/dist/services/definitions/index.mjs.map +1 -1
  67. package/dist/services/definitions/opensandbox.cjs +149 -0
  68. package/dist/services/definitions/opensandbox.cjs.map +1 -0
  69. package/dist/services/definitions/opensandbox.d.cts +7 -0
  70. package/dist/services/definitions/opensandbox.d.cts.map +1 -0
  71. package/dist/services/definitions/opensandbox.d.mts +7 -0
  72. package/dist/services/definitions/opensandbox.d.mts.map +1 -0
  73. package/dist/services/definitions/opensandbox.mjs +148 -0
  74. package/dist/services/definitions/opensandbox.mjs.map +1 -0
  75. package/dist/{skills-BlzpHmpH.cjs → skills-BSF7iNa4.cjs} +142 -1
  76. package/dist/{skills-BlzpHmpH.cjs.map → skills-BSF7iNa4.cjs.map} +1 -1
  77. package/dist/types.d.cts +1 -1
  78. package/dist/types.d.mts +1 -1
  79. package/dist/validator.cjs +1 -1
  80. package/package.json +1 -1
  81. package/src/addon-stack.test.ts +158 -0
  82. package/src/addon-stack.ts +48 -0
  83. package/src/generators/postgres-init.ts +2 -0
  84. package/src/generators/skills.ts +142 -0
  85. package/src/schema.ts +7 -0
  86. package/src/services/definitions/burnlink.ts +142 -0
  87. package/src/services/definitions/hindsight.ts +131 -0
  88. package/src/services/definitions/index.ts +10 -0
  89. package/src/services/definitions/opensandbox.ts +156 -0
@@ -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
+ };