Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ env:
jobs:
Check:
name: Check
runs-on: blacksmith-4vcpu-ubuntu-2404
runs-on: blacksmith-2vcpu-ubuntu-2404
steps:
- name: Checkout
uses: actions/checkout@v4
Expand Down Expand Up @@ -47,7 +47,7 @@ jobs:

BuildPackage:
name: Build Package Artifact
runs-on: blacksmith-4vcpu-ubuntu-2404
runs-on: blacksmith-2vcpu-ubuntu-2404
needs: Check
steps:
- name: Checkout
Expand Down Expand Up @@ -84,7 +84,7 @@ jobs:

PackageE2E:
name: Package Install E2E
runs-on: blacksmith-4vcpu-ubuntu-2404
runs-on: blacksmith-2vcpu-ubuntu-2404
needs: BuildPackage
steps:
- name: Setup Node
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/publish-package.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ permissions:
jobs:
resolve-merge-context:
name: Resolve Merge Context
runs-on: blacksmith-4vcpu-ubuntu-2404
runs-on: blacksmith-2vcpu-ubuntu-2404
permissions:
contents: read
pull-requests: read
Expand Down Expand Up @@ -122,7 +122,7 @@ jobs:

publish-and-manage-bump:
name: Publish Package + Manage Bump PR
runs-on: blacksmith-4vcpu-ubuntu-2404
runs-on: blacksmith-2vcpu-ubuntu-2404
needs: resolve-merge-context
permissions:
contents: write
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/validate-pr-title.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ permissions:
jobs:
ValidatePrTitle:
name: ValidatePrTitle
runs-on: blacksmith-4vcpu-ubuntu-2404
runs-on: blacksmith-2vcpu-ubuntu-2404
steps:
- name: Validate pull request title
env:
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ bun run start -- --no-open
- Auto-installs missing `git` and `node/npm` inside sandbox
- Forwards provider env vars (`OPENAI_*`, `ANTHROPIC_*`, `XAI_*`, `OPENROUTER_*`, `ZHIPU_*`, `MINIMAX_*`, etc.)
- Syncs local OpenCode config files from `~/.config/opencode` when present
- Uses a fixed Daytona lifecycle policy: auto-stop after 15 minutes, auto-archive after 30 minutes, auto-delete disabled
- Auto-catalogs findings into Obsidian when enabled via `shpit.toml`, with optional automatic `ob sync` in headless mode

### Examples
Expand Down
24 changes: 16 additions & 8 deletions src/analyze-repos.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@ type CliOptions = {
urls: string[];
};

const SANDBOX_LIFECYCLE_POLICY = {
autoStopInterval: 15,
autoArchiveInterval: 30,
autoDeleteInterval: -1,
} as const;

type DaytonaCompatClient = {
configApi: {
configControllerGetConfig: () => Promise<{
Expand Down Expand Up @@ -615,14 +621,16 @@ async function analyzeOneRepo(params: {
const sandboxName = sanitizeSlug(
`audit-${slug}-${Date.now().toString(36)}${Math.random().toString(36).slice(2, 6)}`,
).slice(0, 63);
sandbox = await daytona.create(
{
name: sandboxName,
language: "typescript",
autoStopInterval: 0,
},
{ timeout: options.createTimeoutSec },
);

const createParams = {
name: sandboxName,
language: "typescript",
autoStopInterval: SANDBOX_LIFECYCLE_POLICY.autoStopInterval,
autoArchiveInterval: SANDBOX_LIFECYCLE_POLICY.autoArchiveInterval,
autoDeleteInterval: SANDBOX_LIFECYCLE_POLICY.autoDeleteInterval,
};

sandbox = await daytona.create(createParams, { timeout: options.createTimeoutSec });
console.log(`[analyze] (${runPrefix}) Sandbox ready: ${sandbox.id}`);

const userHome = (await sandbox.getUserHomeDir()) ?? "/home/daytona";
Expand Down
23 changes: 15 additions & 8 deletions src/start-opencode-daytona.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@ type CliOptions = {
openUi: boolean;
};

const SANDBOX_LIFECYCLE_POLICY = {
autoStopInterval: 15,
autoArchiveInterval: 30,
autoDeleteInterval: -1,
} as const;

type LogCursor = { value: string };
type DaytonaCompatClient = {
configApi: {
Expand Down Expand Up @@ -410,14 +416,15 @@ async function main(): Promise<void> {

try {
console.log("[local] Creating Daytona sandbox...");
sandbox = await daytona.create(
{
name: options.sandboxName,
language: "typescript",
autoStopInterval: 0,
},
{ timeout: options.createTimeoutSec },
);
const createParams = {
name: options.sandboxName,
language: "typescript",
autoStopInterval: SANDBOX_LIFECYCLE_POLICY.autoStopInterval,
autoArchiveInterval: SANDBOX_LIFECYCLE_POLICY.autoArchiveInterval,
autoDeleteInterval: SANDBOX_LIFECYCLE_POLICY.autoDeleteInterval,
};

sandbox = await daytona.create(createParams, { timeout: options.createTimeoutSec });
console.log(`[local] Sandbox ready: ${sandbox.id}`);

const userHome = (await sandbox.getUserHomeDir()) ?? "/home/daytona";
Expand Down