{"_id":"@agentvalet/paperclip-adapter","_rev":"4-7cb7103e434c2a101ff02fde830bf962","name":"@agentvalet/paperclip-adapter","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@agentvalet/paperclip-adapter","version":"0.1.0","keywords":["paperclip","paperclipai","agentvalet","adapter","ai-agent","credential-proxy","governance"],"license":"MIT","_id":"@agentvalet/paperclip-adapter@0.1.0","maintainers":[{"name":"edwinashdown","email":"edwin@aifirstpartner.com"}],"dist":{"shasum":"9817d60b53656b77a050411ca40415f8ae286e13","tarball":"https://registry.npmjs.org/@agentvalet/paperclip-adapter/-/paperclip-adapter-0.1.0.tgz","fileCount":65,"integrity":"sha512-zeRSp7+W1iCXJRhpVjA1huK5ooJdUs5/PEMZPPbPEns6CN2PuDIiibF6AkjtlIFAGbdTLVA7HKWfrKrzPAv+5w==","signatures":[{"sig":"MEYCIQCaEDRpp1f4zNJdRLMTBYJii92XpG9kAkYfq+vogUjd9QIhAJP7l34I7g7StkkCQ0A0bzqTfvKhxpZS9cltJ+HV5H4F","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72147},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":"./dist/index.js","./ui":"./dist/ui/index.js","./cli":"./dist/cli/index.js","./server":"./dist/server/index.js"},"gitHead":"1a0b9a1bd49ab496ebd71d334500884d19385e1c","scripts":{"dev":"tsc --watch","build":"tsc","typecheck":"tsc --noEmit"},"_npmUser":{"name":"edwinashdown","email":"edwin@aifirstpartner.com"},"_npmVersion":"10.9.3","description":"Paperclip adapter for AgentValet — credential proxy and identity governance for Paperclip agents","directories":{},"_nodeVersion":"22.20.0","dependencies":{"jose":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0"},"peerDependencies":{"picocolors":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/paperclip-adapter_0.1.0_1777017701170_0.1375096514926617","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@agentvalet/paperclip-adapter","version":"0.1.1","keywords":["paperclip","paperclipai","agentvalet","adapter","ai-agent","credential-proxy","governance"],"license":"MIT","_id":"@agentvalet/paperclip-adapter@0.1.1","maintainers":[{"name":"edwinashdown","email":"edwin@aifirstpartner.com"}],"dist":{"shasum":"b960f3d9eae735b160923ce68c1206660ec2f563","tarball":"https://registry.npmjs.org/@agentvalet/paperclip-adapter/-/paperclip-adapter-0.1.1.tgz","fileCount":65,"integrity":"sha512-lO5ZR2zLCjdWOk0aA+SWVCDr/Ex9ZEWiY9EHECWmxh0dRXWJZMQObsIOzZeCPTA06eA0GK3zYf+MPoT+9rYJKQ==","signatures":[{"sig":"MEQCH34FyhVnd4G76vq4jIDhrT3CBMSZWJ6OS2mUtZqA9dYCIQDDuoU4L6kXoKqk2qggoNZZqq3MKDWxKPqEhXbFZyYn2A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72692},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":"./dist/index.js","./ui":"./dist/ui/index.js","./cli":"./dist/cli/index.js","./server":"./dist/server/index.js"},"gitHead":"72fd07658e612c6c6811e63d8373de6d7f527b4a","scripts":{"dev":"tsc --watch","build":"tsc","typecheck":"tsc --noEmit"},"_npmUser":{"name":"edwinashdown","email":"edwin@aifirstpartner.com"},"_npmVersion":"10.9.3","description":"Paperclip adapter for AgentValet — credential proxy and identity governance for Paperclip agents","directories":{},"_nodeVersion":"22.20.0","dependencies":{"jose":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0"},"peerDependencies":{"picocolors":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/paperclip-adapter_0.1.1_1777022190184_0.5166359897320703","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@agentvalet/paperclip-adapter","version":"0.1.2","keywords":["paperclip","paperclipai","agentvalet","adapter","ai-agent","credential-proxy","governance"],"license":"MIT","_id":"@agentvalet/paperclip-adapter@0.1.2","maintainers":[{"name":"edwinashdown","email":"edwin@aifirstpartner.com"}],"dist":{"shasum":"be8576324ad296529df6fcad431e980f6ab6827f","tarball":"https://registry.npmjs.org/@agentvalet/paperclip-adapter/-/paperclip-adapter-0.1.2.tgz","fileCount":70,"integrity":"sha512-StDRaIbB2usLSv2ewv5gBaz+Pv6mk5IdJ88FjigEH6ajAMxN6acWUZgkdmb6f2iM7wc4Ed1AxZ/XkQw4JLAh3w==","signatures":[{"sig":"MEUCIFzAyk2bPqrSimHkD5ysqp14axeh9y1r9RI5lil5XEqQAiEAlMMZMpqhYCGJyOVwJDxIVUnaD6pMtu0uDFTjWt18ajE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":90757},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":"./dist/index.js","./ui":"./dist/ui/index.js","./cli":"./dist/cli/index.js","./server":"./dist/server/index.js"},"gitHead":"604a0ed5461de31f7f14b506f8520cf331d76bd1","scripts":{"dev":"tsc --watch","build":"tsc","typecheck":"tsc --noEmit"},"_npmUser":{"name":"edwinashdown","email":"edwin@aifirstpartner.com"},"_npmVersion":"10.9.3","description":"Paperclip adapter for AgentValet — credential proxy and identity governance for Paperclip agents","directories":{},"_nodeVersion":"22.20.0","dependencies":{"jose":"^5.0.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.0.0"},"peerDependencies":{"picocolors":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/paperclip-adapter_0.1.2_1777024805220_0.4857085945134234","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@agentvalet/paperclip-adapter","version":"0.1.3","description":"Paperclip adapter for AgentValet — credential proxy and identity governance for Paperclip agents","type":"module","main":"dist/index.js","exports":{".":"./dist/index.js","./server":"./dist/server/index.js","./ui":"./dist/ui/index.js","./cli":"./dist/cli/index.js"},"dependencies":{"jose":"^5.0.0"},"devDependencies":{"typescript":"^5.0.0"},"peerDependencies":{"picocolors":"^1.0.0"},"engines":{"node":">=18"},"repository":{"type":"git","url":"git+https://github.com/MCSEdwin/agentvalet.git","directory":"packages/paperclip-adapter"},"keywords":["paperclip","paperclipai","agentvalet","adapter","ai-agent","credential-proxy","governance"],"license":"MIT","scripts":{"build":"tsc","dev":"tsc --watch","typecheck":"tsc --noEmit"},"_id":"@agentvalet/paperclip-adapter@0.1.3","types":"./dist/index.d.ts","bugs":{"url":"https://github.com/MCSEdwin/agentvalet/issues"},"homepage":"https://github.com/MCSEdwin/agentvalet#readme","_integrity":"sha512-zpqg61w4STMgxIMA67s0KeFOL2PQBVJ2kqrlz0eFAXJ8SWma7W/zMFmHZCq71QzcyP2xevmK/a5Uz1CIo8d0Ig==","_resolved":"C:\\Users\\edwin\\AppData\\Local\\Temp\\9a7bc94f9ab574d7cda0ed61130ec5cc\\agentvalet-paperclip-adapter-0.1.3.tgz","_from":"file:agentvalet-paperclip-adapter-0.1.3.tgz","_nodeVersion":"22.20.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-zpqg61w4STMgxIMA67s0KeFOL2PQBVJ2kqrlz0eFAXJ8SWma7W/zMFmHZCq71QzcyP2xevmK/a5Uz1CIo8d0Ig==","shasum":"311df28e4fcb387cf0a719c191e0de32c4673566","tarball":"https://registry.npmjs.org/@agentvalet/paperclip-adapter/-/paperclip-adapter-0.1.3.tgz","fileCount":54,"unpackedSize":61721,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGL+lHHVe5wBIz/zLpgGCP78rodOW258rFmKs2+BdtwuAiEAtfEYVvwE5PgE068s5NO3e8KWqK+QNDv1rybc2ifMnHs="}]},"_npmUser":{"name":"edwinashdown","email":"edwin@aifirstpartner.com"},"directories":{},"maintainers":[{"name":"edwinashdown","email":"edwin@aifirstpartner.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/paperclip-adapter_0.1.3_1777455877135_0.5281944527825899"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-24T08:01:41.081Z","modified":"2026-04-29T09:44:37.397Z","0.1.0":"2026-04-24T08:01:41.310Z","0.1.1":"2026-04-24T09:16:30.325Z","0.1.2":"2026-04-24T10:00:05.381Z","0.1.3":"2026-04-29T09:44:37.285Z"},"license":"MIT","keywords":["paperclip","paperclipai","agentvalet","adapter","ai-agent","credential-proxy","governance"],"description":"Paperclip adapter for AgentValet — credential proxy and identity governance for Paperclip agents","maintainers":[{"name":"edwinashdown","email":"edwin@aifirstpartner.com"}],"readme":"# @agentvalet/paperclip-adapter\r\n\r\nPaperclip adapter for AgentValet — credential proxy and identity governance for Paperclip agents.\r\n\r\n## What it does\r\n\r\nAgentValet sits between Paperclip agents and SaaS platforms (Slack, Stripe, Gmail, Airtable, etc.). When a Paperclip agent is configured with this adapter, every platform API call is routed through AgentValet, which validates the agent's identity, enforces scope permissions, applies rate limits, triggers human-in-the-loop approvals where required, and writes a full audit trail.\r\n\r\n## Architecture\r\n\r\n```\r\nPaperclip                    AgentValet              SaaS Platforms\r\n┌──────────────┐             ┌─────────────┐         ┌───────────┐\r\n│  Heartbeat   │──execute()─▶│  Identity   │         │           │\r\n│  Scheduler   │             │  check      │         │  Slack    │\r\n│              │             │             │─────────▶│  Stripe   │\r\n│  Issue Queue │             │  Scope gate │         │  Gmail    │\r\n│              │◀──results───│             │◀─────────│  Airtable │\r\n│  Audit UI    │             │  Audit log  │         └───────────┘\r\n└──────────────┘             └─────────────┘\r\n         │                          │\r\n         │                   ┌──────┴──────┐\r\n         │                   │  Dashboard  │\r\n         └───────────────────│  (approve / │\r\n                             │   revoke)   │\r\n                             └─────────────┘\r\n```\r\n\r\n## Two-layer model\r\n\r\nAuthentication (who am I?) is company-level — one RS256 key shared across all agents. Authorisation (what can I do?) is agent-level — configured per-agent in the AgentValet dashboard.\r\n\r\n## Prerequisites\r\n\r\n- Node.js 20+\r\n- A Paperclip instance with an adapter registry\r\n- An AgentValet account at https://app.agentvalet.ai\r\n- An RS256 keypair (one per Paperclip company)\r\n\r\n## Installation into Paperclip\r\n\r\n```bash\r\nnpm install @agentvalet/paperclip-adapter\r\n```\r\n\r\nRegister it in your Paperclip instance by adding to three registry files:\r\n\r\n### server/src/adapters/registry.ts\r\n\r\n```typescript\r\nimport * as agentValet from \"@agentvalet/paperclip-adapter\";\r\nimport { execute, testEnvironment } from \"@agentvalet/paperclip-adapter/server\";\r\n\r\nregistry.set(\"agentvalet\", { ...agentValet, execute, testEnvironment });\r\n```\r\n\r\n### ui/src/adapters/registry.ts\r\n\r\n```typescript\r\nimport * as agentValet from \"@agentvalet/paperclip-adapter\";\r\nimport { parseStdout, buildConfig } from \"@agentvalet/paperclip-adapter/ui\";\r\n\r\nregistry.set(\"agentvalet\", { ...agentValet, parseStdout, buildConfig });\r\n```\r\n\r\n### cli/src/adapters/registry.ts\r\n\r\n```typescript\r\nimport * as agentValet from \"@agentvalet/paperclip-adapter\";\r\nimport { formatEvent } from \"@agentvalet/paperclip-adapter/cli\";\r\n\r\nregistry.set(\"agentvalet\", { ...agentValet, formatEvent });\r\n```\r\n\r\nThen rebuild your Paperclip instance.\r\n\r\n## Company-level setup (required once)\r\n\r\nSet these environment variables in your Paperclip server:\r\n\r\n```\r\nAGENTVALET_PROXY_URL=https://api.agentvalet.ai\r\nAGENTVALET_OWNER_ID=<your owner ID from AgentValet Settings>\r\nAGENTVALET_COMPANY_KEY=<RS256 private key PEM — never commit this>\r\n```\r\n\r\n## Setting up your company key\r\n\r\n`AGENTVALET_COMPANY_KEY` is an RSA-2048 private key used to sign\r\nJWT tokens that identify your Paperclip company to AgentValet.\r\nAgentValet verifies the signature using the corresponding public key,\r\nwhich you register once in the dashboard.\r\n\r\n### Option 1 — Let AgentValet generate it (recommended)\r\n\r\n1. Open AgentValet → Settings → Integrations → Paperclip\r\n2. Click **Generate keypair**\r\n3. Copy the private key from the modal — it's shown once only\r\n4. Set it as `AGENTVALET_COMPANY_KEY` in your Paperclip instance\r\n5. Done — the public key is stored automatically\r\n\r\n### Option 2 — Generate your own with openssl\r\n\r\n```bash\r\n# Generate private key\r\nopenssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 \\\r\n  -out agentvalet-company.key\r\n\r\n# Extract public key (paste this into AgentValet)\r\nopenssl rsa -in agentvalet-company.key -pubout \\\r\n  -out agentvalet-company.pub\r\n```\r\n\r\nThen in AgentValet → Settings → Integrations → Paperclip,\r\npaste the contents of `agentvalet-company.pub` using\r\n\"Register your own key\".\r\n\r\nSet `AGENTVALET_COMPANY_KEY` to the full contents of\r\n`agentvalet-company.key`.\r\n\r\n### Option 3 — Generate with Node.js\r\n\r\n```javascript\r\nconst { generateKeyPairSync } = require('crypto');\r\n\r\nconst { privateKey, publicKey } = generateKeyPairSync('rsa', {\r\n  modulusLength: 2048,\r\n  publicKeyEncoding: { type: 'spki', format: 'pem' },\r\n  privateKeyEncoding: { type: 'pkcs8', format: 'pem' }\r\n});\r\n\r\nconsole.log('Set as AGENTVALET_COMPANY_KEY:\\n', privateKey);\r\nconsole.log('Paste into AgentValet:\\n', publicKey);\r\n```\r\n\r\n### Multi-line env var handling\r\n\r\nIf your environment mangles newlines in env vars:\r\n\r\n| Format | Example | Notes |\r\n|--------|---------|-------|\r\n| Multi-line (ideal) | Normal PEM with real newlines | Works natively |\r\n| Escaped | `-----BEGIN...\\\\nMIIE...\\\\n-----END...` | Adapter converts automatically |\r\n| Base64 | Set `AGENTVALET_COMPANY_KEY_B64` | Adapter detects and decodes |\r\n\r\n### One key per Paperclip company\r\n\r\nUse a separate keypair for each Paperclip company (e.g. production\r\nvs staging). Label them clearly in AgentValet. To rotate a key,\r\ngenerate a new one in AgentValet, update the env var, and revoke\r\nthe old key in the dashboard.\r\n\r\n## Quick start — agent config\r\n\r\nCreate an agent with this `adapterConfig`:\r\n\r\n```json\r\n{\r\n  \"adapterType\": \"agentvalet\",\r\n  \"adapterConfig\": {\r\n    \"underlyingAdapter\": \"claude_local\",\r\n    \"underlyingAdapterConfig\": { \"cwd\": \"/projects/my-agent\" },\r\n    \"agentvaletScopes\": [\"slack:read\", \"slack:write\"],\r\n    \"approvalTimeoutSec\": 60\r\n  }\r\n}\r\n```\r\n\r\n## Configuration reference\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `underlyingAdapter` | string | `\"claude_local\"` | Paperclip adapter to delegate execution to |\r\n| `underlyingAdapterConfig` | object | `{}` | Config passed verbatim to the underlying adapter |\r\n| `agentvaletScopes` | string[] | `[]` | Hint only — scopes this agent intends to use |\r\n| `approvalTimeoutSec` | number | `60` | Seconds to wait for human approval |\r\n| `tokenTtlSec` | number | `300` | JWT lifetime per run (seconds) |\r\n| `registrationTimeoutSec` | number | `120` | Seconds to wait for owner to approve new agent |\r\n\r\n## How approval blocking works\r\n\r\nWhen an agent calls a platform with a scope requiring approval, AgentValet returns `{ \"status\": \"pending_approval\", \"approval_id\": \"apr_...\" }`. The agent should poll `GET /v1/approvals/{approval_id}` every 5 seconds. If not approved within `approvalTimeoutSec`, the adapter returns a blocked result to Paperclip, which retries on the next heartbeat.\r\n\r\n## Security notes\r\n\r\n- The RS256 private key (`AGENTVALET_COMPANY_KEY`) must be set as an environment variable — never in `adapterConfig`\r\n- JWTs are minted fresh per heartbeat run and expire after `tokenTtlSec` seconds\r\n- `AGENTVALET_AGENT_TOKEN` is never logged or printed — the CLI formatter redacts it\r\n- One keypair per Paperclip company — never reuse keys across companies\r\n- `agentvaletScopes` in adapterConfig is a hint only — it never self-grants permissions\r\n","readmeFilename":"README.md","homepage":"https://github.com/MCSEdwin/agentvalet#readme","repository":{"type":"git","url":"git+https://github.com/MCSEdwin/agentvalet.git","directory":"packages/paperclip-adapter"},"bugs":{"url":"https://github.com/MCSEdwin/agentvalet/issues"}}