mirror of
https://github.com/OpenRouterTeam/spawn.git
synced 2026-04-28 11:59:29 +00:00
feat: add downloadFile to CloudRunner + local OpenClaw config merge (#2636)
* feat: add downloadFile to CloudRunner + local OpenClaw config merge Add `downloadFile(remotePath, localPath)` to the CloudRunner interface and implement it across all 6 cloud providers (Hetzner, AWS, GCP, DigitalOcean, Sprite, Local) — mirroring the existing `uploadFile` with reversed SCP direction. Replace the OpenClaw config write with a download → deep-merge → upload flow so config merging happens in our own linted TypeScript instead of a remote script. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: move isPlainObject and deepMerge to shared utils Extract `isPlainObject` to `shared/type-guards.ts` and `deepMerge` to `shared/parse.ts` so they're reusable across the codebase. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: promote isPlainObject to shared package, use across codebase Move `isPlainObject` from cli/type-guards.ts into @openrouter/spawn-shared so it can be used everywhere. Replace inline `val !== null && typeof val === "object" && !Array.isArray(val)` checks in: - shared/type-guards.ts (toRecord, toObjectArray) - shared/parse.ts (parseJsonObj) - cli/manifest.ts (isValidManifest) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: remove type-guards re-export, import directly from spawn-shared Delete `packages/cli/src/shared/type-guards.ts` (was just a re-export barrel). All 35 consuming files now import `getErrorMessage`, `isString`, `isNumber`, `isPlainObject`, `toRecord`, etc. directly from `@openrouter/spawn-shared`. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude <claude@anthropic.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
0f9bbd399c
commit
f7c23de716
50 changed files with 337 additions and 62 deletions
|
|
@ -7,6 +7,7 @@ import type { AgentConfig } from "./agents";
|
|||
import type { SshTunnelHandle } from "./ssh";
|
||||
|
||||
import { readFileSync } from "node:fs";
|
||||
import { getErrorMessage } from "@openrouter/spawn-shared";
|
||||
import * as v from "valibot";
|
||||
import { generateSpawnId, saveLaunchCmd, saveMetadata, saveSpawnRecord } from "../history.js";
|
||||
import { offerGithubAuth, wrapSshCall } from "./agent-setup";
|
||||
|
|
@ -17,7 +18,6 @@ import { getSpawnPreferencesPath } from "./paths";
|
|||
import { asyncTryCatch, asyncTryCatchIf, isFileError, isOperationalError, tryCatchIf } from "./result.js";
|
||||
import { startSshTunnel } from "./ssh";
|
||||
import { ensureSshKeys, getSshKeyOpts } from "./ssh-keys";
|
||||
import { getErrorMessage } from "./type-guards";
|
||||
import {
|
||||
logDebug,
|
||||
logInfo,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue