{"record":{"id":"4e46c4e962ad984b","repo":"paperclipai/paperclip","slug":"worker-entrypoint-not-found-for-plugin-plugin-p","errorCode":null,"errorMessage":"Worker entrypoint not found for plugin \"${plugin.pluginKey}\". Checked: ${path.resolve(packageDir, workerRelPath)}, ${path.resolve(directDir, workerRelPath)}","messagePattern":"Worker entrypoint not found for plugin \"(.+?)\"\\. Checked: (.+?), (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/src/services/plugin-loader.ts","lineNumber":2560,"sourceCode":" * also the package directory if it was a local-path install.\n *\n * @see PLUGIN_SPEC.md §10 — Package Contract\n */\nfunction resolveWorkerEntrypoint(\n  plugin: PluginRecord & { packagePath?: string | null },\n  localPluginDir: string,\n): string {\n  const manifest = plugin.manifestJson;\n  const workerRelPath = manifest.entrypoints.worker;\n\n  // For local-path installs we persist the resolved package path; use it first\n  if (plugin.packagePath && existsSync(plugin.packagePath)) {\n    const entrypoint = path.resolve(plugin.packagePath, workerRelPath);\n    if (entrypoint.startsWith(path.resolve(plugin.packagePath)) && existsSync(entrypoint)) {\n      return entrypoint;\n    }\n  }\n\n  // Try the local plugin directory (standard npm install location)\n  const packageName = plugin.packageName;\n  let packageDir: string;\n\n  if (packageName.startsWith(\"@\")) {\n    // Scoped package: @scope/plugin-name → localPluginDir/node_modules/@scope/plugin-name\n    const [scope, name] = packageName.split(\"/\");\n    packageDir = path.join(localPluginDir, \"node_modules\", scope!, name!);\n  } else {\n    packageDir = path.join(localPluginDir, \"node_modules\", packageName);\n  }\n\n  // Also check if the package exists directly under localPluginDir\n  // (for direct local-path installs or symlinked packages)\n  const directDir = path.join(localPluginDir, packageName);\n\n  // Try in order: node_modules path, direct path\n  for (const dir of [packageDir, directDir]) {","sourceCodeStart":2542,"sourceCodeEnd":2578,"githubUrl":"https://github.com/paperclipai/paperclip/blob/3f1d897a7c018d76563a21c6e39c3c9b03933622/server/src/services/plugin-loader.ts#L2542-L2578","documentation":"Entrypoint resolution failure: the manifest's worker path was checked under the package dir and direct dir (with path-traversal protection) and existsSync failed for each candidate, and it is not an absolute existing path either. The plugin's missing/misdeclared worker entrypoint is at fault.","triggerScenarios":"Thrown at server/src/services/plugin-loader.ts:2557 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Build the plugin so the worker entrypoint exists at one of the checked paths, or fix the worker path in the manifest/package layout."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"3f1d897a7c018d76563a21c6e39c3c9b03933622","analyzedAt":"2026-08-18T22:49:45.177Z","contentChangedAt":"2026-08-18T22:49:45.177Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}