paperclipai/paperclip · error
npm installs are disabled on cloud-managed instances; only p
Error message
npm installs are disabled on cloud-managed instances; only plugins bundled with the application may be installed
What it means
403 policy guard on POST /plugins/install. Fires on cloud-managed instances when the requested install source is not a local path (i.e. an npm/registry install); only plugins bundled with the application may be installed there, regardless of privileges.
Source
Thrown at server/src/routes/plugins.ts:1179
// Validate package name format
const trimmedPackage = packageName.trim();
if (trimmedPackage.length === 0) {
res.status(400).json({ error: "packageName cannot be empty" });
return;
}
// Basic security check for package name (prevent injection)
if (!isLocalPath && /[<>:"|?*]/.test(trimmedPackage)) {
res.status(400).json({ error: "packageName contains invalid characters" });
return;
}
// Cloud install floor: on harness-managed instances only bundled-catalog
// sources are installable, regardless of actor privileges or flag state.
const cloudManaged = isCloudManagedInstance();
if (cloudManaged && !isLocalPath) {
res.status(403).json({
error:
"npm installs are disabled on cloud-managed instances; only plugins bundled with the application may be installed",
});
return;
}
// Canonicalize local install paths on every instance so traversal
// segments and symlinks cannot smuggle an aliased path past validation.
let canonicalLocalPath: string | undefined;
if (isLocalPath) {
const validated = await canonicalizeLocalPluginPath(trimmedPackage);
if (!validated.ok) {
res.status(400).json({ error: `Invalid localPath: ${validated.reason}` });
return;
}
if (cloudManaged && !(await isWithinBundledPluginRoot(validated.canonicalPath))) {
res.status(403).json({
error:View on GitHub (pinned to a7e689b3c3)
Solutions
- This is an authorization rule, not a bug: perform the action with an actor that satisfies the stated constraint (board user, the owning agent, or an in-scope resource).
- If access should be allowed, verify the actor's credentials/company scope and the resource's ownership before retrying.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at server/src/routes/plugins.ts:1163 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of paperclipai/paperclip@a7e689b3c3 (2026-08-18).
Data as JSON: /api/errors/1b36d4d1b148a490.
Report an issue: GitHub.