{"_id":"@accelint/stream-devtools","_rev":"2-63bff105b476a98f90a3fba65c64c58e","name":"@accelint/stream-devtools","dist-tags":{"latest":"2.0.0"},"versions":{"1.0.0":{"name":"@accelint/stream-devtools","version":"1.0.0","keywords":["dev-tk","devtools","sse","streams","tooling","websocket"],"author":{"name":"https://hypergiant.com"},"license":"Apache-2.0","_id":"@accelint/stream-devtools@1.0.0","maintainers":[{"name":"hg-devsecops","email":"hg-devsecops@hypergiant.com"},{"name":"brandonjpierce","email":"brandonpierce91@gmail.com"},{"name":"bryan_hg","email":"bryan.kizer@hypergiant.com"},{"name":"colin.leahy","email":"colin.leahy@hypergiant.com"},{"name":"jacob.foster.hg","email":"jacob.foster@hypergiant.com"}],"homepage":"https://github.com/gohypergiant/standard-toolkit#readme","bugs":{"url":"https://github.com/gohypergiant/standard-toolkit/issues"},"dist":{"shasum":"27ed020a60059e3e0232094ddec82495b2f7c931","tarball":"https://registry.npmjs.org/@accelint/stream-devtools/-/stream-devtools-1.0.0.tgz","fileCount":8,"integrity":"sha512-/+oUVhXaMzGp4eD41oGlZtgzPS5jYEV28F2KgZuumSN1T0au4/RkPfbrVMctR5uNI9n3EhxeYEnkLHPVKfVDxQ==","signatures":[{"sig":"MEQCIA3jCuWZG9/5p2oMCccGX8lcKoo3WBGF8L2jj+X5adNsAiA1QdsGcR72kVtMnRzST/yv0Jnp25r5TD4rW0g1Cheikw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":586614},"main":"./dist/index.js","type":"module","_from":"file:accelint-stream-devtools-1.0.0.tgz","owner":"default/pathfinder","title":"Accelint Stream Devtools","types":"./dist/index.d.ts","module":"./dist/index.js","$schema":"https://json.schemastore.org/package","engines":{"node":">=22","pnpm":">=10"},"exports":{".":"./dist/index.js","./package.json":"./package.json"},"private":false,"scripts":{"dev":"pnpm tsc --watch","lint":"pnpm biome lint . --verbose","test":"pnpm vitest --dir=src","build":"pnpm tsdown","format":"pnpm biome format . --write --verbose","license":"pnpm zx ../../scripts/license.mjs","test:watch":"pnpm vitest --dir=src --watch","format:check":"pnpm biome format . --verbose","lint:package":"pnpm publint"},"subPath":"packages/stream-devtools","_npmUser":{"name":"brandonjpierce","email":"brandonpierce91@gmail.com"},"_resolved":"/tmp/242e1d8a045d50a6d01707bd222d3343/accelint-stream-devtools-1.0.0.tgz","_integrity":"sha512-/+oUVhXaMzGp4eD41oGlZtgzPS5jYEV28F2KgZuumSN1T0au4/RkPfbrVMctR5uNI9n3EhxeYEnkLHPVKfVDxQ==","repository":{"url":"git+https://github.com/gohypergiant/standard-toolkit.git","type":"git"},"_npmVersion":"11.17.0","description":"TanStack Devtools panel for @accelint/stream — every stream's status, observers, message log, and lifecycle timeline, with reconnect/close/simulate/inject actions.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.18.0","vitest":"^4.0.15","radashi":"^12.6.2","solid-js":"^1.9.7","typescript":"^5.9.3","@accelint/stream":"0.2.0","vite-plugin-solid":"^2.11.9","@tanstack/devtools-ui":"^0.6.0","@accelint/vitest-config":"0.1.6","@tanstack/devtools-utils":"^0.4.0","@accelint/typescript-config":"0.1.4"},"peerDependencies":{"@accelint/stream":"0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/stream-devtools_1.0.0_1787681429911_0.44019239753394634","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@accelint/stream-devtools","description":"TanStack Devtools panel for @accelint/stream — every stream's status, observers, message log, and lifecycle timeline, with reconnect/close/simulate/inject actions.","version":"2.0.0","author":{"name":"https://hypergiant.com"},"$schema":"https://json.schemastore.org/package","devDependencies":{"@tanstack/devtools":"^0.14.2","@tanstack/devtools-ui":"^0.6.0","@tanstack/devtools-utils":"^0.4.0","@testing-library/dom":"^10.4.1","@testing-library/jest-dom":"^6.9.1","@testing-library/react":"^16.3.0","@types/react":"^19","goober":"^2.1.16","radashi":"^12.6.2","react":"^19","react-dom":"^19","solid-js":"^1.9.7","tsdown":"^0.18.0","typescript":"^5.9.3","vite-plugin-solid":"^2.11.9","vitest":"^4.0.15","@accelint/stream":"0.3.0","@accelint/typescript-config":"0.1.4","@accelint/vitest-config":"0.1.6"},"engines":{"node":">=22","pnpm":">=10"},"exports":{".":"./dist/index.js","./production":"./dist/production.js","./react":"./dist/react/index.js","./react/production":"./dist/react/production.js","./package.json":"./package.json"},"keywords":["dev-tk","devtools","sse","streams","tooling","websocket"],"license":"Apache-2.0","main":"./dist/index.js","module":"./dist/index.js","owner":"default/pathfinder","peerDependencies":{"@tanstack/devtools":"^0.14.2","react":"^19","@accelint/stream":"0.3.0"},"peerDependenciesMeta":{"@tanstack/devtools":{"optional":true},"react":{"optional":true}},"private":false,"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/gohypergiant/standard-toolkit.git"},"sideEffects":false,"subPath":"packages/stream-devtools","title":"Accelint Stream Devtools","type":"module","types":"./dist/index.d.ts","scripts":{"build":"pnpm tsdown","dev":"pnpm tsc --watch","format":"pnpm biome format . --write --verbose","format:check":"pnpm biome format . --verbose","license":"pnpm zx ../../scripts/license.mjs","lint":"pnpm biome lint . --verbose","lint:package":"pnpm publint","test":"pnpm vitest --dir=src","test:watch":"pnpm vitest --dir=src --watch"},"_id":"@accelint/stream-devtools@2.0.0","bugs":{"url":"https://github.com/gohypergiant/standard-toolkit/issues"},"homepage":"https://github.com/gohypergiant/standard-toolkit#readme","_integrity":"sha512-lHP10B4fYjtiDOYtYUq8T9jSi4TvEKdmUO5pJH1MfhCVQgcJzNsgyncSFElWE3Jh7ZS5J44dRoinBjBNGDO7CA==","_resolved":"/tmp/b77b44a2115ee37944c27f82d82a09aa/accelint-stream-devtools-2.0.0.tgz","_from":"file:accelint-stream-devtools-2.0.0.tgz","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-lHP10B4fYjtiDOYtYUq8T9jSi4TvEKdmUO5pJH1MfhCVQgcJzNsgyncSFElWE3Jh7ZS5J44dRoinBjBNGDO7CA==","shasum":"51c4087d6258fd64946f9e33598cfc92368ce5d9","tarball":"https://registry.npmjs.org/@accelint/stream-devtools/-/stream-devtools-2.0.0.tgz","fileCount":29,"unpackedSize":650641,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAI11OAQUNkxh5CVndVJvXNJTUBdxlK4nlKyuS3totjpAiEAy5VpXYwmTHUm4Wov90qKeWysauozP4Dz4YBA4OvPyU4="}]},"_npmUser":{"name":"brandonjpierce","email":"brandonpierce91@gmail.com"},"directories":{},"maintainers":[{"name":"hg-devsecops","email":"hg-devsecops@hypergiant.com"},{"name":"brandonjpierce","email":"brandonpierce91@gmail.com"},{"name":"bryan_hg","email":"bryan.kizer@hypergiant.com"},{"name":"colin.leahy","email":"colin.leahy@hypergiant.com"},{"name":"jacob.foster.hg","email":"jacob.foster@hypergiant.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/stream-devtools_2.0.0_1788360750709_0.5735920631011189"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-25T18:10:29.789Z","modified":"2026-09-02T14:52:31.145Z","1.0.0":"2026-08-25T18:10:30.065Z","2.0.0":"2026-09-02T14:52:30.882Z"},"bugs":{"url":"https://github.com/gohypergiant/standard-toolkit/issues"},"author":{"name":"https://hypergiant.com"},"license":"Apache-2.0","homepage":"https://github.com/gohypergiant/standard-toolkit#readme","keywords":["dev-tk","devtools","sse","streams","tooling","websocket"],"repository":{"type":"git","url":"git+https://github.com/gohypergiant/standard-toolkit.git"},"description":"TanStack Devtools panel for @accelint/stream — every stream's status, observers, message log, and lifecycle timeline, with reconnect/close/simulate/inject actions.","maintainers":[{"name":"hg-devsecops","email":"hg-devsecops@hypergiant.com"},{"name":"brandonjpierce","email":"brandonpierce91@gmail.com"},{"name":"bryan_hg","email":"bryan.kizer@hypergiant.com"},{"name":"colin.leahy","email":"colin.leahy@hypergiant.com"},{"name":"jacob.foster.hg","email":"jacob.foster@hypergiant.com"}],"readme":"<!-- Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at https://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License. -->\n\n# @accelint/stream-devtools\n\n**A Streams tab for TanStack Devtools.** Shows every `@accelint/stream`\nconnection live: status, observer count, message log, and lifecycle\ntimeline, with Reconnect, Close, Clear All, Simulate-Error, and\nInject-Message actions. The panel is built with `@tanstack/devtools-ui`,\nrenders in the shell's light or dark theme, and reads as a native sibling\nof TanStack's own panels.\n\nSolidJS is fully bundled, so host apps never install Solid. The only\nrequired peer is `@accelint/stream`. `react` is an optional peer, used by\nthe `./react` entry only.\n\nThe package follows the TanStack devtools architecture: the root entry is\nthe Solid core, and framework adapters live on subpath entries.\n\n| Host | Import from |\n| --- | --- |\n| `@tanstack/react-devtools` shell, or any React app | `@accelint/stream-devtools/react` |\n| Custom wrapper (Solid shell, other frameworks) | `@accelint/stream-devtools` (core class + store factory) |\n\n## Usage: React host\n\nA React shell portals each plugin render's return value as a React\nelement, so it needs the React adapter. The adapter drives the Solid panel\nthrough a core class with `mount`/`unmount`, the same bridge TanStack's\nown panels use.\n\nThe adapter is zero-config: the panel resolves the app's `StreamClient`\nfrom `StreamClientProvider` context, the same way React Query's devtools\nresolve their client. `<TanStackDevtools>` must sit inside the provider.\nThe shell portals plugin panels, and portals keep React context.\n\n```tsx\nimport { TanStackDevtools } from '@tanstack/react-devtools';\nimport { StreamClientProvider } from '@accelint/stream/react';\nimport { streamDevtoolsPlugin } from '@accelint/stream-devtools/react';\n\n<StreamClientProvider client={streamClient}>\n  <App />\n  <TanStackDevtools plugins={[streamDevtoolsPlugin]} />\n</StreamClientProvider>;\n```\n\nTo customize the tab, spread the plugin object:\n`{ ...streamDevtoolsPlugin, name: 'My Streams' }`.\n\nThe adapter keeps one store per client for the client's lifetime, attached\nwhen the panel first mounts. Timelines and message logs survive the shell\nunmounting and remounting the panel. History from before the devtools\nfirst open is limited to what the stream cache still holds.\n\nKnown limitation, inherited from the upstream React panel host that\nTanStack's own panels also use: under React StrictMode (the Next.js dev\ndefault) a mounted panel keeps the theme it first mounted with. Switch the\nshell theme and reload to change it.\n\nThe entry also exports `StreamDevtoolsPanel`, the raw panel component, for\nhosts without the shell. It takes the mount props directly, including an\nexplicit store:\n\n```tsx\nimport { StreamDevtoolsPanel } from '@accelint/stream-devtools/react';\nimport { createStreamDevtoolsStore } from '@accelint/stream-devtools';\n\nconst panelProps = {\n  store: createStreamDevtoolsStore(streamClient),\n  theme: 'dark',\n  devtoolsOpen: true,\n} as const;\n\n<StreamDevtoolsPanel {...panelProps} />;\n```\n\n## Usage: custom wrapper (Solid shell, other frameworks)\n\nThe root entry is the Solid core class, a constructor whose instances\n`mount(el, props)` and `unmount()`, plus the store factory that binds it\nto a client. A Solid-shell plugin is a few lines with\n`@tanstack/devtools-utils`:\n\n```tsx\nimport {\n  StreamDevtoolsCore,\n  createStreamDevtoolsStore,\n} from '@accelint/stream-devtools';\nimport type { StreamDevtoolsMountProps } from '@accelint/stream-devtools';\n\nconst props: StreamDevtoolsMountProps = {\n  store: createStreamDevtoolsStore(streamClient),\n  theme: 'dark',\n  devtoolsOpen: true,\n};\nconst core = new StreamDevtoolsCore();\ncore.mount(element, props);\n// later: core.unmount()\n```\n\nThe store attaches to the client's `StreamCache` when created and keeps\nrecording while no panel is mounted. Create it eagerly if timelines should\nspan the whole app session.\n\n## Production builds\n\nThe main entries are development-only, the TanStack devtools convention:\noutside `NODE_ENV === 'development'` they resolve to no-op twins that\nrender nothing and never touch the client. Bundlers inline the check, so\nthe devtools code path disappears from production bundles. To keep live\ndevtools in a production build, import from the opt-in entries instead:\n\n```ts\nimport { StreamDevtoolsCore } from '@accelint/stream-devtools/production';\n// or, for React hosts:\nimport { streamDevtoolsPlugin } from '@accelint/stream-devtools/react/production';\n```\n\n## What the panel shows\n\n- **Transport tabs** (SSE / WebSockets) with per-status count chips and a\n  trailing messages-per-second rate.\n- **Stream list**: status-colored observer badge, stream key, total message\n  count, last-update time.\n- **Detail pane** per selected stream: status card, actions row (with\n  transport-dependent actions disabled until a stream has connected),\n  lifecycle timeline (`added`, `recreated`, `statusChanged from → to`,\n  observer changes), message log (sequence numbers, duplicate markers,\n  expandable JSON payloads), and a data explorer for the latest payload.\n\n## Architecture notes\n\n- The store observes only public `StreamCache.subscribe()` events plus\n  each stream's own message history. It ratchets `messageHistory` to 50 on\n  every stream it sees. `@accelint/stream` has no knowledge of the\n  devtools.\n- Panel-to-app commands are direct in-process calls, deliberately **not**\n  on the TanStack devtools event bus: the bus broadcasts to all\n  same-origin tabs, which caused cross-tab state clobbering. This is the\n  React Query devtools architecture.\n- Inject-Message feeds panel-validated JSON through the real transport\n  message path, indistinguishable from a server message. Treat it as\n  destructive in apps whose observers trigger side effects.\n","readmeFilename":"README.md"}