{
  "$schema": "https://cliphub.fyi/registry/index.schema.json",
  "generatedAt": "2026-06-04T23:26:06.763Z",
  "plugins": [
    {
      "slug": "plugin-daytona",
      "npmPackage": "@paperclipai/plugin-daytona",
      "addedBy": "lacymorrow",
      "category": "provider",
      "sourceRepo": "https://github.com/paperclipai/paperclip",
      "version": "2026.529.0",
      "latestVersion": "2026.529.0",
      "manifest": {
        "id": "paperclip.daytona-sandbox-provider",
        "apiVersion": 1,
        "version": "0.1.0",
        "displayName": "Daytona Sandbox Provider",
        "description": "First-party sandbox provider plugin that provisions Daytona sandboxes as Paperclip execution environments.",
        "author": "Paperclip",
        "categories": [
          "automation"
        ],
        "capabilities": [
          "environment.drivers.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js"
        },
        "environmentDrivers": [
          {
            "driverKey": "daytona",
            "kind": "sandbox_provider",
            "displayName": "Daytona Sandbox",
            "description": "Provisions Daytona sandboxes with configurable image or snapshot selection, startup timeouts, and lease reuse.",
            "configSchema": {
              "type": "object",
              "properties": {
                "apiKey": {
                  "type": "string",
                  "format": "secret-ref",
                  "description": "Environment-specific Daytona API key. Paste a key or an existing Paperclip secret reference; saved environments store pasted values as company secrets. Falls back to DAYTONA_API_KEY if omitted."
                },
                "apiUrl": {
                  "type": "string",
                  "description": "Optional Daytona API base URL. If omitted, the Daytona SDK uses its configured default endpoint."
                },
                "target": {
                  "type": "string",
                  "description": "Optional Daytona target/region identifier."
                },
                "snapshot": {
                  "type": "string",
                  "description": "Optional Daytona snapshot name to start from."
                },
                "image": {
                  "type": "string",
                  "description": "Optional base image or Daytona Image reference. If set, the sandbox is created from this image instead of a snapshot."
                },
                "language": {
                  "type": "string",
                  "description": "Optional Daytona language hint for direct code execution. If omitted, Daytona uses its default runtime."
                },
                "cpu": {
                  "type": "number",
                  "description": "Optional CPU allocation in cores."
                },
                "memory": {
                  "type": "number",
                  "description": "Optional memory allocation in GiB."
                },
                "disk": {
                  "type": "number",
                  "description": "Optional disk allocation in GiB."
                },
                "gpu": {
                  "type": "number",
                  "description": "Optional GPU allocation in units."
                },
                "timeoutMs": {
                  "type": "number",
                  "description": "Timeout for Daytona create/start/stop/execute operations in milliseconds.",
                  "default": 300000
                },
                "autoStopInterval": {
                  "type": "number",
                  "description": "Optional Daytona auto-stop interval in minutes. `0` disables auto-stop."
                },
                "autoArchiveInterval": {
                  "type": "number",
                  "description": "Optional Daytona auto-archive interval in minutes. `0` uses Daytona's max interval."
                },
                "autoDeleteInterval": {
                  "type": "number",
                  "description": "Optional Daytona auto-delete interval in minutes. `-1` disables auto-delete and `0` deletes immediately after stop."
                },
                "reuseLease": {
                  "type": "boolean",
                  "description": "Whether to stop and later resume the sandbox across runs instead of deleting it on release.",
                  "default": false
                }
              }
            }
          }
        ]
      },
      "installs": 2411,
      "installCommand": "npx paperclipai@latest plugin install @paperclipai/plugin-daytona",
      "resolvedAt": "2026-06-02T07:54:55.767Z"
    },
    {
      "slug": "plugin-exe-dev",
      "npmPackage": "@paperclipai/plugin-exe-dev",
      "addedBy": "lacymorrow",
      "category": "provider",
      "sourceRepo": "https://github.com/paperclipai/paperclip",
      "version": "2026.529.0",
      "latestVersion": "2026.529.0",
      "manifest": {
        "id": "paperclip.exe-dev-sandbox-provider",
        "apiVersion": 1,
        "version": "0.1.1",
        "displayName": "exe.dev Sandbox Provider",
        "description": "Sandbox provider plugin that provisions exe.dev VMs as Paperclip execution environments.",
        "author": "Paperclip",
        "categories": [
          "automation"
        ],
        "capabilities": [
          "environment.drivers.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js"
        },
        "environmentDrivers": [
          {
            "driverKey": "exe-dev",
            "kind": "sandbox_provider",
            "displayName": "exe.dev VM",
            "description": "Provisions exe.dev VMs through the HTTPS API, then runs commands over direct SSH for long-lived Paperclip workloads.",
            "configSchema": {
              "type": "object",
              "properties": {
                "apiKey": {
                  "type": "string",
                  "format": "secret-ref",
                  "description": "Paste your exe.dev API token, or pick a saved Paperclip secret. Create one at exe.dev → Settings → API tokens with `/exec` scope (`new`, `ls`, `rm`)."
                },
                "sshPrivateKey": {
                  "type": "string",
                  "format": "secret-ref",
                  "maxLength": 8192,
                  "description": "Paste the SSH private key you registered with exe.dev, or pick a saved secret. Leave blank to fall back to an on-host key (see Advanced → SSH access)."
                },
                "sshUser": {
                  "type": "string",
                  "description": "Login user on the VM. Leave blank to use the image default, usually `root`.",
                  "x-paperclip-advanced": true,
                  "x-paperclip-group": "SSH access"
                },
                "sshIdentityFile": {
                  "type": "string",
                  "description": "Absolute path to a private key on the Paperclip host. Used only when SSH Private Key is empty.",
                  "x-paperclip-advanced": true,
                  "x-paperclip-group": "SSH access"
                },
                "sshPort": {
                  "type": "number",
                  "description": "SSH port for direct VM access.",
                  "default": 22,
                  "x-paperclip-advanced": true,
                  "x-paperclip-group": "SSH access"
                },
                "strictHostKeyChecking": {
                  "type": "string",
                  "description": "Host key policy passed to ssh via StrictHostKeyChecking. Typical values are `accept-new`, `yes`, or `no`.",
                  "default": "accept-new",
                  "x-paperclip-advanced": true,
                  "x-paperclip-group": "SSH access"
                },
                "image": {
                  "type": "string",
                  "description": "Optional container image to use when creating the VM.",
                  "x-paperclip-advanced": true,
                  "x-paperclip-group": "VM resources"
                },
                "cpu": {
                  "type": "number",
                  "description": "Optional CPU count passed to `exe.dev new --cpu`.",
                  "x-paperclip-advanced": true,
                  "x-paperclip-group": "VM resources"
                },
                "memory": {
                  "type": "string",
                  "description": "Optional memory size such as `4GB`.",
                  "x-paperclip-advanced": true,
                  "x-paperclip-group": "VM resources"
                },
                "disk": {
                  "type": "string",
                  "description": "Optional disk size such as `20GB`.",
                  "x-paperclip-advanced": true,
                  "x-paperclip-group": "VM resources"
                },
                "command": {
                  "type": "string",
                  "description": "Optional container command passed to `exe.dev new --command`.",
                  "x-paperclip-advanced": true,
                  "x-paperclip-group": "VM creation"
                },
                "env": {
                  "type": "object",
                  "description": "Optional environment variables applied at VM creation time.",
                  "additionalProperties": {
                    "type": "string"
                  },
                  "x-paperclip-advanced": true,
                  "x-paperclip-group": "VM creation"
                },
                "integrations": {
                  "type": "array",
                  "description": "Optional exe.dev integrations to attach during VM creation.",
                  "items": {
                    "type": "string"
                  },
                  "x-paperclip-advanced": true,
                  "x-paperclip-group": "VM creation"
                },
                "tags": {
                  "type": "array",
                  "description": "Optional tags to apply during VM creation.",
                  "items": {
                    "type": "string"
                  },
                  "x-paperclip-advanced": true,
                  "x-paperclip-group": "VM creation"
                },
                "setupScript": {
                  "type": "string",
                  "description": "Optional first-boot setup script passed to `exe.dev new --setup-script`.",
                  "x-paperclip-advanced": true,
                  "x-paperclip-group": "VM creation"
                },
                "prompt": {
                  "type": "string",
                  "description": "Optional Shelley prompt passed to `exe.dev new --prompt`.",
                  "x-paperclip-advanced": true,
                  "x-paperclip-group": "VM creation"
                },
                "comment": {
                  "type": "string",
                  "description": "Optional short note attached to created VMs.",
                  "x-paperclip-advanced": true,
                  "x-paperclip-group": "VM creation"
                },
                "namePrefix": {
                  "type": "string",
                  "description": "Optional prefix used when generating VM names.",
                  "default": "paperclip",
                  "x-paperclip-advanced": true,
                  "x-paperclip-group": "VM creation"
                },
                "apiUrl": {
                  "type": "string",
                  "description": "Optional exe.dev HTTPS API base URL or /exec endpoint. Defaults to https://exe.dev/exec.",
                  "x-paperclip-advanced": true,
                  "x-paperclip-group": "API + runtime"
                },
                "timeoutMs": {
                  "type": "number",
                  "description": "Timeout for VM lifecycle and SSH operations in milliseconds.",
                  "default": 300000,
                  "x-paperclip-advanced": true,
                  "x-paperclip-group": "API + runtime"
                },
                "reuseLease": {
                  "type": "boolean",
                  "description": "Whether to keep the VM alive between runs instead of deleting it on release.",
                  "default": false,
                  "x-paperclip-advanced": true,
                  "x-paperclip-group": "API + runtime"
                }
              }
            }
          }
        ]
      },
      "installs": 2364,
      "installCommand": "npx paperclipai@latest plugin install @paperclipai/plugin-exe-dev",
      "resolvedAt": "2026-06-02T07:54:56.466Z"
    },
    {
      "slug": "plugin-e2b",
      "npmPackage": "@paperclipai/plugin-e2b",
      "addedBy": "lacymorrow",
      "category": "tools",
      "sourceRepo": "https://github.com/paperclipai/paperclip",
      "version": "2026.529.0",
      "latestVersion": "2026.529.0",
      "manifest": {
        "id": "paperclip.e2b-sandbox-provider",
        "apiVersion": 1,
        "version": "0.1.0",
        "displayName": "E2B Sandbox Provider",
        "description": "First-party sandbox provider plugin that provisions E2B cloud sandboxes as Paperclip execution environments.",
        "author": "Paperclip",
        "categories": [
          "automation"
        ],
        "capabilities": [
          "environment.drivers.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js"
        },
        "environmentDrivers": [
          {
            "driverKey": "e2b",
            "kind": "sandbox_provider",
            "displayName": "E2B Cloud Sandbox",
            "description": "Provisions E2B cloud sandboxes with configurable templates, timeouts, and lease reuse.",
            "configSchema": {
              "type": "object",
              "properties": {
                "template": {
                  "type": "string",
                  "description": "E2B sandbox template name. Defaults to base when omitted.",
                  "default": "base"
                },
                "apiKey": {
                  "type": "string",
                  "format": "secret-ref",
                  "description": "Environment-specific E2B API key. Paste a key or an existing Paperclip secret reference; saved environments store pasted values as company secrets. Falls back to E2B_API_KEY if omitted."
                },
                "timeoutMs": {
                  "type": "number",
                  "description": "Sandbox lifetime in milliseconds, refreshed on each command. Defaults to 1 hour. Raise this if your runs commonly idle longer than the default between commands.",
                  "default": 3600000
                },
                "reuseLease": {
                  "type": "boolean",
                  "description": "Whether to pause and reuse sandboxes across runs.",
                  "default": false
                }
              }
            }
          }
        ]
      },
      "installs": 2323,
      "installCommand": "npx paperclipai@latest plugin install @paperclipai/plugin-e2b",
      "resolvedAt": "2026-05-01T00:00:00Z"
    },
    {
      "slug": "plugin-modal",
      "npmPackage": "@paperclipai/plugin-modal",
      "addedBy": "lacymorrow",
      "category": "provider",
      "sourceRepo": "https://github.com/paperclipai/paperclip",
      "version": "2026.529.0",
      "latestVersion": "2026.529.0",
      "manifest": {
        "id": "paperclip.modal-sandbox-provider",
        "apiVersion": 1,
        "version": "0.1.0",
        "displayName": "Modal Sandbox Provider",
        "description": "First-party sandbox provider plugin that provisions Modal sandboxes as Paperclip execution environments.",
        "author": "Paperclip",
        "categories": [
          "automation"
        ],
        "capabilities": [
          "environment.drivers.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js"
        },
        "environmentDrivers": [
          {
            "driverKey": "modal",
            "kind": "sandbox_provider",
            "displayName": "Modal Sandbox",
            "description": "Provisions Modal sandboxes with configurable image, app, auth, timeouts, and network controls.",
            "configSchema": {
              "type": "object",
              "required": [
                "appName",
                "image"
              ],
              "properties": {
                "appName": {
                  "type": "string",
                  "description": "Modal App name used as the parent for sandboxes. The plugin calls `modal.apps.fromName(appName, { createIfMissing: true })`, so the App is created on first acquire if it does not already exist."
                },
                "image": {
                  "type": "string",
                  "description": "Container image reference passed to `modal.images.fromRegistry()`, e.g. `python:3.13` or `node:20`."
                },
                "tokenId": {
                  "type": "string",
                  "format": "secret-ref",
                  "description": "Modal token ID. Paste a token or an existing Paperclip secret reference; saved environments store pasted values as company secrets. Required."
                },
                "tokenSecret": {
                  "type": "string",
                  "format": "secret-ref",
                  "description": "Modal token secret paired with tokenId. Required."
                },
                "environment": {
                  "type": "string",
                  "description": "Optional Modal environment name. Falls back to the SDK profile default."
                },
                "workdir": {
                  "type": "string",
                  "description": "Remote working directory inside the sandbox.",
                  "default": "/workspace/paperclip"
                },
                "sandboxTimeoutMs": {
                  "type": "number",
                  "description": "Maximum sandbox lifetime in milliseconds. Must be a positive multiple of 1000 between 1000 and 86400000 (24 hours).",
                  "default": 3600000
                },
                "idleTimeoutMs": {
                  "type": "number",
                  "description": "Optional idle timeout in milliseconds. When set, Modal terminates the sandbox if no exec is active for this duration. Must be a positive multiple of 1000."
                },
                "execTimeoutMs": {
                  "type": "number",
                  "description": "Default per-exec timeout in milliseconds when the caller does not provide one. Must be a positive multiple of 1000.",
                  "default": 300000
                },
                "blockNetwork": {
                  "type": "boolean",
                  "description": "Whether to block all egress network access from the sandbox.",
                  "default": false
                },
                "cidrAllowlist": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Optional list of CIDRs the sandbox is allowed to reach. Cannot be combined with blockNetwork."
                },
                "reuseLease": {
                  "type": "boolean",
                  "description": "When true, the sandbox is detached (not terminated) on release and resumed by id later. Reuse relies on Modal's sandbox lifetime and idle timeout because Modal has no separate pause primitive.",
                  "default": false
                }
              }
            }
          }
        ]
      },
      "installs": 2311,
      "installCommand": "npx paperclipai@latest plugin install @paperclipai/plugin-modal",
      "resolvedAt": "2026-06-02T07:54:57.152Z"
    },
    {
      "slug": "plugin-cloudflare-sandbox",
      "npmPackage": "@paperclipai/plugin-cloudflare-sandbox",
      "addedBy": "lacymorrow",
      "category": "provider",
      "sourceRepo": "https://github.com/paperclipai/paperclip",
      "version": "2026.529.0",
      "latestVersion": "2026.529.0",
      "manifest": {
        "id": "paperclip.cloudflare-sandbox-provider",
        "apiVersion": 1,
        "version": "0.1.0",
        "displayName": "Cloudflare Sandbox Provider",
        "description": "First-party sandbox provider plugin that provisions Cloudflare sandboxes through an operator-deployed Worker bridge.",
        "author": "Paperclip",
        "categories": [
          "automation"
        ],
        "capabilities": [
          "environment.drivers.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js"
        },
        "environmentDrivers": [
          {
            "driverKey": "cloudflare",
            "kind": "sandbox_provider",
            "displayName": "Cloudflare Sandbox",
            "description": "Runs Paperclip sandbox environments through a Cloudflare Worker bridge backed by the Sandbox SDK and Durable Objects.",
            "configSchema": {
              "type": "object",
              "properties": {
                "bridgeBaseUrl": {
                  "type": "string",
                  "format": "uri",
                  "description": "Base URL of the operator-deployed Cloudflare Worker bridge."
                },
                "bridgeAuthToken": {
                  "type": "string",
                  "format": "secret-ref",
                  "description": "Bearer token used by the provider plugin when calling the Cloudflare bridge. Pasted values are stored as company secrets."
                },
                "reuseLease": {
                  "type": "boolean",
                  "default": false,
                  "description": "Reuse a sandbox by environment ID instead of creating one per run."
                },
                "keepAlive": {
                  "type": "boolean",
                  "default": false,
                  "description": "Prevent Cloudflare from idling the container between requests."
                },
                "sleepAfter": {
                  "type": "string",
                  "default": "1h",
                  "description": "Idle timeout passed to getSandbox() on lease creation. Defaults to 1 hour so a fresh sandbox survives normal Claude/Codex heartbeats. Ignored when keepAlive is true."
                },
                "normalizeId": {
                  "type": "boolean",
                  "default": true,
                  "description": "Lowercase and normalize sandbox IDs for operator-friendly naming."
                },
                "requestedCwd": {
                  "type": "string",
                  "default": "/workspace/paperclip",
                  "description": "Workspace directory to create inside the sandbox lease."
                },
                "sessionStrategy": {
                  "type": "string",
                  "enum": [
                    "named",
                    "default"
                  ],
                  "default": "named",
                  "description": "Whether to run commands in a stable named session or the default session."
                },
                "sessionId": {
                  "type": "string",
                  "default": "paperclip",
                  "description": "Named Cloudflare session ID used when sessionStrategy is named."
                },
                "timeoutMs": {
                  "type": "number",
                  "default": 300000,
                  "description": "Default per-command timeout passed through to the bridge."
                },
                "bridgeRequestTimeoutMs": {
                  "type": "number",
                  "default": 30000,
                  "description": "HTTP timeout for plugin-to-bridge requests."
                },
                "previewHostname": {
                  "type": "string",
                  "description": "Optional hostname reserved for future preview URL support."
                }
              },
              "required": [
                "bridgeBaseUrl",
                "bridgeAuthToken"
              ]
            }
          }
        ]
      },
      "installs": 2291,
      "installCommand": "npx paperclipai@latest plugin install @paperclipai/plugin-cloudflare-sandbox",
      "resolvedAt": "2026-06-02T07:54:55.089Z"
    },
    {
      "slug": "file-browser",
      "npmPackage": "@jk3labs/file-browser",
      "addedBy": "lacymorrow",
      "category": "tools",
      "version": "0.1.3",
      "latestVersion": "0.1.3",
      "manifest": {
        "id": "jkl.file-browser",
        "apiVersion": 1,
        "version": "0.1.3",
        "displayName": "JKL File Browser",
        "description": "A file browser plugin for Paperclip workspaces",
        "author": "Plugin Author",
        "categories": [
          "workspace"
        ],
        "capabilities": [
          "events.subscribe",
          "plugin.state.read",
          "plugin.state.write",
          "local.folders",
          "ui.dashboardWidget.register",
          "ui.detailTab.register",
          "api.routes.register",
          "project.workspaces.read"
        ],
        "localFolders": [
          {
            "folderKey": "workspace",
            "displayName": "Workspace Root",
            "description": "Root directory of the project workspace to browse files",
            "access": "read"
          }
        ],
        "apiRoutes": [
          {
            "routeKey": "list-files",
            "method": "GET",
            "path": "/files/list",
            "auth": "board-or-agent",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "query",
              "key": "companyId"
            }
          },
          {
            "routeKey": "download-file",
            "method": "GET",
            "path": "/files/download",
            "auth": "board-or-agent",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "query",
              "key": "companyId"
            }
          },
          {
            "routeKey": "download-zip",
            "method": "GET",
            "path": "/files/zip",
            "auth": "board-or-agent",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "query",
              "key": "companyId"
            }
          }
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "ui": {
          "slots": [
            {
              "type": "dashboardWidget",
              "id": "file-browser-widget",
              "displayName": "JKL File Browser",
              "exportName": "DashboardWidget"
            },
            {
              "type": "detailTab",
              "id": "file-browser-tab",
              "displayName": "Files",
              "exportName": "FileBrowserTab",
              "entityTypes": [
                "project"
              ],
              "order": 50
            }
          ]
        }
      },
      "installs": 395,
      "installCommand": "npx paperclipai@latest plugin install @jk3labs/file-browser",
      "resolvedAt": "2026-06-02T07:55:13.632Z"
    },
    {
      "slug": "paperclip-plugin-agentmemory",
      "npmPackage": "@gaud_erp/paperclip-plugin-agentmemory",
      "addedBy": "lacymorrow",
      "category": "memory",
      "sourceRepo": "https://github.com/gauderp/paperclip-plugin-agentmemory",
      "version": "0.6.0",
      "latestVersion": "0.6.0",
      "manifest": {
        "id": "customizar.agentmemory",
        "apiVersion": 1,
        "version": "0.6.0",
        "displayName": "Agent Memory",
        "description": "Memory-as-Skill system for Paperclip agents. Persistent recall, observation, and search with token budget enforcement.",
        "author": "paperclip-plugin-agentmemory contributors",
        "categories": [
          "connector"
        ],
        "capabilities": [
          "http.outbound",
          "plugin.state.read",
          "plugin.state.write",
          "instance.settings.register",
          "companies.read",
          "agent.tools.register",
          "agents.managed",
          "skills.managed",
          "jobs.schedule",
          "events.subscribe",
          "ui.dashboardWidget.register",
          "ui.action.register",
          "secrets.read-ref",
          "activity.log.write",
          "events.emit"
        ],
        "tools": [
          {
            "name": "memory-recall",
            "displayName": "Memory Recall",
            "description": "Recall relevant context from persistent memory before starting a task.",
            "parametersSchema": {
              "type": "object",
              "required": [
                "query"
              ],
              "properties": {
                "query": {
                  "type": "string",
                  "description": "Description of what you're about to do"
                },
                "project": {
                  "type": "string",
                  "description": "Project name for scoped search"
                },
                "maxTokens": {
                  "type": "number",
                  "description": "Max tokens for context (defaults to budget)"
                }
              }
            }
          },
          {
            "name": "memory-observe",
            "displayName": "Memory Observe",
            "description": "Store an observation — decision, discovery, pattern, or failure — into persistent memory.",
            "parametersSchema": {
              "type": "object",
              "required": [
                "observation",
                "category"
              ],
              "properties": {
                "observation": {
                  "type": "string",
                  "description": "The insight to remember (1-3 sentences)"
                },
                "category": {
                  "type": "string",
                  "enum": [
                    "decision",
                    "discovery",
                    "pattern",
                    "failure"
                  ],
                  "description": "Type of observation"
                },
                "project": {
                  "type": "string",
                  "description": "Project name"
                }
              }
            }
          },
          {
            "name": "memory-search",
            "displayName": "Memory Search",
            "description": "Search persistent memory for specific information — use when checking if something was tried before.",
            "parametersSchema": {
              "type": "object",
              "required": [
                "query"
              ],
              "properties": {
                "query": {
                  "type": "string",
                  "description": "What to search for"
                },
                "project": {
                  "type": "string",
                  "description": "Project name for scoped search"
                },
                "limit": {
                  "type": "number",
                  "description": "Max results (default 10)"
                }
              }
            }
          },
          {
            "name": "memory-forget",
            "displayName": "Memory Forget",
            "description": "Remove a specific memory that is outdated or incorrect.",
            "parametersSchema": {
              "type": "object",
              "required": [
                "memoryId"
              ],
              "properties": {
                "memoryId": {
                  "type": "string",
                  "description": "ID of the memory to remove (from recall/search results)"
                },
                "reason": {
                  "type": "string",
                  "description": "Why this memory is being removed"
                }
              }
            }
          }
        ],
        "skills": [
          {
            "skillKey": "agent-memory",
            "displayName": "Agent Memory",
            "description": "Teaches agents to use persistent memory — recall context, observe decisions, search history.",
            "markdown": "# Agent Memory Protocol\n\nYou have access to persistent memory tools. Memory context is managed both automatically and manually.\n\n## Automatic behavior (no action needed)\n- **Auto-recall:** Memory context is loaded automatically at the start of each run. You receive prior decisions, known patterns, and past failures relevant to your current task.\n- **Auto-observe:** A summary of your work is recorded automatically at the end of each run.\n\n## When to use tools manually\n\n### memory-recall\nUse `memory-recall` only when you need context NOT covered by the auto-loaded memory:\n- Searching for something specific from a different project\n- Narrowing down to a particular topic mid-task\n\n### memory-observe\nUse `memory-observe` during work for **high-value insights only**:\n- Made an architectural decision? → category `\"decision\"`\n- Something failed unexpectedly? → category `\"failure\"`\n- Discovered something non-obvious? → category `\"discovery\"`\n- Identified a recurring pattern? → category `\"pattern\"`\n\nBasic run summaries are captured automatically — only observe what the auto-summary would miss.\n\n### memory-search\n- \"Have we tried this before?\" → `memory-search` before investigating from scratch\n- \"How did we solve X last time?\" → `memory-search` with relevant context\n\n### memory-forget\n- Recall returned something outdated or wrong? → `memory-forget` with the memoryId from the result\n- Then observe the correct information with `memory-observe`\n- Search results and recall results include a `source` field — use it as the memoryId for forget\n\n## Project scoping\n- Project context is injected automatically from your current run context\n- You do NOT need to pass the `project` parameter unless targeting a different project\n- To search across all projects, pass `project: \"*\"`\n\n## Rules\n- Do NOT observe trivial information (imports, boilerplate, obvious code)\n- Do NOT observe entire code — observe the decision or insight behind it\n- Prefer short, dense observations (1-3 sentences)\n- The recall tool already respects token budget — trust the result and use it\n- When recall returns relevant context, reference it in your work\n"
          },
          {
            "skillKey": "memory-reflection",
            "displayName": "Memory Reflection",
            "description": "Guides agents through retrospective analysis of decisions and failures at milestone completion.",
            "markdown": "# Memory Reflection Protocol\n\nRun this retrospective when a milestone, sprint, or major feature is completed.\n\n## Steps\n\n1. **Gather failures:**\n   Call `memory-search` with a query targeting failures in this project.\n   Review each failure — what went wrong and what was the root cause?\n\n2. **Gather decisions:**\n   Call `memory-search` with a query targeting decisions in this project.\n   List the key architectural and design decisions made.\n\n3. **Cross-reference:**\n   Which decisions contributed to failures?\n   Which decisions prevented failures or worked well?\n   Are there recurring failure patterns across multiple tasks?\n\n4. **Synthesize:**\n   Write a consolidated insight as a `memory-observe` with category `\"pattern\"`.\n   Focus on actionable takeaways, not a narrative.\n   Example: \"Pattern: skipping integration tests before DB migrations led to 3 production rollbacks. Always run migration tests against a staging copy first.\"\n\n5. **Report:**\n   Present the reflection summary to the user with:\n   - Total failures reviewed\n   - Total decisions reviewed\n   - Key patterns identified\n   - Recommended changes\n\n## Rules\n- Be ruthlessly specific — \"improve testing\" is not a pattern, \"add integration tests for migration scripts\" is\n- One observation per pattern — don't dump everything into one\n- If no meaningful patterns emerge, say so — don't fabricate insights\n"
          }
        ],
        "jobs": [
          {
            "jobKey": "curator-cycle",
            "displayName": "Memory Curator Cycle",
            "description": "Consolidates observations, compresses history, cleans expired data.",
            "schedule": "0 */6 * * *"
          }
        ],
        "agents": [
          {
            "agentKey": "memory-curator",
            "displayName": "Memory Curator",
            "role": "memory-maintenance",
            "title": "Memory Curator Agent",
            "capabilities": "Consolidates observations into crystals, compresses history, cleans expired data, maintains knowledge graph.",
            "instructions": {
              "content": "# Memory Curator\n\nYou maintain the memory base clean and useful. You run automatically on a schedule and after issues are completed.\n\n## Periodic routine\n1. List unconsolidated observations from the last 7 days\n2. Group by project and category\n3. Consolidate groups with 5+ observations into crystals\n4. Extract entities/relations for the knowledge graph (if enabled)\n5. Apply auto-forget on observations older than the configured threshold that are already consolidated\n6. Garbage-collect sketches not promoted within the configured TTL\n\n## After issue completed\n1. Consolidate observations from the issue into a summary crystal\n2. Promote relevant sketches to permanent memory\n3. Discard irrelevant sketches\n\n## Rules\n- NEVER delete user manual memories\n- Consolidate, don't erase — compressed information is better than lost information\n- Prioritize \"failure\" and \"decision\" crystals (they have the highest value for future work)\n- Log what you consolidated and cleaned for auditability\n"
            }
          }
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "ui": {
          "slots": [
            {
              "type": "dashboardWidget",
              "id": "health-widget",
              "displayName": "Agent Memory Health",
              "exportName": "DashboardWidget"
            },
            {
              "type": "dashboardWidget",
              "id": "stats-widget",
              "displayName": "Agent Memory Stats",
              "exportName": "StatsWidget"
            },
            {
              "type": "settingsPage",
              "id": "settings",
              "displayName": "Agent Memory",
              "exportName": "SettingsPage"
            }
          ]
        }
      },
      "installs": 320,
      "installCommand": "npx paperclipai@latest plugin install @gaud_erp/paperclip-plugin-agentmemory",
      "resolvedAt": "2026-06-02T07:54:53.642Z"
    },
    {
      "slug": "paperclip-plugin-gsd",
      "npmPackage": "@codewithahsan/paperclip-plugin-gsd",
      "addedBy": "lacymorrow",
      "category": "integration",
      "sourceRepo": "https://github.com/AhsanAyaz/paperclip-plugin-gsd",
      "version": "0.1.0",
      "latestVersion": "0.1.2",
      "manifest": {
        "id": "paperclip.gsd",
        "apiVersion": 1,
        "version": "0.1.0",
        "displayName": "GSD — Get Shit Done",
        "description": "Bridges GSD planning workflows with Paperclip. Syncs phases, milestones, and progress from agent workspaces into Paperclip issues and UI.",
        "author": "Paperclip",
        "categories": [
          "workspace",
          "automation"
        ],
        "capabilities": [
          "events.subscribe",
          "jobs.schedule",
          "plugin.state.read",
          "plugin.state.write",
          "companies.read",
          "projects.read",
          "project.workspaces.read",
          "issues.read",
          "issues.update",
          "issue.comments.read",
          "issue.comments.create",
          "agents.read",
          "ui.dashboardWidget.register",
          "ui.detailTab.register",
          "ui.action.register",
          "instance.settings.register",
          "activity.log.write"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "autoSyncEnabled": {
              "type": "boolean",
              "title": "Enable auto-sync",
              "description": "Periodically sync GSD state from project workspaces",
              "default": true
            },
            "syncIntervalSeconds": {
              "type": "number",
              "title": "Sync interval (seconds)",
              "description": "How often to check for GSD changes (minimum 10)",
              "default": 30,
              "minimum": 10,
              "maximum": 600
            }
          }
        },
        "jobs": [
          {
            "jobKey": "periodic-sync",
            "displayName": "Periodic GSD Sync"
          }
        ],
        "ui": {
          "slots": [
            {
              "type": "dashboardWidget",
              "id": "gsd-overview",
              "displayName": "GSD Progress",
              "exportName": "GsdDashboardWidget"
            },
            {
              "type": "detailTab",
              "id": "gsd-project-tab",
              "displayName": "GSD",
              "exportName": "GsdProjectTab",
              "entityTypes": [
                "project"
              ]
            },
            {
              "type": "detailTab",
              "id": "gsd-issue-tab",
              "displayName": "GSD Phase",
              "exportName": "GsdIssueTab",
              "entityTypes": [
                "issue"
              ]
            },
            {
              "type": "toolbarButton",
              "id": "gsd-sync-btn",
              "displayName": "Sync GSD",
              "exportName": "GsdSyncButton",
              "entityTypes": [
                "project"
              ]
            },
            {
              "type": "settingsPage",
              "id": "gsd-settings",
              "displayName": "GSD Settings",
              "exportName": "GsdSettingsPage"
            }
          ]
        }
      },
      "installs": 245,
      "installCommand": "npx paperclipai@latest plugin install @codewithahsan/paperclip-plugin-gsd",
      "resolvedAt": "2026-06-02T07:55:02.391Z"
    },
    {
      "slug": "magneto-ai-paperclip-plugin",
      "npmPackage": "@magneto-ai/paperclip-plugin",
      "addedBy": "lacymorrow",
      "category": "tools",
      "version": "0.1.2",
      "latestVersion": "0.1.2",
      "manifest": {
        "id": "magneto-ai",
        "apiVersion": 1,
        "version": "0.1.2",
        "displayName": "Magneto AI",
        "description": "Paperclip plugin for Magneto AI - exposes power skills as agent tools with hierarchical governance, approval bridge, and tamper-evident audit logging.",
        "author": "Magneto AI Contributors",
        "categories": [
          "automation",
          "connector"
        ],
        "capabilities": [
          "agent.tools.register",
          "events.subscribe",
          "events.emit",
          "activity.log.write",
          "plugin.state.read",
          "plugin.state.write"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js"
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "magnetoPath": {
              "type": "string",
              "title": "Magneto CLI Path",
              "description": "Path to magneto CLI executable",
              "default": "magneto"
            },
            "defaultSprintId": {
              "type": "string",
              "title": "Default Sprint ID",
              "description": "Default sprint ID for artifact storage"
            },
            "syncAudit": {
              "type": "boolean",
              "title": "Sync Audit Log",
              "description": "Enable audit log sync to Paperclip Activity",
              "default": true
            },
            "auditSyncIntervalMs": {
              "type": "number",
              "title": "Audit Sync Interval (ms)",
              "description": "Audit sync interval in milliseconds",
              "default": 30000
            },
            "companyId": {
              "type": "string",
              "title": "Company ID",
              "description": "Company ID for audit entries"
            },
            "verbose": {
              "type": "boolean",
              "title": "Verbose Logging",
              "description": "Enable verbose logging",
              "default": false
            }
          }
        },
        "tools": [
          {
            "name": "magneto.think",
            "displayName": "Magneto Think",
            "description": "Structured thinking with chain-of-thought reasoning",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "prompt": {
                  "type": "string",
                  "description": "The problem to think through"
                },
                "sprint": {
                  "type": "string",
                  "description": "Sprint ID for artifacts"
                }
              },
              "required": [
                "prompt"
              ]
            }
          },
          {
            "name": "magneto.review",
            "displayName": "Magneto Review",
            "description": "Graph-aware code review with trace links",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "diff": {
                  "type": "string"
                },
                "base": {
                  "type": "string"
                },
                "sprint": {
                  "type": "string"
                }
              }
            }
          },
          {
            "name": "magneto.ship",
            "displayName": "Magneto Ship",
            "description": "Release automation: sync, test, PR, trace links",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "sprint": {
                  "type": "string"
                },
                "draft": {
                  "type": "boolean"
                },
                "skipTests": {
                  "type": "boolean"
                }
              }
            }
          },
          {
            "name": "magneto.audit",
            "displayName": "Magneto Audit",
            "description": "Read and verify tamper-evident audit log",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "tail": {
                  "type": "number"
                },
                "verify": {
                  "type": "boolean"
                },
                "sprint": {
                  "type": "string"
                }
              }
            }
          },
          {
            "name": "magneto.guard",
            "displayName": "Magneto Guard",
            "description": "Combined /careful + /freeze safety",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "paths": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "off": {
                  "type": "boolean"
                }
              },
              "required": [
                "paths"
              ]
            }
          },
          {
            "name": "magneto.trace",
            "displayName": "Magneto Trace",
            "description": "Requirement / design / code / test link graph",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "coverage": {
                  "type": "boolean"
                },
                "sprint": {
                  "type": "string"
                }
              }
            }
          },
          {
            "name": "magneto.codex.review",
            "displayName": "Magneto Codex Review",
            "description": "Multi-LLM code review with convergence scoring",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "diff": {
                  "type": "string"
                },
                "code": {
                  "type": "string"
                },
                "sprint": {
                  "type": "string"
                }
              }
            }
          },
          {
            "name": "magneto.plan-ceo-review",
            "displayName": "Magneto CEO Review",
            "description": "CEO-level business readiness review",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "plan": {
                  "type": "string"
                },
                "sprint": {
                  "type": "string"
                },
                "strict": {
                  "type": "boolean"
                }
              }
            }
          }
        ]
      },
      "installs": 164,
      "installCommand": "npx paperclipai@latest plugin install @magneto-ai/paperclip-plugin",
      "resolvedAt": "2026-06-02T07:55:09.135Z"
    },
    {
      "slug": "paperclip-plugin-telegram",
      "npmPackage": "paperclip-plugin-telegram",
      "addedBy": "lacymorrow",
      "category": "integration",
      "sourceRepo": "https://github.com/mvanhorn/paperclip-plugin-telegram",
      "version": "0.6.1",
      "latestVersion": "0.6.1",
      "manifest": {
        "id": "paperclip-plugin-telegram",
        "apiVersion": 1,
        "version": "0.3.0",
        "displayName": "Telegram Bot",
        "description": "Bidirectional Telegram integration: push notifications, bot commands, escalation to humans, multi-agent sessions (native + ACP), media pipeline with transcription, custom workflow commands, and proactive suggestion watches.",
        "author": "mvanhorn",
        "categories": [
          "connector",
          "automation"
        ],
        "capabilities": [
          "companies.read",
          "projects.read",
          "issues.read",
          "issues.create",
          "issues.update",
          "issue.comments.read",
          "issue.comments.create",
          "agents.read",
          "agents.invoke",
          "agent.sessions.create",
          "agent.sessions.list",
          "agent.sessions.send",
          "agent.sessions.close",
          "agent.tools.register",
          "events.subscribe",
          "events.emit",
          "plugin.state.read",
          "plugin.state.write",
          "http.outbound",
          "secrets.read-ref",
          "activity.log.write",
          "metrics.write",
          "jobs.schedule",
          "instance.settings.register",
          "ui.page.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "ui": {
          "slots": [
            {
              "type": "settingsPage",
              "id": "telegram-settings",
              "displayName": "Telegram Settings",
              "exportName": "TelegramSettingsPage"
            }
          ]
        },
        "jobs": [
          {
            "jobKey": "telegram-daily-digest",
            "displayName": "Telegram Digest",
            "description": "Send a summary of agent activity to Telegram (daily or bidaily).",
            "schedule": "0 * * * *"
          },
          {
            "jobKey": "check-escalation-timeouts",
            "displayName": "Check Escalation Timeouts",
            "description": "Check for timed-out escalations and apply default actions.",
            "schedule": "* * * * *"
          },
          {
            "jobKey": "check-watches",
            "displayName": "Check Proactive Watches",
            "description": "Evaluate registered watches and send suggestions when conditions are met.",
            "schedule": "*/15 * * * *"
          }
        ],
        "tools": [
          {
            "name": "escalate_to_human",
            "displayName": "Escalate to Human",
            "description": "Escalate a conversation to a human when you cannot handle it confidently",
            "parametersSchema": {
              "type": "object"
            }
          },
          {
            "name": "handoff_to_agent",
            "displayName": "Handoff to Agent",
            "description": "Hand off work to another agent in this thread",
            "parametersSchema": {
              "type": "object"
            }
          },
          {
            "name": "discuss_with_agent",
            "displayName": "Discuss with Agent",
            "description": "Start a back-and-forth conversation with another agent",
            "parametersSchema": {
              "type": "object"
            }
          },
          {
            "name": "register_watch",
            "displayName": "Register Watch",
            "description": "Register a proactive watch that monitors entities and sends suggestions",
            "parametersSchema": {
              "type": "object"
            }
          }
        ]
      },
      "installs": 156,
      "installCommand": "npx paperclipai@latest plugin install paperclip-plugin-telegram",
      "resolvedAt": "2026-04-10T00:00:00Z"
    },
    {
      "slug": "hindsight-paperclip",
      "npmPackage": "@vectorize-io/hindsight-paperclip",
      "addedBy": "lacymorrow",
      "category": "memory",
      "sourceRepo": "https://github.com/vectorize-io/hindsight",
      "version": "0.2.3",
      "latestVersion": "0.2.3",
      "manifest": {
        "id": "paperclip-plugin-hindsight",
        "apiVersion": 1,
        "version": "0.2.0",
        "displayName": "Hindsight Memory",
        "author": "Vectorize <support@vectorize.io>",
        "description": "Persistent long-term memory for Paperclip agents. Automatically recalls relevant context before each run and retains agent output after — so every agent gets smarter over time.",
        "categories": [
          "automation"
        ],
        "capabilities": [
          "events.subscribe",
          "agent.tools.register",
          "plugin.state.read",
          "plugin.state.write",
          "http.outbound",
          "secrets.read-ref",
          "agents.read",
          "issues.read",
          "issue.comments.read"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js"
        },
        "instanceConfigSchema": {
          "type": "object",
          "required": [
            "hindsightApiUrl"
          ],
          "properties": {
            "hindsightApiUrl": {
              "type": "string",
              "title": "Hindsight API URL",
              "description": "Base URL of your Hindsight instance. Defaults to Hindsight Cloud. Use http://localhost:8888 for self-hosted.",
              "default": "https://api.hindsight.vectorize.io"
            },
            "hindsightApiKeyRef": {
              "type": "string",
              "title": "Hindsight API Key (secret ref)",
              "description": "Name of the Paperclip secret holding your Hindsight Cloud API key. Leave empty for self-hosted."
            },
            "dynamicBankId": {
              "type": "boolean",
              "title": "Dynamic Bank ID",
              "description": "When true (default), bank ID is derived from bankGranularity. Set false and provide bankId to use a static shared bank.",
              "default": true
            },
            "bankId": {
              "type": "string",
              "title": "Static Bank ID",
              "description": "Static bank ID used when dynamicBankId is false. All agents sharing this value read/write the same memory bank."
            },
            "bankGranularity": {
              "type": "array",
              "title": "Bank Granularity",
              "description": "Controls memory isolation when dynamicBankId is true. Default ['company', 'agent'] gives each agent its own bank per company. Add 'user' for per-user memory isolation (useful for GDPR compliance).",
              "items": {
                "type": "string",
                "enum": [
                  "company",
                  "agent",
                  "user"
                ]
              },
              "default": [
                "company",
                "agent"
              ]
            },
            "recallBudget": {
              "type": "string",
              "title": "Recall Budget",
              "description": "'low' is fastest, 'mid' balances speed and depth, 'high' is most thorough.",
              "enum": [
                "low",
                "mid",
                "high"
              ],
              "default": "mid"
            },
            "autoRetain": {
              "type": "boolean",
              "title": "Auto-retain on Run Finished",
              "description": "Automatically retain agent run output to Hindsight when a run completes.",
              "default": true
            }
          }
        },
        "tools": [
          {
            "name": "hindsight_recall",
            "displayName": "Recall from Memory",
            "description": "Search Hindsight long-term memory for context relevant to a query. Use this before starting a task to surface relevant past decisions, preferences, and knowledge.",
            "parametersSchema": {
              "type": "object",
              "required": [
                "query"
              ],
              "properties": {
                "query": {
                  "type": "string",
                  "description": "What to search for in memory"
                }
              }
            }
          },
          {
            "name": "hindsight_retain",
            "displayName": "Save to Memory",
            "description": "Store important facts, decisions, or outcomes in Hindsight long-term memory for future runs.",
            "parametersSchema": {
              "type": "object",
              "required": [
                "content"
              ],
              "properties": {
                "content": {
                  "type": "string",
                  "description": "The content to store in memory"
                }
              }
            }
          }
        ]
      },
      "installs": 142,
      "installCommand": "npx paperclipai@latest plugin install @vectorize-io/hindsight-paperclip",
      "resolvedAt": "2026-04-24T00:00:00Z"
    },
    {
      "slug": "paperclip-plugin-slack",
      "npmPackage": "paperclip-plugin-slack",
      "addedBy": "lacymorrow",
      "category": "integration",
      "sourceRepo": "https://github.com/mvanhorn/paperclip-plugin-slack",
      "version": "2.0.8",
      "latestVersion": "2.0.8",
      "manifest": {
        "id": "paperclip-plugin-slack",
        "apiVersion": 1,
        "version": "2.0.6",
        "displayName": "Slack Chat OS",
        "description": "Full Chat OS for Slack: escalation, multi-agent sessions, media pipeline, custom commands, and proactive suggestions. Push Paperclip notifications, receive slash commands, and manage agent workflows.",
        "author": "mvanhorn",
        "categories": [
          "connector",
          "automation"
        ],
        "capabilities": [
          "companies.read",
          "issues.read",
          "issues.create",
          "agents.read",
          "agent.sessions.create",
          "agent.sessions.send",
          "agent.sessions.close",
          "agents.invoke",
          "events.subscribe",
          "events.emit",
          "plugin.state.read",
          "plugin.state.write",
          "http.outbound",
          "secrets.read-ref",
          "webhooks.receive",
          "instance.settings.register",
          "activity.log.write",
          "metrics.write",
          "jobs.schedule",
          "agent.tools.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js"
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "slackTokenRef": {
              "type": "string",
              "format": "secret-ref",
              "title": "Slack Bot Token (secret reference)",
              "description": "Secret UUID for your Slack Bot OAuth token. Create the secret in Settings → Secrets, then paste its UUID here.",
              "default": ""
            },
            "slackSigningSecretRef": {
              "type": "string",
              "format": "secret-ref",
              "title": "Slack Signing Secret (secret reference)",
              "description": "Secret UUID for your Slack app's Signing Secret. Required to verify that incoming webhooks are genuinely from Slack.",
              "default": ""
            },
            "defaultChannelId": {
              "type": "string",
              "title": "Default Slack Channel ID",
              "description": "Channel ID to post notifications to (e.g. C01ABC2DEF3).",
              "default": ""
            },
            "approvalsChannelId": {
              "type": "string",
              "title": "Approvals Channel ID",
              "description": "Dedicated channel for approval notifications (optional, falls back to default).",
              "default": ""
            },
            "errorsChannelId": {
              "type": "string",
              "title": "Errors Channel ID",
              "description": "Dedicated channel for agent error notifications (optional, falls back to default).",
              "default": ""
            },
            "pipelineChannelId": {
              "type": "string",
              "title": "Pipeline Channel ID",
              "description": "Dedicated channel for agent lifecycle events (optional, falls back to default).",
              "default": ""
            },
            "notifyOnIssueCreated": {
              "type": "boolean",
              "title": "Notify on issue created",
              "default": true
            },
            "notifyOnIssueDone": {
              "type": "boolean",
              "title": "Notify on issue completed",
              "default": true
            },
            "notifyOnApprovalCreated": {
              "type": "boolean",
              "title": "Notify on approval requested",
              "default": true
            },
            "notifyOnAgentError": {
              "type": "boolean",
              "title": "Notify on agent error",
              "default": true
            },
            "notifyOnAgentConnected": {
              "type": "boolean",
              "title": "Notify on agent connected/disconnected",
              "default": true
            },
            "notifyOnBudgetThreshold": {
              "type": "boolean",
              "title": "Notify on budget threshold reached",
              "default": true
            },
            "enableDailyDigest": {
              "type": "boolean",
              "title": "Send daily activity digest",
              "description": "Posts a summary of all agent activity, costs, and completed tasks once per day.",
              "default": false
            },
            "paperclipBaseUrl": {
              "type": "string",
              "title": "Paperclip Base URL",
              "description": "Base URL of your Paperclip instance for dashboard links.",
              "default": "http://localhost:3100"
            },
            "escalationChatId": {
              "type": "string",
              "title": "Escalation Channel ID",
              "description": "Dedicated channel for escalation notifications (optional, falls back to approvalsChannelId or defaultChannelId).",
              "default": ""
            },
            "escalationTimeoutMs": {
              "type": "number",
              "title": "Escalation Timeout (ms)",
              "description": "Time in milliseconds before an unresolved escalation triggers the default action.",
              "default": 900000
            },
            "escalationDefaultAction": {
              "type": "string",
              "title": "Escalation Default Action",
              "description": "Action to take when an escalation times out: 'defer', 'dismiss', or 'auto_reply'.",
              "default": "defer"
            },
            "escalationHoldMessage": {
              "type": "string",
              "title": "Escalation Hold Message",
              "description": "Message sent to the customer while waiting for a human to respond.",
              "default": "Your request has been escalated to a human agent. Please hold."
            },
            "maxAgentsPerThread": {
              "type": "number",
              "title": "Max Agents Per Thread",
              "description": "Maximum number of concurrent agents allowed in a single Slack thread.",
              "default": 5
            }
          },
          "required": [
            "slackTokenRef",
            "slackSigningSecretRef",
            "defaultChannelId"
          ]
        },
        "jobs": [
          {
            "jobKey": "daily-digest",
            "displayName": "Daily Activity Digest",
            "description": "Posts a summary of agent activity, costs, and completed tasks to Slack.",
            "schedule": "0 9 * * *"
          },
          {
            "jobKey": "check-escalation-timeouts",
            "displayName": "Check Escalation Timeouts",
            "description": "Checks for unresolved escalations that have exceeded the configured timeout.",
            "schedule": "*/1 * * * *"
          },
          {
            "jobKey": "check-watches",
            "displayName": "Check Event Watches",
            "description": "Processes pending event watches and triggers agent invocations for matching events.",
            "schedule": "*/2 * * * *"
          }
        ],
        "webhooks": [
          {
            "endpointKey": "slack-events",
            "displayName": "Slack Events API",
            "description": "Receives Slack Events API payloads (url_verification, event callbacks, file_shared)."
          },
          {
            "endpointKey": "slash-command",
            "displayName": "Slack Slash Command",
            "description": "Receives /clip slash commands from Slack."
          },
          {
            "endpointKey": "slack-interactivity",
            "displayName": "Slack Interactivity",
            "description": "Receives button click payloads from interactive messages (approve/reject/escalation/handoff/discussion/command)."
          }
        ]
      },
      "installs": 133,
      "installCommand": "npx paperclipai@latest plugin install paperclip-plugin-slack",
      "resolvedAt": "2026-04-10T00:00:00Z"
    },
    {
      "slug": "paperclip-workspace-browser",
      "npmPackage": "paperclip-workspace-browser",
      "addedBy": "lacymorrow",
      "category": "tools",
      "sourceRepo": "https://github.com/fob92/paperclip-workspace-browser",
      "version": "0.1.28",
      "latestVersion": "0.1.28",
      "manifest": {
        "id": "paperclip-workspace-browser",
        "apiVersion": 1,
        "version": "0.1.27",
        "displayName": "Workspace Browser",
        "description": "Browse, search, preview, download, and export full Paperclip project workspaces.",
        "author": "Felix Oberdorf",
        "categories": [
          "workspace",
          "ui"
        ],
        "capabilities": [
          "ui.sidebar.register",
          "ui.page.register",
          "ui.detailTab.register",
          "projects.read",
          "project.workspaces.read"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "ui": {
          "slots": [
            {
              "type": "sidebar",
              "id": "workspace-browser-sidebar-link",
              "displayName": "Workspace Files",
              "exportName": "WorkspaceSidebarLink",
              "order": 34
            },
            {
              "type": "page",
              "id": "workspace-browser-page",
              "displayName": "Workspace Files",
              "exportName": "WorkspaceBrowserPage",
              "routePath": "workspace-files"
            },
            {
              "type": "detailTab",
              "id": "workspace-browser-project-tab",
              "displayName": "Workspace Files",
              "exportName": "WorkspaceBrowserTab",
              "entityTypes": [
                "project"
              ],
              "order": 34
            }
          ]
        }
      },
      "installs": 110,
      "installCommand": "npx paperclipai@latest plugin install paperclip-workspace-browser",
      "resolvedAt": "2026-06-02T07:55:15.059Z"
    },
    {
      "slug": "paperclip-plugin-discord",
      "npmPackage": "paperclip-plugin-discord",
      "addedBy": "lacymorrow",
      "category": "integration",
      "sourceRepo": "https://github.com/mvanhorn/paperclip-plugin-discord",
      "version": "0.9.1",
      "latestVersion": "0.9.1",
      "manifest": {
        "id": "paperclip-plugin-discord",
        "apiVersion": 1,
        "version": "0.7.3",
        "displayName": "Discord Bot",
        "description": "Bidirectional Discord integration: push notifications on agent events, receive slash commands, gather community intelligence, multi-agent sessions, media pipeline, custom commands, and proactive suggestions.",
        "author": "mvanhorn",
        "categories": [
          "connector",
          "automation"
        ],
        "capabilities": [
          "companies.read",
          "projects.read",
          "issues.read",
          "issue.comments.read",
          "issues.create",
          "issues.update",
          "agents.read",
          "agent.sessions.create",
          "agent.sessions.send",
          "agent.sessions.close",
          "agents.invoke",
          "events.subscribe",
          "plugin.state.read",
          "plugin.state.write",
          "http.outbound",
          "secrets.read-ref",
          "webhooks.receive",
          "activity.log.write",
          "metrics.write",
          "agent.tools.register",
          "jobs.schedule",
          "events.emit"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js"
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "discordBotTokenRef": {
              "type": "string",
              "format": "secret-ref",
              "title": "Discord Bot Token (secret reference)",
              "description": "Secret UUID for your Discord Bot token. Create the secret in Settings → Secrets, then paste its UUID here.",
              "default": ""
            },
            "paperclipBoardApiKeyRef": {
              "type": "string",
              "format": "secret-ref",
              "title": "Paperclip Board API Key (secret reference)",
              "description": "Optional. Secret UUID for a Paperclip board API key. Required when Paperclip is deployed in `authenticated` mode so that plugin-originated calls (approve/reject buttons, workflow steps, inbound reply routing) can satisfy server-side board-auth checks. Create a board API key in Settings → API Keys, store it as a secret, then paste the secret UUID here. Leave blank for `local_trusted` deployments.",
              "default": ""
            },
            "defaultGuildId": {
              "type": "string",
              "title": "Default Guild (Server) ID",
              "description": "The Discord server ID to post notifications to.",
              "default": ""
            },
            "defaultChannelId": {
              "type": "string",
              "title": "Default Channel ID",
              "description": "Channel ID to post notifications to.",
              "default": ""
            },
            "approvalsChannelId": {
              "type": "string",
              "title": "Approvals Channel ID",
              "description": "Channel ID for approval requests. Falls back to default channel.",
              "default": ""
            },
            "companyChannels": {
              "type": "object",
              "title": "Per-company channel overrides",
              "description": "Route notifications per Paperclip company. Keys are company UUIDs, values are Discord channel IDs. Applied to every event type that does not have a more specific map. Falls through to the default/global channel when a company is not listed.",
              "additionalProperties": {
                "type": "string"
              },
              "default": {}
            },
            "approvalsChannels": {
              "type": "object",
              "title": "Per-company approvals channel overrides",
              "description": "Route approval.created events to a specific channel per company. Keys are company UUIDs, values are Discord channel IDs. Checked before companyChannels; falls through to approvalsChannelId (global) when unset.",
              "additionalProperties": {
                "type": "string"
              },
              "default": {}
            },
            "errorsChannelId": {
              "type": "string",
              "title": "Errors Channel ID",
              "description": "Channel ID for agent error notifications. Falls back to default channel.",
              "default": ""
            },
            "bdPipelineChannelId": {
              "type": "string",
              "title": "BD Pipeline Channel ID",
              "description": "Channel ID for agent run lifecycle events. Falls back to default channel.",
              "default": ""
            },
            "notifyOnIssueCreated": {
              "type": "boolean",
              "title": "Notify on issue created",
              "default": true
            },
            "notifyOnIssueDone": {
              "type": "boolean",
              "title": "Notify on issue completed",
              "default": true
            },
            "notifyOnApprovalCreated": {
              "type": "boolean",
              "title": "Notify on approval requested",
              "default": true
            },
            "notifyOnAgentError": {
              "type": "boolean",
              "title": "Notify on agent error",
              "default": true
            },
            "enableIntelligence": {
              "type": "boolean",
              "title": "Enable community intelligence",
              "description": "Periodically scan Discord channels for community signals (feature requests, pain points). Results are queryable by agents.",
              "default": false
            },
            "intelligenceChannelIds": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "title": "Intelligence channels",
              "description": "Channel IDs to scan for community signals.",
              "default": []
            },
            "backfillDays": {
              "type": "number",
              "title": "Backfill history (days)",
              "description": "How many days of Discord message history to scan on first install. Set to 0 to skip backfill.",
              "default": 90,
              "minimum": 0,
              "maximum": 365
            },
            "paperclipBaseUrl": {
              "type": "string",
              "title": "Paperclip Base URL",
              "description": "Base URL for Paperclip dashboard links and API calls",
              "default": "http://localhost:3100"
            },
            "intelligenceRetentionDays": {
              "type": "number",
              "title": "Intelligence retention (days)",
              "description": "How many days to retain intelligence signals before expiry.",
              "default": 30,
              "minimum": 1,
              "maximum": 365
            },
            "escalationChannelId": {
              "type": "string",
              "title": "Escalation Channel ID",
              "description": "Channel ID for human-in-the-loop escalation messages. Falls back to default channel.",
              "default": ""
            },
            "enableEscalations": {
              "type": "boolean",
              "title": "Enable escalation support",
              "description": "Allow agents to escalate conversations to humans via Discord with actionable buttons.",
              "default": true
            },
            "escalationTimeoutMinutes": {
              "type": "number",
              "title": "Escalation timeout (minutes)",
              "description": "How long to wait for a human response before marking an escalation as timed out.",
              "default": 30,
              "minimum": 5,
              "maximum": 1440
            },
            "maxAgentsPerThread": {
              "type": "number",
              "title": "Max agents per thread",
              "description": "Maximum number of concurrent agent sessions allowed in a single Discord thread.",
              "default": 5,
              "minimum": 1,
              "maximum": 10
            },
            "enableMediaPipeline": {
              "type": "boolean",
              "title": "Enable media pipeline (Phase 3)",
              "description": "Detect audio/video/image attachments in Discord messages, transcribe with Whisper, and route to Brief Agent.",
              "default": false
            },
            "mediaChannelIds": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "title": "Media pipeline channels",
              "description": "Channel IDs to monitor for media attachments. Falls back to all channels.",
              "default": []
            },
            "enableCustomCommands": {
              "type": "boolean",
              "title": "Enable custom commands (Phase 4)",
              "description": "Allow agents to register custom slash-style commands that Discord users can invoke.",
              "default": false
            },
            "enableProactiveSuggestions": {
              "type": "boolean",
              "title": "Enable proactive suggestions (Phase 5)",
              "description": "Allow agents to register watch conditions that fire proactive suggestions when matched.",
              "default": false
            },
            "proactiveScanIntervalMinutes": {
              "type": "number",
              "title": "Proactive scan interval (minutes)",
              "description": "How often to check registered watches for new matches.",
              "default": 15,
              "minimum": 5,
              "maximum": 60
            },
            "enableCommands": {
              "type": "boolean",
              "title": "Enable slash commands",
              "description": "Allow Discord users to invoke /clip and /acp slash commands.",
              "default": true
            },
            "enableInbound": {
              "type": "boolean",
              "title": "Enable inbound reply routing",
              "description": "Route Discord replies to bot notifications back to Paperclip as issue comments or escalation responses.",
              "default": true
            },
            "topicRouting": {
              "type": "boolean",
              "title": "Enable topic/channel routing",
              "description": "Route notifications to specific Discord channels based on project-to-channel mappings set via /clip connect-channel.",
              "default": false
            },
            "digestMode": {
              "type": "string",
              "enum": [
                "off",
                "daily",
                "bidaily",
                "tridaily"
              ],
              "title": "Digest mode",
              "description": "How often to send a summary digest to mapped channels.",
              "default": "off"
            },
            "dailyDigestTime": {
              "type": "string",
              "title": "Daily digest time (HH:MM UTC)",
              "description": "Time to send the daily digest in UTC.",
              "default": "09:00"
            },
            "bidailySecondTime": {
              "type": "string",
              "title": "Second digest time for bidaily mode (HH:MM UTC)",
              "default": "17:00"
            },
            "tridailyTimes": {
              "type": "string",
              "title": "Digest times for tridaily mode (comma-separated HH:MM UTC)",
              "default": "07:00,13:00,19:00"
            }
          },
          "required": [
            "discordBotTokenRef",
            "defaultChannelId"
          ]
        },
        "jobs": [
          {
            "jobKey": "discord-intelligence-scan",
            "displayName": "Discord Intelligence Scan",
            "description": "Periodically scan configured Discord channels for community signals.",
            "schedule": "0 */6 * * *"
          },
          {
            "jobKey": "check-escalation-timeouts",
            "displayName": "Escalation Timeout Check",
            "description": "Periodically check for escalations that have exceeded the configured timeout.",
            "schedule": "*/5 * * * *"
          },
          {
            "jobKey": "check-watches",
            "displayName": "Proactive Watch Check",
            "description": "Periodically evaluate registered watch conditions and post proactive suggestions.",
            "schedule": "*/15 * * * *"
          },
          {
            "jobKey": "check-budget-thresholds",
            "displayName": "Budget Threshold Check",
            "description": "Periodically check agent budgets and alert when crossing the 80% usage threshold.",
            "schedule": "*/5 * * * *"
          },
          {
            "jobKey": "discord-daily-digest",
            "displayName": "Discord Daily Digest",
            "description": "Hourly job that checks if the current UTC hour matches configured digest times and sends a summary.",
            "schedule": "0 * * * *"
          }
        ],
        "tools": [
          {
            "name": "discord_signals",
            "displayName": "Discord Signals",
            "description": "Query recent community signals from Discord (feature requests, pain points, maintainer directives).",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "companyId": {
                  "type": "string",
                  "description": "Company ID to query signals for"
                },
                "category": {
                  "type": "string",
                  "enum": [
                    "feature_wish",
                    "pain_point",
                    "maintainer_directive",
                    "sentiment"
                  ],
                  "description": "Filter signals by category (optional)"
                }
              },
              "required": [
                "companyId"
              ]
            }
          },
          {
            "name": "escalate_to_human",
            "displayName": "Escalate to Human",
            "description": "Escalate a conversation to a human operator via Discord with interactive buttons.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "companyId": {
                  "type": "string",
                  "description": "Company ID for the escalation"
                },
                "agentName": {
                  "type": "string",
                  "description": "Name of the agent requesting escalation"
                },
                "reason": {
                  "type": "string",
                  "description": "Why the agent is escalating"
                },
                "confidenceScore": {
                  "type": "number",
                  "description": "Confidence score (0-1)"
                },
                "agentReasoning": {
                  "type": "string",
                  "description": "Internal reasoning"
                },
                "conversationHistory": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "role": {
                        "type": "string"
                      },
                      "content": {
                        "type": "string"
                      }
                    }
                  },
                  "description": "Last N messages (max 5 shown)"
                },
                "suggestedReply": {
                  "type": "string",
                  "description": "Optional suggested reply"
                }
              },
              "required": [
                "companyId",
                "agentName",
                "reason"
              ]
            }
          },
          {
            "name": "handoff_to_agent",
            "displayName": "Handoff to Agent",
            "description": "Hand off a conversation to another agent. Requires human approval.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "threadId": {
                  "type": "string",
                  "description": "Discord thread ID"
                },
                "fromAgent": {
                  "type": "string",
                  "description": "Agent initiating the handoff"
                },
                "toAgent": {
                  "type": "string",
                  "description": "Target agent name"
                },
                "reason": {
                  "type": "string",
                  "description": "Reason for the handoff"
                },
                "context": {
                  "type": "string",
                  "description": "Context to pass to target agent"
                }
              },
              "required": [
                "threadId",
                "fromAgent",
                "toAgent",
                "reason"
              ]
            }
          },
          {
            "name": "discuss_with_agent",
            "displayName": "Discuss with Agent",
            "description": "Start a multi-turn discussion between two agents with human checkpoints.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "threadId": {
                  "type": "string",
                  "description": "Discord thread ID"
                },
                "initiator": {
                  "type": "string",
                  "description": "Agent starting the discussion"
                },
                "target": {
                  "type": "string",
                  "description": "Agent to discuss with"
                },
                "topic": {
                  "type": "string",
                  "description": "Topic or question"
                },
                "maxTurns": {
                  "type": "number",
                  "description": "Max turns (default 10, max 50)"
                },
                "humanCheckpointInterval": {
                  "type": "number",
                  "description": "Pause every N turns (0 = none)"
                }
              },
              "required": [
                "threadId",
                "initiator",
                "target",
                "topic"
              ]
            }
          },
          {
            "name": "register_custom_command",
            "displayName": "Register Custom Command",
            "description": "Register a custom command that Discord users can invoke via !command.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "companyId": {
                  "type": "string",
                  "description": "Company ID"
                },
                "command": {
                  "type": "string",
                  "description": "Command name (without leading !)"
                },
                "description": {
                  "type": "string",
                  "description": "Description of the command"
                },
                "parameters": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "string"
                      },
                      "description": {
                        "type": "string"
                      },
                      "required": {
                        "type": "boolean"
                      }
                    }
                  },
                  "description": "Command parameters"
                }
              },
              "required": [
                "companyId",
                "command",
                "description"
              ]
            }
          },
          {
            "name": "register_watch",
            "displayName": "Register Watch",
            "description": "Register a watch condition that fires proactive suggestions when matched.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "companyId": {
                  "type": "string",
                  "description": "Company ID"
                },
                "watchName": {
                  "type": "string",
                  "description": "Watch name"
                },
                "patterns": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Regex patterns to match"
                },
                "channelIds": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Channel IDs to watch (empty = all)"
                },
                "responseTemplate": {
                  "type": "string",
                  "description": "Template for the suggestion message"
                },
                "cooldownMinutes": {
                  "type": "number",
                  "description": "Min minutes between triggers (default 60)"
                }
              },
              "required": [
                "companyId",
                "watchName",
                "patterns",
                "responseTemplate"
              ]
            }
          }
        ],
        "webhooks": [
          {
            "endpointKey": "discord-interactions",
            "displayName": "Discord Interactions",
            "description": "Receives Discord slash command and button interaction payloads."
          }
        ]
      },
      "installs": 77,
      "installCommand": "npx paperclipai@latest plugin install paperclip-plugin-discord",
      "resolvedAt": "2026-04-10T00:00:00Z"
    },
    {
      "slug": "paperclip-plugin-k8s",
      "npmPackage": "@farhoodlabs/paperclip-plugin-k8s",
      "addedBy": "lacymorrow",
      "category": "tools",
      "version": "0.3.7",
      "latestVersion": "0.3.7",
      "manifest": {
        "id": "farhoodlabs.k8s-sandbox-provider",
        "apiVersion": 1,
        "version": "0.3.7",
        "displayName": "Kubernetes Sandbox Provider",
        "description": "Provisions a long-lived Kubernetes pod per environment lease and routes adapter command execution through the K8s exec API.",
        "author": "farhoodlabs",
        "categories": [
          "automation"
        ],
        "capabilities": [
          "environment.drivers.register",
          "instance.settings.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "ui": {
          "slots": [
            {
              "type": "settingsPage",
              "id": "inventory",
              "displayName": "Inventory",
              "exportName": "SettingsPage"
            }
          ]
        },
        "environmentDrivers": [
          {
            "driverKey": "k8s",
            "kind": "sandbox_provider",
            "displayName": "Kubernetes",
            "description": "Runs each environment lease as a long-lived pod, with optional PVC-backed workspace and lease reuse across runs.",
            "configSchema": {
              "type": "object",
              "properties": {
                "kubeconfigPath": {
                  "type": "string",
                  "description": "Path to a kubeconfig file. Falls back to in-cluster config or ~/.kube/config."
                },
                "namespace": {
                  "type": "string",
                  "description": "Kubernetes namespace for the lease pod and any owned resources. When the plugin worker runs in-cluster and this is left blank, defaults to the worker's own namespace (read from the in-cluster service account). Falls back to \"default\" otherwise."
                },
                "image": {
                  "type": "string",
                  "description": "Container image to run inside the lease pod. When the plugin worker runs in-cluster and this is left blank, defaults to the worker's host pod image, which is digest-pinned and already cached on the node."
                },
                "serviceAccountName": {
                  "type": "string",
                  "description": "ServiceAccount to attach to the pod. Supports {companyId} placeholder, e.g. \"paperclip-{companyId}\"."
                },
                "workspace": {
                  "type": "object",
                  "title": "Workspace",
                  "description": "Where the agent's working directory lives inside the lease pod, and the PVC (if any) that backs it.",
                  "properties": {
                    "mountPath": {
                      "type": "string",
                      "title": "Mount Path",
                      "default": "/workspace",
                      "description": "Path inside the pod where the workspace volume is mounted."
                    },
                    "pvc": {
                      "type": "object",
                      "title": "Persistent Volume Claim",
                      "description": "Optional PVC backing the workspace. Leave name blank for an ephemeral emptyDir workspace.",
                      "properties": {
                        "name": {
                          "type": "string",
                          "title": "PVC Name",
                          "description": "Name of the PVC to mount at the mount path. Leave blank for an ephemeral emptyDir workspace (lost when the pod terminates)."
                        },
                        "create": {
                          "type": "boolean",
                          "title": "Create if Missing",
                          "default": false,
                          "description": "When set, the plugin creates the PVC during acquireLease if it doesn't already exist (using the storage class, size, and access mode below). When false, the PVC must already exist or acquire fails. Plugin-created PVCs are not auto-deleted when the lease ends."
                        },
                        "storageClass": {
                          "type": "string",
                          "title": "Storage Class",
                          "description": "StorageClass name for newly-created PVCs. Leave blank to use the cluster's default StorageClass."
                        },
                        "size": {
                          "type": "string",
                          "title": "Size",
                          "default": "10Gi",
                          "description": "Volume size for newly-created PVCs (Kubernetes quantity, e.g. \"10Gi\", \"50Gi\")."
                        },
                        "accessMode": {
                          "type": "string",
                          "title": "Access Mode",
                          "default": "ReadWriteOnce",
                          "description": "Access mode for newly-created PVCs. Most cloud providers only support ReadWriteOnce."
                        }
                      }
                    }
                  }
                },
                "runAsUser": {
                  "type": "number",
                  "description": "UID for the pod's containers. Defaults to 1000 (the `node` user in the Paperclip image).",
                  "default": 1000
                },
                "runAsGroup": {
                  "type": "number",
                  "description": "GID for the pod's containers. Defaults to 1000.",
                  "default": 1000
                },
                "fsGroup": {
                  "type": "number",
                  "description": "fsGroup applied to mounted volumes so the runAsUser can write. Defaults to 1000.",
                  "default": 1000
                },
                "resources": {
                  "type": "object",
                  "title": "Resources",
                  "description": "CPU and memory requests/limits for the lease pod's agent container. Standard Kubernetes quantity strings (e.g. \"500m\", \"2\", \"512Mi\", \"4Gi\"). Leave blank for no limits.",
                  "properties": {
                    "requests": {
                      "type": "object",
                      "title": "Requests",
                      "description": "Minimum resources reserved for the pod (used by the scheduler).",
                      "properties": {
                        "cpu": {
                          "type": "string",
                          "title": "CPU",
                          "description": "e.g. 500m, 1, 2"
                        },
                        "memory": {
                          "type": "string",
                          "title": "Memory",
                          "description": "e.g. 256Mi, 1Gi"
                        }
                      }
                    },
                    "limits": {
                      "type": "object",
                      "title": "Limits",
                      "description": "Maximum resources the pod can consume (kubelet enforces; CPU throttles, memory triggers OOM).",
                      "properties": {
                        "cpu": {
                          "type": "string",
                          "title": "CPU",
                          "description": "e.g. 1, 2, 4"
                        },
                        "memory": {
                          "type": "string",
                          "title": "Memory",
                          "description": "e.g. 1Gi, 4Gi, 8Gi"
                        }
                      }
                    }
                  }
                },
                "reuseLease": {
                  "type": "boolean",
                  "description": "Keep the pod running across runs and resume into it on the next lease.",
                  "default": false
                },
                "podReadyTimeoutMs": {
                  "type": "number",
                  "title": "Pod Ready Timeout (ms)",
                  "description": "How long to wait for the pod to reach Ready before failing acquire.",
                  "default": 120000
                },
                "timeoutMs": {
                  "type": "number",
                  "title": "Timeout (ms)",
                  "description": "Default timeout per execute call. The host extends its environmentExecute RPC budget to match this value.",
                  "default": 300000
                },
                "debug": {
                  "type": "boolean",
                  "title": "Debug Logging",
                  "default": false,
                  "description": "Emit verbose [debug] logs from each plugin lifecycle hook (validateConfig, probe, acquire/resume/release/destroy lease, realizeWorkspace, execute) including received params and resolved values. Useful for diagnosing timeouts, RPC behavior, and config-passthrough issues. Logs go to the host's plugin log stream — no restart needed to enable; just save the env config. Disable in production."
                },
                "env": {
                  "type": "object",
                  "description": "Environment variables to set on the pod container.",
                  "additionalProperties": {
                    "type": "string"
                  }
                }
              }
            }
          }
        ]
      },
      "installs": 70,
      "installCommand": "npx paperclipai@latest plugin install @farhoodlabs/paperclip-plugin-k8s",
      "resolvedAt": "2026-04-28T00:00:00Z"
    },
    {
      "slug": "paperclip-aperture",
      "npmPackage": "@tomismeta/paperclip-aperture",
      "addedBy": "lacymorrow",
      "category": "memory",
      "sourceRepo": "https://github.com/tomismeta/paperclip-aperture",
      "version": "0.4.5",
      "latestVersion": "0.4.5",
      "manifest": {
        "id": "tomismeta.paperclip-aperture",
        "apiVersion": 1,
        "version": "0.4.5",
        "minimumHostVersion": "2026.525.0",
        "displayName": "Paperclip Aperture",
        "description": "The live attention layer for Paperclip, combining Aperture Core continuity with Paperclip-native operator policy.",
        "author": "@tomismeta",
        "categories": [
          "automation",
          "ui"
        ],
        "capabilities": [
          "events.subscribe",
          "http.outbound",
          "agents.read",
          "issues.read",
          "issue.relations.read",
          "issue.comments.read",
          "issue.comments.create",
          "issue.documents.read",
          "activity.log.write",
          "plugin.state.read",
          "plugin.state.write",
          "telemetry.track",
          "ui.dashboardWidget.register",
          "ui.page.register",
          "ui.sidebar.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "captureIssueLifecycle": {
              "type": "boolean",
              "title": "Capture Issue Lifecycle",
              "default": true,
              "description": "Turn issue creation and update events into Aperture status signals."
            },
            "captureRunFailures": {
              "type": "boolean",
              "title": "Capture Run Failures",
              "default": true,
              "description": "Turn failed agent runs into high-salience attention events."
            },
            "paperclipApiBase": {
              "type": "string",
              "title": "Paperclip API Base",
              "default": "",
              "description": "Optional base URL for Paperclip approval reads and writes. Leave empty to disable approval API fetches when the plugin SDK lacks a first-class approval client."
            }
          }
        },
        "ui": {
          "slots": [
            {
              "type": "page",
              "id": "attention-page",
              "displayName": "Focus",
              "exportName": "AttentionPage",
              "routePath": "aperture"
            },
            {
              "type": "sidebar",
              "id": "attention-sidebar-link",
              "displayName": "Focus",
              "exportName": "AttentionSidebarLink"
            },
            {
              "type": "dashboardWidget",
              "id": "attention-widget",
              "displayName": "Focus",
              "exportName": "DashboardWidget"
            }
          ]
        }
      },
      "installs": 65,
      "installCommand": "npx paperclipai@latest plugin install @tomismeta/paperclip-aperture",
      "resolvedAt": "2026-06-02T07:54:54.222Z"
    },
    {
      "slug": "paperclip-live-analytics-plugin",
      "npmPackage": "@agent-analytics/paperclip-live-analytics-plugin",
      "addedBy": "lacymorrow",
      "category": "observability",
      "sourceRepo": "https://github.com/Agent-Analytics/paperclip-live-analytics-plugin",
      "version": "0.1.11",
      "latestVersion": "0.1.11",
      "manifest": {
        "id": "agent-analytics.paperclip-live-analytics-plugin",
        "apiVersion": 1,
        "version": "0.1.11",
        "displayName": "Agent Analytics Live",
        "description": "Paperclip plugin for viewing live Agent Analytics signals inside a company workspace.",
        "author": "@agent-analytics",
        "categories": [
          "connector",
          "ui"
        ],
        "capabilities": [
          "http.outbound",
          "plugin.state.read",
          "plugin.state.write",
          "companies.read",
          "projects.read",
          "ui.page.register",
          "ui.dashboardWidget.register",
          "ui.sidebar.register",
          "instance.settings.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "ui": {
          "slots": [
            {
              "type": "page",
              "id": "agent-analytics-live-page",
              "displayName": "Agent Analytics Live",
              "exportName": "LivePage",
              "routePath": "agent-analytics-live"
            },
            {
              "type": "dashboardWidget",
              "id": "agent-analytics-live-widget",
              "displayName": "Agent Analytics Live",
              "exportName": "LiveDashboardWidget"
            },
            {
              "type": "sidebar",
              "id": "agent-analytics-live-sidebar",
              "displayName": "Analytics",
              "exportName": "LiveSidebarLink"
            },
            {
              "type": "settingsPage",
              "id": "agent-analytics-live-settings",
              "displayName": "Agent Analytics Live Settings",
              "exportName": "LiveSettingsPage"
            }
          ]
        }
      },
      "installs": 54,
      "installCommand": "npx paperclipai@latest plugin install @agent-analytics/paperclip-live-analytics-plugin",
      "resolvedAt": "2026-04-26T00:00:00Z"
    },
    {
      "slug": "paperclip-plugin-company-wizard",
      "npmPackage": "@yesterday-ai/paperclip-plugin-company-wizard",
      "addedBy": "lacymorrow",
      "category": "tools",
      "version": "0.1.16",
      "latestVersion": "0.1.16",
      "manifest": {
        "id": "yesterday-ai.paperclip-plugin-company-wizard",
        "apiVersion": 1,
        "version": "0.1.16",
        "displayName": "Company Wizard",
        "description": "AI-powered wizard to bootstrap agent companies from composable templates",
        "author": "Yesterday",
        "categories": [
          "workspace",
          "ui"
        ],
        "capabilities": [
          "companies.read",
          "issues.create",
          "issues.read",
          "issues.update",
          "goals.create",
          "goals.read",
          "agents.read",
          "projects.read",
          "plugin.state.read",
          "plugin.state.write",
          "events.subscribe",
          "ui.page.register",
          "ui.sidebar.register"
        ],
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "companiesDir": {
              "type": "string",
              "description": "Directory where assembled company workspaces are written. Defaults to ~/.paperclip/instances/default/companies. Override for Docker setups (e.g. /paperclip/instances/default/companies)."
            },
            "templatesPath": {
              "type": "string",
              "description": "Path to the templates directory. Defaults to ~/.paperclip/plugin-templates (auto-downloaded from templatesRepoUrl if missing). Override for Docker setups (e.g. /paperclip/plugin-templates)."
            },
            "templatesRepoUrl": {
              "type": "string",
              "default": "https://github.com/Yesterday-AI/paperclip-plugin-company-wizard/tree/main/templates",
              "description": "GitHub tree URL to pull templates from when the templates directory does not exist."
            },
            "anthropicApiKey": {
              "type": "string",
              "format": "secret-ref",
              "description": "Anthropic API key for the AI wizard. Required to use the AI-powered company setup path."
            },
            "paperclipUrl": {
              "type": "string",
              "description": "Paperclip instance URL. Defaults to http://localhost:3100 or the PAPERCLIP_PUBLIC_URL env var."
            },
            "paperclipEmail": {
              "type": "string",
              "description": "Board login email (for authenticated instances)."
            },
            "paperclipPassword": {
              "type": "string",
              "format": "secret-ref",
              "description": "Board login password."
            },
            "disableBoardApprovalOnNewCompanies": {
              "type": "boolean",
              "default": false,
              "description": "Optional. If true, the wizard will PATCH new companies to set requireBoardApprovalForNewAgents=false during provisioning. Leave false to preserve approval-gated hiring policies."
            }
          }
        },
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "ui": {
          "slots": [
            {
              "type": "page",
              "id": "company-wizard",
              "displayName": "Company Wizard",
              "exportName": "WizardPage",
              "routePath": "company-creator"
            },
            {
              "type": "sidebar",
              "id": "company-wizard-link",
              "displayName": "Create Company",
              "exportName": "SidebarLink"
            }
          ]
        }
      },
      "installs": 48,
      "installCommand": "npx paperclipai@latest plugin install @yesterday-ai/paperclip-plugin-company-wizard",
      "resolvedAt": "2026-04-30T00:00:00Z"
    },
    {
      "slug": "paperclip-plugin-navigator",
      "npmPackage": "paperclip-plugin-navigator",
      "addedBy": "lacymorrow",
      "category": "tools",
      "sourceRepo": "https://github.com/rjvc/paperclip-plugin-navigator",
      "version": "0.2.1",
      "latestVersion": "0.2.1",
      "manifest": {
        "id": "paperclip-plugin-navigator",
        "apiVersion": 1,
        "version": "0.2.1",
        "displayName": "File Navigator",
        "description": "Browse projects with real names and open them directly in your external filebrowser.",
        "author": "paperclip-plugin-navigator",
        "categories": [
          "workspace",
          "ui"
        ],
        "capabilities": [
          "projects.read",
          "project.workspaces.read",
          "companies.read",
          "ui.page.register",
          "ui.sidebar.register",
          "http.outbound"
        ],
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "fileBrowserBaseUrl": {
              "type": "string",
              "title": "File Browser Base URL",
              "description": "Base URL of your external filebrowser (e.g. https://files.example.com/files)"
            },
            "fileBrowserUser": {
              "type": "string",
              "title": "File Browser Username",
              "description": "Username for filebrowser API authentication. Required for the native file browser."
            },
            "fileBrowserPassword": {
              "type": "string",
              "title": "File Browser Password",
              "format": "password",
              "description": "Password for filebrowser API authentication. Required for the native file browser."
            },
            "enableModalBrowser": {
              "type": "boolean",
              "title": "Enable Modal Browser (Beta)",
              "description": "When enabled, clicking Files opens an inline file browser modal instead of navigating to the external filebrowser. Beta feature — disabled by default.",
              "default": false
            }
          },
          "required": [
            "fileBrowserBaseUrl"
          ]
        },
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "ui": {
          "slots": [
            {
              "type": "sidebar",
              "id": "navigator-sidebar",
              "displayName": "Files",
              "exportName": "NavigatorSidebarEntry"
            },
            {
              "type": "page",
              "id": "navigator-page",
              "displayName": "Files",
              "exportName": "NavigatorPage"
            },
            {
              "type": "projectSidebarItem",
              "id": "navigator-project-sidebar",
              "displayName": "Files",
              "exportName": "NavigatorProjectSidebarItem",
              "entityTypes": [
                "project"
              ]
            }
          ]
        }
      },
      "installs": 34,
      "installCommand": "npx paperclipai@latest plugin install paperclip-plugin-navigator",
      "resolvedAt": "2026-04-22T00:00:00Z"
    },
    {
      "slug": "social-agent-plugin",
      "npmPackage": "@blaze283/social-agent-plugin",
      "addedBy": "lacymorrow",
      "category": "integration",
      "version": "0.7.3",
      "latestVersion": "0.7.3",
      "manifest": {
        "id": "konfirmity.social-agent-plugin",
        "apiVersion": 1,
        "version": "0.7.3",
        "displayName": "Social Agent",
        "description": "LinkedIn agent + analytics for Paperclip. Connects LinkedIn accounts (OAuth, multi-account per company), lets agents post / react / comment on their behalf, and surfaces engager-level analytics — engagers classified by ICP and region, triage workflow, URL-paste tracking — on tracked posts.",
        "author": "blaze283",
        "categories": [
          "connector",
          "automation",
          "ui"
        ],
        "capabilities": [
          "companies.read",
          "activity.log.write",
          "activity.read",
          "plugin.state.read",
          "plugin.state.write",
          "database.namespace.migrate",
          "database.namespace.read",
          "database.namespace.write",
          "http.outbound",
          "secrets.read-ref",
          "agent.tools.register",
          "jobs.schedule",
          "api.routes.register",
          "ui.page.register",
          "ui.sidebar.register",
          "instance.settings.register",
          "issues.create",
          "issues.read",
          "issues.update",
          "issue.comments.create",
          "projects.read",
          "agents.read"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "database": {
          "namespaceSlug": "social",
          "migrationsDir": "migrations",
          "coreReadTables": [
            "companies"
          ]
        },
        "instanceConfigSchema": {
          "type": "object",
          "required": [
            "dekRef",
            "redirectBaseUrl",
            "channels"
          ],
          "properties": {
            "dekRef": {
              "type": "string",
              "format": "secret-ref",
              "title": "Token Encryption Key (32 bytes, base64)",
              "description": "Reference to a paperclip secret holding 32 random bytes, base64-encoded. Used to envelope OAuth tokens."
            },
            "redirectBaseUrl": {
              "type": "string",
              "title": "Public base URL",
              "description": "Public origin of this paperclip instance, e.g. https://paperclip.example.com. Used to build OAuth redirect URIs."
            },
            "channels": {
              "type": "object",
              "properties": {
                "linkedin": {
                  "type": "object",
                  "properties": {
                    "enabled": {
                      "type": "boolean",
                      "default": false
                    },
                    "clientIdRef": {
                      "type": "string",
                      "format": "secret-ref"
                    },
                    "clientSecretRef": {
                      "type": "string",
                      "format": "secret-ref"
                    }
                  }
                },
                "analytics": {
                  "type": "object",
                  "properties": {
                    "issueProjectId": {
                      "type": "string",
                      "title": "Project for analytics issues"
                    },
                    "issueAssigneeAgentId": {
                      "type": "string",
                      "title": "Default assignee"
                    },
                    "refreshWebhookUrl": {
                      "type": "string",
                      "title": "Routine webhook URL"
                    },
                    "refreshWebhookSecretRef": {
                      "type": "string",
                      "format": "secret-ref"
                    },
                    "refreshWebhookAuthMode": {
                      "type": "string",
                      "enum": [
                        "bearer",
                        "hmac_sha256"
                      ],
                      "default": "bearer"
                    }
                  }
                },
                "leads": {
                  "type": "object",
                  "properties": {
                    "issueProjectId": {
                      "type": "string",
                      "title": "Project for lead issues",
                      "description": "Paperclip project under which the plugin creates lead-DM-drafting issues."
                    },
                    "assigneeAgentId": {
                      "type": "string",
                      "title": "Lead-DM assignee agent",
                      "description": "Agent assigned to each new lead issue. Generates 3 cold-DM drafts and writes them back via the plugin's agent-auth route. Optional — if blank, lead issues are unassigned."
                    }
                  }
                }
              }
            }
          }
        },
        "jobs": [
          {
            "jobKey": "reconcile-connections",
            "displayName": "Reconcile Social Connections",
            "schedule": "0 3 * * *"
          }
        ],
        "apiRoutes": [
          {
            "routeKey": "my-connections",
            "method": "GET",
            "path": "/me/connections",
            "auth": "board",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "query",
              "key": "companyId"
            }
          },
          {
            "routeKey": "team-connections",
            "method": "GET",
            "path": "/team/connections",
            "auth": "board",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "query",
              "key": "companyId"
            }
          },
          {
            "routeKey": "audit-recent",
            "method": "GET",
            "path": "/audit/recent",
            "auth": "board",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "query",
              "key": "companyId"
            }
          },
          {
            "routeKey": "oauth-start",
            "method": "POST",
            "path": "/oauth/start",
            "auth": "board",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "body",
              "key": "companyId"
            }
          },
          {
            "routeKey": "oauth-complete",
            "method": "POST",
            "path": "/oauth/complete",
            "auth": "board",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "body",
              "key": "companyId"
            }
          },
          {
            "routeKey": "disconnect",
            "method": "POST",
            "path": "/connections/:connectionId/disconnect",
            "auth": "board",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "body",
              "key": "companyId"
            }
          },
          {
            "routeKey": "tools-dispatch",
            "method": "POST",
            "path": "/tools/dispatch",
            "auth": "agent",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "body",
              "key": "companyId"
            }
          },
          {
            "routeKey": "analytics-list-posts",
            "method": "GET",
            "path": "/analytics/posts",
            "auth": "board",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "query",
              "key": "companyId"
            }
          },
          {
            "routeKey": "analytics-post-detail",
            "method": "GET",
            "path": "/analytics/posts/:id",
            "auth": "board",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "query",
              "key": "companyId"
            }
          },
          {
            "routeKey": "analytics-engager-update",
            "method": "POST",
            "path": "/analytics/posts/:id/engagers/:engagerId",
            "auth": "board",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "body",
              "key": "companyId"
            }
          },
          {
            "routeKey": "analytics-track-url",
            "method": "POST",
            "path": "/analytics/track-url",
            "auth": "board",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "body",
              "key": "companyId"
            }
          },
          {
            "routeKey": "analytics-list-projects",
            "method": "GET",
            "path": "/analytics/projects",
            "auth": "board",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "query",
              "key": "companyId"
            }
          },
          {
            "routeKey": "analytics-list-agents",
            "method": "GET",
            "path": "/analytics/agents",
            "auth": "board",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "query",
              "key": "companyId"
            }
          },
          {
            "routeKey": "analytics-tracked-posts-list",
            "method": "GET",
            "path": "/analytics/agent/tracked-posts",
            "auth": "agent",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "query",
              "key": "companyId"
            }
          },
          {
            "routeKey": "analytics-tracked-posts-upsert",
            "method": "POST",
            "path": "/analytics/agent/tracked-posts",
            "auth": "agent",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "body",
              "key": "companyId"
            }
          },
          {
            "routeKey": "analytics-engagers-upsert",
            "method": "POST",
            "path": "/analytics/agent/posts/:id/engagers",
            "auth": "agent",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "body",
              "key": "companyId"
            }
          },
          {
            "routeKey": "analytics-snapshot",
            "method": "POST",
            "path": "/analytics/agent/posts/:id/snapshot",
            "auth": "agent",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "body",
              "key": "companyId"
            }
          },
          {
            "routeKey": "leads-list",
            "method": "GET",
            "path": "/leads",
            "auth": "board",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "query",
              "key": "companyId"
            }
          },
          {
            "routeKey": "leads-detail",
            "method": "GET",
            "path": "/leads/:leadId",
            "auth": "board",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "query",
              "key": "companyId"
            }
          },
          {
            "routeKey": "leads-mark-contacted",
            "method": "POST",
            "path": "/leads/:leadId/contacted",
            "auth": "board",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "body",
              "key": "companyId"
            }
          },
          {
            "routeKey": "leads-archive",
            "method": "POST",
            "path": "/leads/:leadId/archive",
            "auth": "board",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "body",
              "key": "companyId"
            }
          },
          {
            "routeKey": "leads-restore",
            "method": "POST",
            "path": "/leads/:leadId/restore",
            "auth": "board",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "body",
              "key": "companyId"
            }
          },
          {
            "routeKey": "leads-agent-get",
            "method": "GET",
            "path": "/leads/agent/:leadId",
            "auth": "agent",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "query",
              "key": "companyId"
            }
          },
          {
            "routeKey": "leads-agent-dm-suggestions",
            "method": "POST",
            "path": "/leads/agent/:leadId/dm-suggestions",
            "auth": "agent",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "body",
              "key": "companyId"
            }
          }
        ],
        "tools": [
          {
            "name": "social-list-channels",
            "displayName": "List Social Channels",
            "description": "List social channels supported by this plugin and whether each is enabled in the current paperclip instance. Use this before calling a channel-specific post tool to confirm the channel is configured.",
            "parametersSchema": {
              "type": "object",
              "properties": {}
            }
          },
          {
            "name": "social-list-connections",
            "displayName": "List Social Connections",
            "description": "List connected social accounts on a given channel within the current company. Returns one entry per account with its connectionId, accountDisplayName, accountHandle, externalUrn, and status. Use this before calling a channel-specific post tool to find the destination connectionId.",
            "parametersSchema": {
              "type": "object",
              "required": [
                "channel"
              ],
              "properties": {
                "channel": {
                  "type": "string",
                  "description": "e.g. 'linkedin'"
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "active",
                    "expired",
                    "revoked",
                    "any"
                  ],
                  "default": "active"
                },
                "match": {
                  "type": "string",
                  "description": "Optional substring matched (case-insensitive) against accountDisplayName and accountHandle."
                }
              }
            }
          },
          {
            "name": "linkedin-post",
            "displayName": "Post to LinkedIn",
            "description": "Publish a post to a connected LinkedIn account. Requires an active connection. Use 'social-list-connections' first to obtain a connectionId.",
            "parametersSchema": {
              "type": "object",
              "required": [
                "connectionId",
                "text"
              ],
              "properties": {
                "connectionId": {
                  "type": "string",
                  "description": "Opaque connection id from social-list-connections."
                },
                "text": {
                  "type": "string",
                  "maxLength": 3000
                },
                "visibility": {
                  "type": "string",
                  "enum": [
                    "PUBLIC",
                    "CONNECTIONS"
                  ],
                  "default": "PUBLIC"
                },
                "issueId": {
                  "type": "string",
                  "description": "Optional: paperclip issue id, for audit linkage."
                }
              }
            }
          },
          {
            "name": "linkedin-react",
            "displayName": "React to LinkedIn Post",
            "description": "Apply a reaction (LIKE by default) on a LinkedIn post on behalf of a connected account. Accepts a LinkedIn post URL or URN. Use 'social-list-connections' first to obtain a connectionId.",
            "parametersSchema": {
              "type": "object",
              "required": [
                "connectionId",
                "post"
              ],
              "properties": {
                "connectionId": {
                  "type": "string",
                  "description": "Opaque connection id from social-list-connections."
                },
                "post": {
                  "type": "string",
                  "description": "LinkedIn post URL or URN. Accepted: urn:li:activity:..., urn:li:share:..., urn:li:ugcPost:..., https://www.linkedin.com/feed/update/<urn>/..., https://www.linkedin.com/posts/<slug>-activity-<id>-<hash>/."
                },
                "reactionType": {
                  "type": "string",
                  "enum": [
                    "LIKE",
                    "PRAISE",
                    "EMPATHY",
                    "INTEREST",
                    "APPRECIATION",
                    "ENTERTAINMENT"
                  ],
                  "default": "LIKE"
                },
                "issueId": {
                  "type": "string",
                  "description": "Optional: paperclip issue id, for audit linkage."
                }
              }
            }
          },
          {
            "name": "linkedin-repost",
            "displayName": "Repost on LinkedIn",
            "description": "Reshare a LinkedIn post on behalf of a connected account, optionally with quote commentary. Accepts a LinkedIn post URL or URN. Use 'social-list-connections' first to obtain a connectionId.",
            "parametersSchema": {
              "type": "object",
              "required": [
                "connectionId",
                "post"
              ],
              "properties": {
                "connectionId": {
                  "type": "string",
                  "description": "Opaque connection id from social-list-connections."
                },
                "post": {
                  "type": "string",
                  "description": "LinkedIn post URL or URN to reshare. Accepted: urn:li:activity:..., urn:li:share:..., urn:li:ugcPost:..., https://www.linkedin.com/feed/update/<urn>/..., https://www.linkedin.com/posts/<slug>-activity-<id>-<hash>/."
                },
                "commentary": {
                  "type": "string",
                  "maxLength": 3000,
                  "description": "Optional quote text published with the reshare. Omit or pass an empty string for a bare reshare."
                },
                "visibility": {
                  "type": "string",
                  "enum": [
                    "PUBLIC",
                    "CONNECTIONS"
                  ],
                  "default": "PUBLIC"
                },
                "issueId": {
                  "type": "string",
                  "description": "Optional: paperclip issue id, for audit linkage."
                }
              }
            }
          },
          {
            "name": "linkedin-comment",
            "displayName": "Comment on LinkedIn Post",
            "description": "Post a top-level text comment on a LinkedIn post on behalf of a connected account. Supports inline @-mentions when the caller provides target URNs. Accepts a LinkedIn post URL or URN. Use 'social-list-connections' first to obtain a connectionId.",
            "parametersSchema": {
              "type": "object",
              "required": [
                "connectionId",
                "post",
                "text"
              ],
              "properties": {
                "connectionId": {
                  "type": "string",
                  "description": "Opaque connection id from social-list-connections."
                },
                "post": {
                  "type": "string",
                  "description": "LinkedIn post URL or URN. Accepted: urn:li:activity:..., urn:li:share:..., urn:li:ugcPost:..., https://www.linkedin.com/feed/update/<urn>/..., https://www.linkedin.com/posts/<slug>-activity-<id>-<hash>/."
                },
                "text": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 1250,
                  "description": "Comment body. LinkedIn enforces ~1250 chars for comments."
                },
                "mentions": {
                  "type": "array",
                  "description": "Optional inline mentions. Each entry's [start, start+length) must fit within `text` and entries must not overlap. Caller supplies URNs; this tool does not resolve names to URNs.",
                  "items": {
                    "type": "object",
                    "required": [
                      "start",
                      "length",
                      "urn"
                    ],
                    "properties": {
                      "start": {
                        "type": "integer",
                        "minimum": 0
                      },
                      "length": {
                        "type": "integer",
                        "minimum": 1
                      },
                      "urn": {
                        "type": "string",
                        "pattern": "^urn:li:(person|organization):.+"
                      }
                    }
                  }
                },
                "issueId": {
                  "type": "string",
                  "description": "Optional: paperclip issue id, for audit linkage."
                }
              }
            }
          }
        ],
        "ui": {
          "slots": [
            {
              "type": "page",
              "id": "social",
              "exportName": "SocialPage",
              "displayName": "Social Accounts",
              "routePath": "social"
            },
            {
              "type": "page",
              "id": "oauth-callback",
              "exportName": "OAuthCallbackPage",
              "displayName": "Connecting…",
              "routePath": "social-callback"
            },
            {
              "type": "settingsPage",
              "id": "settings",
              "exportName": "SettingsPage",
              "displayName": "Social Agent"
            },
            {
              "type": "sidebar",
              "id": "sidebar",
              "exportName": "SidebarEntry",
              "displayName": "Social"
            },
            {
              "type": "page",
              "id": "analytics",
              "exportName": "AnalyticsPage",
              "displayName": "Analytics",
              "routePath": "analytics"
            },
            {
              "type": "sidebar",
              "id": "sidebar-analytics",
              "exportName": "SidebarEntryAnalytics",
              "displayName": "Analytics"
            },
            {
              "type": "page",
              "id": "leads",
              "exportName": "LeadsPage",
              "displayName": "Leads",
              "routePath": "leads"
            },
            {
              "type": "sidebar",
              "id": "sidebar-leads",
              "exportName": "SidebarEntryLeads",
              "displayName": "Leads"
            }
          ]
        }
      },
      "installs": 32,
      "installCommand": "npx paperclipai@latest plugin install @blaze283/social-agent-plugin",
      "resolvedAt": "2026-06-02T07:55:00.956Z"
    },
    {
      "slug": "paperclip-plugin-compass",
      "npmPackage": "paperclip-plugin-compass",
      "addedBy": "lacymorrow",
      "category": "tools",
      "sourceRepo": "https://github.com/Tr1ckyMag1ca1/paperclip-plugin-compass",
      "version": "1.1.8",
      "latestVersion": "1.1.8",
      "manifest": {
        "id": "paperclip-plugin-compass",
        "apiVersion": 1,
        "version": "1.1.7",
        "displayName": "Compass",
        "description": "Strategic consultant for AI company lifecycle — diagnose, found, revive, reposition",
        "author": "Paperclip AI",
        "categories": [
          "ui",
          "automation"
        ],
        "capabilities": [
          "ui.page.register",
          "ui.sidebar.register",
          "agents.read",
          "agents.pause",
          "agents.resume",
          "issues.read",
          "issues.create",
          "issues.update",
          "issues.wakeup",
          "issue.comments.read",
          "issue.comments.create",
          "issue.documents.read",
          "issue.documents.write",
          "plugin.state.read",
          "plugin.state.write",
          "companies.read",
          "activity.log.write",
          "events.subscribe",
          "events.emit",
          "jobs.schedule"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "anthropicApiKey": {
              "type": "string",
              "title": "Anthropic API Key",
              "description": "Anthropic API key used by Compass for strategy reasoning (Found, Assess, Revive, Reposition modes). Required when running LLM-backed workflows; mode detection works without it.",
              "format": "password"
            },
            "zaiApiKey": {
              "type": "string",
              "title": "Z.ai (Zhipu) API Key",
              "description": "Optional Z.ai/Zhipu key. If set, Compass uses GLM-class models for cheap-tier reasoning (drift summaries, classification).",
              "format": "password"
            },
            "primaryModel": {
              "type": "string",
              "title": "Primary Model",
              "description": "Model identifier for strategy reasoning. Defaults to claude-sonnet-4-6 when an Anthropic key is set.",
              "default": "claude-sonnet-4-6"
            },
            "cheapModel": {
              "type": "string",
              "title": "Cheap Model",
              "description": "Model used for low-stakes summarization and classification. Defaults to claude-haiku-4-5-20251001.",
              "default": "claude-haiku-4-5-20251001"
            }
          },
          "required": []
        },
        "ui": {
          "slots": [
            {
              "type": "page",
              "id": "compass-page",
              "displayName": "Compass",
              "exportName": "MainPanel",
              "routePath": "compass"
            },
            {
              "type": "sidebar",
              "id": "compass-sidebar-link",
              "displayName": "Compass",
              "exportName": "SidebarLink"
            }
          ]
        }
      },
      "installs": 26,
      "installCommand": "npx paperclipai@latest plugin install paperclip-plugin-compass",
      "resolvedAt": "2026-04-20T00:00:00Z"
    },
    {
      "slug": "paperclip-plugin-driftwatch",
      "npmPackage": "@octofloworg/paperclip-plugin-driftwatch",
      "addedBy": "lacymorrow",
      "category": "observability",
      "version": "0.1.10",
      "latestVersion": "0.1.10",
      "manifest": {
        "id": "paperclip-plugin-driftwatch",
        "apiVersion": 1,
        "version": "0.1.8",
        "displayName": "DriftWatch",
        "description": "Audit agent instructions in read-only mode. Detect drift, overlap, and handoff mismatches across your agent system.",
        "author": "DriftWatch",
        "categories": [
          "ui"
        ],
        "capabilities": [
          "agents.read",
          "http.outbound",
          "secrets.read-ref",
          "ui.page.register"
        ],
        "entrypoints": {
          "worker": "dist/worker.js",
          "ui": "dist/ui"
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "provider": {
              "type": "string",
              "title": "Provider",
              "description": "Which LLM provider to use for drift analysis",
              "enum": [
                "anthropic",
                "openai"
              ],
              "default": "openai"
            },
            "model": {
              "type": "string",
              "title": "Model",
              "description": "Model ID (e.g. gpt-5, gpt-5-mini, claude-sonnet-4-5-20250514)",
              "default": "gpt-5"
            },
            "anthropicApiKey": {
              "type": "string",
              "title": "Anthropic API key (override)",
              "description": "Optional. Falls back to ANTHROPIC_API_KEY env var if not set."
            },
            "openaiApiKey": {
              "type": "string",
              "title": "OpenAI API key (override)",
              "description": "Optional. Falls back to OPENAI_API_KEY env var if not set."
            }
          },
          "required": [
            "provider",
            "model"
          ]
        },
        "ui": {
          "slots": [
            {
              "type": "page",
              "id": "driftwatch-main",
              "displayName": "DriftWatch",
              "exportName": "DriftWatchPage",
              "routePath": "driftwatch"
            }
          ]
        }
      },
      "installs": 25,
      "installCommand": "npx paperclipai@latest plugin install @octofloworg/paperclip-plugin-driftwatch",
      "resolvedAt": "2026-04-29T00:00:00Z"
    },
    {
      "slug": "paperclip-honcho",
      "npmPackage": "@honcho-ai/paperclip-honcho",
      "addedBy": "lacymorrow",
      "category": "memory",
      "sourceRepo": "https://github.com/plastic-labs/paperclip-honcho",
      "version": "0.1.2",
      "latestVersion": "0.1.2",
      "manifest": {
        "id": "honcho-ai.paperclip-honcho",
        "apiVersion": 1,
        "version": "0.1.2",
        "displayName": "Honcho Memory",
        "description": "Tool-first Honcho memory integration for Paperclip companies, agents, issues, comments, and documents.",
        "author": "Honcho AI",
        "categories": [
          "connector",
          "automation",
          "ui"
        ],
        "capabilities": [
          "companies.read",
          "projects.read",
          "project.workspaces.read",
          "issues.read",
          "issue.comments.read",
          "issue.documents.read",
          "agents.read",
          "plugin.state.read",
          "plugin.state.write",
          "events.subscribe",
          "jobs.schedule",
          "agent.tools.register",
          "http.outbound",
          "secrets.read-ref",
          "instance.settings.register",
          "ui.detailTab.register",
          "ui.action.register"
        ],
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "honchoApiBaseUrl": {
              "type": "string",
              "title": "Honcho API Base URL",
              "default": "https://api.honcho.dev"
            },
            "honchoApiKey": {
              "type": "string",
              "title": "Honcho API Key",
              "format": "secret-ref",
              "default": ""
            },
            "workspacePrefix": {
              "type": "string",
              "title": "Workspace Prefix",
              "default": "paperclip"
            },
            "syncIssueComments": {
              "type": "boolean",
              "title": "Sync Issue Comments",
              "default": true
            },
            "syncIssueDocuments": {
              "type": "boolean",
              "title": "Sync Issue Documents",
              "default": true
            },
            "enablePromptContext": {
              "type": "boolean",
              "title": "Inject Honcho Prompt Context",
              "default": false
            },
            "enablePeerChat": {
              "type": "boolean",
              "title": "Enable Peer Chat Tool",
              "default": true
            },
            "observe_me": {
              "type": "boolean",
              "title": "Observe Current Agent",
              "default": true
            },
            "observe_others": {
              "type": "boolean",
              "title": "Observe Other Participants",
              "default": true
            },
            "noisePatterns": {
              "type": "array",
              "title": "Custom Noise Patterns",
              "items": {
                "type": "string"
              },
              "default": []
            },
            "disableDefaultNoisePatterns": {
              "type": "boolean",
              "title": "Disable Default Noise Patterns",
              "default": false
            },
            "stripPlatformMetadata": {
              "type": "boolean",
              "title": "Strip Platform Metadata",
              "default": true
            },
            "flushBeforeReset": {
              "type": "boolean",
              "title": "Flush Before Reset",
              "default": false
            }
          }
        },
        "entrypoints": {
          "worker": "./dist/worker-bootstrap.js",
          "ui": "./dist/ui"
        },
        "jobs": [
          {
            "jobKey": "initialize-memory",
            "displayName": "Initialize Memory",
            "description": "Connects Honcho, creates core mappings, imports baseline issue memory, and verifies manual prompt previews."
          },
          {
            "jobKey": "migration-scan",
            "displayName": "Scan Migration Sources",
            "description": "Scans issue comments and issue documents and writes an import preview."
          },
          {
            "jobKey": "migration-import",
            "displayName": "Import Historical Memory",
            "description": "Imports the approved historical Paperclip issue memory preview into Honcho with idempotent ledger checks."
          }
        ],
        "tools": [
          {
            "name": "honcho_get_issue_context",
            "displayName": "Honcho Issue Context",
            "description": "Retrieve compact Honcho context for the current issue session.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "issueId": {
                  "type": "string"
                }
              }
            }
          },
          {
            "name": "honcho_search_memory",
            "displayName": "Honcho Search Memory",
            "description": "Search Honcho memory within the current workspace, narrowing to the current issue by default.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "query": {
                  "type": "string"
                },
                "issueId": {
                  "type": "string"
                },
                "scope": {
                  "type": "string",
                  "enum": [
                    "workspace",
                    "session"
                  ]
                },
                "limit": {
                  "type": "number"
                }
              },
              "required": [
                "query"
              ]
            }
          },
          {
            "name": "honcho_ask_peer",
            "displayName": "Honcho Ask Peer",
            "description": "Query Honcho peer chat for a target peer. Requires peer chat to be enabled in plugin config.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "targetPeerId": {
                  "type": "string"
                },
                "query": {
                  "type": "string"
                },
                "issueId": {
                  "type": "string"
                }
              },
              "required": [
                "targetPeerId",
                "query"
              ]
            }
          },
          {
            "name": "honcho_get_workspace_context",
            "displayName": "Honcho Workspace Context",
            "description": "Retrieve broad workspace recall from Honcho.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "query": {
                  "type": "string"
                }
              }
            }
          },
          {
            "name": "honcho_search_messages",
            "displayName": "Honcho Search Messages",
            "description": "Search raw Honcho messages.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "query": {
                  "type": "string"
                },
                "issueId": {
                  "type": "string"
                },
                "limit": {
                  "type": "number"
                }
              },
              "required": [
                "query"
              ]
            }
          },
          {
            "name": "honcho_search_conclusions",
            "displayName": "Honcho Search Conclusions",
            "description": "Search high-signal summarized Honcho memory.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "query": {
                  "type": "string"
                },
                "issueId": {
                  "type": "string"
                },
                "limit": {
                  "type": "number"
                }
              },
              "required": [
                "query"
              ]
            }
          },
          {
            "name": "honcho_get_session",
            "displayName": "Honcho Session",
            "description": "Retrieve issue session context from Honcho.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "issueId": {
                  "type": "string"
                }
              }
            }
          },
          {
            "name": "honcho_get_agent_context",
            "displayName": "Honcho Agent Context",
            "description": "Retrieve peer context for a specific agent.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "agentId": {
                  "type": "string"
                },
                "issueId": {
                  "type": "string"
                }
              },
              "required": [
                "agentId"
              ]
            }
          },
          {
            "name": "honcho_get_hierarchy_context",
            "displayName": "Honcho Hierarchy Context",
            "description": "Retrieve delegated work context when the host provides lineage metadata.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "runId": {
                  "type": "string"
                },
                "issueId": {
                  "type": "string"
                }
              }
            }
          }
        ],
        "ui": {
          "slots": [
            {
              "type": "settingsPage",
              "id": "honcho-settings-page",
              "displayName": "Honcho Settings",
              "exportName": "HonchoSettingsPage"
            },
            {
              "type": "detailTab",
              "id": "honcho-issue-memory-tab",
              "displayName": "Memory",
              "exportName": "HonchoIssueMemoryTab",
              "entityTypes": [
                "issue"
              ],
              "order": 40
            }
          ],
          "launchers": [
            {
              "id": "honcho-memory-launcher",
              "displayName": "Honcho Memory",
              "placementZone": "globalToolbarButton",
              "action": {
                "type": "openDrawer",
                "target": "HonchoMemoryToolbarLauncher"
              },
              "render": {
                "environment": "hostOverlay"
              }
            }
          ]
        }
      },
      "installs": 23,
      "installCommand": "npx paperclipai@latest plugin install @honcho-ai/paperclip-honcho",
      "resolvedAt": "2026-06-02T07:54:52.878Z"
    },
    {
      "slug": "paperclip-plugin-agent-usage",
      "npmPackage": "paperclip-plugin-agent-usage",
      "addedBy": "lacymorrow",
      "category": "observability",
      "sourceRepo": "https://github.com/lacymorrow/paperclip-plugin-agent-usage",
      "version": "0.1.3",
      "latestVersion": "0.1.3",
      "manifest": {
        "id": "paperclip-plugin-agent-usage",
        "apiVersion": 1,
        "version": "0.1.0",
        "displayName": "Agent Usage Tracker",
        "description": "Monitors AI provider usage quotas (Claude, etc.) and exposes real-time usage data to agents and the dashboard so they can make smart decisions based on remaining capacity.",
        "author": "Paperclip Company",
        "categories": [
          "ui",
          "automation"
        ],
        "capabilities": [
          "companies.read",
          "plugin.state.read",
          "plugin.state.write",
          "events.subscribe",
          "events.emit",
          "jobs.schedule",
          "http.outbound",
          "metrics.write",
          "agent.tools.register",
          "ui.dashboardWidget.register",
          "ui.page.register",
          "instance.settings.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "claudeOauthToken": {
              "type": "string",
              "title": "Claude OAuth Token",
              "description": "OAuth access token for the Anthropic usage API. Found in ~/.claude/.credentials.json under claudeAiOauth.accessToken. Leave blank to auto-detect from the local machine.",
              "default": ""
            },
            "pollIntervalMinutes": {
              "type": "number",
              "title": "Poll Interval (minutes)",
              "description": "How often to refresh usage data from providers.",
              "default": 15
            },
            "providers": {
              "type": "array",
              "title": "Providers to Track",
              "items": {
                "type": "string",
                "enum": [
                  "claude"
                ]
              },
              "default": [
                "claude"
              ]
            }
          }
        },
        "jobs": [
          {
            "jobKey": "poll-usage",
            "displayName": "Poll Provider Usage",
            "description": "Periodically fetches usage quota data from configured AI providers and stores it for agent access.",
            "schedule": "*/15 * * * *"
          }
        ],
        "tools": [
          {
            "name": "get-usage",
            "displayName": "Get AI Provider Usage",
            "description": "Returns current usage quota windows for configured AI providers (utilization percentages, reset times, limits). Use this to check how much capacity remains before starting expensive operations.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "provider": {
                  "type": "string",
                  "description": "Provider to query. Defaults to 'claude'."
                }
              }
            }
          },
          {
            "name": "get-usage-summary",
            "displayName": "Get Usage Summary",
            "description": "Returns a brief human-readable summary of current usage across all providers, including remaining capacity and reset times.",
            "parametersSchema": {
              "type": "object",
              "properties": {}
            }
          }
        ],
        "ui": {
          "slots": [
            {
              "type": "page",
              "id": "agent-usage-page",
              "displayName": "Agent Usage",
              "exportName": "AgentUsagePage",
              "routePath": "agent-usage"
            },
            {
              "type": "settingsPage",
              "id": "agent-usage-settings-page",
              "displayName": "Agent Usage Settings",
              "exportName": "AgentUsageSettingsPage"
            },
            {
              "type": "dashboardWidget",
              "id": "agent-usage-dashboard-widget",
              "displayName": "AI Usage",
              "exportName": "AgentUsageDashboardWidget"
            }
          ]
        }
      },
      "installs": 18,
      "installCommand": "npx paperclipai@latest plugin install paperclip-plugin-agent-usage",
      "resolvedAt": "2026-05-01T00:00:00Z"
    },
    {
      "slug": "paperclip-plugin-workflow-studio",
      "npmPackage": "@vlbog/paperclip-plugin-workflow-studio",
      "addedBy": "lacymorrow",
      "category": "tools",
      "sourceRepo": "https://github.com/Vladick-Pick/paperclip-plugin-workflow-studio",
      "version": "0.1.3",
      "latestVersion": "0.1.3",
      "manifest": {
        "id": "paperclip-plugin-workflow-studio",
        "apiVersion": 1,
        "version": "0.1.3",
        "displayName": "Workflow Studio",
        "description": "Visual workflow editor that publishes Paperclip Company Skills",
        "author": "NoHum",
        "categories": [
          "workspace",
          "ui"
        ],
        "capabilities": [
          "plugin.state.read",
          "plugin.state.write",
          "ui.sidebar.register",
          "ui.page.register",
          "ui.action.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "ui": {
          "slots": [
            {
              "type": "sidebar",
              "id": "workflow-studio-sidebar-link",
              "displayName": "Workflow Studio",
              "exportName": "WorkflowStudioSidebarLink"
            },
            {
              "type": "page",
              "id": "workflow-studio-page",
              "displayName": "Workflow Studio",
              "routePath": "workflow-studio",
              "exportName": "WorkflowStudioPage"
            }
          ],
          "launchers": [
            {
              "id": "workflow-studio-launcher",
              "displayName": "Workflow Studio",
              "description": "Design workflows and publish them as company skills.",
              "placementZone": "page",
              "action": {
                "type": "navigate",
                "target": "workflow-studio"
              },
              "render": {
                "environment": "hostRoute",
                "bounds": "full"
              }
            }
          ]
        }
      },
      "installs": 17,
      "installCommand": "npx paperclipai@latest plugin install @vlbog/paperclip-plugin-workflow-studio",
      "resolvedAt": "2026-04-25T00:00:00Z"
    },
    {
      "slug": "paperclip-plugin-linear",
      "npmPackage": "@oldharlem/paperclip-plugin-linear",
      "addedBy": "lacymorrow",
      "category": "integration",
      "sourceRepo": "https://github.com/Oldharlem/paperclip-linear-plugin",
      "version": "0.7.0",
      "latestVersion": "0.7.0",
      "manifest": {
        "id": "paperclip.linear",
        "apiVersion": 1,
        "version": "0.7.0",
        "displayName": "Linear",
        "description": "Two-way sync between Paperclip projects and a Linear workspace. Pick which Paperclip project links to which Linear project; new Paperclip issues push to the linked Linear project, Linear issues that carry a configured label are imported back so agents can pick them up.",
        "author": "Paperclip",
        "categories": [
          "connector",
          "automation",
          "ui"
        ],
        "capabilities": [
          "companies.read",
          "projects.read",
          "issues.read",
          "issues.create",
          "issues.update",
          "issues.wakeup",
          "issue.comments.read",
          "issue.comments.create",
          "issue.documents.read",
          "activity.log.write",
          "plugin.state.read",
          "plugin.state.write",
          "events.subscribe",
          "events.emit",
          "jobs.schedule",
          "webhooks.receive",
          "http.outbound",
          "secrets.read-ref",
          "agent.tools.register",
          "instance.settings.register",
          "ui.page.register",
          "ui.dashboardWidget.register",
          "ui.detailTab.register",
          "ui.sidebar.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "apiKey": {
              "type": "string",
              "title": "Linear API Key",
              "description": "Paste your Linear personal API key here (Linear → Settings → API → Personal API keys). Stored encrypted at rest. For stronger isolation, use apiKeyRef instead."
            },
            "apiKeyRef": {
              "type": "string",
              "title": "Linear API Key (secret ref)",
              "description": "Optional: reference an entry in the Paperclip secret provider instead of pasting the key above.",
              "format": "secret-ref"
            },
            "webhookSecret": {
              "type": "string",
              "title": "Linear Webhook Signing Secret",
              "description": "Paste the HMAC SHA-256 signing secret Linear shows when you create the webhook."
            },
            "webhookSecretRef": {
              "type": "string",
              "title": "Linear Webhook Signing Secret (secret ref)",
              "format": "secret-ref"
            },
            "apiUrl": {
              "type": "string",
              "title": "Linear GraphQL Endpoint",
              "default": "https://api.linear.app/graphql"
            },
            "paperclipPublicUrl": {
              "type": "string",
              "title": "Paperclip Public URL",
              "description": "Public origin of this Paperclip instance (e.g. https://paperclipai.example.com). Used to compose the Linear webhook URL the plugin auto-provisions. Trailing slashes are stripped."
            },
            "pushPaperclipIssues": {
              "type": "boolean",
              "title": "Push new Paperclip issues to Linear",
              "default": true
            },
            "pushPaperclipDocuments": {
              "type": "boolean",
              "title": "Mirror Paperclip documents (e.g. plans) to Linear comments",
              "description": "When agents create or update an issue document like the plan, post or update a single Linear comment with the document body so it shows up in the Linear thread.",
              "default": true
            },
            "importLinearIssues": {
              "type": "boolean",
              "title": "Import labelled Linear issues into Paperclip",
              "default": true
            },
            "importLabelName": {
              "type": "string",
              "title": "Import label",
              "description": "Linear label name that gates imports — only Linear issues with this label are pulled into Paperclip. The plugin auto-creates the label on first sync.",
              "default": "paperclip"
            },
            "incrementalSyncMinutes": {
              "type": "integer",
              "title": "Incremental Sync Frequency (minutes)",
              "minimum": 1,
              "maximum": 1440,
              "default": 15
            }
          }
        },
        "jobs": [
          {
            "jobKey": "full-sync",
            "displayName": "Linear: Full Sync",
            "description": "Refresh cached Linear teams, projects, and labels; reconcile mapped projects.",
            "schedule": "0 3 * * *"
          },
          {
            "jobKey": "incremental-sync",
            "displayName": "Linear: Incremental Sync",
            "description": "Pull labelled Linear issues updated since the last cursor, per linked project.",
            "schedule": "*/15 * * * *"
          }
        ],
        "webhooks": [
          {
            "endpointKey": "linear",
            "displayName": "Linear Webhook",
            "description": "Receives create/update/remove events from Linear for issues and comments. Configure this URL inside Linear → Settings → API → Webhooks."
          }
        ],
        "tools": [
          {
            "name": "create-linear-issue",
            "displayName": "Create Linear Issue",
            "description": "Creates a new issue in Linear. If the agent's current Paperclip project is linked to a Linear project, the issue is created there.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "title": {
                  "type": "string",
                  "description": "Linear issue title"
                },
                "description": {
                  "type": "string",
                  "description": "Markdown description"
                },
                "paperclipProjectId": {
                  "type": "string",
                  "description": "Optional Paperclip project UUID. When provided, resolves the linked Linear project automatically."
                },
                "paperclipIssueId": {
                  "type": "string",
                  "description": "Optional Paperclip issue UUID. When provided, the resulting Linear issue is linked to it for future bidirectional sync."
                },
                "teamId": {
                  "type": "string",
                  "description": "Optional Linear team UUID override."
                },
                "projectId": {
                  "type": "string",
                  "description": "Optional Linear project UUID override."
                }
              },
              "required": [
                "title"
              ]
            }
          },
          {
            "name": "search-linear-issues",
            "displayName": "Search Linear Issues",
            "description": "Searches Linear for issues matching a query string and returns identifier/title/url for the top matches.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "query": {
                  "type": "string"
                },
                "limit": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 50,
                  "default": 10
                }
              },
              "required": [
                "query"
              ]
            }
          }
        ],
        "ui": {
          "slots": [
            {
              "type": "page",
              "id": "linear-page",
              "displayName": "Linear",
              "exportName": "LinearPage",
              "routePath": "linear"
            },
            {
              "type": "dashboardWidget",
              "id": "linear-dashboard-widget",
              "displayName": "Linear Sync",
              "exportName": "LinearDashboardWidget"
            },
            {
              "type": "detailTab",
              "id": "linear-issue-detail-tab",
              "displayName": "Linear",
              "exportName": "LinearIssueDetailTab",
              "entityTypes": [
                "issue"
              ]
            },
            {
              "type": "detailTab",
              "id": "linear-project-detail-tab",
              "displayName": "Linear",
              "exportName": "LinearProjectDetailTab",
              "entityTypes": [
                "project"
              ]
            },
            {
              "type": "projectSidebarItem",
              "id": "linear-project-sidebar-item",
              "displayName": "Linear",
              "exportName": "LinearProjectSidebarItem",
              "entityTypes": [
                "project"
              ]
            }
          ]
        }
      },
      "installs": 16,
      "installCommand": "npx paperclipai@latest plugin install @oldharlem/paperclip-plugin-linear",
      "resolvedAt": "2026-04-14T00:00:00Z"
    },
    {
      "slug": "paperclip-plugin-acn",
      "npmPackage": "@acnlabs/paperclip-plugin-acn",
      "addedBy": "lacymorrow",
      "category": "integration",
      "sourceRepo": "https://github.com/acnlabs/paperclip-acn-plugin",
      "version": "0.1.1",
      "latestVersion": "0.1.1",
      "manifest": {
        "id": "acnlabs.acn",
        "apiVersion": 1,
        "version": "0.1.0",
        "displayName": "ACN — Agent Collaboration Network",
        "description": "Connect Paperclip to ACN: sync tasks, manage agent identity, and settle work through the ACN protocol layer.",
        "author": "acnlabs",
        "categories": [
          "connector",
          "automation"
        ],
        "entrypoints": {
          "worker": "dist/worker.js",
          "ui": "dist/ui"
        },
        "capabilities": [
          "companies.read",
          "issues.read",
          "issues.create",
          "issues.update",
          "issue.comments.read",
          "issue.comments.create",
          "agents.read",
          "events.subscribe",
          "webhooks.receive",
          "http.outbound",
          "secrets.read-ref",
          "plugin.state.read",
          "plugin.state.write",
          "ui.detailTab.register",
          "instance.settings.register"
        ],
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "acnBaseUrl": {
              "type": "string",
              "title": "ACN Base URL",
              "default": "https://api.acnlabs.dev",
              "description": "Base URL of the ACN instance (no trailing slash). Defaults to ACN Labs' hosted production ACN — point at your own deployment to self-host."
            },
            "paperclipBaseUrl": {
              "type": "string",
              "title": "Paperclip Base URL",
              "default": "",
              "description": "Public base URL of this Paperclip instance (e.g. https://app.paperclip.ai). Used to construct the ACN harness webhook URL."
            },
            "acnApiKeyRef": {
              "type": "string",
              "title": "ACN API Key (secret ref)",
              "default": "",
              "description": "Secret reference to the ACN agent API key used to call ACN on behalf of Paperclip."
            },
            "acnHarnessSecretRef": {
              "type": "string",
              "title": "ACN Harness Webhook Secret (secret ref)",
              "default": "",
              "description": "Secret reference to the shared HMAC-SHA256 secret used to sign and verify ACN harness webhook deliveries (X-ACN-Signature). Leave blank to skip verification (NOT recommended in production)."
            },
            "acnSubnetId": {
              "type": "string",
              "title": "ACN Subnet ID",
              "default": "",
              "description": "The ACN subnet whose tasks this plugin syncs into Paperclip issues."
            },
            "autoCreateIssues": {
              "type": "boolean",
              "title": "Auto-create Paperclip issues for new ACN tasks",
              "default": true
            },
            "autoApproveOnDone": {
              "type": "boolean",
              "title": "Auto-approve ACN task when Paperclip issue moves to 'done'",
              "default": false,
              "description": "When disabled, a board member must click Approve in the ACN tab to release payment."
            }
          }
        },
        "webhooks": [
          {
            "endpointKey": "acn-events",
            "displayName": "ACN Task Events",
            "description": "Receives HMAC-signed lifecycle events from ACN (task.created, task.submitted, task.completed, ...)."
          }
        ],
        "ui": {
          "slots": [
            {
              "type": "detailTab",
              "id": "acn-issue-tab",
              "displayName": "ACN",
              "exportName": "ACNIssueTab",
              "entityTypes": [
                "issue"
              ]
            }
          ]
        }
      },
      "installs": 16,
      "installCommand": "npx paperclipai@latest plugin install @acnlabs/paperclip-plugin-acn",
      "resolvedAt": "2026-06-02T07:54:58.000Z"
    },
    {
      "slug": "social-networking",
      "npmPackage": "@gaud_erp/social-networking",
      "addedBy": "lacymorrow",
      "category": "integration",
      "sourceRepo": "https://github.com/gauderp/papperclip-social-networking",
      "version": "0.1.0",
      "latestVersion": "0.1.0",
      "manifest": {
        "id": "gauderp.social-networking",
        "apiVersion": 1,
        "version": "0.1.0",
        "displayName": "Social Networking",
        "description": "Conecta contas de redes sociais, agenda publicacoes e exibe historico com metricas. Slice inicial: LinkedIn.",
        "author": "Gaud ERP",
        "categories": [
          "connector",
          "ui"
        ],
        "capabilities": [
          "events.subscribe",
          "plugin.state.read",
          "plugin.state.write",
          "secrets.read-ref",
          "http.outbound",
          "jobs.schedule",
          "database.namespace.migrate",
          "database.namespace.read",
          "database.namespace.write",
          "api.routes.register",
          "ui.sidebar.register",
          "ui.page.register",
          "instance.settings.register"
        ],
        "database": {
          "migrationsDir": "migrations",
          "coreReadTables": []
        },
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "apiRoutes": [
          {
            "routeKey": "network-status",
            "method": "GET",
            "path": "/networks/:networkKey/status",
            "auth": "board-or-agent",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "query",
              "key": "companyId"
            }
          },
          {
            "routeKey": "linkedin-sync-metrics",
            "method": "POST",
            "path": "/linkedin/sync-metrics",
            "auth": "board-or-agent",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "query",
              "key": "companyId"
            }
          },
          {
            "routeKey": "scheduled-posts-list",
            "method": "GET",
            "path": "/networks/:networkKey/scheduled-posts",
            "auth": "board-or-agent",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "query",
              "key": "companyId"
            }
          },
          {
            "routeKey": "scheduled-posts-create",
            "method": "POST",
            "path": "/networks/:networkKey/scheduled-posts",
            "auth": "board-or-agent",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "query",
              "key": "companyId"
            }
          },
          {
            "routeKey": "scheduled-posts-delete",
            "method": "DELETE",
            "path": "/networks/:networkKey/scheduled-posts/:postId",
            "auth": "board-or-agent",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "query",
              "key": "companyId"
            }
          }
        ],
        "jobs": [
          {
            "jobKey": "publish-scheduled",
            "displayName": "Publicar posts agendados",
            "description": "Processa fila de publicacoes com scheduledAt <= agora.",
            "schedule": "*/5 * * * *"
          },
          {
            "jobKey": "sync-linkedin-metrics",
            "displayName": "Sincronizar metricas LinkedIn",
            "description": "Atualiza likes, comentarios, shares e impressions em post_metrics.",
            "schedule": "0 */6 * * *"
          }
        ],
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "linkedinClientIdSecretRef": {
              "type": "string",
              "title": "LinkedIn Client ID (secret ref)",
              "default": ""
            },
            "linkedinClientSecretSecretRef": {
              "type": "string",
              "title": "LinkedIn Client Secret (secret ref)",
              "default": ""
            }
          }
        },
        "ui": {
          "slots": [
            {
              "type": "sidebar",
              "id": "social-sidebar-link",
              "displayName": "Social Networking",
              "exportName": "SidebarLink",
              "order": 45
            },
            {
              "type": "page",
              "id": "social-hub-page",
              "displayName": "Social Networking",
              "exportName": "SocialHubPage",
              "routePath": "social"
            },
            {
              "type": "routeSidebar",
              "id": "social-route-sidebar",
              "displayName": "Social Networking",
              "exportName": "SocialRouteSidebar",
              "routePath": "social"
            },
            {
              "type": "page",
              "id": "linkedin-page",
              "displayName": "LinkedIn",
              "exportName": "LinkedInPage",
              "routePath": "social-linkedin"
            },
            {
              "type": "routeSidebar",
              "id": "linkedin-route-sidebar",
              "displayName": "Social Networking",
              "exportName": "SocialRouteSidebar",
              "routePath": "social-linkedin"
            },
            {
              "type": "settingsPage",
              "id": "social-settings",
              "displayName": "Social Networking",
              "exportName": "SettingsPage"
            }
          ]
        }
      },
      "installs": 14,
      "installCommand": "npx paperclipai@latest plugin install @gaud_erp/social-networking",
      "resolvedAt": "2026-06-02T07:55:03.089Z"
    },
    {
      "slug": "anneal-memory-paperclip-plugin",
      "npmPackage": "@anneal-memory/paperclip-plugin",
      "addedBy": "lacymorrow",
      "category": "memory",
      "sourceRepo": "https://github.com/phillipclapham/anneal-memory-paperclip-plugin",
      "version": "0.0.2",
      "latestVersion": "0.0.2",
      "manifest": {
        "id": "anneal-memory",
        "apiVersion": 1,
        "version": "0.0.1",
        "displayName": "anneal-memory",
        "description": "First-class four-layer memory for Paperclip agents: episodic store + continuity file + Hebbian associations + limbic affective tagging, with citation-validated graduation and tamper-evident audit chain. Wraps the anneal-memory Python MCP server.",
        "author": "Phill Clapham",
        "categories": [
          "automation"
        ],
        "capabilities": [
          "agent.tools.register",
          "plugin.state.read",
          "plugin.state.write",
          "activity.log.write",
          "events.subscribe"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js"
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "mcpCommand": {
              "type": "string",
              "title": "anneal-memory command",
              "description": "Path or command name for the anneal-memory MCP server executable. Default: 'anneal-memory' (resolves via PATH). Override for uvx, pipx, or virtualenv installs.",
              "default": "anneal-memory"
            },
            "storeBasePath": {
              "type": "string",
              "title": "Memory store base path",
              "description": "Filesystem directory under which per-agent SQLite stores are created. Each Paperclip agent gets a subdirectory: <storeBasePath>/<agentId>/memory.db. Defaults to the plugin's data directory."
            },
            "autoRecordEvents": {
              "type": "boolean",
              "title": "Auto-record Paperclip events as episodes",
              "description": "When enabled, the plugin subscribes to agent/run events and records them as 'observation' episodes automatically. Disable for explicit-only recording.",
              "default": false
            }
          }
        },
        "tools": [
          {
            "name": "record",
            "displayName": "Record episode",
            "description": "Record a typed episode to memory. Call when important decisions are made, patterns noticed, tensions identified, questions arise, or outcomes observed. Record the reasoning, not just the fact.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "content": {
                  "type": "string",
                  "description": "Episode content."
                },
                "episode_type": {
                  "type": "string",
                  "enum": [
                    "observation",
                    "decision",
                    "tension",
                    "question",
                    "outcome",
                    "context"
                  ],
                  "description": "Episode type."
                },
                "source": {
                  "type": "string",
                  "description": "Source attribution. Default 'agent'."
                },
                "metadata": {
                  "type": "object",
                  "description": "Optional JSON metadata."
                }
              },
              "required": [
                "content",
                "episode_type"
              ]
            }
          },
          {
            "name": "recall",
            "displayName": "Recall episodes",
            "description": "Query episodes from memory with filters (time range, type, source, keyword). Returns matches newest-first.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "since": {
                  "type": "string",
                  "description": "ISO 8601 lower bound."
                },
                "until": {
                  "type": "string",
                  "description": "ISO 8601 upper bound."
                },
                "episode_type": {
                  "type": "string",
                  "enum": [
                    "observation",
                    "decision",
                    "tension",
                    "question",
                    "outcome",
                    "context"
                  ]
                },
                "source": {
                  "type": "string"
                },
                "keyword": {
                  "type": "string"
                },
                "limit": {
                  "type": "integer",
                  "default": 100
                },
                "offset": {
                  "type": "integer",
                  "default": 0
                }
              }
            }
          },
          {
            "name": "prepare_wrap",
            "displayName": "Prepare wrap (compression package)",
            "description": "Prepare a compression package at session boundary. Returns episodes since last wrap, current continuity, stale pattern warnings, Hebbian association context, and compression instructions. Mints a wrap_token that must be round-tripped to save_continuity.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "max_chars": {
                  "type": "integer",
                  "default": 20000
                },
                "staleness_days": {
                  "type": "integer",
                  "default": 7
                }
              }
            }
          },
          {
            "name": "save_continuity",
            "displayName": "Save compressed continuity",
            "description": "Validate and save compressed continuity (must contain ## State, ## Patterns, ## Decisions, ## Context). Server validates structure, citation grounding, citation gaming, and records Hebbian associations + optional affective state.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "text": {
                  "type": "string",
                  "description": "Full continuity markdown."
                },
                "affective_state": {
                  "type": "object",
                  "properties": {
                    "tag": {
                      "type": "string"
                    },
                    "intensity": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 1
                    }
                  },
                  "required": [
                    "tag",
                    "intensity"
                  ]
                },
                "wrap_token": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{32}$",
                  "description": "32-char hex token from prepare_wrap response."
                }
              },
              "required": [
                "text"
              ]
            }
          },
          {
            "name": "delete_episode",
            "displayName": "Delete episode",
            "description": "Delete a single episode by ID (GDPR-grade; tombstone preserved by default). Cascades to associations + audit log. Irreversible.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "episode_id": {
                  "type": "string",
                  "description": "8-char hex episode ID."
                }
              },
              "required": [
                "episode_id"
              ]
            }
          },
          {
            "name": "status",
            "displayName": "Memory status",
            "description": "Get memory health metrics: episode counts, wrap state, continuity size, Hebbian density, audit chain health.",
            "parametersSchema": {
              "type": "object",
              "properties": {}
            }
          }
        ]
      },
      "installs": 13,
      "installCommand": "npx paperclipai@latest plugin install @anneal-memory/paperclip-plugin",
      "resolvedAt": "2026-06-02T07:56:10.924Z"
    },
    {
      "slug": "paperclip-plugin-chat",
      "npmPackage": "@webprismdev/paperclip-plugin-chat",
      "addedBy": "lacymorrow",
      "category": "tools",
      "sourceRepo": "https://github.com/webprismdevin/paperclip-plugin-chat",
      "version": "0.1.12",
      "latestVersion": "0.1.12",
      "manifest": {
        "id": "chat-ui",
        "apiVersion": 1,
        "version": "0.1.12",
        "displayName": "Chat",
        "description": "Interactive AI copilot for managing tasks, agents, and workspaces through natural conversation",
        "author": "webprismdevin",
        "categories": [
          "ui"
        ],
        "capabilities": [
          "ui.page.register",
          "ui.sidebar.register",
          "issues.read",
          "issues.create",
          "issues.update",
          "issue.comments.create",
          "agents.read",
          "projects.read",
          "activity.read",
          "costs.read"
        ],
        "entrypoints": {
          "worker": "dist/server/worker.js",
          "ui": "dist/ui"
        },
        "ui": {
          "slots": [
            {
              "type": "page",
              "id": "chat-page",
              "displayName": "Chat",
              "exportName": "default"
            },
            {
              "type": "sidebar",
              "id": "chat-sidebar",
              "displayName": "Chat",
              "exportName": "default"
            }
          ]
        }
      },
      "installs": 13,
      "installCommand": "npx paperclipai@latest plugin install @webprismdev/paperclip-plugin-chat",
      "resolvedAt": "2026-06-02T07:55:12.387Z"
    },
    {
      "slug": "clawnet-plugin",
      "npmPackage": "@bopen-io/clawnet-plugin",
      "addedBy": "lacymorrow",
      "category": "integration",
      "version": "0.0.12",
      "latestVersion": "0.0.12",
      "manifest": {
        "id": "bopen-io.clawnet-plugin",
        "apiVersion": 1,
        "version": "0.0.12",
        "displayName": "ClawNet",
        "description": "Agent marketplace bridge: browse, search, and hire agents from the ClawNet registry with trust-gated attestations",
        "author": "bOpen",
        "categories": [
          "connector"
        ],
        "capabilities": [
          "agents.read",
          "agents.invoke",
          "issues.create",
          "issues.read",
          "plugin.state.read",
          "plugin.state.write",
          "events.subscribe",
          "jobs.schedule",
          "http.outbound",
          "secrets.read-ref",
          "agent.tools.register",
          "ui.dashboardWidget.register",
          "ui.page.register",
          "ui.sidebar.register",
          "instance.settings.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "clawnetApiUrl": {
              "type": "string",
              "title": "ClawNet API URL",
              "default": "https://clawnet.sh"
            },
            "syncIntervalMinutes": {
              "type": "number",
              "title": "Sync Interval (minutes)",
              "default": 15
            }
          }
        },
        "jobs": [
          {
            "jobKey": "clawnet-sync",
            "displayName": "ClawNet Registry Sync",
            "description": "Pulls agents and skills from the ClawNet registry into plugin state.",
            "schedule": "*/15 * * * *"
          }
        ],
        "tools": [
          {
            "name": "agent-lookup",
            "displayName": "ClawNet Agent Lookup",
            "description": "Look up a ClawNet agent by slug and return its profile, trust score, skills, and attestations.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "slug": {
                  "type": "string",
                  "description": "The ClawNet agent slug to look up."
                }
              },
              "required": [
                "slug"
              ]
            }
          },
          {
            "name": "skill-search",
            "displayName": "ClawNet Skill Search",
            "description": "Search available skills from the ClawNet registry by keyword or category.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "query": {
                  "type": "string",
                  "description": "Search query for skill name, description, or tags."
                },
                "category": {
                  "type": "string",
                  "description": "Optional category filter."
                }
              },
              "required": [
                "query"
              ]
            }
          },
          {
            "name": "fleet-overview",
            "displayName": "ClawNet Fleet Overview",
            "description": "Return a summary of all ClawNet agents including count, status breakdown, and top skills.",
            "parametersSchema": {
              "type": "object",
              "properties": {}
            }
          },
          {
            "name": "hire-clawnet-agent",
            "displayName": "Hire ClawNet Agent",
            "description": "Hire an agent from the ClawNet registry into this Paperclip company. Looks up the agent by slug and invokes the hiring flow.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "slug": {
                  "type": "string",
                  "description": "ClawNet agent slug to hire."
                }
              },
              "required": [
                "slug"
              ]
            }
          },
          {
            "name": "link-clawnet-agent",
            "displayName": "Link Agent to ClawNet Template",
            "description": "Link an existing Paperclip agent to a ClawNet registry template by agent ID and ClawNet slug.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "agentId": {
                  "type": "string",
                  "description": "Paperclip agent UUID to link."
                },
                "clawnetSlug": {
                  "type": "string",
                  "description": "ClawNet agent slug to link to."
                }
              },
              "required": [
                "agentId",
                "clawnetSlug"
              ]
            }
          }
        ],
        "ui": {
          "slots": [
            {
              "type": "dashboardWidget",
              "id": "clawnet-dashboard-widget",
              "displayName": "ClawNet Fleet",
              "exportName": "ClawNetFleetWidget"
            },
            {
              "type": "page",
              "id": "clawnet-page",
              "displayName": "ClawNet Marketplace",
              "exportName": "ClawNetMarketplacePage",
              "routePath": "clawnet"
            },
            {
              "type": "sidebar",
              "id": "clawnet-sidebar-link",
              "displayName": "ClawNet",
              "exportName": "ClawNetSidebarLink"
            },
            {
              "type": "settingsPage",
              "id": "clawnet-settings-page",
              "displayName": "ClawNet Settings",
              "exportName": "ClawNetSettingsPage"
            }
          ]
        }
      },
      "installs": 12,
      "installCommand": "npx paperclipai@latest plugin install @bopen-io/clawnet-plugin",
      "resolvedAt": "2026-06-02T07:55:01.661Z"
    },
    {
      "slug": "papperclip_observability",
      "npmPackage": "@gaud_erp/papperclip_observability",
      "addedBy": "lacymorrow",
      "category": "observability",
      "sourceRepo": "https://github.com/gauderp/paperclip-plugin-observability",
      "version": "0.3.3",
      "latestVersion": "0.3.3",
      "manifest": {
        "id": "paperclip.observability",
        "apiVersion": 1,
        "version": "0.3.3",
        "displayName": "Observability",
        "description": "Configure metrics data sources and view imported dashboards (Grafana, AWS CloudWatch)",
        "author": "Paperclip",
        "categories": [
          "ui"
        ],
        "capabilities": [
          "plugin.state.read",
          "plugin.state.write",
          "secrets.read-ref",
          "ui.sidebar.register",
          "ui.page.register",
          "instance.settings.register",
          "metrics.write"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "ui": {
          "slots": [
            {
              "type": "sidebar",
              "id": "observability-nav",
              "displayName": "Observability",
              "exportName": "ObservabilitySidebar",
              "order": 40
            },
            {
              "type": "routeSidebar",
              "id": "observability-route-nav",
              "displayName": "Observability",
              "routePath": "observability",
              "exportName": "ObservabilityRouteSidebar",
              "order": 40
            },
            {
              "type": "page",
              "id": "observability",
              "displayName": "Observability",
              "routePath": "observability",
              "exportName": "ObservabilityPage",
              "order": 40
            },
            {
              "type": "settingsPage",
              "id": "observability-settings",
              "displayName": "Observability",
              "exportName": "ObservabilitySettingsPage",
              "order": 40
            }
          ]
        }
      },
      "installs": 12,
      "installCommand": "npx paperclipai@latest plugin install @gaud_erp/papperclip_observability",
      "resolvedAt": "2026-06-02T07:55:08.249Z"
    },
    {
      "slug": "plugin-feishu-connector-v2",
      "npmPackage": "@niubitli/plugin-feishu-connector-v2",
      "addedBy": "lacymorrow",
      "category": "integration",
      "version": "0.3.3-connector-feishu",
      "latestVersion": "0.3.3-connector-feishu",
      "manifest": {
        "id": "paperclipai.feishu-connector",
        "apiVersion": 1,
        "version": "0.3.1-connector-feishu",
        "displayName": "飞书连接器",
        "description": "让 Paperclip 智能体通过飞书机器人收消息、回消息，并可把需求写入飞书多维表格。",
        "author": "Paperclip",
        "categories": [
          "connector",
          "automation"
        ],
        "capabilities": [
          "companies.read",
          "projects.read",
          "issues.read",
          "issues.create",
          "issue.comments.read",
          "issue.comments.create",
          "issue.attachments.create",
          "agents.read",
          "agents.invoke",
          "agent.sessions.create",
          "agent.sessions.send",
          "activity.log.write",
          "metrics.write",
          "database.namespace.migrate",
          "database.namespace.read",
          "database.namespace.write",
          "plugin.state.read",
          "plugin.state.write",
          "secrets.read-ref",
          "webhooks.receive",
          "api.routes.register",
          "events.subscribe",
          "agent.tools.register",
          "instance.settings.register",
          "ui.sidebar.register",
          "ui.dashboardWidget.register",
          "ui.detailTab.register",
          "ui.action.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "webhooks": [
          {
            "endpointKey": "feishu-events",
            "displayName": "飞书事件回调",
            "description": "接收飞书开放平台推送的消息事件，并按入口规则创建或更新 Paperclip Issue。"
          }
        ],
        "apiRoutes": [
          {
            "routeKey": "simulate-inbound-message",
            "method": "POST",
            "path": "/simulate-inbound-message",
            "auth": "board",
            "capability": "api.routes.register",
            "companyResolution": {
              "from": "body",
              "key": "companyId"
            }
          }
        ],
        "database": {
          "namespaceSlug": "feishu_connector",
          "migrationsDir": "migrations",
          "coreReadTables": [
            "issues"
          ]
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "capabilityDefaultPolicy": {
              "type": "string",
              "title": "飞书能力默认开放策略",
              "x-order": 5,
              "description": "默认使用“按飞书应用授权开放”：插件不会让用户逐项确认已接入能力，用户只需要关闭不想给 Agent 使用的能力。",
              "enum": [
                "authorized",
                "conservative"
              ],
              "enumNames": [
                "按飞书应用授权开放",
                "保守模式：只开启核心能力"
              ],
              "default": "authorized"
            },
            "connections": {
              "type": "array",
              "title": "第 1 步：飞书机器人账号",
              "x-order": 10,
              "description": "先告诉 Paperclip 用哪个飞书机器人收发消息。通常一个机器人填一项。",
              "items": {
                "type": "object",
                "title": "飞书机器人账号",
                "properties": {
                  "id": {
                    "type": "string",
                    "title": "连接代号",
                    "x-order": 10,
                    "description": "自己起一个短名字，后面的接收规则会引用它。建议用英文和短横线，例如 boss-news-bot。",
                    "default": "boss-news-bot"
                  },
                  "name": {
                    "type": "string",
                    "title": "页面显示名称",
                    "x-order": 20,
                    "description": "给人看的名字，例如「老板资讯机器人」。",
                    "default": "老板资讯机器人"
                  },
                  "profileName": {
                    "type": "string",
                    "title": "lark-cli 登录配置名",
                    "x-order": 30,
                    "description": "这是飞书官方 lark-cli 里已经登录好的 profile 名。不会填时先找工程师执行 lark-cli auth login 创建。",
                    "default": "paperclip-news-bot"
                  },
                  "botAliases": {
                    "type": "array",
                    "title": "飞书 @ 名称/别名",
                    "x-order": 32,
                    "description": "当飞书或 lark-cli 没有返回机器人显示名时，用这里判断用户是不是 @ 了当前机器人。可填多个，例如「锐思」「小锐」。",
                    "items": {
                      "type": "string"
                    },
                    "default": []
                  },
                  "appId": {
                    "type": "string",
                    "title": "飞书 App ID（可选）",
                    "x-order": 35,
                    "description": "只用于页面核对，不保存 App Secret。App Secret 由官方 lark-cli profile 托管。"
                  },
                  "enabled": {
                    "type": "boolean",
                    "title": "启用这个飞书机器人",
                    "x-order": 40,
                    "default": true
                  }
                },
                "required": [
                  "id",
                  "profileName"
                ]
              },
              "default": []
            },
            "routes": {
              "type": "array",
              "title": "第 2 步：飞书消息交给哪个智能体",
              "x-order": 20,
              "description": "一条规则代表一个场景：谁在飞书里发消息、交给 Paperclip 里的哪个智能体处理。",
              "items": {
                "type": "object",
                "title": "接收消息规则",
                "properties": {
                  "id": {
                    "type": "string",
                    "title": "规则代号",
                    "x-order": 10,
                    "description": "自己起一个短名字，例如 boss-chat-to-news-agent。",
                    "default": "boss-chat-to-news-agent"
                  },
                  "connectionId": {
                    "type": "string",
                    "title": "使用哪个飞书机器人",
                    "x-order": 20,
                    "description": "填写第 1 步里的「连接代号」。如果只配置了一个机器人，也建议填上，避免以后混淆。",
                    "default": "boss-news-bot"
                  },
                  "enabled": {
                    "type": "boolean",
                    "title": "启用这条规则",
                    "x-order": 30,
                    "default": true
                  },
                  "matchType": {
                    "type": "string",
                    "title": "监听方式",
                    "x-order": 40,
                    "description": "最常用选「指定飞书群/会话」。老板单聊机器人也可以用这个方式，填对应 chat_id。",
                    "enum": [
                      "chat",
                      "user",
                      "keyword",
                      "regex",
                      "default"
                    ],
                    "enumNames": [
                      "指定飞书群/会话",
                      "指定发消息的人",
                      "消息包含关键词",
                      "高级：正则匹配",
                      "兜底：其他消息都接收"
                    ],
                    "default": "chat"
                  },
                  "chatId": {
                    "type": "string",
                    "title": "飞书群/会话 chat_id",
                    "x-order": 50,
                    "description": "监听方式选「指定飞书群/会话」时填写。设置页支持按群名搜索后自动带出。"
                  },
                  "chatName": {
                    "type": "string",
                    "title": "飞书群/会话名称",
                    "x-order": 55,
                    "description": "只用于页面显示，真正匹配仍以 chat_id 为准。"
                  },
                  "userOpenId": {
                    "type": "string",
                    "title": "发消息人的 open_id",
                    "x-order": 60,
                    "description": "监听方式选「指定发消息的人」时填写。设置页支持按姓名搜索后自动带出。"
                  },
                  "userName": {
                    "type": "string",
                    "title": "发消息人姓名",
                    "x-order": 65,
                    "description": "只用于页面显示，真正匹配仍以 open_id 为准。"
                  },
                  "keyword": {
                    "type": "string",
                    "title": "关键词",
                    "x-order": 70,
                    "description": "监听方式选「消息包含关键词」时填写。例如「资讯」「帮我查」。"
                  },
                  "regex": {
                    "type": "string",
                    "title": "高级：正则表达式",
                    "x-order": 80,
                    "description": "一般不用填。只有需要复杂匹配规则时给工程师使用。"
                  },
                  "companyRef": {
                    "type": "string",
                    "title": "Paperclip 公司",
                    "x-order": 90,
                    "description": "填公司名称或左侧圆点上的公司前缀即可，例如「锐捷网络」或「CMP」。",
                    "default": "CMP"
                  },
                  "targetAgentName": {
                    "type": "string",
                    "title": "交给哪个智能体",
                    "x-order": 100,
                    "description": "填左侧智能体列表里显示的名字，例如「资讯数字人」「刘总」。插件会自动找到对应智能体。"
                  },
                  "replyMode": {
                    "type": "string",
                    "title": "智能体处理后怎么回复飞书",
                    "x-order": 110,
                    "enum": [
                      "none",
                      "message",
                      "thread"
                    ],
                    "enumNames": [
                      "不自动回复",
                      "发一条新消息",
                      "在原消息线程里回复"
                    ],
                    "default": "thread"
                  },
                  "baseSinkId": {
                    "type": "string",
                    "title": "可选：同步到哪张多维表格",
                    "x-order": 120,
                    "description": "填写第 3 步里的「多维表格规则代号」。不需要写入多维表格就留空。"
                  },
                  "priority": {
                    "type": "number",
                    "title": "高级：规则优先级",
                    "x-order": 900,
                    "description": "多条规则都能匹配时，数字大的先执行。普通用户保持 10 即可。",
                    "default": 10
                  },
                  "companyId": {
                    "type": "string",
                    "title": "高级：公司 ID",
                    "x-order": 910,
                    "description": "普通用户不用填。只有公司名称/前缀找不到时，才让工程师复制公司 ID。"
                  },
                  "projectId": {
                    "type": "string",
                    "title": "高级：项目 ID",
                    "x-order": 920,
                    "description": "默认会创建到公司任务池。想固定进入某个项目时再填项目 ID。"
                  },
                  "targetAgentId": {
                    "type": "string",
                    "title": "高级：智能体 ID",
                    "x-order": 930,
                    "description": "普通用户不用填。只有智能体名称找不到时，才复制智能体页面 URL 里的 ID。"
                  }
                },
                "required": [
                  "id",
                  "matchType"
                ]
              },
              "default": []
            },
            "baseSinks": {
              "type": "array",
              "title": "第 3 步（可选）：写入飞书多维表格",
              "x-order": 30,
              "description": "如果希望把飞书里的新需求同步沉淀到多维表格，就在这里添加一项。不需要就留空。",
              "items": {
                "type": "object",
                "title": "多维表格写入规则",
                "properties": {
                  "id": {
                    "type": "string",
                    "title": "多维表格规则代号",
                    "x-order": 10,
                    "description": "自己起一个短名字，接收规则里会引用它。例如 boss-demand-base。",
                    "default": "boss-demand-base"
                  },
                  "connectionId": {
                    "type": "string",
                    "title": "使用哪个飞书机器人",
                    "x-order": 20,
                    "description": "填写第 1 步里的「连接代号」。留空时默认使用第一个机器人。",
                    "default": "boss-news-bot"
                  },
                  "enabled": {
                    "type": "boolean",
                    "title": "启用写入多维表格",
                    "x-order": 30,
                    "default": true
                  },
                  "baseToken": {
                    "type": "string",
                    "title": "多维表格 base token",
                    "x-order": 40,
                    "description": "飞书多维表格链接里的 app 开头那段 token。不会找时把表格链接发给工程师。"
                  },
                  "tableIdOrName": {
                    "type": "string",
                    "title": "数据表 ID 或表名",
                    "x-order": 50,
                    "description": "可以填表名，例如「需求池」；更稳的是填 table_id。"
                  },
                  "identity": {
                    "type": "string",
                    "title": "用谁的身份写表",
                    "x-order": 60,
                    "enum": [
                      "bot",
                      "user"
                    ],
                    "enumNames": [
                      "机器人身份",
                      "用户身份"
                    ],
                    "default": "bot"
                  },
                  "fieldMap": {
                    "type": "object",
                    "title": "写入哪些字段",
                    "x-order": 70,
                    "description": "左边是飞书表格字段名，右边是要写入的内容模板。默认字段适合「需求池」表。",
                    "properties": {
                      "需求标题": {
                        "type": "string",
                        "title": "需求标题",
                        "x-order": 10,
                        "default": "{{issue_title}}"
                      },
                      "原始需求": {
                        "type": "string",
                        "title": "原始需求",
                        "x-order": 20,
                        "default": "{{message.text}}"
                      },
                      "提出人": {
                        "type": "string",
                        "title": "提出人",
                        "x-order": 30,
                        "default": "{{sender.name}}"
                      },
                      "飞书消息ID": {
                        "type": "string",
                        "title": "飞书消息ID",
                        "x-order": 40,
                        "default": "{{message.id}}"
                      },
                      "Paperclip任务ID": {
                        "type": "string",
                        "title": "Paperclip任务ID",
                        "x-order": 50,
                        "default": "{{issue_id}}"
                      }
                    }
                  }
                },
                "required": [
                  "id",
                  "baseToken",
                  "tableIdOrName"
                ]
              },
              "default": []
            },
            "dryRunCli": {
              "type": "boolean",
              "title": "测试模式：先不真的发飞书消息",
              "x-order": 40,
              "default": true,
              "description": "刚配置时建议打开。确认没问题后再关闭，关闭后才会真的调用 lark-cli 给飞书发消息或写表。"
            },
            "ackOnInbound": {
              "type": "boolean",
              "title": "收到需求后先回复一句「已收到」",
              "x-order": 50,
              "default": false,
              "description": "打开后，飞书消息进来时会先自动回复确认。建议正式使用时打开。"
            },
            "ackMessageTemplate": {
              "type": "string",
              "title": "收到需求时的确认话术",
              "x-order": 60,
              "default": "已收到，交给 {{agent_name}} 处理。\n任务：{{issue_ref}}",
              "description": "可以使用 {{agent_name}} 表示智能体名称。"
            },
            "enableQuickReply": {
              "type": "boolean",
              "title": "测试口令：只回复 ok 时不跑智能体",
              "x-order": 65,
              "default": true,
              "description": "打开后，在飞书里 @机器人 发送「只回复 ok」会直接回 ok，用来确认飞书收发链路，不会创建 Paperclip 任务。"
            },
            "quickReplyRegex": {
              "type": "string",
              "title": "高级：测试口令匹配规则",
              "x-order": 66,
              "default": "^(只回复\\s*ok|回复\\s*ok|ping)$",
              "description": "普通用户不用改。匹配到这个规则时，会直接发送下方的测试回复内容。"
            },
            "quickReplyText": {
              "type": "string",
              "title": "测试回复内容",
              "x-order": 67,
              "default": "ok",
              "description": "测试口令命中后，机器人直接回复这句话。"
            },
            "completionMessageTemplate": {
              "type": "string",
              "title": "智能体完成后的回复话术",
              "x-order": 70,
              "default": "处理完成：{{issue_title}}",
              "description": "默认优先使用 Paperclip 最终评论正文。自定义时可使用 {{issue_title}}、{{issue_ref}}、{{issue_url}}。"
            },
            "paperclipBaseUrl": {
              "type": "string",
              "title": "Paperclip 内部访问地址（可选）",
              "x-order": 75,
              "default": "",
              "description": "例如 https://paperclip.company.com。只用于飞书里附带内部任务链接；没有 Paperclip 账号的人打不开。"
            },
            "enableEventSubscriber": {
              "type": "boolean",
              "title": "自动监听飞书新消息",
              "x-order": 80,
              "default": false,
              "description": "本地测试可以打开。未来部署到云服务器时，建议只开一个监听服务，避免同一条飞书消息被处理多次。"
            },
            "eventTypes": {
              "type": "string",
              "title": "高级：监听的飞书事件类型",
              "x-order": 90,
              "default": "im.message.receive_v1",
              "description": "普通用户不用改。默认监听飞书收到消息事件。"
            },
            "eventVerificationTokenRef": {
              "type": "string",
              "title": "事件 Verification Token Secret Ref",
              "x-order": 92,
              "description": "可选。把飞书事件订阅里的 Verification Token 存到 Paperclip Secret/Vault 后，在这里填写引用名。插件只保存引用，不保存 token 明文。"
            },
            "eventEncryptKeyRef": {
              "type": "string",
              "title": "事件 Encrypt Key Secret Ref",
              "x-order": 94,
              "description": "可选。把飞书事件订阅里的 Encrypt Key 存到 Paperclip Secret/Vault 后，在这里填写引用名。用于解密加密事件，也可用于签名校验。"
            },
            "eventRequireSignature": {
              "type": "boolean",
              "title": "公网回调必须校验签名",
              "x-order": 96,
              "default": false,
              "description": "云端 webhook 建议开启。开启后，飞书回调必须带 x-lark-signature、timestamp 和 nonce，并通过 Encrypt Key 校验。"
            },
            "larkCliBin": {
              "type": "string",
              "title": "高级：lark-cli 命令路径",
              "x-order": 100,
              "default": "lark-cli",
              "description": "普通用户不用改。保持默认时插件会优先使用包内自带 CLI；需要强制走服务器固定路径时才填写完整路径。"
            }
          }
        },
        "tools": [
          {
            "name": "feishu.send_message",
            "displayName": "发送飞书消息",
            "description": "通过已配置的飞书机器人给指定会话或用户发送消息。",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "connectionId": {
                  "type": "string",
                  "title": "飞书机器人连接代号",
                  "description": "对应第 1 步里填写的连接代号。留空时使用第一个启用的机器人。"
                },
                "chatId": {
                  "type": "string",
                  "title": "飞书群/会话 chat_id",
                  "description": "发到群或单聊会话时填写。"
                },
                "userId": {
                  "type": "string",
                  "title": "飞书用户 ID",
                  "description": "直接发给某个用户时填写。"
                },
                "text": {
                  "type": "string",
                  "title": "文本内容"
                },
                "markdown": {
                  "type": "string",
                  "title": "Markdown 内容"
                }
              }
            }
          },
          {
            "name": "feishu.write_base_record",
            "displayName": "写入飞书多维表格",
            "description": "把一条结构化记录写入已配置的飞书多维表格。",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "sinkId": {
                  "type": "string",
                  "title": "多维表格规则代号",
                  "description": "对应第 3 步里填写的规则代号。"
                },
                "record": {
                  "type": "object",
                  "title": "要写入的记录内容"
                }
              },
              "required": [
                "sinkId",
                "record"
              ]
            }
          },
          {
            "name": "feishu.send_card",
            "displayName": "发送飞书卡片",
            "description": "通过已配置的飞书机器人发送结构化飞书卡片。",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "connectionId": {
                  "type": "string",
                  "title": "飞书机器人连接代号",
                  "description": "留空时使用第一个启用的机器人。"
                },
                "chatId": {
                  "type": "string",
                  "title": "飞书群/会话 chat_id"
                },
                "userId": {
                  "type": "string",
                  "title": "飞书用户 ID"
                },
                "title": {
                  "type": "string",
                  "title": "卡片标题"
                },
                "summary": {
                  "type": "string",
                  "title": "卡片正文摘要"
                },
                "actions": {
                  "type": "array",
                  "title": "按钮",
                  "items": {
                    "type": "object",
                    "properties": {
                      "text": {
                        "type": "string",
                        "title": "按钮文字"
                      },
                      "url": {
                        "type": "string",
                        "title": "按钮链接"
                      }
                    }
                  }
                }
              },
              "required": [
                "title",
                "summary"
              ]
            }
          },
          {
            "name": "feishu.reply_original_thread",
            "displayName": "回复原飞书会话",
            "description": "在由飞书消息创建的 Paperclip 任务中，把内容回复到原飞书消息线程。默认会根据当前 Agent 运行自动找到原会话。",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "text": {
                  "type": "string",
                  "title": "要回复的文本"
                },
                "issueId": {
                  "type": "string",
                  "title": "Paperclip 任务 ID（可选）",
                  "description": "一般不用填。只有当前运行找不到飞书会话时，才用任务 ID 兜底查找。"
                },
                "replyMode": {
                  "type": "string",
                  "title": "回复方式",
                  "enum": [
                    "thread",
                    "message"
                  ],
                  "enumNames": [
                    "在原消息线程里回复",
                    "直接发到原飞书会话"
                  ],
                  "default": "thread"
                }
              },
              "required": [
                "text"
              ]
            }
          },
          {
            "name": "feishu.reply_source_thread",
            "displayName": "回复飞书来源线程",
            "description": "在由飞书消息创建的 Paperclip 任务中，把内容回复到原飞书消息线程。建议新 Agent 使用这个工具名；旧工具名继续兼容。",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "text": {
                  "type": "string",
                  "title": "要回复的文本"
                },
                "issueId": {
                  "type": "string",
                  "title": "Paperclip 任务 ID（可选）",
                  "description": "一般不用填。只有当前运行找不到飞书会话时，才用任务 ID 兜底查找。"
                },
                "replyMode": {
                  "type": "string",
                  "title": "回复方式",
                  "enum": [
                    "thread",
                    "message"
                  ],
                  "enumNames": [
                    "在原消息线程里回复",
                    "直接发到原飞书会话"
                  ],
                  "default": "thread"
                }
              },
              "required": [
                "text"
              ]
            }
          },
          {
            "name": "feishu.ask_clarification",
            "displayName": "向飞书提出追问",
            "description": "任务信息不足时，在原飞书消息线程里向提出人追问。只适用于从飞书入口创建的 Paperclip 任务。",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "question": {
                  "type": "string",
                  "title": "要追问的问题"
                },
                "issueId": {
                  "type": "string",
                  "title": "Paperclip 任务 ID（可选）",
                  "description": "一般不用填。只有当前运行找不到飞书会话时，才用任务 ID 兜底查找。"
                }
              },
              "required": [
                "question"
              ]
            }
          },
          {
            "name": "feishu.download_attachments",
            "displayName": "下载原飞书附件",
            "description": "下载创建当前 Paperclip 任务的飞书原消息附件，并挂到 Issue。",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "issueId": {
                  "type": "string",
                  "title": "Paperclip 任务 ID（可选）",
                  "description": "一般不用填。只有当前运行找不到飞书会话时，才用任务 ID 兜底查找。"
                }
              }
            }
          },
          {
            "name": "feishu.lookup_user",
            "displayName": "查找飞书用户",
            "description": "按姓名、工号或关键词查找飞书联系人，供智能体在需要确认收件人或提出人身份时使用。",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "query": {
                  "type": "string",
                  "title": "姓名、工号或关键词"
                },
                "connectionId": {
                  "type": "string",
                  "title": "飞书机器人连接代号（可选）",
                  "description": "留空时使用第一个启用的机器人。"
                },
                "profileName": {
                  "type": "string",
                  "title": "lark-cli profile（可选）",
                  "description": "工程师调试时才需要。普通智能体不要填写。"
                }
              },
              "required": [
                "query"
              ]
            }
          },
          {
            "name": "feishu.fetch_doc",
            "displayName": "读取飞书文档",
            "description": "读取飞书云文档内容，供智能体总结或分析。默认使用用户授权身份。",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "doc": {
                  "type": "string",
                  "title": "飞书文档 URL 或 token"
                },
                "connectionId": {
                  "type": "string",
                  "title": "飞书机器人连接代号（可选）",
                  "description": "用于选择绑定在同一飞书应用下的 profile。"
                },
                "profileName": {
                  "type": "string",
                  "title": "lark-cli profile（可选）",
                  "description": "工程师调试时才需要。普通智能体不要填写。"
                },
                "identity": {
                  "type": "string",
                  "title": "访问身份",
                  "enum": [
                    "user",
                    "bot"
                  ],
                  "enumNames": [
                    "用户授权",
                    "机器人身份"
                  ],
                  "default": "user"
                }
              },
              "required": [
                "doc"
              ]
            }
          },
          {
            "name": "feishu.run_lark_cli_capability",
            "displayName": "受控运行 lark-cli 能力",
            "description": "高级兜底工具。只能运行能力中心已开启且命令前缀在允许列表里的 lark-cli 能力。",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "capabilityKey": {
                  "type": "string",
                  "title": "能力 key",
                  "description": "来自能力中心，例如 fetch_doc、lookup_user。"
                },
                "command": {
                  "type": "array",
                  "title": "lark-cli 命令参数数组",
                  "items": {
                    "type": "string"
                  },
                  "description": "不要包含 lark-cli 二进制名。插件会按连接注入 profile。"
                },
                "connectionId": {
                  "type": "string",
                  "title": "飞书机器人连接代号（可选）"
                },
                "profileName": {
                  "type": "string",
                  "title": "lark-cli profile（可选）",
                  "description": "工程师调试时才需要。普通智能体不要填写。"
                },
                "timeoutMs": {
                  "type": "number",
                  "title": "超时时间毫秒（可选）"
                }
              },
              "required": [
                "capabilityKey",
                "command"
              ]
            }
          }
        ],
        "ui": {
          "slots": [
            {
              "type": "settingsPage",
              "id": "feishu-connector-settings",
              "displayName": "飞书连接器配置",
              "exportName": "FeishuSettingsPage"
            },
            {
              "type": "dashboardWidget",
              "id": "feishu-connector-status",
              "displayName": "飞书连接器",
              "exportName": "DashboardWidget"
            },
            {
              "type": "sidebar",
              "id": "feishu-connector-sidebar-link",
              "displayName": "飞书连接器",
              "exportName": "FeishuSidebarLink"
            },
            {
              "type": "sidebarPanel",
              "id": "feishu-connector-sidebar-panel",
              "displayName": "飞书连接器状态",
              "exportName": "FeishuSidebarPanel"
            },
            {
              "type": "detailTab",
              "id": "feishu-issue-source",
              "displayName": "飞书",
              "exportName": "FeishuIssueTab",
              "entityTypes": [
                "issue"
              ]
            },
            {
              "type": "commentContextMenuItem",
              "id": "feishu-comment-reply-action",
              "displayName": "回复到飞书",
              "exportName": "FeishuCommentReplyAction",
              "entityTypes": [
                "comment"
              ]
            }
          ]
        }
      },
      "installs": 12,
      "installCommand": "npx paperclipai@latest plugin install @niubitli/plugin-feishu-connector-v2",
      "resolvedAt": "2026-06-02T07:55:03.844Z"
    },
    {
      "slug": "paperclip-plugin-agent-chat",
      "npmPackage": "@sergioconejo/paperclip-plugin-agent-chat",
      "addedBy": "lacymorrow",
      "category": "tools",
      "sourceRepo": "https://github.com/sergioconejo/paperclip-plugin-agent-chat",
      "version": "0.5.0",
      "latestVersion": "0.5.0",
      "manifest": {
        "id": "paperclip-agent-chat",
        "apiVersion": 1,
        "version": "0.5.0",
        "displayName": "Agent Chat",
        "description": "Chat page for direct conversations with agent employees via real agent sessions.",
        "author": "sergioconejo",
        "categories": [
          "ui",
          "automation"
        ],
        "capabilities": [
          "agents.read",
          "agents.invoke",
          "agent.sessions.create",
          "agent.sessions.list",
          "agent.sessions.send",
          "agent.sessions.close",
          "companies.read",
          "plugin.state.read",
          "plugin.state.write",
          "activity.log.write",
          "events.subscribe",
          "ui.sidebar.register",
          "ui.page.register",
          "ui.detailTab.register",
          "ui.action.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "maxHistoryPerAgent": {
              "type": "number",
              "title": "Max History Per Agent",
              "default": 50
            }
          }
        },
        "ui": {
          "slots": [
            {
              "type": "sidebar",
              "id": "chat-sidebar-link",
              "displayName": "Agent Chat",
              "exportName": "ChatSidebarLink"
            },
            {
              "type": "page",
              "id": "chat-page",
              "displayName": "Agent Chat",
              "exportName": "ChatPage",
              "routePath": "agent-chat"
            },
            {
              "type": "detailTab",
              "id": "chat-agent-tab",
              "displayName": "Chat",
              "exportName": "ChatAgentTab",
              "entityTypes": [
                "agent"
              ],
              "order": 5
            }
          ]
        }
      },
      "installs": 11,
      "installCommand": "npx paperclipai@latest plugin install @sergioconejo/paperclip-plugin-agent-chat",
      "resolvedAt": "2026-06-02T07:55:10.783Z"
    },
    {
      "slug": "paperclip-theme",
      "npmPackage": "paperclip-theme",
      "addedBy": "lacymorrow",
      "category": "tools",
      "version": "0.2.2",
      "latestVersion": "0.2.2",
      "manifest": {
        "id": "blazo.paperclip-theme",
        "apiVersion": 1,
        "version": "0.1.0",
        "displayName": "Theme Customizer",
        "description": "In-app theme editor with live preview, curated presets, and shareable configurations. Override colors, radius, and design tokens without rebuilding.",
        "author": "Khaleeq Fisher",
        "categories": [
          "ui"
        ],
        "capabilities": [
          "plugin.state.read",
          "plugin.state.write",
          "instance.settings.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "ui": {
          "slots": [
            {
              "type": "settingsPage",
              "id": "theme-settings-page",
              "displayName": "Theme",
              "exportName": "ThemeSettingsPage"
            }
          ]
        }
      },
      "installs": 11,
      "installCommand": "npx paperclipai@latest plugin install paperclip-theme",
      "resolvedAt": "2026-06-02T07:55:14.703Z"
    },
    {
      "slug": "paperclip-plugin-line",
      "npmPackage": "paperclip-plugin-line",
      "addedBy": "lacymorrow",
      "category": "integration",
      "sourceRepo": "https://github.com/Bandruption-Platform/paperclip-plugin-line",
      "version": "1.0.0",
      "latestVersion": "1.0.0",
      "manifest": {
        "id": "paperclip-plugin-line",
        "apiVersion": 1,
        "version": "1.0.0",
        "displayName": "LINE Bridge",
        "description": "Bidirectional LINE Messaging API integration for Paperclip: verified webhook intake, agent sessions per LINE user, outbound LINE push tools, and inbound media relay.",
        "author": "Bandruption",
        "categories": [
          "connector",
          "automation"
        ],
        "capabilities": [
          "plugin.state.read",
          "plugin.state.write",
          "jobs.schedule",
          "webhooks.receive",
          "agent.tools.register",
          "http.outbound",
          "secrets.read-ref",
          "activity.log.write",
          "metrics.write",
          "issues.read",
          "issues.create",
          "issues.update",
          "issue.comments.read",
          "issue.comments.create",
          "agents.read",
          "agent.sessions.create",
          "agent.sessions.list",
          "agent.sessions.send",
          "agent.sessions.close",
          "events.emit",
          "events.subscribe"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js"
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "lineChannelSecretRef": {
              "type": "string",
              "format": "secret-ref",
              "title": "LINE Channel Secret (secret reference)",
              "description": "Secret UUID for the LINE Messaging API channel secret used to verify webhook signatures.",
              "default": ""
            },
            "lineChannelAccessTokenRef": {
              "type": "string",
              "format": "secret-ref",
              "title": "LINE Channel Access Token (secret reference)",
              "description": "Secret UUID for the LINE channel access token used by outbound LINE API calls.",
              "default": ""
            },
            "paperclipBoardApiKeyRef": {
              "type": "string",
              "format": "secret-ref",
              "title": "Paperclip Board API Key (secret reference)",
              "description": "Optional secret UUID for a board API key used by attachment uploads in authenticated deployments.",
              "default": ""
            },
            "paperclipApiBaseUrl": {
              "type": "string",
              "title": "Paperclip API Base URL",
              "description": "Optional override for the Paperclip API base URL. Defaults to the PAPERCLIP_API_URL env var.",
              "default": ""
            },
            "defaultPaperclipCompany": {
              "type": "string",
              "title": "Default Paperclip Company",
              "description": "Single-tenant mode: the Paperclip company every inbound LINE user is mapped to. Leave blank if you supply an onProvisionPrincipal extension hook.",
              "default": ""
            },
            "defaultAgentId": {
              "type": "string",
              "title": "Default Agent ID",
              "description": "Single-tenant mode: the agent that handles every LINE user's session. Leave blank if you supply an onProvisionPrincipal extension hook.",
              "default": ""
            },
            "attachmentBucketName": {
              "type": "string",
              "title": "Attachment Bucket Name",
              "description": "Logical attachment bucket namespace used for inbound LINE media object keys.",
              "default": ""
            },
            "attachmentSignedUrlTtlDays": {
              "type": "integer",
              "title": "Attachment Signed URL TTL (days)",
              "description": "Number of days inbound LINE attachment signed read URLs remain valid.",
              "minimum": 1,
              "maximum": 90,
              "default": 30
            },
            "idleCloseMinutes": {
              "type": "integer",
              "title": "Idle Close Threshold (minutes)",
              "description": "How long an open LINE thread may stay idle before the plugin closes it.",
              "minimum": 1,
              "maximum": 1440,
              "default": 30
            },
            "linePushDailyLimit": {
              "type": "integer",
              "title": "LINE Push Daily Limit",
              "description": "Maximum line.push_* tool calls per Paperclip company and agent per UTC day. Use 0 to disable push tools.",
              "minimum": 0,
              "default": 500
            },
            "replyTokenMaxAgeSeconds": {
              "type": "integer",
              "title": "Reply Token Max Age (seconds)",
              "description": "Maximum age for cached LINE reply tokens before they are treated as expired.",
              "minimum": 1,
              "maximum": 300,
              "default": 60
            }
          }
        },
        "jobs": [
          {
            "jobKey": "process-event",
            "displayName": "Process LINE Event",
            "description": "Queue-drain job that processes verified inbound LINE events after the webhook ACK path returns.",
            "schedule": "*/1 * * * *"
          },
          {
            "jobKey": "idle-close",
            "displayName": "Idle Close LINE Threads",
            "description": "Scheduled sweep that closes stale LINE threads and tears down their persisted agent sessions.",
            "schedule": "*/15 * * * *"
          },
          {
            "jobKey": "reply-token-gc",
            "displayName": "Reply Token Garbage Collection",
            "description": "Scheduled cleanup for expired cached LINE reply-token metadata.",
            "schedule": "*/1 * * * *"
          }
        ],
        "webhooks": [
          {
            "endpointKey": "line-webhook",
            "displayName": "LINE Webhook",
            "description": "Receives LINE Messaging API webhook deliveries for inbound LINE traffic."
          }
        ],
        "tools": [
          {
            "name": "line.push_text",
            "displayName": "LINE Push Text",
            "description": "Send a plain-text LINE push message to a mapped LINE principal.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "lineUserId": {
                  "type": "string"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "lineUserId",
                "text"
              ]
            }
          },
          {
            "name": "line.push_image",
            "displayName": "LINE Push Image",
            "description": "Send an image to a LINE principal using a publicly readable or signed image URL.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "lineUserId": {
                  "type": "string"
                },
                "imageUrl": {
                  "type": "string"
                },
                "previewImageUrl": {
                  "type": "string"
                }
              },
              "required": [
                "lineUserId",
                "imageUrl"
              ]
            }
          },
          {
            "name": "line.push_flex",
            "displayName": "LINE Push Flex",
            "description": "Send a LINE Flex message payload to a LINE principal.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "lineUserId": {
                  "type": "string"
                },
                "altText": {
                  "type": "string"
                },
                "contents": {
                  "type": "object"
                }
              },
              "required": [
                "lineUserId",
                "altText",
                "contents"
              ]
            }
          },
          {
            "name": "line.push_template",
            "displayName": "LINE Push Template",
            "description": "Send a LINE template message payload to a LINE principal.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "lineUserId": {
                  "type": "string"
                },
                "altText": {
                  "type": "string"
                },
                "template": {
                  "type": "object"
                }
              },
              "required": [
                "lineUserId",
                "altText",
                "template"
              ]
            }
          },
          {
            "name": "line.push_sticker",
            "displayName": "LINE Push Sticker",
            "description": "Send a sticker message to a LINE principal.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "lineUserId": {
                  "type": "string"
                },
                "packageId": {
                  "type": "string"
                },
                "stickerId": {
                  "type": "string"
                }
              },
              "required": [
                "lineUserId",
                "packageId",
                "stickerId"
              ]
            }
          },
          {
            "name": "line.ack_with_reply_token",
            "displayName": "LINE Ack With Reply Token",
            "description": "Use cached reply-token metadata tied to a Paperclip comment to send an immediate acknowledgment.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "commentId": {
                  "type": "string"
                },
                "text": {
                  "type": "string"
                }
              },
              "required": [
                "commentId",
                "text"
              ]
            }
          },
          {
            "name": "line.close_thread",
            "displayName": "LINE Close Thread",
            "description": "Close the current Paperclip thread for a mapped LINE user.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "lineUserId": {
                  "type": "string"
                }
              },
              "required": [
                "lineUserId"
              ]
            }
          },
          {
            "name": "line.get_profile",
            "displayName": "LINE Get Profile",
            "description": "Fetch the current LINE profile data for a mapped LINE principal.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "lineUserId": {
                  "type": "string"
                }
              },
              "required": [
                "lineUserId"
              ]
            }
          }
        ]
      },
      "installs": 10,
      "installCommand": "npx paperclipai@latest plugin install paperclip-plugin-line",
      "resolvedAt": "2026-06-02T07:55:05.292Z"
    },
    {
      "slug": "agent-commerce-bridge",
      "npmPackage": "@avirajkhare00/agent-commerce-bridge",
      "addedBy": "lacymorrow",
      "category": "integration",
      "version": "0.1.4",
      "latestVersion": "0.1.4",
      "manifest": {
        "id": "avirajkhare00.agent-commerce-bridge",
        "apiVersion": 1,
        "version": "0.1.4",
        "displayName": "Agent Commerce",
        "description": "Bridge UI for Agent Commerce next to Paperclip",
        "author": "avirajkhare00",
        "categories": [
          "connector"
        ],
        "capabilities": [
          "http.outbound",
          "plugin.state.read",
          "plugin.state.write",
          "ui.action.register",
          "ui.page.register",
          "ui.sidebar.register",
          "ui.dashboardWidget.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "commerce_api_base_url": {
              "type": "string",
              "title": "Commerce API base URL",
              "description": "Origin only, no trailing path (e.g. http://127.0.0.1:3210). Used for GET /v1/paperclip/ping on the Commerce service."
            },
            "commerce_tenant_api_key": {
              "type": "string",
              "title": "Commerce tenant API key",
              "description": "Bearer token for your Commerce tenant (Authorization header)."
            }
          }
        },
        "ui": {
          "slots": [
            {
              "type": "page",
              "id": "commerce-bridge-page",
              "displayName": "Commerce bridge",
              "exportName": "CommercePage",
              "routePath": "commerce-bridge"
            },
            {
              "type": "sidebar",
              "id": "commerce-sidebar",
              "displayName": "Commerce bridge",
              "exportName": "CommerceSidebarLink"
            },
            {
              "type": "dashboardWidget",
              "id": "health-widget",
              "displayName": "Agent Commerce",
              "exportName": "DashboardWidget"
            }
          ]
        }
      },
      "installs": 9,
      "installCommand": "npx paperclipai@latest plugin install @avirajkhare00/agent-commerce-bridge",
      "resolvedAt": "2026-06-02T07:54:58.856Z"
    },
    {
      "slug": "paperclip-plugin-knok",
      "npmPackage": "paperclip-plugin-knok",
      "addedBy": "lacymorrow",
      "category": "integration",
      "sourceRepo": "https://github.com/TomasWard1/paperclip-plugin-knok",
      "version": "0.1.3",
      "latestVersion": "0.1.3",
      "manifest": {
        "id": "paperclip-plugin-knok",
        "apiVersion": 1,
        "version": "0.1.0",
        "displayName": "Knok Notifications",
        "description": "Push desktop notifications via Knok when inbox events occur",
        "author": "Tomas Ward",
        "categories": [
          "automation"
        ],
        "capabilities": [
          "events.subscribe",
          "http.outbound",
          "plugin.state.read",
          "plugin.state.write",
          "secrets.read-ref",
          "instance.settings.register",
          "ui.dashboardWidget.register"
        ],
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "knokEndpoint": {
              "type": "string",
              "title": "Knok Endpoint",
              "description": "URL to the Knok HTTP server (e.g. http://100.x.x.x:9999)",
              "format": "uri"
            },
            "knokTokenRef": {
              "type": "string",
              "title": "Knok Auth Token",
              "description": "Secret reference for the Knok authentication token"
            },
            "defaultLevel": {
              "type": "string",
              "title": "Default Notification Level",
              "description": "Default urgency level for notifications",
              "enum": [
                "whisper",
                "nudge",
                "knock",
                "break"
              ],
              "default": "nudge"
            },
            "events": {
              "type": "object",
              "title": "Event Subscriptions",
              "description": "Toggle which events trigger notifications",
              "properties": {
                "approvalCreated": {
                  "type": "boolean",
                  "title": "Approval Created",
                  "default": true
                },
                "approvalDecided": {
                  "type": "boolean",
                  "title": "Approval Decided",
                  "default": false
                },
                "agentRunFailed": {
                  "type": "boolean",
                  "title": "Agent Run Failed",
                  "default": true
                },
                "agentRunFinished": {
                  "type": "boolean",
                  "title": "Agent Run Finished",
                  "default": false
                },
                "agentStatusChanged": {
                  "type": "boolean",
                  "title": "Agent Status Changed",
                  "default": false
                },
                "issueCreated": {
                  "type": "boolean",
                  "title": "Issue Created",
                  "default": false
                },
                "issueUpdated": {
                  "type": "boolean",
                  "title": "Issue Updated",
                  "default": false
                },
                "issueCommentCreated": {
                  "type": "boolean",
                  "title": "Issue Comment Created",
                  "default": true
                }
              },
              "additionalProperties": false
            },
            "levelOverrides": {
              "type": "object",
              "title": "Level Overrides",
              "description": "Override the default notification level per event type",
              "properties": {
                "approvalCreated": {
                  "type": "string",
                  "enum": [
                    "whisper",
                    "nudge",
                    "knock",
                    "break"
                  ]
                },
                "approvalDecided": {
                  "type": "string",
                  "enum": [
                    "whisper",
                    "nudge",
                    "knock",
                    "break"
                  ]
                },
                "agentRunFailed": {
                  "type": "string",
                  "enum": [
                    "whisper",
                    "nudge",
                    "knock",
                    "break"
                  ]
                },
                "agentRunFinished": {
                  "type": "string",
                  "enum": [
                    "whisper",
                    "nudge",
                    "knock",
                    "break"
                  ]
                },
                "agentStatusChanged": {
                  "type": "string",
                  "enum": [
                    "whisper",
                    "nudge",
                    "knock",
                    "break"
                  ]
                },
                "issueCreated": {
                  "type": "string",
                  "enum": [
                    "whisper",
                    "nudge",
                    "knock",
                    "break"
                  ]
                },
                "issueUpdated": {
                  "type": "string",
                  "enum": [
                    "whisper",
                    "nudge",
                    "knock",
                    "break"
                  ]
                },
                "issueCommentCreated": {
                  "type": "string",
                  "enum": [
                    "whisper",
                    "nudge",
                    "knock",
                    "break"
                  ]
                }
              },
              "additionalProperties": false
            }
          },
          "required": [
            "knokEndpoint",
            "knokTokenRef"
          ],
          "additionalProperties": false
        },
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "ui": {
          "slots": [
            {
              "type": "settingsPage",
              "id": "settings",
              "displayName": "Knok Settings",
              "exportName": "SettingsPanel"
            },
            {
              "type": "dashboardWidget",
              "id": "health-widget",
              "displayName": "Knok Notifications",
              "exportName": "DashboardWidget"
            }
          ]
        }
      },
      "installs": 8,
      "installCommand": "npx paperclipai@latest plugin install paperclip-plugin-knok",
      "resolvedAt": "2026-06-02T07:55:05.645Z"
    },
    {
      "slug": "tortuga-plugin",
      "npmPackage": "@bopen-io/tortuga-plugin",
      "addedBy": "lacymorrow",
      "category": "observability",
      "version": "0.0.11",
      "latestVersion": "0.0.11",
      "manifest": {
        "id": "bopen-io.tortuga-plugin",
        "apiVersion": 1,
        "version": "0.0.11",
        "displayName": "Tortuga",
        "description": "bOpen fleet monitoring and operations: real-time agent health, heartbeat tracking, cost analytics",
        "author": "bOpen",
        "categories": [
          "ui",
          "automation"
        ],
        "capabilities": [
          "agents.read",
          "agents.pause",
          "agents.resume",
          "agents.invoke",
          "companies.read",
          "issues.read",
          "plugin.state.read",
          "plugin.state.write",
          "events.subscribe",
          "jobs.schedule",
          "ui.dashboardWidget.register",
          "ui.page.register",
          "ui.sidebar.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "jobs": [
          {
            "jobKey": "fleet-health",
            "displayName": "Fleet Health Check",
            "description": "Cross-references Paperclip agents with fleet state to detect unhealthy or missing agents.",
            "schedule": "*/5 * * * *"
          }
        ],
        "ui": {
          "slots": [
            {
              "type": "dashboardWidget",
              "id": "tortuga-dashboard-widget",
              "displayName": "Fleet Status",
              "exportName": "FleetStatusWidget"
            },
            {
              "type": "page",
              "id": "tortuga-page",
              "displayName": "Fleet Monitor",
              "exportName": "FleetMonitorPage",
              "routePath": "tortuga"
            },
            {
              "type": "sidebar",
              "id": "tortuga-sidebar-link",
              "displayName": "Tortuga",
              "exportName": "TortugaSidebarLink"
            }
          ]
        }
      },
      "installs": 8,
      "installCommand": "npx paperclipai@latest plugin install @bopen-io/tortuga-plugin",
      "resolvedAt": "2026-06-02T07:55:07.415Z"
    },
    {
      "slug": "plugin-bitly",
      "npmPackage": "@bbugs280/plugin-bitly",
      "addedBy": "lacymorrow",
      "category": "integration",
      "version": "0.2.0",
      "latestVersion": "0.2.0",
      "manifest": {
        "id": "bitly",
        "apiVersion": 1,
        "version": "0.1.0",
        "displayName": "Bitly",
        "description": "Bitly plugin. Create short links and get click analytics for shortened URLs.",
        "author": "@bbugs280",
        "categories": [
          "connector"
        ],
        "capabilities": [
          "agent.tools.register",
          "http.outbound",
          "secrets.read-ref",
          "instance.settings.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js"
        },
        "tools": [
          {
            "name": "bitly-shorten",
            "displayName": "Shorten URL",
            "description": "Create a Bitly short link for a long URL. Returns the short link.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "longUrl": {
                  "type": "string",
                  "description": "The long URL to shorten"
                },
                "title": {
                  "type": "string",
                  "description": "Optional title/label for the link"
                }
              },
              "required": [
                "longUrl"
              ]
            }
          },
          {
            "name": "bitly-get-link-clicks",
            "displayName": "Get Link Clicks",
            "description": "Get total click count for a Bitly short link over a time period",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "bitlink": {
                  "type": "string",
                  "description": "The Bitly short link, e.g. bit.ly/abc123"
                },
                "units": {
                  "type": "number",
                  "description": "Number of time units to look back (default: 7)"
                },
                "unit": {
                  "type": "string",
                  "enum": [
                    "minute",
                    "hour",
                    "day",
                    "week",
                    "month"
                  ],
                  "description": "Time unit granularity (default: day)"
                }
              },
              "required": [
                "bitlink"
              ]
            }
          },
          {
            "name": "bitly-get-link-summary",
            "displayName": "Get Link Summary",
            "description": "Get full stats summary for a Bitly link: clicks by day, referrers, and top countries",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "bitlink": {
                  "type": "string",
                  "description": "The Bitly short link, e.g. bit.ly/abc123"
                },
                "units": {
                  "type": "number",
                  "description": "Number of days to look back (default: 7)"
                }
              },
              "required": [
                "bitlink"
              ]
            }
          }
        ],
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "accessTokenRef": {
              "type": "string",
              "title": "Access Token Reference",
              "description": "Secret reference for Bitly API access token",
              "default": "bitly_access_token",
              "format": "secret-ref"
            }
          }
        }
      },
      "installs": 8,
      "installCommand": "npx paperclipai@latest plugin install @bbugs280/plugin-bitly",
      "resolvedAt": "2026-06-02T07:55:00.252Z"
    },
    {
      "slug": "paperclip-plugin-memory",
      "npmPackage": "@smara/paperclip-plugin-memory",
      "addedBy": "lacymorrow",
      "category": "memory",
      "sourceRepo": "https://github.com/smara-io/paperclip-plugin",
      "version": "0.1.1",
      "latestVersion": "0.1.1",
      "manifest": {
        "id": "smara.memory",
        "apiVersion": 1,
        "version": "0.1.0",
        "displayName": "Smara Memory",
        "description": "Persistent memory for Paperclip agents with Temporal Memory Scoring™. Store facts, search by meaning, and recall context — recent and important memories surface first, stale ones fade naturally.",
        "author": "Smara (smara.io)",
        "categories": [
          "connector",
          "automation"
        ],
        "capabilities": [
          "agent.tools.register",
          "http.outbound",
          "secrets.read-ref",
          "plugin.state.read",
          "plugin.state.write",
          "instance.settings.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js"
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "smaraApiUrl": {
              "type": "string",
              "title": "Smara API URL",
              "default": "https://api.smara.io"
            },
            "smaraApiKeyRef": {
              "type": "string",
              "title": "Smara API Key",
              "description": "Secret reference for your Smara API key. Get a free key at https://smara.io"
            },
            "defaultUserId": {
              "type": "string",
              "title": "Default User ID",
              "description": "User ID to use when agents don't specify one. Defaults to the agent's ID."
            }
          },
          "required": [
            "smaraApiKeyRef"
          ]
        },
        "tools": [
          {
            "name": "memory-store",
            "displayName": "Store Memory",
            "description": "Store a fact or preference in Smara. Handles dedup and contradiction detection automatically. Memories decay over time based on importance — use 0.1-0.3 for trivia, 0.5 for general, 0.7-1.0 for critical.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "fact": {
                  "type": "string",
                  "description": "The fact to remember"
                },
                "user_id": {
                  "type": "string",
                  "description": "User ID (optional, defaults to agent ID)"
                },
                "importance": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 1,
                  "description": "Importance score 0-1. Higher = slower decay."
                }
              },
              "required": [
                "fact"
              ]
            }
          },
          {
            "name": "memory-search",
            "displayName": "Search Memory",
            "description": "Semantic search across stored memories. Results ranked by Temporal Memory Scoring™ — balances semantic relevance with memory freshness and importance.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "query": {
                  "type": "string",
                  "description": "Natural language search query"
                },
                "user_id": {
                  "type": "string",
                  "description": "User ID (optional)"
                },
                "limit": {
                  "type": "number",
                  "description": "Max results (default 5)"
                }
              },
              "required": [
                "query"
              ]
            }
          },
          {
            "name": "memory-context",
            "displayName": "Get User Context",
            "description": "Retrieve a pre-formatted context string for a user, ready to inject into an agent's prompt. Ranked by Temporal Memory Scoring™.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "user_id": {
                  "type": "string",
                  "description": "User to get context for"
                },
                "query": {
                  "type": "string",
                  "description": "Optional topic focus"
                },
                "top_n": {
                  "type": "number",
                  "description": "Number of memories (default 5)"
                }
              },
              "required": [
                "user_id"
              ]
            }
          },
          {
            "name": "memory-delete",
            "displayName": "Delete Memory",
            "description": "Delete a specific memory by ID. Use when asked to forget something.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Memory ID to delete"
                }
              },
              "required": [
                "id"
              ]
            }
          },
          {
            "name": "memory-usage",
            "displayName": "Memory Usage",
            "description": "Check current plan, limits, and memory count.",
            "parametersSchema": {
              "type": "object",
              "properties": {}
            }
          }
        ]
      },
      "installs": 7,
      "installCommand": "npx paperclipai@latest plugin install @smara/paperclip-plugin-memory",
      "resolvedAt": "2026-06-02T07:54:52.352Z"
    },
    {
      "slug": "paperclip-content-sprint-plugin",
      "npmPackage": "@marsbdigital/paperclip-content-sprint-plugin",
      "addedBy": "lacymorrow",
      "category": "tools",
      "version": "0.1.3",
      "latestVersion": "0.1.3",
      "manifest": {
        "id": "marsbdigital.paperclip-content-sprint-plugin",
        "apiVersion": 1,
        "version": "0.1.3",
        "displayName": "Content Sprint AI",
        "description": "Generate five structured social posts (authority, engagement, conversion) from product context for LinkedIn or X.",
        "author": "Mars B Digital",
        "categories": [
          "automation",
          "ui"
        ],
        "capabilities": [
          "agent.tools.register",
          "jobs.schedule",
          "ui.action.register",
          "ui.dashboardWidget.register"
        ],
        "entrypoints": {
          "worker": "dist/index.js",
          "ui": "dist/ui"
        },
        "tools": [
          {
            "name": "generate_content_batch",
            "displayName": "Generate content batch",
            "description": "Creates five social posts (2 authority, 2 engagement, 1 conversion) from product name, description, audience, and platform.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "productName": {
                  "type": "string",
                  "description": "Product or offer name"
                },
                "productDescription": {
                  "type": "string",
                  "description": "What the product does and why it matters"
                },
                "targetAudience": {
                  "type": "string",
                  "description": "Who you are writing for"
                },
                "platform": {
                  "type": "string",
                  "enum": [
                    "linkedin",
                    "twitter"
                  ],
                  "description": "Target network"
                }
              },
              "required": [
                "productName",
                "productDescription",
                "targetAudience",
                "platform"
              ]
            }
          }
        ],
        "jobs": [
          {
            "jobKey": "run_content_sprint",
            "displayName": "Run content sprint",
            "description": "Generates a sample batch using placeholder product input (for demos and smoke tests).",
            "schedule": "0 9 * * 1"
          }
        ],
        "ui": {
          "slots": [
            {
              "type": "globalToolbarButton",
              "id": "content-sprint-toolbar",
              "displayName": "Content Sprint",
              "exportName": "ToolbarButton"
            },
            {
              "type": "dashboardWidget",
              "id": "content-sprint-dashboard",
              "displayName": "Content Sprint AI",
              "exportName": "ContentSprintPanel"
            }
          ]
        }
      },
      "installs": 7,
      "installCommand": "npx paperclipai@latest plugin install @marsbdigital/paperclip-content-sprint-plugin",
      "resolvedAt": "2026-06-02T07:55:09.906Z"
    },
    {
      "slug": "paperclaw-dashboard",
      "npmPackage": "@betaform/paperclaw-dashboard",
      "addedBy": "lacymorrow",
      "category": "tools",
      "version": "2.6.8",
      "latestVersion": "2.6.8",
      "manifest": {
        "id": "betaform.paperclaw-dashboard",
        "apiVersion": 1,
        "version": "2.6.8",
        "displayName": "betaform Control",
        "description": "Executive dashboard for betaform.io: lead pipeline, social media queue, agent status, and post approvals.",
        "author": "betaform",
        "categories": [
          "ui",
          "automation"
        ],
        "capabilities": [
          "issues.read",
          "issues.create",
          "issues.update",
          "issue.documents.read",
          "issue.documents.write",
          "agents.read",
          "companies.read",
          "projects.read",
          "issue.comments.read",
          "events.subscribe",
          "http.outbound",
          "ui.sidebar.register",
          "ui.page.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "ui": {
          "slots": [
            {
              "type": "sidebar",
              "id": "betaform-dashboard-sidebar",
              "displayName": "betaform",
              "exportName": "DashboardSidebarLink",
              "routePath": "ctrl-kpis"
            },
            {
              "type": "page",
              "id": "betaform-dashboard-page",
              "displayName": "betaform Control",
              "exportName": "DashboardPage",
              "routePath": "ctrl-kpis"
            },
            {
              "type": "page",
              "id": "betaform-posts-page",
              "displayName": "Social Posts",
              "exportName": "SocialQueuePage",
              "routePath": "ctrl-posts"
            },
            {
              "type": "page",
              "id": "betaform-leads-page",
              "displayName": "Lead Pipeline",
              "exportName": "LeadPipelinePage",
              "routePath": "ctrl-leads"
            },
            {
              "type": "page",
              "id": "betaform-files-page",
              "displayName": "Dokumente",
              "exportName": "FileListPage",
              "routePath": "ctrl-files"
            }
          ]
        }
      },
      "installs": 7,
      "installCommand": "npx paperclipai@latest plugin install @betaform/paperclaw-dashboard",
      "resolvedAt": "2026-06-02T07:55:13.127Z"
    },
    {
      "slug": "paperclip-plugin-github-issues",
      "npmPackage": "@wil0x91/paperclip-plugin-github-issues",
      "addedBy": "lacymorrow",
      "category": "integration",
      "sourceRepo": "https://github.com/wil0x91/paperclip-plugin-github-issues",
      "version": "0.2.4",
      "latestVersion": "0.2.4",
      "manifest": {
        "id": "local.github-issues",
        "apiVersion": 1,
        "version": "0.2.3",
        "displayName": "GitHub Issues Sync",
        "description": "Multi-binding GitHub issue sync — register N bindings (one per Paperclip company × repo) and the plugin polls each on a 10-minute schedule.",
        "author": "Willian Costa",
        "categories": [
          "connector"
        ],
        "capabilities": [
          "issues.read",
          "issues.create",
          "issues.update",
          "plugin.state.read",
          "plugin.state.write",
          "jobs.schedule",
          "http.outbound",
          "secrets.read-ref",
          "activity.log.write",
          "companies.read",
          "projects.read",
          "instance.settings.register"
        ],
        "entrypoints": {
          "worker": "dist/worker.js",
          "ui": "dist/ui"
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "defaultPriority": {
              "type": "string",
              "title": "Default priority for imported issues",
              "enum": [
                "low",
                "medium",
                "high",
                "critical"
              ],
              "default": "medium"
            }
          }
        },
        "jobs": [
          {
            "jobKey": "sync-github-issues",
            "displayName": "Sync GitHub issues",
            "description": "Poll every registered binding and import / update issues.",
            "schedule": "*/10 * * * *"
          }
        ],
        "ui": {
          "slots": [
            {
              "type": "settingsPage",
              "id": "github-issues-settings",
              "displayName": "GitHub Issues Sync",
              "exportName": "GithubIssuesPage"
            }
          ]
        }
      },
      "installs": 6,
      "installCommand": "npx paperclipai@latest plugin install @wil0x91/paperclip-plugin-github-issues",
      "resolvedAt": "2026-06-02T07:55:04.588Z"
    },
    {
      "slug": "plugin-substack",
      "npmPackage": "@bbugs280/plugin-substack",
      "addedBy": "lacymorrow",
      "category": "integration",
      "version": "0.1.0",
      "latestVersion": "0.1.0",
      "manifest": {
        "id": "substack",
        "apiVersion": 1,
        "version": "0.1.0",
        "displayName": "Substack",
        "description": "Substack plugin for Paperclip. Fetches recent posts and public engagement stats via RSS and the Substack reader API.",
        "author": "@bbugs280",
        "categories": [
          "connector"
        ],
        "capabilities": [
          "agent.tools.register",
          "http.outbound",
          "instance.settings.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js"
        },
        "tools": [
          {
            "name": "substack-get-posts",
            "displayName": "Get Recent Posts",
            "description": "Fetch recent posts from a Substack publication via RSS. Returns title, date, URL, and preview.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "publicationUrl": {
                  "type": "string",
                  "description": "The Substack publication URL, e.g. newworldvalue.substack.com"
                },
                "limit": {
                  "type": "number",
                  "description": "Max number of posts to return (default: 10)"
                }
              },
              "required": [
                "publicationUrl"
              ]
            }
          },
          {
            "name": "substack-get-post-stats",
            "displayName": "Get Post Stats",
            "description": "Fetch like count and comment count for a specific Substack post using the public reader API.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "postUrl": {
                  "type": "string",
                  "description": "Full URL of the Substack post, e.g. https://newworldvalue.substack.com/p/some-post"
                }
              },
              "required": [
                "postUrl"
              ]
            }
          }
        ],
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "defaultPublication": {
              "type": "string",
              "title": "Default Publication",
              "description": "Default Substack subdomain, e.g. newworldvalue.substack.com",
              "default": ""
            }
          }
        }
      },
      "installs": 6,
      "installCommand": "npx paperclipai@latest plugin install @bbugs280/plugin-substack",
      "resolvedAt": "2026-06-02T07:54:59.526Z"
    },
    {
      "slug": "paperclip-file-viewer",
      "npmPackage": "paperclip-file-viewer",
      "addedBy": "lacymorrow",
      "category": "tools",
      "sourceRepo": "https://github.com/Tr1ckyMag1ca1/paperclip-file-viewer",
      "version": "0.3.1",
      "latestVersion": "0.3.1",
      "manifest": {
        "id": "paperclipai.plugin-file-viewer",
        "apiVersion": 1,
        "version": "0.3.1",
        "displayName": "File Viewer",
        "description": "Browse and review files linked to Paperclip issues. Manage a review queue, approve or reject files, and keep a full review history — all from within Paperclip.",
        "author": "Paperclip AI Agents",
        "categories": [
          "ui",
          "workspace"
        ],
        "capabilities": [
          "plugin.state.read",
          "plugin.state.write",
          "companies.read",
          "issues.read",
          "issue.documents.read",
          "ui.page.register",
          "ui.sidebar.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "seedExampleFiles": {
              "type": "boolean",
              "title": "Seed Example Files",
              "description": "Create 3 example files (deploy.sh, config.yml, README.md) on first load. Useful for testing. Disable for clean installs.",
              "default": true
            },
            "defaultFlagForReview": {
              "type": "boolean",
              "title": "Flag New Files for Review",
              "description": "When enabled, newly registered files are automatically added to the Review Queue.",
              "default": false
            },
            "autoIndexDocuments": {
              "type": "boolean",
              "title": "Auto-Index Issue Documents",
              "description": "Automatically discover and register all issue documents on plugin startup. New documents are added each time the plugin restarts.",
              "default": true
            },
            "maxFilesPerPage": {
              "type": "number",
              "title": "Files Per Page",
              "description": "Maximum number of files shown in the sidebar list.",
              "default": 100
            }
          }
        },
        "ui": {
          "slots": [
            {
              "type": "page",
              "id": "file-viewer-page",
              "displayName": "File Viewer",
              "routePath": "file-viewer",
              "exportName": "FileViewerPage"
            },
            {
              "type": "sidebar",
              "id": "file-viewer-sidebar",
              "displayName": "File Viewer",
              "exportName": "FileViewerSidebar"
            }
          ]
        }
      },
      "installs": 5,
      "installCommand": "npx paperclipai@latest plugin install paperclip-file-viewer",
      "resolvedAt": "2026-06-02T07:55:13.998Z"
    },
    {
      "slug": "paperclip-plugin-notification-sound",
      "npmPackage": "paperclip-plugin-notification-sound",
      "addedBy": "lacymorrow",
      "category": "tools",
      "version": "1.0.3",
      "latestVersion": "1.0.3",
      "manifest": {
        "id": "paperclipai.notification-sound",
        "apiVersion": 1,
        "version": "1.0.0",
        "displayName": "Notification Sound",
        "description": "Plays a notification sound when issues change to in_review, blocked, or done.",
        "author": "Service Ranker",
        "categories": [
          "ui"
        ],
        "capabilities": [
          "events.subscribe",
          "plugin.state.read",
          "plugin.state.write",
          "ui.action.register"
        ],
        "entrypoints": {
          "worker": "dist/worker.js",
          "ui": "dist/ui"
        },
        "ui": {
          "slots": [
            {
              "type": "globalToolbarButton",
              "id": "notification-sound",
              "displayName": "Notification Sound",
              "exportName": "NotificationListener"
            }
          ]
        }
      },
      "installs": 5,
      "installCommand": "npx paperclipai@latest plugin install paperclip-plugin-notification-sound",
      "resolvedAt": "2026-06-02T07:55:15.407Z"
    },
    {
      "slug": "paperclip-plugin-zernio",
      "npmPackage": "paperclip-plugin-zernio",
      "addedBy": "lacymorrow",
      "category": "integration",
      "sourceRepo": "https://github.com/rwbaker/plugin-zernio",
      "version": "0.4.1",
      "latestVersion": "0.4.1",
      "manifest": {
        "id": "zernio",
        "apiVersion": 1,
        "version": "0.4.1",
        "displayName": "Zernio",
        "description": "Social media management via the Zernio API — schedule posts, manage inbox, and view analytics across 14+ platforms.",
        "author": "SGNL Studio",
        "categories": [
          "automation"
        ],
        "capabilities": [
          "plugin.state.read",
          "plugin.state.write",
          "http.outbound",
          "agent.tools.register",
          "webhooks.receive",
          "secrets.read-ref"
        ],
        "entrypoints": {
          "worker": "dist/worker.mjs"
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "zernioApiKey": {
              "type": "string",
              "title": "Zernio API Key",
              "description": "Enter a secret name from project env (e.g. ZERNIO_API_KEY) or paste a raw API key (sk_…). Secret names are resolved at runtime."
            },
            "defaultProfileId": {
              "type": "string",
              "title": "Default Profile ID",
              "description": "Optional default Zernio profile ID for operations."
            }
          },
          "required": [
            "zernioApiKey"
          ]
        },
        "webhooks": [
          {
            "endpointKey": "zernio-events",
            "displayName": "Zernio Events",
            "description": "Receives webhook events from Zernio (post.published, post.failed, message.received, etc.)."
          }
        ]
      },
      "installs": 5,
      "installCommand": "npx paperclipai@latest plugin install paperclip-plugin-zernio",
      "resolvedAt": "2026-06-02T07:55:05.963Z"
    },
    {
      "slug": "paperclip-plugin-claude-config-editor",
      "npmPackage": "paperclip-plugin-claude-config-editor",
      "addedBy": "lacymorrow",
      "category": "tools",
      "sourceRepo": "https://github.com/paperclipai/plugin-claude-config-editor",
      "version": "1.0.1",
      "latestVersion": "1.0.1",
      "manifest": {
        "id": "paperclip-claude-config-editor",
        "apiVersion": 1,
        "version": "1.0.0",
        "displayName": "Claude Config Editor",
        "description": "Allows instance admins to edit Claude Code configuration files (.claude.json and .credentials.json) through the Paperclip settings UI.",
        "author": "Paperclip",
        "categories": [
          "ui"
        ],
        "capabilities": [
          "instance.settings.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "ui": {
          "slots": [
            {
              "type": "settingsPage",
              "id": "claude-config-settings-page",
              "displayName": "Claude Config",
              "exportName": "ClaudeConfigSettingsPage"
            }
          ]
        }
      },
      "installs": 5,
      "installCommand": "npx paperclipai@latest plugin install paperclip-plugin-claude-config-editor",
      "resolvedAt": "2026-06-02T07:55:14.356Z"
    },
    {
      "slug": "peak6-x-publishing-plugin",
      "npmPackage": "peak6-x-publishing-plugin",
      "addedBy": "lacymorrow",
      "category": "integration",
      "sourceRepo": "https://github.com/peak6-labs/x-publishing-plugin",
      "version": "0.2.3",
      "latestVersion": "0.2.3",
      "manifest": {
        "id": "peak6-labs.x-publishing",
        "apiVersion": 1,
        "version": "0.2.3",
        "displayName": "X Publishing",
        "description": "X/Twitter publishing plugin — drafts, approvals, scheduling, threads, metrics capture, and cross-plugin event flow.",
        "author": "peak6-labs",
        "categories": [
          "connector",
          "automation"
        ],
        "capabilities": [
          "http.outbound",
          "secrets.read-ref",
          "jobs.schedule",
          "agent.tools.register",
          "plugin.state.read",
          "plugin.state.write",
          "events.subscribe",
          "events.emit",
          "issues.read",
          "issues.create",
          "issues.update",
          "activity.log.write",
          "metrics.write",
          "instance.settings.register",
          "ui.dashboardWidget.register",
          "ui.page.register"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "company_id": {
              "type": "string",
              "title": "Company ID",
              "description": "UUID of the company this plugin serves",
              "default": ""
            },
            "oauth_client_id_ref": {
              "type": "string",
              "title": "OAuth Client ID Secret Reference",
              "description": "Shared across all accounts (one X Developer App)",
              "default": "X_OAUTH_CLIENT_ID"
            },
            "oauth_client_secret_ref": {
              "type": "string",
              "title": "OAuth Client Secret Reference",
              "default": "X_OAUTH_CLIENT_SECRET"
            },
            "default_account": {
              "type": "string",
              "title": "Default Account",
              "description": "Handle of the default account (used when tools omit account param)"
            },
            "accounts": {
              "type": "object",
              "title": "Accounts",
              "description": "Map of X accounts keyed by handle (without @)",
              "additionalProperties": {
                "type": "object",
                "properties": {
                  "x_handle": {
                    "type": "string",
                    "description": "X handle (without @)"
                  },
                  "x_user_id": {
                    "type": "string",
                    "description": "Numeric X user ID"
                  },
                  "role": {
                    "type": "string",
                    "enum": [
                      "hub",
                      "spoke"
                    ],
                    "default": "spoke"
                  },
                  "approval_modes": {
                    "type": "object",
                    "properties": {
                      "posts": {
                        "type": "string",
                        "enum": [
                          "required",
                          "optional",
                          "none"
                        ],
                        "default": "none"
                      },
                      "replies": {
                        "type": "string",
                        "enum": [
                          "required",
                          "optional",
                          "none"
                        ],
                        "default": "none"
                      },
                      "quotes": {
                        "type": "string",
                        "enum": [
                          "required",
                          "optional",
                          "none"
                        ],
                        "default": "none"
                      },
                      "reposts": {
                        "type": "string",
                        "enum": [
                          "required",
                          "optional",
                          "none"
                        ],
                        "default": "none"
                      },
                      "scheduled": {
                        "type": "string",
                        "enum": [
                          "required",
                          "optional",
                          "none"
                        ],
                        "default": "required"
                      }
                    }
                  }
                },
                "required": [
                  "x_handle",
                  "x_user_id"
                ]
              }
            },
            "daily_post_limit": {
              "type": "number",
              "title": "Daily Post Limit",
              "description": "Maximum posts per day per account (safety guardrail)",
              "default": 25
            },
            "engagement_milestones": {
              "type": "array",
              "title": "Engagement Milestones",
              "description": "Total engagement thresholds that trigger milestone events",
              "items": {
                "type": "number"
              },
              "default": [
                50,
                100,
                500,
                1000
              ]
            },
            "metrics_capture_lookback_days": {
              "type": "number",
              "title": "Metrics Capture Lookback (days)",
              "default": 7
            },
            "alert_agents": {
              "type": "array",
              "title": "Alert Agents",
              "description": "Agents to notify on failures or milestones",
              "items": {
                "type": "object",
                "properties": {
                  "agentId": {
                    "type": "string",
                    "description": "Paperclip agent UUID"
                  },
                  "memoryFile": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Path to user memory file"
                  }
                },
                "required": [
                  "agentId"
                ]
              },
              "default": []
            }
          }
        },
        "jobs": [
          {
            "jobKey": "token-refresh",
            "displayName": "Token Refresh",
            "description": "Refresh OAuth2 access token before expiry. Alerts on failure.",
            "schedule": "0 */2 * * *"
          },
          {
            "jobKey": "publish-scheduled",
            "displayName": "Publish Scheduled",
            "description": "Publish approved drafts whose schedule_at has passed.",
            "schedule": "*/15 * * * *"
          },
          {
            "jobKey": "metrics-capture",
            "displayName": "Metrics Capture",
            "description": "Snapshot engagement metrics on recent published posts.",
            "schedule": "0 */6 * * *"
          },
          {
            "jobKey": "stale-draft-cleanup",
            "displayName": "Stale Draft Cleanup",
            "description": "Mark drafts older than 48h in draft/in_review status as stale.",
            "schedule": "0 2 * * *"
          }
        ],
        "tools": [
          {
            "name": "setup-oauth",
            "displayName": "Setup OAuth",
            "description": "Seed initial OAuth tokens from a manual PKCE flow. Call once per account during setup.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "account": {
                  "type": "string",
                  "description": "X handle to store tokens for (must exist in accounts config)"
                },
                "access_token": {
                  "type": "string",
                  "description": "OAuth2 access token"
                },
                "refresh_token": {
                  "type": "string",
                  "description": "OAuth2 refresh token"
                },
                "expires_in": {
                  "type": "number",
                  "description": "Token TTL in seconds (default 7200)"
                }
              },
              "required": [
                "account",
                "access_token",
                "refresh_token"
              ]
            }
          },
          {
            "name": "draft-post",
            "displayName": "Draft Post",
            "description": "Create a draft post for review or later publishing.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "text": {
                  "type": "string",
                  "description": "Tweet text (max 280 chars)"
                },
                "format": {
                  "type": "string",
                  "enum": [
                    "single",
                    "reply",
                    "quote"
                  ],
                  "description": "Post format"
                },
                "reply_to_tweet_id": {
                  "type": "string",
                  "description": "Tweet ID to reply to (for reply format)"
                },
                "quote_tweet_id": {
                  "type": "string",
                  "description": "Tweet ID to quote (for quote format)"
                },
                "schedule_at": {
                  "type": "string",
                  "description": "ISO datetime to schedule publication"
                },
                "metadata": {
                  "type": "object",
                  "description": "Content metadata for feedback loop",
                  "properties": {
                    "voice": {
                      "type": "string"
                    },
                    "content_bucket": {
                      "type": "string"
                    },
                    "topic": {
                      "type": "string"
                    },
                    "source_tweet_id": {
                      "type": "string"
                    },
                    "source_issue_id": {
                      "type": "string"
                    }
                  }
                }
              },
              "required": [
                "text"
              ]
            }
          },
          {
            "name": "draft-thread",
            "displayName": "Draft Thread",
            "description": "Create a draft thread (multiple tweets posted as a reply chain).",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "thread_tweets": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Array of tweet texts (each max 280 chars)"
                },
                "schedule_at": {
                  "type": "string",
                  "description": "ISO datetime to schedule publication"
                },
                "metadata": {
                  "type": "object",
                  "properties": {
                    "voice": {
                      "type": "string"
                    },
                    "content_bucket": {
                      "type": "string"
                    },
                    "topic": {
                      "type": "string"
                    },
                    "source_tweet_id": {
                      "type": "string"
                    },
                    "source_issue_id": {
                      "type": "string"
                    }
                  }
                }
              },
              "required": [
                "thread_tweets"
              ]
            }
          },
          {
            "name": "update-draft",
            "displayName": "Update Draft",
            "description": "Update an existing draft's text, metadata, or schedule.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "draft_id": {
                  "type": "string",
                  "description": "Draft entity ID"
                },
                "text": {
                  "type": "string",
                  "description": "Updated tweet text"
                },
                "thread_tweets": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "schedule_at": {
                  "type": "string"
                },
                "metadata": {
                  "type": "object",
                  "properties": {
                    "voice": {
                      "type": "string"
                    },
                    "content_bucket": {
                      "type": "string"
                    },
                    "topic": {
                      "type": "string"
                    },
                    "source_tweet_id": {
                      "type": "string"
                    },
                    "source_issue_id": {
                      "type": "string"
                    }
                  }
                }
              },
              "required": [
                "draft_id"
              ]
            }
          },
          {
            "name": "publish-post",
            "displayName": "Publish Post",
            "description": "Publish a tweet to X. Accepts inline text or a draft_id.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "account": {
                  "type": "string",
                  "description": "X handle to post as (defaults to default_account)"
                },
                "text": {
                  "type": "string",
                  "description": "Tweet text (if publishing inline)"
                },
                "draft_id": {
                  "type": "string",
                  "description": "Draft entity ID (if publishing from draft)"
                },
                "metadata": {
                  "type": "object",
                  "properties": {
                    "voice": {
                      "type": "string"
                    },
                    "content_bucket": {
                      "type": "string"
                    },
                    "topic": {
                      "type": "string"
                    },
                    "source_tweet_id": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          {
            "name": "reply-to-tweet",
            "displayName": "Reply to Tweet",
            "description": "Post a reply to an existing tweet on X.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "account": {
                  "type": "string",
                  "description": "X handle to post as (defaults to default_account)"
                },
                "tweet_id": {
                  "type": "string",
                  "description": "Tweet ID to reply to"
                },
                "text": {
                  "type": "string",
                  "description": "Reply text (max 280 chars)"
                },
                "draft_id": {
                  "type": "string",
                  "description": "Draft entity ID (if from draft)"
                },
                "metadata": {
                  "type": "object",
                  "properties": {
                    "voice": {
                      "type": "string"
                    },
                    "content_bucket": {
                      "type": "string"
                    },
                    "topic": {
                      "type": "string"
                    },
                    "source_tweet_id": {
                      "type": "string"
                    }
                  }
                }
              },
              "required": [
                "tweet_id",
                "text"
              ]
            }
          },
          {
            "name": "quote-tweet",
            "displayName": "Quote Tweet",
            "description": "Post a quote tweet on X.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "account": {
                  "type": "string",
                  "description": "X handle to post as (defaults to default_account)"
                },
                "tweet_id": {
                  "type": "string",
                  "description": "Tweet ID to quote"
                },
                "text": {
                  "type": "string",
                  "description": "Quote text (max 280 chars)"
                },
                "draft_id": {
                  "type": "string",
                  "description": "Draft entity ID (if from draft)"
                },
                "metadata": {
                  "type": "object",
                  "properties": {
                    "voice": {
                      "type": "string"
                    },
                    "content_bucket": {
                      "type": "string"
                    },
                    "topic": {
                      "type": "string"
                    },
                    "source_tweet_id": {
                      "type": "string"
                    }
                  }
                }
              },
              "required": [
                "tweet_id",
                "text"
              ]
            }
          },
          {
            "name": "repost",
            "displayName": "Repost",
            "description": "Repost (retweet) an existing tweet on X.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "account": {
                  "type": "string",
                  "description": "X handle to post as (defaults to default_account)"
                },
                "tweet_id": {
                  "type": "string",
                  "description": "Tweet ID to repost"
                },
                "draft_id": {
                  "type": "string",
                  "description": "Draft entity ID (if from draft)"
                }
              },
              "required": [
                "tweet_id"
              ]
            }
          },
          {
            "name": "schedule-post",
            "displayName": "Schedule Post",
            "description": "Create or update a draft with a scheduled publication time.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "draft_id": {
                  "type": "string",
                  "description": "Existing draft ID to schedule"
                },
                "text": {
                  "type": "string",
                  "description": "Tweet text (creates new draft if no draft_id)"
                },
                "schedule_at": {
                  "type": "string",
                  "description": "ISO datetime for publication"
                },
                "metadata": {
                  "type": "object",
                  "properties": {
                    "voice": {
                      "type": "string"
                    },
                    "content_bucket": {
                      "type": "string"
                    },
                    "topic": {
                      "type": "string"
                    },
                    "source_tweet_id": {
                      "type": "string"
                    }
                  }
                }
              },
              "required": [
                "schedule_at"
              ]
            }
          },
          {
            "name": "publish-thread",
            "displayName": "Publish Thread",
            "description": "Publish a multi-tweet thread to X with reply chaining. Retries on failure; leaves partial thread + alert on persistent failure.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "account": {
                  "type": "string",
                  "description": "X handle to post as (defaults to default_account)"
                },
                "thread_tweets": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Array of tweet texts"
                },
                "draft_id": {
                  "type": "string",
                  "description": "Draft entity ID (if from draft)"
                },
                "metadata": {
                  "type": "object",
                  "properties": {
                    "voice": {
                      "type": "string"
                    },
                    "content_bucket": {
                      "type": "string"
                    },
                    "topic": {
                      "type": "string"
                    },
                    "source_tweet_id": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          {
            "name": "get-drafts",
            "displayName": "Get Drafts",
            "description": "Query draft entities, optionally filtered by status.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "status": {
                  "type": "string",
                  "enum": [
                    "draft",
                    "in_review",
                    "approved",
                    "rejected",
                    "stale"
                  ],
                  "description": "Filter by draft status"
                },
                "limit": {
                  "type": "number",
                  "description": "Max results (default 20)"
                }
              }
            }
          },
          {
            "name": "get-schedule",
            "displayName": "Get Schedule",
            "description": "Get upcoming scheduled posts (drafts with schedule_at set).",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "limit": {
                  "type": "number",
                  "description": "Max results (default 20)"
                }
              }
            }
          },
          {
            "name": "get-post-metrics",
            "displayName": "Get Post Metrics",
            "description": "Get engagement metrics for a published post.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "tweet_id": {
                  "type": "string",
                  "description": "Tweet ID to get metrics for"
                }
              },
              "required": [
                "tweet_id"
              ]
            }
          },
          {
            "name": "get-account-status",
            "displayName": "Get Account Status",
            "description": "Get account health: rate limits, daily post count, token validity. Returns all accounts if no account specified.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "account": {
                  "type": "string",
                  "description": "X handle (omit for all accounts)"
                }
              }
            }
          }
        ],
        "ui": {
          "slots": [
            {
              "type": "dashboardWidget",
              "id": "x-publishing-dashboard",
              "displayName": "X Publishing",
              "exportName": "DashboardWidget"
            },
            {
              "type": "settingsPage",
              "id": "x-publishing-settings",
              "displayName": "X Publishing Settings",
              "exportName": "SettingsPage"
            },
            {
              "type": "page",
              "id": "x-publishing-content",
              "displayName": "Content Queue",
              "exportName": "ContentPage",
              "routePath": "x-publishing"
            }
          ]
        }
      },
      "installs": 3,
      "installCommand": "npx paperclipai@latest plugin install peak6-x-publishing-plugin",
      "resolvedAt": "2026-06-02T07:55:06.354Z"
    },
    {
      "slug": "paperclip-plugin-bcp-commerce",
      "npmPackage": "paperclip-plugin-bcp-commerce",
      "addedBy": "lacymorrow",
      "category": "integration",
      "sourceRepo": "https://github.com/lucidedev/bcp-protocol",
      "version": "0.1.0",
      "latestVersion": "0.1.0",
      "manifest": {
        "id": "bcp-commerce",
        "apiVersion": 1,
        "version": "0.1.0",
        "displayName": "BCP Commerce",
        "description": "Inter-company commerce — let your AI company hire other AI companies. Request quotes, negotiate, and manage deals autonomously.",
        "author": "lucidedev",
        "categories": [
          "connector",
          "automation"
        ],
        "capabilities": [
          "webhooks.receive",
          "plugin.state.read",
          "plugin.state.write",
          "http.outbound",
          "agent.tools.register",
          "events.subscribe"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js"
        },
        "webhooks": [
          {
            "endpointKey": "bcp-incoming",
            "displayName": "BCP Commerce Endpoint",
            "description": "Receives BCP protocol messages (INTENT, COUNTER, COMMIT, etc.) from other companies"
          }
        ],
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "services": {
              "type": "array",
              "description": "Services this company offers (seller mode)",
              "items": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "description": {
                    "type": "string"
                  },
                  "basePrice": {
                    "type": "number"
                  },
                  "currency": {
                    "type": "string"
                  },
                  "estimatedDays": {
                    "type": "number"
                  },
                  "deliverables": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "name",
                  "basePrice"
                ]
              }
            },
            "autoQuote": {
              "type": "boolean",
              "default": true,
              "description": "Auto-generate quotes for incoming requests"
            },
            "autoAcceptCommit": {
              "type": "boolean",
              "default": true,
              "description": "Auto-accept when a buyer commits"
            },
            "maxAutoApprove": {
              "type": "number",
              "default": 500,
              "description": "Max USD to auto-approve for purchases (buyer mode)"
            },
            "currency": {
              "type": "string",
              "default": "USD",
              "description": "Default currency"
            },
            "knownSellers": {
              "type": "array",
              "description": "Pre-configured companies your agents can hire",
              "items": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "url": {
                    "type": "string"
                  },
                  "services": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "name",
                  "url"
                ]
              }
            }
          }
        }
      },
      "installs": 3,
      "installCommand": "npx paperclipai@latest plugin install paperclip-plugin-bcp-commerce",
      "resolvedAt": "2026-06-02T07:55:04.952Z"
    },
    {
      "slug": "peak6-x-intelligence-plugin",
      "npmPackage": "peak6-x-intelligence-plugin",
      "addedBy": "lacymorrow",
      "category": "integration",
      "sourceRepo": "https://github.com/peak6-labs/x-intelligence-plugin",
      "version": "0.1.9",
      "latestVersion": "0.1.9",
      "manifest": {
        "id": "peak6-labs.x-intelligence",
        "apiVersion": 1,
        "version": "0.1.8",
        "displayName": "X Intelligence",
        "description": "Automated X/Twitter intelligence pipeline — discovery, enrichment, scoring, deduplication, authority list management, and corpus storage.",
        "author": "peak6-labs",
        "categories": [
          "connector",
          "automation"
        ],
        "capabilities": [
          "http.outbound",
          "secrets.read-ref",
          "jobs.schedule",
          "agent.tools.register",
          "plugin.state.read",
          "plugin.state.write",
          "events.subscribe",
          "events.emit",
          "issues.read",
          "issues.create",
          "issues.update",
          "activity.log.write",
          "metrics.write",
          "instance.settings.register",
          "ui.dashboardWidget.register",
          "ui.page.register",
          "agents.invoke",
          "agents.read"
        ],
        "entrypoints": {
          "worker": "./dist/worker.js",
          "ui": "./dist/ui"
        },
        "instanceConfigSchema": {
          "type": "object",
          "properties": {
            "company_id": {
              "type": "string",
              "title": "Company ID",
              "description": "UUID of the company this plugin serves (required for events and activity logging)",
              "default": ""
            },
            "xai_api_key_ref": {
              "type": "string",
              "title": "xAI API Key Secret Reference",
              "default": "XAI_API_KEY"
            },
            "x_api_bearer_ref": {
              "type": "string",
              "title": "X API Bearer Token Secret Reference",
              "default": "BEARER_TOKEN"
            },
            "semantic_topics": {
              "type": "array",
              "title": "Semantic Discovery Topics",
              "items": {
                "type": "string"
              },
              "default": [
                "institutional investors discussing market structure reform",
                "fintech companies disrupting traditional trading",
                "SEC regulatory changes affecting options trading",
                "algorithmic trading and quantitative strategies",
                "venture capital investing in financial infrastructure",
                "PEAK6",
                "options market making technology",
                "Chicago trading community news"
              ]
            },
            "keyword_searches": {
              "type": "array",
              "title": "Keyword Searches",
              "items": {
                "type": "string"
              },
              "default": [
                "\"PEAK6 Investments\" OR \"PEAK6\" trading fintech",
                "fintech and trading technology",
                "market structure and regulation",
                "options trading strategies and platforms"
              ]
            },
            "content_pillars": {
              "type": "array",
              "title": "Content Pillars",
              "items": {
                "type": "string"
              },
              "default": [
                "market structure & regulation",
                "fintech & trading technology",
                "venture capital & investment",
                "Chicago business ecosystem",
                "company culture & talent"
              ]
            },
            "scoring_weights": {
              "type": "object",
              "title": "Scoring Weights",
              "properties": {
                "relevance": {
                  "type": "number",
                  "default": 0.45
                },
                "recency": {
                  "type": "number",
                  "default": 0.25
                },
                "engagement": {
                  "type": "number",
                  "default": 0.3
                }
              },
              "default": {
                "relevance": 0.45,
                "recency": 0.25,
                "engagement": 0.3
              }
            },
            "engagement_sub_weights": {
              "type": "object",
              "title": "Engagement Sub-Weights",
              "properties": {
                "likes": {
                  "type": "number",
                  "default": 0.55
                },
                "reposts": {
                  "type": "number",
                  "default": 0.25
                },
                "replies": {
                  "type": "number",
                  "default": 0.15
                },
                "quotes": {
                  "type": "number",
                  "default": 0.05
                }
              },
              "default": {
                "likes": 0.55,
                "reposts": 0.25,
                "replies": 0.15,
                "quotes": 0.05
              }
            },
            "max_corpus_size": {
              "type": "number",
              "title": "Max Corpus Size Per Day",
              "default": 200
            },
            "dedup_threshold": {
              "type": "number",
              "title": "Dedup Jaccard Threshold",
              "default": 0.7
            },
            "authority_boost": {
              "type": "number",
              "title": "Authority Score Boost",
              "default": 0.15
            },
            "authority_lists": {
              "type": "object",
              "title": "Authority Handle Lists",
              "default": {
                "market_structure": {
                  "description": "Market structure, regulation, SEC reform, options trading",
                  "handles": [
                    "LizAnnSonders",
                    "matt_levine",
                    "unusual_whales",
                    "CMEGroup",
                    "CBOE",
                    "OptionsHawk",
                    "InvestorDenis"
                  ],
                  "last_reviewed": "2026-03-29"
                },
                "fintech": {
                  "description": "Fintech, trading technology, AI in finance",
                  "handles": [
                    "twifintech",
                    "IBSIntelligence",
                    "privy_io",
                    "i_Know_First",
                    "fintech_germany",
                    "venture_radar"
                  ],
                  "last_reviewed": "2026-03-29"
                },
                "venture_capital": {
                  "description": "Venture capital investing in financial infrastructure",
                  "handles": [
                    "a16z",
                    "FundersVC"
                  ],
                  "last_reviewed": "2026-03-29"
                },
                "chicago_trading": {
                  "description": "Chicago trading community, prop firms, PEAK6 ecosystem",
                  "handles": [
                    "CBOE",
                    "CMEGroup",
                    "boogeymantradez",
                    "adealafia"
                  ],
                  "last_reviewed": "2026-03-29"
                }
              }
            },
            "global_excluded": {
              "type": "array",
              "title": "Globally Excluded Handles",
              "items": {
                "type": "string"
              },
              "default": [
                "elonmusk",
                "openai",
                "google",
                "microsoft"
              ]
            },
            "authority_promotion_policy": {
              "type": "object",
              "title": "Authority Promotion Policy",
              "default": {
                "auto_promote_threshold": {
                  "min_appearances": 7,
                  "min_avg_relevance": 0.8,
                  "min_mutual_overlap": 3
                },
                "candidate_threshold": {
                  "min_appearances": 5,
                  "min_avg_relevance": 0.7,
                  "min_mutual_overlap": 2
                },
                "tracking_window_days": 14
              }
            },
            "corpus_retention_days": {
              "type": "number",
              "title": "Corpus Retention (days)",
              "default": 90
            },
            "engagement_thresholds": {
              "type": "object",
              "title": "Engagement Thresholds",
              "description": "Engagement level tiers: noise_floor (filter), expert (highlight), escalation (alert event)",
              "properties": {
                "noise_floor": {
                  "type": "number",
                  "default": 10
                },
                "expert": {
                  "type": "number",
                  "default": 50
                },
                "escalation": {
                  "type": "number",
                  "default": 100
                }
              },
              "default": {
                "noise_floor": 10,
                "expert": 50,
                "escalation": 100
              }
            },
            "alert_agents": {
              "type": "array",
              "title": "Alert Agents",
              "description": "Agents to invoke on high-engagement tweets and corpus updates. Each entry maps an agent ID to an optional memory file for preference-enriched prompts.",
              "items": {
                "type": "object",
                "properties": {
                  "agentId": {
                    "type": "string",
                    "description": "Paperclip agent UUID"
                  },
                  "memoryFile": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Path to user memory file for enriched prompts (null for raw alerts)"
                  }
                },
                "required": [
                  "agentId"
                ]
              },
              "default": []
            }
          }
        },
        "jobs": [
          {
            "jobKey": "discovery-run",
            "displayName": "Discovery Run",
            "description": "Two-stage pipeline: xAI open + focused discovery, X API v2 enrichment, scoring, and corpus storage.",
            "schedule": "0 6 * * *"
          },
          {
            "jobKey": "authority-decay",
            "displayName": "Authority Decay",
            "description": "Weekly handle decay — downgrade or remove handles not seen within the tracking window.",
            "schedule": "0 0 * * 0"
          },
          {
            "jobKey": "compliance-check",
            "displayName": "Compliance Check",
            "description": "Weekly re-check of stored tweets — remove deleted or suspended content.",
            "schedule": "0 3 * * 0"
          },
          {
            "jobKey": "corpus-retention",
            "displayName": "Corpus Retention",
            "description": "Monthly archive/delete corpus older than the retention window.",
            "schedule": "0 4 1 * *"
          }
        ],
        "tools": [
          {
            "name": "search-corpus",
            "displayName": "Search X Corpus",
            "description": "Search the scored X intelligence corpus by query text, date range, content pillar, score threshold, and engagement level.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "query": {
                  "type": "string",
                  "description": "Search query (text match)"
                },
                "date": {
                  "type": "string",
                  "description": "Date filter (YYYY-MM-DD)"
                },
                "pillar": {
                  "type": "string",
                  "description": "Content pillar filter"
                },
                "limit": {
                  "type": "number",
                  "description": "Max results (default 20)"
                },
                "min_score": {
                  "type": "number",
                  "description": "Minimum score threshold (0-1)"
                },
                "min_engagement": {
                  "type": "number",
                  "description": "Minimum total engagement (likes+reposts+replies+quotes)"
                },
                "since": {
                  "type": "string",
                  "description": "Time window: '1h', '3h', '12h', '1d', '7d', or YYYY-MM-DD"
                }
              }
            }
          },
          {
            "name": "get-today",
            "displayName": "Get Today's Intelligence",
            "description": "Get today's scored X intelligence corpus from entities, optionally filtered by pillar and score threshold.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "pillar": {
                  "type": "string",
                  "description": "Content pillar filter"
                },
                "limit": {
                  "type": "number",
                  "description": "Max results (default 20)"
                },
                "min_score": {
                  "type": "number",
                  "description": "Minimum score threshold (0-1)"
                }
              }
            }
          },
          {
            "name": "get-authorities",
            "displayName": "Get Authority Handles",
            "description": "Get the authority handle list for a domain, or all domains if none specified.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "list_name": {
                  "type": "string",
                  "description": "Domain name (e.g. 'market_structure')"
                }
              }
            }
          },
          {
            "name": "suggest-handles",
            "displayName": "Suggest Handle Promotions",
            "description": "Get handles that are candidates for authority list promotion based on tracking data.",
            "parametersSchema": {
              "type": "object",
              "properties": {}
            }
          },
          {
            "name": "track-handle",
            "displayName": "Track Handle",
            "description": "Record a handle appearance from agent discovery with relevance score and domain.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "handle": {
                  "type": "string",
                  "description": "X handle (without @)"
                },
                "relevance": {
                  "type": "number",
                  "description": "Relevance score (0-1)"
                },
                "domain": {
                  "type": "string",
                  "description": "Domain/topic area"
                }
              },
              "required": [
                "handle",
                "relevance",
                "domain"
              ]
            }
          },
          {
            "name": "analyze-topic",
            "displayName": "Analyze Topic",
            "description": "On-demand xAI search for any topic with 5-perspective decomposition (core, expert voices, pain points, positive signals, link-based) and corpus cross-reference. Returns a synthesis brief.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "topic": {
                  "type": "string",
                  "description": "Topic to analyze"
                },
                "include_corpus": {
                  "type": "boolean",
                  "description": "Cross-reference with stored corpus (default true)"
                }
              },
              "required": [
                "topic"
              ]
            }
          },
          {
            "name": "get-thread",
            "displayName": "Get Tweet Thread",
            "description": "Fetch conversation context for a tweet. Returns the target tweet and other tweets in the same conversation thread.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "tweet_id": {
                  "type": "string",
                  "description": "Tweet ID to get thread for"
                }
              },
              "required": [
                "tweet_id"
              ]
            }
          },
          {
            "name": "promote-handle",
            "displayName": "Promote Handle",
            "description": "Promote a tracked handle to authority status in a specific domain list. Sets entity status to promoted and records the target list.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "handle": {
                  "type": "string",
                  "description": "X handle (without @)"
                },
                "list_name": {
                  "type": "string",
                  "description": "Authority list to promote to (e.g. 'market_structure')"
                },
                "note": {
                  "type": "string",
                  "description": "Optional note about why this handle was promoted"
                }
              },
              "required": [
                "handle",
                "list_name"
              ]
            }
          },
          {
            "name": "rate-tweet",
            "displayName": "Rate Tweet",
            "description": "Record relevance feedback on a tweet in the corpus. Agents or humans can rate tweets as relevant, irrelevant, or skip.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "tweet_id": {
                  "type": "string",
                  "description": "Tweet ID to rate"
                },
                "rating": {
                  "type": "string",
                  "enum": [
                    "relevant",
                    "irrelevant",
                    "skip"
                  ],
                  "description": "Relevance rating"
                },
                "rated_by": {
                  "type": "string",
                  "description": "ID of the rater (agent or user)"
                }
              },
              "required": [
                "tweet_id",
                "rating"
              ]
            }
          },
          {
            "name": "search-x",
            "displayName": "Search X",
            "description": "Real-time semantic search on X/Twitter via xAI. Returns scored, enriched tweets without storing to corpus. Works any time — no pipeline required.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "query": {
                  "type": "string",
                  "description": "Search query (semantic — describe what you're looking for)"
                },
                "limit": {
                  "type": "number",
                  "description": "Max results (default 20)"
                },
                "handles": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Optional: restrict search to these handles only"
                },
                "quick": {
                  "type": "boolean",
                  "description": "Quick mode: skip enrichment, return xAI synthesis + tweet IDs only (lower cost)"
                }
              },
              "required": [
                "query"
              ]
            }
          },
          {
            "name": "get-trending",
            "displayName": "Get Trending",
            "description": "What's trending in PEAK6's configured domains right now. Searches all semantic topics (or a specific pillar) via xAI, enriches and scores results. No pipeline required.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "limit": {
                  "type": "number",
                  "description": "Max results (default 20)"
                },
                "pillar": {
                  "type": "string",
                  "description": "Filter to topics matching this pillar/keyword"
                }
              }
            }
          },
          {
            "name": "get-user-timeline",
            "displayName": "Get User Timeline",
            "description": "Fetch a user's recent tweets from X/Twitter. Returns enriched tweet data with metrics.",
            "parametersSchema": {
              "type": "object",
              "properties": {
                "handle": {
                  "type": "string",
                  "description": "X handle (without @)"
                },
                "limit": {
                  "type": "number",
                  "description": "Max tweets to return (default 20, max 100)"
                },
                "since": {
                  "type": "string",
                  "description": "Only return tweets after this date (YYYY-MM-DD)"
                }
              },
              "required": [
                "handle"
              ]
            }
          }
        ],
        "ui": {
          "slots": [
            {
              "type": "dashboardWidget",
              "id": "x-intelligence-dashboard",
              "displayName": "X Intelligence",
              "exportName": "DashboardWidget"
            },
            {
              "type": "settingsPage",
              "id": "x-intelligence-settings",
              "displayName": "X Intelligence Settings",
              "exportName": "SettingsPage"
            },
            {
              "type": "page",
              "id": "x-intelligence-corpus-browser",
              "displayName": "X Intelligence Corpus",
              "exportName": "CorpusBrowserPage",
              "routePath": "x-intelligence"
            }
          ]
        }
      },
      "installs": 3,
      "installCommand": "npx paperclipai@latest plugin install peak6-x-intelligence-plugin",
      "resolvedAt": "2026-06-02T07:55:06.690Z"
    }
  ],
  "quarantined": []
}
