{"_id":"@blackbelt-technology/pi-dashboard-blackhole-plugin","_rev":"3-92531ab9e5141d4d19220ef240f98263","name":"@blackbelt-technology/pi-dashboard-blackhole-plugin","dist-tags":{"latest":"0.9.0"},"versions":{"0.7.0":{"name":"@blackbelt-technology/pi-dashboard-blackhole-plugin","version":"0.7.0","license":"MIT","_id":"@blackbelt-technology/pi-dashboard-blackhole-plugin@0.7.0","maintainers":[{"name":"mbotond","email":"botond.molnar@blackbelt.hu"},{"name":"mrbence","email":"dbence10@gmail.com"},{"name":"robertcsakany","email":"robert.csakany@blackbelt.hu"},{"name":"norbert.herczeg","email":"norbert.herczeg@blackbelt.hu"}],"homepage":"https://github.com/BlackBeltTechnology/pi-agent-dashboard#readme","bugs":{"url":"https://github.com/BlackBeltTechnology/pi-agent-dashboard/issues"},"dist":{"shasum":"1992a9480f5be82837a11da3fc18546f246cb900","tarball":"https://registry.npmjs.org/@blackbelt-technology/pi-dashboard-blackhole-plugin/-/pi-dashboard-blackhole-plugin-0.7.0.tgz","fileCount":19,"integrity":"sha512-uNJz06h8LF0d37uCt7flj3mX2IeapAID8YbBhxehVt8cEf3doQILzkr0mkyxtFfmwqDwZs3eY5OErcLn93VwHQ==","signatures":[{"sig":"MEUCIGym3k6pEdNDjYSwjKcBdCwuQp6aSMtELjZ1rkUJjJvBAiEA6yCux/h7W2xpzILxVbDu7jHWkos523KHLnX2nTXOVjA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":92324},"type":"module","exports":{".":{"types":"./src/client/index.tsx","default":"./src/client/index.tsx"},"./client":{"types":"./src/client/index.tsx","default":"./src/client/index.tsx"},"./server":{"types":"./src/server/index.ts","default":"./src/server/index.ts"}},"gitHead":"fa69fa268e165e428fcb53d51f7d8ebff6b1da61","_npmUser":{"name":"robertcsakany","email":"robert.csakany@blackbelt.hu"},"repository":{"url":"git+https://github.com/BlackBeltTechnology/pi-agent-dashboard.git","type":"git","directory":"packages/blackhole-plugin"},"_npmVersion":"10.9.3","description":"Dashboard settings surface for the pi-blackhole extension — reads and writes its on-disk pi-blackhole-config.json through validated server routes, including an ordered per-worker model fallback-chain editor.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@blackbelt-technology/pi-dashboard-shared":"^0.7.0","@blackbelt-technology/dashboard-plugin-runtime":"^0.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0","wouter":"^3.9.0","react-dom":"^19.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":">=18.0.0","wouter":">=3.0.0","fastify":"^5.0.0","react-dom":">=18.0.0"},"pi-dashboard-plugin":{"id":"blackhole","claims":[{"tab":"general","slot":"settings-section","component":"BlackholeSettings"}],"client":"./src/client/index.tsx","server":"./src/server/index.ts","priority":100,"requires":{"piExtensions":["pi-blackhole"]},"displayName":"Blackhole","i18nCatalog":"catalog","configSchema":"./src/configSchema.json"},"_npmOperationalInternal":{"tmp":"tmp/pi-dashboard-blackhole-plugin_0.7.0_1786997752523_0.03298203451359005","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@blackbelt-technology/pi-dashboard-blackhole-plugin","version":"0.8.0","license":"MIT","_id":"@blackbelt-technology/pi-dashboard-blackhole-plugin@0.8.0","maintainers":[{"name":"mbotond","email":"botond.molnar@blackbelt.hu"},{"name":"mrbence","email":"dbence10@gmail.com"},{"name":"robertcsakany","email":"robert.csakany@blackbelt.hu"},{"name":"norbert.herczeg","email":"norbert.herczeg@blackbelt.hu"}],"homepage":"https://github.com/BlackBeltTechnology/pi-agent-dashboard#readme","bugs":{"url":"https://github.com/BlackBeltTechnology/pi-agent-dashboard/issues"},"dist":{"shasum":"d58db305487789d5ece91be71ee2a2c308032b4d","tarball":"https://registry.npmjs.org/@blackbelt-technology/pi-dashboard-blackhole-plugin/-/pi-dashboard-blackhole-plugin-0.8.0.tgz","fileCount":15,"integrity":"sha512-bge/Mjd3r/k06glNZegF/4u7yktnY1wScRR0N/m8mKR5524pxaI+f+/bH18ssiUe1IMb39lZ5u3tdQJhNkspdA==","signatures":[{"sig":"MEUCIAGQHhBNBLmae+6vo3nLNfP686Ufxoqs1iKjfOmmxmeOAiEAsaZ/q9MvrzNUoweHUw5uyIEWgLILVJDbDj/dJHwTNhQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackbelt-technology%2fpi-dashboard-blackhole-plugin@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":83895},"type":"module","exports":{".":{"types":"./src/client/index.tsx","default":"./src/client/index.tsx"},"./client":{"types":"./src/client/index.tsx","default":"./src/client/index.tsx"},"./server":{"types":"./src/server/index.ts","default":"./src/server/index.ts"}},"gitHead":"9373dfa416660a285475febc0383608fe14270b1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3765ddef-e8c0-4c7b-894a-f9a72650f2e3"}},"repository":{"url":"git+https://github.com/BlackBeltTechnology/pi-agent-dashboard.git","type":"git","directory":"packages/blackhole-plugin"},"_npmVersion":"12.0.2","description":"Dashboard settings surface for the pi-blackhole extension — reads and writes its on-disk pi-blackhole-config.json through validated server routes, including an ordered per-worker model fallback-chain editor.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@blackbelt-technology/pi-dashboard-shared":"^0.8.0","@blackbelt-technology/dashboard-plugin-runtime":"^0.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0","wouter":"^3.9.0","react-dom":"^19.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":">=18.0.0","wouter":">=3.0.0","fastify":"^5.0.0","react-dom":">=18.0.0"},"pi-dashboard-plugin":{"id":"blackhole","claims":[{"tab":"general","slot":"settings-section","component":"BlackholeSettings"}],"client":"./src/client/index.tsx","server":"./src/server/index.ts","priority":100,"requires":{"piExtensions":["pi-blackhole"]},"displayName":"Blackhole","i18nCatalog":"catalog","configSchema":"./src/configSchema.json"},"_npmOperationalInternal":{"tmp":"tmp/pi-dashboard-blackhole-plugin_0.8.0_1787746019229_0.941060397220536","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"_id":"@blackbelt-technology/pi-dashboard-blackhole-plugin@0.9.0","bugs":{"url":"https://github.com/BlackBeltTechnology/pi-agent-dashboard/issues"},"dist":{"shasum":"6984fb13d3a3ff5e775ad8438354e6a1b905ec1d","tarball":"https://registry.npmjs.org/@blackbelt-technology/pi-dashboard-blackhole-plugin/-/pi-dashboard-blackhole-plugin-0.9.0.tgz","fileCount":24,"integrity":"sha512-p1C+r8zdf8icfawgVktoi21nf4j/gkHXAiYpvjiE/YgtdZp1dFiIFZ5MXzDOkxAZFwHcC9b+kt1dEoaICWwjrA==","signatures":[{"sig":"MEUCIHkRsfK32mqZqdJWnrvcT6fVUHFpsT/r2ajlz4WJlL0hAiEA0TU/VS47xrfOH5IXjssypSSukrm5vtIgw6CveIu1sBs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAmhWFHiycX+KIuOWkcPF+BcuAT9X7YZPmLquhbrh4BIAiEAvRU+VPQ1yNGum1y+Gac9K3pbHchIXmDUpv2g0xvSYYs="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blackbelt-technology%2fpi-dashboard-blackhole-plugin@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":174894},"name":"@blackbelt-technology/pi-dashboard-blackhole-plugin","type":"module","exports":{".":{"types":"./src/client/index.tsx","default":"./src/client/index.tsx"},"./client":{"types":"./src/client/index.tsx","default":"./src/client/index.tsx"},"./server":{"types":"./src/server/index.ts","default":"./src/server/index.ts"}},"gitHead":"60a155465d55e4438e1425c07b0ab5459083a9b5","license":"MIT","version":"0.9.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"3765ddef-e8c0-4c7b-894a-f9a72650f2e3"}},"homepage":"https://github.com/BlackBeltTechnology/pi-agent-dashboard#readme","repository":{"url":"git+https://github.com/BlackBeltTechnology/pi-agent-dashboard.git","type":"git","directory":"packages/blackhole-plugin"},"_npmVersion":"12.2.0","description":"Dashboard surface for the pi-blackhole extension — settings (config file editor + fallback chains) and the per-session memory pipeline subcard/detail view.","directories":{},"maintainers":[{"name":"mbotond","email":"botond.molnar@blackbelt.hu"},{"name":"mrbence","email":"dbence10@gmail.com"},{"name":"robertcsakany","email":"robert.csakany@blackbelt.hu"},{"name":"norbert.herczeg","email":"norbert.herczeg@blackbelt.hu"}],"_nodeVersion":"24.21.0","dependencies":{"@mdi/js":"^7.4.47","@mdi/react":"^1.6.1","@blackbelt-technology/pi-dashboard-shared":"^0.9.0","@blackbelt-technology/dashboard-plugin-runtime":"^0.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0","wouter":"^3.9.0","react-dom":"^19.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":">=18.0.0","wouter":">=3.0.0","fastify":"^5.0.0","react-dom":">=18.0.0"},"pi-dashboard-plugin":{"id":"blackhole","claims":[{"tab":"general","slot":"settings-section","component":"BlackholeSettings"},{"slot":"session-card-memory","component":"MemorySubcard","shouldRender":"shouldRenderMemorySubcard"},{"slot":"content-view","component":"PipelineDetailView","predicate":"isPipelineDetailActive"},{"slot":"custom-entry-renderer","component":"OmEntryCard","customType":"om.observations.recorded"},{"slot":"custom-entry-renderer","component":"OmEntryCard","customType":"om.reflections.recorded"},{"slot":"custom-entry-renderer","component":"OmEntryCard","customType":"om.observations.dropped"}],"client":"./src/client/index.tsx","server":"./src/server/index.ts","priority":200,"requires":{"piExtensions":["pi-blackhole"]},"displayName":"Blackhole","i18nCatalog":"catalog","configSchema":"./src/configSchema.json"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-dashboard-blackhole-plugin_0.9.0_1791297062782_0.8097841697020813"}}},"time":{"created":"2026-08-17T20:15:52.369Z","modified":"2026-10-06T14:31:03.492Z","0.7.0":"2026-08-17T20:15:52.681Z","0.8.0":"2026-08-26T12:06:59.382Z","0.9.0":"2026-10-06T14:31:02.884Z"},"bugs":{"url":"https://github.com/BlackBeltTechnology/pi-agent-dashboard/issues"},"license":"MIT","homepage":"https://github.com/BlackBeltTechnology/pi-agent-dashboard#readme","repository":{"url":"git+https://github.com/BlackBeltTechnology/pi-agent-dashboard.git","type":"git","directory":"packages/blackhole-plugin"},"description":"Dashboard surface for the pi-blackhole extension — settings (config file editor + fallback chains) and the per-session memory pipeline subcard/detail view.","maintainers":[{"name":"mbotond","email":"botond.molnar@blackbelt.hu"},{"name":"mrbence","email":"dbence10@gmail.com"},{"name":"robertcsakany","email":"robert.csakany@blackbelt.hu"},{"name":"norbert.herczeg","email":"norbert.herczeg@blackbelt.hu"}],"readme":"# @blackbelt-technology/pi-dashboard-blackhole-plugin\n\nDashboard settings surface for the [`pi-blackhole`](https://www.npmjs.com/package/pi-blackhole)\nextension — unified algorithmic compaction plus observational memory.\n\n## Surfaces\n\nOne `settings-section` claim, mounted at `/settings/plugins/blackhole`:\n\n1. **Scalar settings** — grouped accordions over the compaction behaviour, the\n   observational-memory switches, the trigger thresholds, the token budgets, and\n   the runtime/diagnostic knobs.\n2. **Model fallback chains** — a ranked, keyboard-operable editor for the\n   `observer` / `reflector` / `dropper` chains, integrated with the shell's\n   model selector and thinking level picker primitives. List position *is*\n   resolution order: index 0 is `<worker>Model`, the rest are\n   `<worker>FallbackModels`. Includes a shared base model picker row above the\n   chains with clear action, a \"Use recommended defaults\" action that stages\n   resilient flash-class fallback chains across distinct providers with\n   confirmation gating, an add-model flow for empty and populated chains,\n   per-entry thinking override controls, and 4-state registry gating\n   (`pending|ok|empty|unavailable` + retry). The shared resolution tail\n   (`base model → session model`) is displayed dynamically and renders the\n   session model as excluded when `sessionFallback` is `false`.\n\nThe per-session pipeline surface is **not** part of this package; it lives in the\n`add-blackhole-session-pipeline` change.\n\n## Files read and written\n\nAll under `<agentDir>/pi-blackhole/`, where `agentDir` is `PI_CODING_AGENT_DIR`\nwhen set and `~/.pi/agent` otherwise — mirroring the extension's own resolution.\n\n| File | Access |\n|------|--------|\n| `pi-blackhole-config.json` | read + write (read-modify-write) |\n\nWrites are a read-modify-write: the server re-reads the file **within the\nrequest**, layers only the managed keys over it, and writes temp-then-rename.\nKeys the plugin does not manage — `_comment`, `_notes`, `skipForProviders`,\n`dropperPoolFullnessThreshold`, anything a newer blackhole adds — keep their\nvalues and their position in the file.\n\nAn unparseable config **fails closed**: `GET` returns a parse-error result\ncarrying the parser message instead of defaults, `PUT` refuses to write, and the\npage renders the error plus recovery actions rather than a fabricated form.\n\nBlackhole writes this file too (`/blackhole configure`, load-time migration) and\nno cross-process lock exists. Re-reading immediately before the write narrows the\nrace but does not close it; the save response reports\n`externalWriteDetected` rather than claiming exclusive access.\n\n## No dependency on `pi-blackhole`\n\nThe package declares `requires.piExtensions: [\"pi-blackhole\"]` — an **install\nprompt** for the Packages page, *not* an activation gate. An unsatisfied\n`requires` leaves a plugin loaded with its claims mounted, so the settings\ncomponent renders its own not-installed state, driven by pi's installed-package\nregistry (`GET /api/plugins`) rather than by the presence of blackhole's\ndirectory, which only means \"has run at least once\".\n\nThere is no npm or git dependency on `pi-blackhole` in any dependency section\n(asserted by `src/__tests__/manifest.test.ts`). The filesystem is the entire\nintegration surface: blackhole re-reads its config after every write, so there is\nno function to import. `src/shared/blackhole-config.ts` therefore **re-declares**\nthe config shape behind a `SOURCE-VERSION PIN` comment, guarded by a drift test\nagainst a vendored snapshot of blackhole's `example-config.json`.\n\n## Routes\n\n| Route | Behaviour |\n|-------|-----------|\n| `GET /api/plugins/blackhole/config` | effective value + default + `isDefault` per managed key, the resolved path, and the unmanaged keys present in the file. `409` with a `parse-error` result when the file cannot be parsed. |\n| `PUT /api/plugins/blackhole/config` | validates every submitted key against the field descriptors **before any disk access**, rejects the whole request atomically on any violation (`400`), then read-modify-writes. `409` when the file is unparseable. |\n\nServer-side validation is the security boundary — the client form is a\nconvenience, and a raw `PUT` that bypasses it hits exactly the same validator.\n","readmeFilename":"README.md"}