@paperclipai/plugin-novita-sandbox 0.1.0
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/README.md +42 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +4 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +73 -0
- package/dist/manifest.js.map +1 -0
- package/dist/plugin.d.ts +22 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +399 -0
- package/dist/plugin.js.map +1 -0
- package/dist/worker.d.ts +3 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +5 -0
- package/dist/worker.js.map +1 -0
- package/package.json +53 -0
package/README.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# `@paperclipai/plugin-novita-sandbox`
|
|
2
|
+
|
|
3
|
+
Published Novita Agent Sandbox provider plugin for Paperclip.
|
|
4
|
+
|
|
5
|
+
This package lives in the Paperclip monorepo, but it is intentionally excluded from the root `pnpm` workspace and shaped to publish and install like a standalone npm package. That means operators can install it from the Plugins page by package name, and the host will fetch its transitive dependencies at install time without adding lockfile churn to the Paperclip repo.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
From a Paperclip instance, install:
|
|
10
|
+
|
|
11
|
+
```text
|
|
12
|
+
@paperclipai/plugin-novita-sandbox
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
The host plugin installer runs `npm install` into the managed plugin directory, so package dependencies such as `novita-sandbox` are pulled in during installation.
|
|
16
|
+
|
|
17
|
+
## Configuration
|
|
18
|
+
|
|
19
|
+
Configure Novita from `Company Settings -> Environments`, not from the plugin's instance settings page.
|
|
20
|
+
|
|
21
|
+
- Put the Novita API key on the sandbox environment itself.
|
|
22
|
+
- When you save an environment, Paperclip stores pasted API keys as company secrets.
|
|
23
|
+
- `NOVITA_API_KEY` remains an optional host-level fallback when an environment omits the key.
|
|
24
|
+
|
|
25
|
+
## Local development
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
cd packages/plugins/sandbox-providers/novita
|
|
29
|
+
pnpm install --ignore-workspace --no-lockfile
|
|
30
|
+
pnpm build
|
|
31
|
+
pnpm test
|
|
32
|
+
pnpm typecheck
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
These commands assume the repo root has already been installed once so the local `@paperclipai/plugin-sdk` workspace package is available to the compiler during development.
|
|
36
|
+
|
|
37
|
+
## Package layout
|
|
38
|
+
|
|
39
|
+
- `src/manifest.ts` declares the sandbox-provider driver metadata
|
|
40
|
+
- `src/plugin.ts` implements the environment lifecycle hooks
|
|
41
|
+
- `src/worker.ts` boots the plugin under the host worker runtime
|
|
42
|
+
- `paperclipPlugin.manifest` and `paperclipPlugin.worker` point the host at the built plugin entrypoints in `dist/`
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAKzE,QAAA,MAAM,QAAQ,EAAE,yBA4Ef,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
const PLUGIN_ID = "paperclip.novita-sandbox-provider";
|
|
2
|
+
const PLUGIN_VERSION = "0.1.0";
|
|
3
|
+
const manifest = {
|
|
4
|
+
id: PLUGIN_ID,
|
|
5
|
+
apiVersion: 1,
|
|
6
|
+
version: PLUGIN_VERSION,
|
|
7
|
+
displayName: "Novita Sandbox Provider",
|
|
8
|
+
description: "Sandbox provider plugin that provisions Novita Agent Sandbox environments for Paperclip agent runs.",
|
|
9
|
+
author: "Novita AI",
|
|
10
|
+
categories: ["automation"],
|
|
11
|
+
capabilities: ["environment.drivers.register"],
|
|
12
|
+
entrypoints: {
|
|
13
|
+
worker: "./dist/worker.js",
|
|
14
|
+
},
|
|
15
|
+
environmentDrivers: [
|
|
16
|
+
{
|
|
17
|
+
driverKey: "novita",
|
|
18
|
+
kind: "sandbox_provider",
|
|
19
|
+
displayName: "Novita Agent Sandbox",
|
|
20
|
+
description: "Provisions Novita Agent Sandbox instances with configurable templates, idle timeout, workspace path, and lease reuse.",
|
|
21
|
+
configSchema: {
|
|
22
|
+
type: "object",
|
|
23
|
+
properties: {
|
|
24
|
+
apiKey: {
|
|
25
|
+
type: "string",
|
|
26
|
+
format: "secret-ref",
|
|
27
|
+
description: "Environment-specific Novita API key. Paste a key or an existing Paperclip secret reference; saved environments store pasted values as company secrets. Falls back to NOVITA_API_KEY if omitted.",
|
|
28
|
+
},
|
|
29
|
+
domain: {
|
|
30
|
+
type: "string",
|
|
31
|
+
description: "Optional Novita API domain override. Leave empty to use the SDK default.",
|
|
32
|
+
},
|
|
33
|
+
template: {
|
|
34
|
+
type: "string",
|
|
35
|
+
description: "Novita sandbox template ID or name. Leave blank to use the SDK's default base template.",
|
|
36
|
+
},
|
|
37
|
+
requestedCwd: {
|
|
38
|
+
type: "string",
|
|
39
|
+
default: "/home/user/paperclip-workspace",
|
|
40
|
+
description: "Workspace directory to create inside the sandbox lease.",
|
|
41
|
+
},
|
|
42
|
+
timeoutMs: {
|
|
43
|
+
type: "number",
|
|
44
|
+
default: 300000,
|
|
45
|
+
description: "Sandbox lifetime and default per-command timeout in milliseconds.",
|
|
46
|
+
},
|
|
47
|
+
requestTimeoutMs: {
|
|
48
|
+
type: "number",
|
|
49
|
+
default: 30000,
|
|
50
|
+
description: "HTTP/RPC request timeout for Novita SDK calls in milliseconds.",
|
|
51
|
+
},
|
|
52
|
+
secure: {
|
|
53
|
+
type: "boolean",
|
|
54
|
+
default: true,
|
|
55
|
+
description: "Use secure connections when supported by the Novita SDK.",
|
|
56
|
+
},
|
|
57
|
+
autoPause: {
|
|
58
|
+
type: "boolean",
|
|
59
|
+
default: false,
|
|
60
|
+
description: "Enable Novita sandbox auto-pause behavior when supported by the selected template.",
|
|
61
|
+
},
|
|
62
|
+
reuseLease: {
|
|
63
|
+
type: "boolean",
|
|
64
|
+
default: false,
|
|
65
|
+
description: "Pause and later resume the sandbox across Paperclip runs instead of killing it on release.",
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
};
|
|
72
|
+
export default manifest;
|
|
73
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAAG,mCAAmC,CAAC;AACtD,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B,MAAM,QAAQ,GAA8B;IAC1C,EAAE,EAAE,SAAS;IACb,UAAU,EAAE,CAAC;IACb,OAAO,EAAE,cAAc;IACvB,WAAW,EAAE,yBAAyB;IACtC,WAAW,EACT,qGAAqG;IACvG,MAAM,EAAE,WAAW;IACnB,UAAU,EAAE,CAAC,YAAY,CAAC;IAC1B,YAAY,EAAE,CAAC,8BAA8B,CAAC;IAC9C,WAAW,EAAE;QACX,MAAM,EAAE,kBAAkB;KAC3B;IACD,kBAAkB,EAAE;QAClB;YACE,SAAS,EAAE,QAAQ;YACnB,IAAI,EAAE,kBAAkB;YACxB,WAAW,EAAE,sBAAsB;YACnC,WAAW,EACT,uHAAuH;YACzH,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,MAAM,EAAE;wBACN,IAAI,EAAE,QAAQ;wBACd,MAAM,EAAE,YAAY;wBACpB,WAAW,EACT,iMAAiM;qBACpM;oBACD,MAAM,EAAE;wBACN,IAAI,EAAE,QAAQ;wBACd,WAAW,EACT,0EAA0E;qBAC7E;oBACD,QAAQ,EAAE;wBACR,IAAI,EAAE,QAAQ;wBACd,WAAW,EACT,yFAAyF;qBAC5F;oBACD,YAAY,EAAE;wBACZ,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,gCAAgC;wBACzC,WAAW,EAAE,yDAAyD;qBACvE;oBACD,SAAS,EAAE;wBACT,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,MAAM;wBACf,WAAW,EACT,mEAAmE;qBACtE;oBACD,gBAAgB,EAAE;wBAChB,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,KAAK;wBACd,WAAW,EACT,gEAAgE;qBACnE;oBACD,MAAM,EAAE;wBACN,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,IAAI;wBACb,WAAW,EAAE,0DAA0D;qBACxE;oBACD,SAAS,EAAE;wBACT,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,KAAK;wBACd,WAAW,EAAE,oFAAoF;qBAClG;oBACD,UAAU,EAAE;wBACV,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,KAAK;wBACd,WAAW,EACT,4FAA4F;qBAC/F;iBACF;aACF;SACF;KACF;CACF,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface NovitaDriverConfig {
|
|
2
|
+
apiKey: string | null;
|
|
3
|
+
domain: string | null;
|
|
4
|
+
template: string | null;
|
|
5
|
+
requestedCwd: string;
|
|
6
|
+
timeoutMs: number;
|
|
7
|
+
requestTimeoutMs: number;
|
|
8
|
+
secure: boolean | null;
|
|
9
|
+
autoPause: boolean;
|
|
10
|
+
reuseLease: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function parseNovitaDriverConfig(raw: Record<string, unknown>): NovitaDriverConfig;
|
|
13
|
+
export declare function buildShellCommand(input: {
|
|
14
|
+
command: string;
|
|
15
|
+
args?: string[];
|
|
16
|
+
cwd?: string;
|
|
17
|
+
env?: Record<string, string>;
|
|
18
|
+
stdin?: string;
|
|
19
|
+
}): string;
|
|
20
|
+
declare const plugin: any;
|
|
21
|
+
export default plugin;
|
|
22
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AAYD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,kBAAkB,CAYxF;AAyDD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,MAAM,CA6BT;AA+ID,QAAA,MAAM,MAAM,KAyMV,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { definePlugin } from "@paperclipai/plugin-sdk";
|
|
3
|
+
import { Sandbox } from "novita-sandbox";
|
|
4
|
+
function parseOptionalString(value) {
|
|
5
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
6
|
+
}
|
|
7
|
+
function parsePositiveInteger(value, fallback) {
|
|
8
|
+
if (value == null || value === "")
|
|
9
|
+
return fallback;
|
|
10
|
+
const parsed = Number(value);
|
|
11
|
+
return Number.isFinite(parsed) && parsed > 0 ? Math.trunc(parsed) : fallback;
|
|
12
|
+
}
|
|
13
|
+
export function parseNovitaDriverConfig(raw) {
|
|
14
|
+
return {
|
|
15
|
+
apiKey: parseOptionalString(raw.apiKey),
|
|
16
|
+
domain: parseOptionalString(raw.domain),
|
|
17
|
+
template: parseOptionalString(raw.template),
|
|
18
|
+
requestedCwd: parseOptionalString(raw.requestedCwd) ?? "/home/user/paperclip-workspace",
|
|
19
|
+
timeoutMs: parsePositiveInteger(raw.timeoutMs, 300_000),
|
|
20
|
+
requestTimeoutMs: parsePositiveInteger(raw.requestTimeoutMs, 30_000),
|
|
21
|
+
secure: typeof raw.secure === "boolean" ? raw.secure : null,
|
|
22
|
+
autoPause: raw.autoPause === true,
|
|
23
|
+
reuseLease: raw.reuseLease === true,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function validateNovitaDriverConfig(config) {
|
|
27
|
+
const errors = [];
|
|
28
|
+
if (!config.apiKey && !process.env.NOVITA_API_KEY?.trim()) {
|
|
29
|
+
errors.push("Novita sandbox environments require an API key in config or NOVITA_API_KEY.");
|
|
30
|
+
}
|
|
31
|
+
if (!config.requestedCwd.startsWith("/")) {
|
|
32
|
+
errors.push("requestedCwd must be an absolute path.");
|
|
33
|
+
}
|
|
34
|
+
if (config.timeoutMs < 10_000) {
|
|
35
|
+
errors.push("timeoutMs must be at least 10000.");
|
|
36
|
+
}
|
|
37
|
+
if (config.requestTimeoutMs < 1_000) {
|
|
38
|
+
errors.push("requestTimeoutMs must be at least 1000.");
|
|
39
|
+
}
|
|
40
|
+
return errors;
|
|
41
|
+
}
|
|
42
|
+
function resolveApiKey(config) {
|
|
43
|
+
const apiKey = config.apiKey ?? process.env.NOVITA_API_KEY?.trim() ?? "";
|
|
44
|
+
if (!apiKey) {
|
|
45
|
+
throw new Error("Novita sandbox environments require an API key in config or NOVITA_API_KEY.");
|
|
46
|
+
}
|
|
47
|
+
return apiKey;
|
|
48
|
+
}
|
|
49
|
+
function sandboxOpts(config) {
|
|
50
|
+
return {
|
|
51
|
+
apiKey: resolveApiKey(config),
|
|
52
|
+
...(config.domain ? { domain: config.domain } : {}),
|
|
53
|
+
...(config.secure == null ? {} : { secure: config.secure }),
|
|
54
|
+
timeoutMs: config.timeoutMs,
|
|
55
|
+
requestTimeoutMs: config.requestTimeoutMs,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function formatErrorMessage(error) {
|
|
59
|
+
return error instanceof Error ? error.message : String(error);
|
|
60
|
+
}
|
|
61
|
+
function shellQuote(value) {
|
|
62
|
+
return `'${value.replace(/'/g, `'"'"'`)}'`;
|
|
63
|
+
}
|
|
64
|
+
function singleQuoteForPrintf(value) {
|
|
65
|
+
return `'${value.replace(/'/g, `'"'"'`)}'`;
|
|
66
|
+
}
|
|
67
|
+
function isValidShellEnvKey(value) {
|
|
68
|
+
return /^[A-Za-z_][A-Za-z0-9_]*$/.test(value);
|
|
69
|
+
}
|
|
70
|
+
function buildStdinPath() {
|
|
71
|
+
return `/tmp/.paperclip-stdin-${randomUUID()}`;
|
|
72
|
+
}
|
|
73
|
+
export function buildShellCommand(input) {
|
|
74
|
+
const envEntries = Object.entries(input.env ?? {});
|
|
75
|
+
for (const [key] of envEntries) {
|
|
76
|
+
if (!isValidShellEnvKey(key)) {
|
|
77
|
+
throw new Error(`Invalid sandbox environment variable key: ${key}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const exports = envEntries.map(([key, value]) => `export ${key}=${shellQuote(value)};`);
|
|
81
|
+
const argv = [input.command, ...(input.args ?? [])].map(shellQuote).join(" ");
|
|
82
|
+
const stdinPath = typeof input.stdin === "string" ? buildStdinPath() : null;
|
|
83
|
+
const stdin = stdinPath ? `printf '%s' ${singleQuoteForPrintf(input.stdin ?? "")} > ${shellQuote(stdinPath)}` : "";
|
|
84
|
+
const cwd = input.cwd?.trim() || "/";
|
|
85
|
+
const commandLines = stdinPath
|
|
86
|
+
? [
|
|
87
|
+
"set +e",
|
|
88
|
+
`${argv} < ${shellQuote(stdinPath)}`,
|
|
89
|
+
"status=$?",
|
|
90
|
+
`rm -f ${shellQuote(stdinPath)}`,
|
|
91
|
+
"exit $status",
|
|
92
|
+
]
|
|
93
|
+
: [`exec ${argv}`];
|
|
94
|
+
return [
|
|
95
|
+
"set -e",
|
|
96
|
+
stdin,
|
|
97
|
+
`cd ${shellQuote(cwd)}`,
|
|
98
|
+
...exports,
|
|
99
|
+
...commandLines,
|
|
100
|
+
].filter(Boolean).join("\n");
|
|
101
|
+
}
|
|
102
|
+
async function createSandbox(params, config) {
|
|
103
|
+
const metadata = {
|
|
104
|
+
"paperclip-provider": "novita",
|
|
105
|
+
"paperclip-company-id": params.companyId,
|
|
106
|
+
"paperclip-environment-id": params.environmentId,
|
|
107
|
+
...(params.issueId ? { "paperclip-issue-id": params.issueId } : {}),
|
|
108
|
+
...("runId" in params ? { "paperclip-run-id": params.runId } : {}),
|
|
109
|
+
};
|
|
110
|
+
const opts = {
|
|
111
|
+
...sandboxOpts(config),
|
|
112
|
+
metadata,
|
|
113
|
+
autoPause: config.autoPause,
|
|
114
|
+
};
|
|
115
|
+
return config.template
|
|
116
|
+
? await Sandbox.create(config.template, opts)
|
|
117
|
+
: await Sandbox.create(opts);
|
|
118
|
+
}
|
|
119
|
+
async function connectSandbox(config, sandboxId) {
|
|
120
|
+
return await Sandbox.connect(sandboxId, sandboxOpts(config));
|
|
121
|
+
}
|
|
122
|
+
function isSandboxNotFoundError(error) {
|
|
123
|
+
const message = formatErrorMessage(error).toLowerCase();
|
|
124
|
+
return message.includes("not found") || message.includes("404");
|
|
125
|
+
}
|
|
126
|
+
async function getSandboxOrNull(config, sandboxId) {
|
|
127
|
+
try {
|
|
128
|
+
return await connectSandbox(config, sandboxId);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
if (isSandboxNotFoundError(error))
|
|
132
|
+
return null;
|
|
133
|
+
throw error;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async function detectShellCommand(sandbox, config) {
|
|
137
|
+
try {
|
|
138
|
+
const result = await sandbox.commands.run("if command -v bash >/dev/null 2>&1; then printf bash; else printf sh; fi", { cwd: "/", timeoutMs: config.requestTimeoutMs });
|
|
139
|
+
return result.stdout.trim() === "bash" ? "bash" : "sh";
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return "sh";
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async function ensureWorkspace(sandbox, remoteCwd, config) {
|
|
146
|
+
await sandbox.commands.run(`mkdir -p ${shellQuote(remoteCwd)}`, {
|
|
147
|
+
cwd: "/",
|
|
148
|
+
timeoutMs: config.requestTimeoutMs,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
function leaseMetadata(input) {
|
|
152
|
+
return {
|
|
153
|
+
provider: "novita",
|
|
154
|
+
shellCommand: input.shellCommand,
|
|
155
|
+
sandboxId: input.sandbox.sandboxId,
|
|
156
|
+
template: input.config.template,
|
|
157
|
+
timeoutMs: input.config.timeoutMs,
|
|
158
|
+
requestTimeoutMs: input.config.requestTimeoutMs,
|
|
159
|
+
autoPause: input.config.autoPause,
|
|
160
|
+
reuseLease: input.config.reuseLease,
|
|
161
|
+
remoteCwd: input.remoteCwd,
|
|
162
|
+
resumedLease: input.resumedLease,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
async function releaseSandbox(config, sandboxId) {
|
|
166
|
+
const sandbox = await getSandboxOrNull(config, sandboxId);
|
|
167
|
+
if (!sandbox)
|
|
168
|
+
return;
|
|
169
|
+
if (config.reuseLease) {
|
|
170
|
+
await sandbox.betaPause({ requestTimeoutMs: config.requestTimeoutMs }).catch(async () => {
|
|
171
|
+
await sandbox.kill({ requestTimeoutMs: config.requestTimeoutMs }).catch(() => undefined);
|
|
172
|
+
});
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
await sandbox.kill({ requestTimeoutMs: config.requestTimeoutMs }).catch(() => undefined);
|
|
176
|
+
}
|
|
177
|
+
async function executeInSandbox(sandbox, params, config) {
|
|
178
|
+
const command = buildShellCommand({
|
|
179
|
+
command: params.command,
|
|
180
|
+
args: params.args,
|
|
181
|
+
cwd: params.cwd,
|
|
182
|
+
env: params.env,
|
|
183
|
+
stdin: params.stdin,
|
|
184
|
+
});
|
|
185
|
+
try {
|
|
186
|
+
const result = await sandbox.commands.run(command, {
|
|
187
|
+
cwd: "/",
|
|
188
|
+
timeoutMs: params.timeoutMs ?? config.timeoutMs,
|
|
189
|
+
});
|
|
190
|
+
return {
|
|
191
|
+
exitCode: result.exitCode,
|
|
192
|
+
signal: null,
|
|
193
|
+
timedOut: false,
|
|
194
|
+
stdout: result.stdout,
|
|
195
|
+
stderr: result.stderr,
|
|
196
|
+
metadata: {
|
|
197
|
+
provider: "novita",
|
|
198
|
+
sandboxId: sandbox.sandboxId,
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
const commandError = error;
|
|
204
|
+
if (typeof commandError.exitCode === "number" || commandError.timedOut === true) {
|
|
205
|
+
return {
|
|
206
|
+
exitCode: commandError.exitCode ?? 124,
|
|
207
|
+
signal: null,
|
|
208
|
+
timedOut: commandError.timedOut === true,
|
|
209
|
+
stdout: commandError.stdout ?? "",
|
|
210
|
+
stderr: commandError.stderr ?? commandError.error ?? "",
|
|
211
|
+
metadata: {
|
|
212
|
+
provider: "novita",
|
|
213
|
+
sandboxId: sandbox.sandboxId,
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
throw error;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
const plugin = definePlugin({
|
|
221
|
+
async setup(ctx) {
|
|
222
|
+
ctx.logger.info("Novita sandbox provider plugin ready");
|
|
223
|
+
},
|
|
224
|
+
async onHealth() {
|
|
225
|
+
return { status: "ok", message: "Novita sandbox provider plugin healthy" };
|
|
226
|
+
},
|
|
227
|
+
async onEnvironmentValidateConfig(params) {
|
|
228
|
+
const config = parseNovitaDriverConfig(params.config);
|
|
229
|
+
const errors = validateNovitaDriverConfig(config);
|
|
230
|
+
if (errors.length > 0) {
|
|
231
|
+
return { ok: false, errors };
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
ok: true,
|
|
235
|
+
normalizedConfig: { ...config },
|
|
236
|
+
};
|
|
237
|
+
},
|
|
238
|
+
async onEnvironmentProbe(params) {
|
|
239
|
+
const config = parseNovitaDriverConfig(params.config);
|
|
240
|
+
try {
|
|
241
|
+
const sandbox = await createSandbox(params, config);
|
|
242
|
+
try {
|
|
243
|
+
await ensureWorkspace(sandbox, config.requestedCwd, config);
|
|
244
|
+
const shellCommand = await detectShellCommand(sandbox, config);
|
|
245
|
+
return {
|
|
246
|
+
ok: true,
|
|
247
|
+
summary: `Connected to Novita sandbox ${sandbox.sandboxId}.`,
|
|
248
|
+
metadata: leaseMetadata({
|
|
249
|
+
config,
|
|
250
|
+
sandbox,
|
|
251
|
+
shellCommand,
|
|
252
|
+
remoteCwd: config.requestedCwd,
|
|
253
|
+
resumedLease: false,
|
|
254
|
+
}),
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
finally {
|
|
258
|
+
await sandbox.kill({ requestTimeoutMs: config.requestTimeoutMs }).catch(() => undefined);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
return {
|
|
263
|
+
ok: false,
|
|
264
|
+
summary: "Novita sandbox probe failed.",
|
|
265
|
+
metadata: {
|
|
266
|
+
provider: "novita",
|
|
267
|
+
template: config.template,
|
|
268
|
+
timeoutMs: config.timeoutMs,
|
|
269
|
+
requestTimeoutMs: config.requestTimeoutMs,
|
|
270
|
+
reuseLease: config.reuseLease,
|
|
271
|
+
error: formatErrorMessage(error),
|
|
272
|
+
},
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
async onEnvironmentAcquireLease(params) {
|
|
277
|
+
const config = parseNovitaDriverConfig(params.config);
|
|
278
|
+
const sandbox = await createSandbox(params, config);
|
|
279
|
+
try {
|
|
280
|
+
const remoteCwd = params.requestedCwd?.trim() || config.requestedCwd;
|
|
281
|
+
await ensureWorkspace(sandbox, remoteCwd, config);
|
|
282
|
+
const shellCommand = await detectShellCommand(sandbox, config);
|
|
283
|
+
return {
|
|
284
|
+
providerLeaseId: sandbox.sandboxId,
|
|
285
|
+
metadata: leaseMetadata({
|
|
286
|
+
config,
|
|
287
|
+
sandbox,
|
|
288
|
+
shellCommand,
|
|
289
|
+
remoteCwd,
|
|
290
|
+
resumedLease: false,
|
|
291
|
+
}),
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
await sandbox.kill({ requestTimeoutMs: config.requestTimeoutMs }).catch(() => undefined);
|
|
296
|
+
throw error;
|
|
297
|
+
}
|
|
298
|
+
},
|
|
299
|
+
async onEnvironmentResumeLease(params) {
|
|
300
|
+
if (!params.providerLeaseId) {
|
|
301
|
+
return {
|
|
302
|
+
providerLeaseId: null,
|
|
303
|
+
metadata: {
|
|
304
|
+
provider: "novita",
|
|
305
|
+
expired: true,
|
|
306
|
+
},
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
const config = parseNovitaDriverConfig(params.config);
|
|
310
|
+
const sandbox = await getSandboxOrNull(config, params.providerLeaseId);
|
|
311
|
+
if (!sandbox) {
|
|
312
|
+
return {
|
|
313
|
+
providerLeaseId: null,
|
|
314
|
+
metadata: {
|
|
315
|
+
provider: "novita",
|
|
316
|
+
expired: true,
|
|
317
|
+
},
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
await sandbox.setTimeout(config.timeoutMs, { requestTimeoutMs: config.requestTimeoutMs }).catch(() => undefined);
|
|
321
|
+
const remoteCwd = typeof params.leaseMetadata?.remoteCwd === "string" && params.leaseMetadata.remoteCwd.trim().length > 0
|
|
322
|
+
? params.leaseMetadata.remoteCwd.trim()
|
|
323
|
+
: config.requestedCwd;
|
|
324
|
+
await ensureWorkspace(sandbox, remoteCwd, config);
|
|
325
|
+
const shellCommand = await detectShellCommand(sandbox, config);
|
|
326
|
+
return {
|
|
327
|
+
providerLeaseId: sandbox.sandboxId,
|
|
328
|
+
metadata: leaseMetadata({
|
|
329
|
+
config,
|
|
330
|
+
sandbox,
|
|
331
|
+
shellCommand,
|
|
332
|
+
remoteCwd,
|
|
333
|
+
resumedLease: true,
|
|
334
|
+
}),
|
|
335
|
+
};
|
|
336
|
+
},
|
|
337
|
+
async onEnvironmentReleaseLease(params) {
|
|
338
|
+
if (!params.providerLeaseId)
|
|
339
|
+
return;
|
|
340
|
+
const config = parseNovitaDriverConfig(params.config);
|
|
341
|
+
await releaseSandbox(config, params.providerLeaseId);
|
|
342
|
+
},
|
|
343
|
+
async onEnvironmentDestroyLease(params) {
|
|
344
|
+
if (!params.providerLeaseId)
|
|
345
|
+
return;
|
|
346
|
+
const config = parseNovitaDriverConfig(params.config);
|
|
347
|
+
const sandbox = await getSandboxOrNull(config, params.providerLeaseId);
|
|
348
|
+
await sandbox?.kill({ requestTimeoutMs: config.requestTimeoutMs }).catch(() => undefined);
|
|
349
|
+
},
|
|
350
|
+
async onEnvironmentRealizeWorkspace(params) {
|
|
351
|
+
const config = parseNovitaDriverConfig(params.config);
|
|
352
|
+
const remoteCwd = typeof params.lease.metadata?.remoteCwd === "string" && params.lease.metadata.remoteCwd.trim().length > 0
|
|
353
|
+
? params.lease.metadata.remoteCwd.trim()
|
|
354
|
+
: params.workspace.remotePath ?? params.workspace.localPath ?? config.requestedCwd;
|
|
355
|
+
if (params.lease.providerLeaseId) {
|
|
356
|
+
const sandbox = await getSandboxOrNull(config, params.lease.providerLeaseId);
|
|
357
|
+
if (sandbox) {
|
|
358
|
+
await ensureWorkspace(sandbox, remoteCwd, config);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return {
|
|
362
|
+
cwd: remoteCwd,
|
|
363
|
+
metadata: {
|
|
364
|
+
provider: "novita",
|
|
365
|
+
remoteCwd,
|
|
366
|
+
},
|
|
367
|
+
};
|
|
368
|
+
},
|
|
369
|
+
async onEnvironmentExecute(params) {
|
|
370
|
+
if (!params.lease.providerLeaseId) {
|
|
371
|
+
return {
|
|
372
|
+
exitCode: 1,
|
|
373
|
+
signal: null,
|
|
374
|
+
timedOut: false,
|
|
375
|
+
stdout: "",
|
|
376
|
+
stderr: "No provider lease ID available for execution.\n",
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
const config = parseNovitaDriverConfig(params.config);
|
|
380
|
+
const sandbox = await getSandboxOrNull(config, params.lease.providerLeaseId);
|
|
381
|
+
if (!sandbox) {
|
|
382
|
+
return {
|
|
383
|
+
exitCode: 1,
|
|
384
|
+
signal: null,
|
|
385
|
+
timedOut: false,
|
|
386
|
+
stdout: "",
|
|
387
|
+
stderr: "Novita sandbox lease is no longer available.\n",
|
|
388
|
+
metadata: {
|
|
389
|
+
provider: "novita",
|
|
390
|
+
sandboxId: params.lease.providerLeaseId,
|
|
391
|
+
expired: true,
|
|
392
|
+
},
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
return await executeInSandbox(sandbox, params, config);
|
|
396
|
+
},
|
|
397
|
+
});
|
|
398
|
+
export default plugin;
|
|
399
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/worker.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,eAAe,MAAM,CAAC"}
|
package/dist/worker.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,eAAe,MAAM,CAAC;AACtB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@paperclipai/plugin-novita-sandbox",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Novita Agent Sandbox provider plugin for Paperclip environments",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"homepage": "https://github.com/paperclipai/paperclip",
|
|
7
|
+
"bugs": {
|
|
8
|
+
"url": "https://github.com/paperclipai/paperclip/issues"
|
|
9
|
+
},
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "https://github.com/paperclipai/paperclip",
|
|
13
|
+
"directory": "packages/plugins/sandbox-providers/novita"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"import": "./dist/index.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"main": "./dist/index.js",
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"publishConfig": {
|
|
25
|
+
"access": "public",
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"import": "./dist/index.js"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"main": "./dist/index.js",
|
|
33
|
+
"types": "./dist/index.d.ts"
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"dist"
|
|
37
|
+
],
|
|
38
|
+
"paperclipPlugin": {
|
|
39
|
+
"manifest": "./dist/manifest.js",
|
|
40
|
+
"worker": "./dist/worker.js"
|
|
41
|
+
},
|
|
42
|
+
"keywords": [
|
|
43
|
+
"paperclip",
|
|
44
|
+
"plugin",
|
|
45
|
+
"sandbox",
|
|
46
|
+
"novita",
|
|
47
|
+
"novita-ai"
|
|
48
|
+
],
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"novita-sandbox": "^1.0.3-b2",
|
|
51
|
+
"@paperclipai/plugin-sdk": "1.0.0"
|
|
52
|
+
}
|
|
53
|
+
}
|