{"_id":"@dex-ai/pi-compat","_rev":"3-730fa198697949da0feedaaf762e53e0","name":"@dex-ai/pi-compat","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.2":{"name":"@dex-ai/pi-compat","version":"0.1.2","_id":"@dex-ai/pi-compat@0.1.2","maintainers":[{"name":"klxdev","email":"klxdev.code@gmail.com"}],"dist":{"shasum":"409b689ea1307ffd9705da40f2ed227e8ba4505f","tarball":"https://registry.npmjs.org/@dex-ai/pi-compat/-/pi-compat-0.1.2.tgz","fileCount":17,"integrity":"sha512-Tbz3qHalDoRPsBeNGTV57LK9NEm37tI5b6Oau3zNYLPiSWC+u1d8I4jpx/mNipU9PfOFWdnlGkqJRyuCcqu+sg==","signatures":[{"sig":"MEUCIQCbFgjbrEi9UJeoCOI8cg758TGQQiSviooZI7sx4LtT7AIgRYS3D5HAB7dsY/cUH3TLDXF/8o6nJ2UQAl7Ew1jcT8M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71768},"main":"src/index.ts","type":"module","exports":{".":"./src/index.ts"},"gitHead":"a96f4a444a5450d47629121e32e6fdd77911754f","scripts":{"test":"bun test","release":"changeset publish","version":"changeset version","changeset":"changeset","typecheck":"tsc --noEmit"},"_npmUser":{"name":"klxdev","email":"klxdev.code@gmail.com"},"_npmVersion":"11.11.0","description":"Pi extension compatibility layer — load and run pi-coding-agent extensions inside Dex","directories":{},"_nodeVersion":"24.14.1","dependencies":{"zod":"^3.24.4","jiti":"^2.7.0","typebox":"^1.1.24"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.0.0","typescript":"^5.6.3","@dex-ai/sdk":"^0.1.2","@changesets/cli":"^2.29.0"},"_npmOperationalInternal":{"tmp":"tmp/pi-compat_0.1.2_1779936983547_0.24479304898125753","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@dex-ai/pi-compat","version":"0.1.3","_id":"@dex-ai/pi-compat@0.1.3","maintainers":[{"name":"klxdev","email":"klxdev.code@gmail.com"}],"dist":{"shasum":"cc0bb452e922aab585532e12b76ae6ca1bad9335","tarball":"https://registry.npmjs.org/@dex-ai/pi-compat/-/pi-compat-0.1.3.tgz","fileCount":26,"integrity":"sha512-aCcWlPLphK3qd2L3TN23rnVrwgq4KNl9x46Vlyijoe2N63h+S/3hwUKuDUmzZx/5dKyJ5B0ujRhbSY8ck5chGQ==","signatures":[{"sig":"MEUCIQCaHNzZDzh6hTOhamgdw1PNj6sid/QINXkF+x8B4ZgzhQIgJiZeQHxar25V/W0h5Ic9ae8nkKcBcPLy2AY7xidRbNo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":96844},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"npm":">=10","node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"2f4845c00bafc127c7597ad6b43e32f9df83dd84","scripts":{"test":"vitest run","build":"npm run clean && tsc -p tsconfig.build.json","clean":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"","release":"changeset publish","version":"changeset version","changeset":"changeset","typecheck":"tsc --noEmit","build:local":"npm run clean && tsc -p tsconfig.build.json","prepublishOnly":"npm run build"},"_npmUser":{"name":"klxdev","email":"klxdev.code@gmail.com"},"_npmVersion":"11.11.0","description":"Pi extension compatibility layer — load and run pi-coding-agent extensions inside Dex","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"zod":"^3.24.4","jiti":"^2.7.0","typebox":"^1.1.24"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"npm@11.13.0","devDependencies":{"vitest":"^3.0.0","typescript":"^5.6.3","@dex-ai/sdk":"^0.1.36","@types/node":"^22.0.0","@changesets/cli":"^2.29.0"},"_npmOperationalInternal":{"tmp":"tmp/pi-compat_0.1.3_1781459745162_0.2500091918149079","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@dex-ai/pi-compat","version":"0.1.4","description":"Pi extension compatibility layer — load and run pi-coding-agent extensions inside Dex","type":"module","main":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"clean":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"","build":"npm run clean && tsc -p tsconfig.build.json","build:local":"npm run clean && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","test":"vitest run","changeset":"changeset","version":"changeset version","release":"changeset publish","prepublishOnly":"npm run build"},"dependencies":{"jiti":"^2.7.0","typebox":"^1.1.24","zod":"^3.24.4"},"devDependencies":{"@dex-ai/sdk":"^0.1.36","typescript":"^5.6.3","@changesets/cli":"^2.29.0","@types/node":"^22.0.0","vitest":"^3.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"types":"./dist/index.d.ts","packageManager":"npm@11.13.0","engines":{"node":">=22","npm":">=10"},"sideEffects":false,"gitHead":"177c9be4d96f068730875a1e287f7d15cb1c78c3","_id":"@dex-ai/pi-compat@0.1.4","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-JMfs/B39xDHRccu8v9V+gcNuFpbxcI/oH8oDkp5UOoHwW9E1PDJdoSVP7u6+k1j2c8qlWOmx2QCucDuA8UwreA==","shasum":"aed63eac14bbd0857dcea01f3535700ec03c4164","tarball":"https://registry.npmjs.org/@dex-ai/pi-compat/-/pi-compat-0.1.4.tgz","fileCount":26,"unpackedSize":96760,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCID/31kmT3FO+1lcAAyIBnINBmRt3lGqsZQUtiQw2h9Y1AiEA3DLZITYpfCOq196+kkrGkIB6sX09X0+Gs1LEKa0y9PE="}]},"_npmUser":{"name":"klxdev","email":"klxdev.code@gmail.com"},"directories":{},"maintainers":[{"name":"klxdev","email":"klxdev.code@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-compat_0.1.4_1781491146062_0.17174845600098942"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-28T02:56:23.349Z","modified":"2026-06-15T02:39:06.372Z","0.1.2":"2026-05-28T02:56:23.711Z","0.1.3":"2026-06-14T17:55:45.300Z","0.1.4":"2026-06-15T02:39:06.188Z"},"description":"Pi extension compatibility layer — load and run pi-coding-agent extensions inside Dex","maintainers":[{"name":"klxdev","email":"klxdev.code@gmail.com"}],"readme":"# @dex-ai/pi-compat\n\nPi extension compatibility layer — load and run [pi-coding-agent](https://github.com/nicobailon/pi-coding-agent) extensions inside Dex.\n\n## What This Does\n\nPi has a mature extension ecosystem with powerful tools like:\n- **pi-lens** — LSP + AST-grep code intelligence\n- **pi-subagents** — Multi-agent delegation\n- **pi-mcp-adapter** — MCP server integration\n- **pi-intercom** — Inter-session communication\n- **@samfp/pi-memory** — Persistent memory with consolidation\n\nThis package lets you use those extensions in Dex without rewriting them. It creates a shim `ExtensionAPI` that captures Pi's imperative registrations (tools, event handlers, skills) and maps them to Dex's declarative Extension interface.\n\n## Usage\n\n```typescript\nimport { piCompatExtension } from '@dex-ai/pi-compat';\nimport { Agent } from '@dex-ai/sdk';\n\nconst agent = await Agent.create({\n  extensions: [\n    // Load pi-lens (globally installed)\n    await piCompatExtension({ packages: ['pi-lens'] }),\n\n    // Load multiple Pi extensions at once\n    await piCompatExtension({\n      packages: ['pi-lens', '@samfp/pi-memory'],\n      flags: { 'lens-lsp': true },\n    }),\n\n    // Load from a path\n    await piCompatExtension({\n      paths: ['~/.pi/agent/extensions/my-extension'],\n    }),\n  ],\n});\n```\n\n## How It Works\n\n```\n┌─────────────────────┐     ┌─────────────────────┐     ┌──────────────────┐\n│   Pi Extension      │     │   pi-compat shim     │     │   Dex Extension  │\n│                     │     │                      │     │                  │\n│ pi.registerTool()   │────▶│ captures → converts  │────▶│ ext.tools[]      │\n│ pi.on(\"event\")      │────▶│ maps event names     │────▶│ ext.on.{event}   │\n│ pi.exec()           │────▶│ child_process.spawn  │     │ (functional)     │\n│ pi.registerFlag()   │────▶│ flag → env/config    │────▶│ ext.config       │\n│ skills/ directory   │────▶│ loads SKILL.md files  │────▶│ ext.skills[]     │\n│                     │     │                      │     │                  │\n│ pi.registerShortcut │────▶│ (no-op)              │     │                  │\n│ ctx.ui.*            │────▶│ (no-op stubs)        │     │                  │\n│ pi.registerProvider │────▶│ (no-op)              │     │                  │\n└─────────────────────┘     └─────────────────────┘     └──────────────────┘\n```\n\n## Architecture Translation\n\n| Pi Concept | Dex Equivalent | Status |\n|---|---|---|\n| `pi.registerTool({ name, parameters: Type.Object(...), execute })` | `ext.tools: [{ name, parameters: z.object(...), execute }]` | ✅ Mapped (TypeBox → Zod) |\n| `pi.on(\"session_start\", handler)` | `ext.on: { 'session-start': handler }` | ✅ Mapped |\n| `pi.on(\"tool_call\", handler)` | `ext.on: { 'tool-start': handler }` | ✅ Mapped |\n| `pi.on(\"tool_result\", handler)` | `ext.on: { 'tool-stop': handler }` | ✅ Mapped |\n| `pi.on(\"agent_end\", handler)` | `ext.on: { 'generate-stop': handler }` | ✅ Mapped |\n| `pi.on(\"turn_start/end\")` | `ext.on: { 'model-start/stop' }` | ✅ Mapped |\n| `pi.exec(cmd, args)` | `child_process.spawn()` | ✅ Functional |\n| `pi.registerFlag(name, opts)` | `opts.flags` on piCompatExtension | ✅ Via options |\n| Skills (`package.json \"pi\".skills`) | `ext.skills[]` (loaded from SKILL.md) | ✅ Loaded |\n| `pi.registerCommand()` | (captured, not exposed) | ⚠️ Captured only |\n| `pi.registerShortcut()` | — | ❌ No-op |\n| `pi.registerProvider()` | — | ❌ No-op |\n| `pi.sendMessage()` | — | ❌ No-op |\n| `ctx.ui.*` | — | ❌ No-op stubs |\n\n## Event Mapping\n\n| Pi Event | Dex Event | Notes |\n|---|---|---|\n| `session_start` | `session-start` | Fires on agent init |\n| `session_shutdown` | `session-stop` | Fires on agent dispose |\n| `before_agent_start` | `generate-start` | Before each generate() |\n| `agent_end` | `generate-stop` | After each generate() |\n| `turn_start` | `model-start` | Before each LLM call |\n| `turn_end` | `model-stop` | After each LLM call |\n| `tool_call` | `tool-start` | Before tool execution (can block) |\n| `tool_result` | `tool-stop` | After tool execution (can modify) |\n| `context` | `generate-input` | Context injection |\n\n## Prerequisites\n\nPi extensions must be installed globally (or locally) with their dependencies:\n\n```bash\n# Install pi extensions\nnpm install -g pi-lens @samfp/pi-memory pi-subagents\n\n# The pi-coding-agent core package must also be installed\n# (pi extensions peer-depend on it for types)\nnpm install -g @earendil-works/pi-coding-agent\n```\n\n## Configuration via Flags\n\nPi extensions use `registerFlag()` / `getFlag()` for configuration. Pass flag values via the `flags` option:\n\n```typescript\nawait piCompatExtension({\n  packages: ['pi-lens'],\n  flags: {\n    'lens-lsp': true,        // Enable LSP features\n    'lens-guard': true,      // Enable git guard\n    'lens-verbose': false,   // Disable verbose logging\n  },\n});\n```\n\n## Limitations\n\n1. **No UI** — Pi's rich TUI features (overlays, widgets, custom footer) are no-ops. Extensions that are purely UI-focused (pi-powerline-footer) won't provide value.\n\n2. **Event fidelity** — Some Pi events have no direct Dex equivalent. Extensions relying heavily on `message_start/update/end`, `before_provider_request`, or `input` events will have those handlers silently ignored.\n\n3. **TypeBox → Zod** — Schema conversion is best-effort. Complex TypeBox features (discriminated unions with `$ref`, conditional schemas) may fall back to `z.any()`.\n\n4. **No message injection** — Pi's `sendMessage()` / `sendUserMessage()` for steering mid-generation isn't mapped. Extensions that inject messages won't function for that capability.\n\n5. **Single provider** — Pi's `registerProvider()` is a no-op. Extensions that add custom providers won't contribute models.\n\n## Development\n\n```bash\nbun install\nbun run typecheck\nbun test\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}