Commit graph

21 commits

Author SHA1 Message Date
A
3d274bf3d2
fix: escape shell commands and sanitize JSON to prevent injection (#463)
- Add printf %q command escaping to run_server/interactive_session in
  Koyeb, Render, Railway, and GitHub Codespaces (matching pattern used
  by E2B, Daytona, Northflank, Fly, and other providers)
- Use json_escape in exchange_oauth_code to prevent JSON injection via
  crafted OAuth codes in shared/common.sh
- Use json_escape in Fly.io _fly_create_app to prevent JSON injection
  via FLY_ORG env var, plus add validation for org slug format
- Pass Fly.io _fly_create_machine values via env vars instead of Python
  string interpolation to prevent code injection

Agent: security-auditor

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 07:20:41 -08:00
A
f1e8d946df
fix: secure upload_file functions against command injection in 5 clouds (#453)
Replace unsafe printf '%q'-escaped unquoted variables with validated
single-quoted embedding in upload_file() for fly, northflank, daytona,
e2b, and koyeb. The previous pattern used unquoted $escaped_content and
$escaped_path in command strings passed to bash -c or run_server, which
could allow command injection via crafted filenames.

The fix:
- Validates remote_path rejects unsafe chars (', $, `, newlines)
- Uses base64 content directly (alphanumeric + /+= is shell-safe)
- Single-quotes both content and path in the command string
- Uses printf '%s' instead of echo for safer output

Matches the pattern already used by render, modal, and railway.

Agent: security-auditor

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 06:28:45 -08:00
A
81bab47a74
fix: Escape API keys in continue.sh JSON configs to prevent injection (#374)
Replace vulnerable heredoc patterns across 27 continue.sh scripts with
setup_continue_config() helper that uses json_escape() + upload_config_file()
to safely handle API keys containing special characters like quotes or braces.

Also fix _save_token_to_config() in shared/common.sh which had the same
unescaped heredoc vulnerability for local token storage.

Relates to #104

Agent: security-auditor

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-11 00:13:19 -08:00
Ahmed Abushagur
8b9f9a0e5a
QA-Bot setup (#335)
* feat: testing

* feat: auto-fix dead apis

* fix: mock works

* feat: new fixtures

* fix: more clouds tested

* fix: dry run fix

* fix: civo valid size

* fix: civo result wait

* feat: fixtures

* feat: per cloud agent
2026-02-10 19:51:07 -08:00
A
56778b89e0
feat: Add Continue agent for 7 clouds (Kamatera, Cherry, Oracle, Koyeb, Northflank, Railway, Render) (#314)
Implemented Continue CLI TUI mode on:
- kamatera/continue.sh
- cherry/continue.sh
- oracle/continue.sh
- koyeb/continue.sh
- northflank/continue.sh
- railway/continue.sh
- render/continue.sh

All scripts follow the standard pattern:
1. Source cloud-specific lib/common.sh
2. Authenticate with cloud provider
3. Provision server/container
4. Install Continue CLI via npm
5. Inject OpenRouter API key
6. Create ~/.continue/config.json with OpenRouter provider
7. Launch interactive TUI session with 'cn' command

Agent: gap-filler-3

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 18:00:42 -08:00
A
4f23276338
refactor: reduce complexity in Fly, Koyeb, and Railway providers (#293)
- Split _fly_create_and_start_machine (70 lines) into _fly_create_machine
  and _fly_wait_for_machine_start for single-responsibility
- Replace ensure_koyeb_token (38 lines) with ensure_api_token_with_provider
- Replace ensure_railway_token (37 lines) with ensure_api_token_with_provider
- Remove _save_koyeb_token and _save_railway_token (handled by shared helper)

Net reduction: ~80 lines of duplicated code

Agent: complexity-hunter

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-10 15:30:32 -08:00
A
116305f32c
fix: Secure upload_file() against command injection in Railway, Modal, and Koyeb (#221)
Railway: Missing base64 -w0 caused newline injection; unescaped remote_path
in single quotes allowed single-quote breakout command injection. Now uses
base64 -w0 with macOS fallback, printf '%q' for path escaping, and routes
through run_server instead of direct railway run bash -c.

Modal: Remote path was embedded in single quotes without escaping, allowing
single-quote breakout. Now uses printf '%q' for safe path escaping.

Koyeb: Used fragile deny-list validation for remote_path (rejecting specific
characters) and base64 without -w0 flag. Replaced with printf '%q' escaping
and added base64 -w0 with macOS fallback.

Agent: security-auditor

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-10 12:33:15 -08:00
A
b32ed45f82
feat: Add Koyeb kilocode script (#208)
Agent: gap-filler-koyeb-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 09:01:02 -08:00
A
bde4719492
feat: Add Koyeb plandex script (#207)
Agent: gap-filler-koyeb-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 09:00:15 -08:00
A
27c1765745
feat: Add Koyeb opencode script (#206)
Agent: gap-filler-koyeb-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 08:59:32 -08:00
A
b02658505b
feat: Add Koyeb gptme script (#204)
Agent: gap-filler-koyeb-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 08:58:48 -08:00
A
6a7187022d
feat: Add Koyeb cline script (#203)
Agent: gap-filler-koyeb-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 08:58:13 -08:00
A
f49ca34e67
feat: Add Koyeb amazonq script (#202)
Agent: gap-filler-koyeb-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 08:57:38 -08:00
A
bd978f7853
feat: Add Koyeb gemini script (#201)
Agent: gap-filler-koyeb-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 08:57:00 -08:00
A
aa162f766d
feat: Add Koyeb interpreter script (#199)
Agent: gap-filler-koyeb-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 08:56:23 -08:00
A
ba4e768fff
feat: Add Koyeb codex script (#197)
Agent: gap-filler-koyeb-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 08:55:47 -08:00
A
54ef5e451a
fix: Prevent command injection via env var values in Koyeb and Hyperstack scripts (#196)
Koyeb's inject_env_vars used sed escaping that didn't handle single quotes,
allowing API key values containing ' to break out of the shell command string
passed to `koyeb instances exec`. Replace with file-based injection using
generate_env_config + upload_file, matching the safe pattern in shared/common.sh.

Hyperstack goose/gemini/interpreter/codex scripts embedded $OPENROUTER_API_KEY
directly in double-quoted command strings passed to run_server (SSH). Values
containing double quotes, backticks, or $() could execute arbitrary commands
on the remote VM. Replace with inject_env_vars_ssh which writes env vars to a
temp file, uploads via SCP, and appends to shell config without interpolation.

Also hardens Koyeb upload_file to reject remote paths containing shell
metacharacters (', $, `, newline).

Agent: security-auditor

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-10 08:55:16 -08:00
A
df70a13529
feat: Add Koyeb goose script (#195)
Agent: gap-filler-koyeb-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 08:55:03 -08:00
A
17e78b9f04
feat: Add Koyeb nanoclaw script (#187)
Agent: gap-filler-koyeb-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 08:54:20 -08:00
A
b039f8868a
refactor: Decompose Koyeb and Vast.ai create_server functions (#189)
Break down the two largest unrefactored create_server functions:
- Koyeb (82 lines -> 10): Extract _koyeb_create_app, _koyeb_create_service,
  _koyeb_wait_for_service, _koyeb_get_instance_id
- Vast.ai (77 lines -> 15): Extract _validate_vastai_params,
  _find_cheapest_offer, _create_vastai_instance

Agent: complexity-hunter

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-10 08:54:14 -08:00
A
e4052189d2
feat: Add Koyeb serverless container platform support (#185)
Add Koyeb as a new cloud provider with CLI-based provisioning.

Changes:
- Created koyeb/lib/common.sh with provider primitives
- Implemented koyeb/claude.sh
- Implemented koyeb/aider.sh
- Implemented koyeb/openclaw.sh
- Added Koyeb entry to manifest.json clouds section
- Added matrix entries for all 14 agents
- Created koyeb/README.md with setup instructions

Koyeb features:
- Serverless container platform with per-second billing
- Free tier available (no credit card required)
- Fast deployment times
- Automatic scaling
- Global deployment regions

Agent: cloud-scout-2

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 08:07:36 -08:00