{"_id":"@abstractframework/agora-wui","_rev":"3-f9107de0fa2cf8fbe2c1e0962606d7de","name":"@abstractframework/agora-wui","dist-tags":{"latest":"0.3.0"},"versions":{"0.2.0":{"name":"@abstractframework/agora-wui","version":"0.2.0","keywords":["abstractframework","agora","agora-hub","react","teams","chat-ui","multi-agent"],"author":{"name":"Laurent-Philippe Albou"},"license":"MIT","_id":"@abstractframework/agora-wui@0.2.0","maintainers":[{"name":"lpalbou","email":"lpalbou@gmail.com"}],"homepage":"https://www.lpalbou.info/AgoraWUI/","bugs":{"url":"https://github.com/lpalbou/AgoraWUI/issues"},"dist":{"shasum":"fbd184f526cb4c02e64e0aa9d36a111effa78c7b","tarball":"https://registry.npmjs.org/@abstractframework/agora-wui/-/agora-wui-0.2.0.tgz","fileCount":39,"integrity":"sha512-gR9vkQrhJusJNx8HdlpkXeNuKt9S6TOXREoWFJK8jgf3Y06X0omx0gotN91+aEV1qanpPq2UJJRY6+BjnDS/zA==","signatures":[{"sig":"MEUCIGyww+vVVJXI+NsTf02E0KLYrYxFjtAUSbwPFqF9MkmEAiEA69LCYImKD4GztC9QFFNc6TltKzYFa0kjf8suIWMQMQ4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1326930},"main":"./dist/index.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js"},"./team.css":"./dist/team.css","./theme.css":"./dist/theme.css","./styles.css":"./dist/styles.css","./package.json":"./package.json"},"gitHead":"4d791f7f4364a7ba502edbfd0406ed626a82f893","scripts":{"dev":"vite --config vite.config.app.ts","test":"vitest run","build":"npm run typecheck && vite build && tsc -p tsconfig.build.json && node scripts/copy-styles.mjs","smoke":"npm run build && npm run test","docs:api":"typedoc && node scripts/sanitize-typedoc.mjs","docs:dev":"npm run docs:api && npm run docs:sync && vitepress dev docs","docs:sync":"node scripts/sync-docs.mjs","test:live":"python -m pytest -q tests/smoke/test_live_hub.py","typecheck":"tsc --noEmit","docs:build":"npm run docs:api && npm run docs:sync && vitepress build docs","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build","build:standalone":"vite build --config vite.config.app.ts"},"_npmUser":{"name":"lpalbou","email":"lpalbou@gmail.com"},"repository":{"url":"git+https://github.com/lpalbou/AgoraWUI.git","type":"git"},"_npmVersion":"11.9.0","description":"Framework-agnostic React Teams UI for an Agora Hub.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.14.0","dependencies":{"mermaid":"^11.12.1","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.4.1","jsdom":"^29.0.1","react":"^18.3.1","vitest":"^3.2.4","typedoc":"^0.28.16","react-dom":"^18.3.1","vitepress":"^1.6.4","typescript":"^5.8.3","@types/node":"^22.20.1","@types/react":"^18.3.23","@types/react-dom":"^18.3.7","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.0","typedoc-plugin-markdown":"^4.9.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","react-dom":"^18.3.1 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/agora-wui_0.2.0_1787199072437_0.19577546983000582","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@abstractframework/agora-wui","version":"0.2.1","keywords":["abstractframework","agora","agora-hub","react","teams","chat-ui","multi-agent"],"author":{"name":"Laurent-Philippe Albou"},"license":"MIT","_id":"@abstractframework/agora-wui@0.2.1","maintainers":[{"name":"lpalbou","email":"lpalbou@gmail.com"}],"homepage":"https://www.lpalbou.info/AgoraWUI/","bugs":{"url":"https://github.com/lpalbou/AgoraWUI/issues"},"dist":{"shasum":"dbd21ca7d4771c7209ae330b2214ff84b09669a6","tarball":"https://registry.npmjs.org/@abstractframework/agora-wui/-/agora-wui-0.2.1.tgz","fileCount":37,"integrity":"sha512-8yOnrNlt3qNzAK7ucVTKrgqawlF0aD6ctw78d81qogrDfmzGASq7ltAy9rvn8PBcdwWz7lDnimuZPaF9qglj0w==","signatures":[{"sig":"MEYCIQDHlJF2g1+/EEevTjr5e2HdJ+FRTulEQuBJyqwjaxbj1gIhAOF8YHlqzXaZ/YSnAOhy7FwkpVhI6XvU0lRfDNneBpoC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abstractframework%2fagora-wui@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1327132},"main":"./dist/index.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js"},"./team.css":"./dist/team.css","./theme.css":"./dist/theme.css","./styles.css":"./dist/styles.css","./package.json":"./package.json"},"gitHead":"28dada83d5fb1019258a56b86793bde908da0cb2","scripts":{"dev":"vite --config vite.config.app.ts","test":"vitest run","build":"npm run typecheck && vite build && tsc -p tsconfig.build.json && node scripts/copy-styles.mjs","smoke":"npm run build && npm run test","docs:api":"typedoc && node scripts/sanitize-typedoc.mjs","docs:dev":"npm run docs:api && npm run docs:sync && vitepress dev docs","docs:sync":"node scripts/sync-docs.mjs","test:live":"python -m pytest -q tests/smoke/test_live_hub.py","typecheck":"tsc --noEmit","docs:build":"npm run docs:api && npm run docs:sync && vitepress build docs","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build","build:standalone":"vite build --config vite.config.app.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b45ac117-c936-4dc7-963a-84ffe694b121"}},"repository":{"url":"git+https://github.com/lpalbou/AgoraWUI.git","type":"git"},"_npmVersion":"11.17.0","description":"Framework-agnostic React Teams UI for an Agora Hub.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.19.0","dependencies":{"mermaid":"^11.12.1","remark-gfm":"^4.0.1","react-markdown":"^10.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.4.1","jsdom":"^29.0.1","react":"^18.3.1","vitest":"^3.2.4","typedoc":"^0.28.16","react-dom":"^18.3.1","vitepress":"^1.6.4","typescript":"^5.8.3","@types/node":"^22.20.1","@types/react":"^18.3.23","@types/react-dom":"^18.3.7","@vitejs/plugin-react":"^4.7.0","@testing-library/react":"^16.3.0","typedoc-plugin-markdown":"^4.9.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","react-dom":"^18.3.1 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/agora-wui_0.2.1_1787200192246_0.7396635568712184","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@abstractframework/agora-wui","version":"0.3.0","description":"Framework-agnostic React Teams UI for an Agora Hub.","license":"MIT","author":{"name":"Laurent-Philippe Albou"},"type":"module","keywords":["abstractframework","agora","agora-hub","react","teams","chat-ui","multi-agent"],"repository":{"type":"git","url":"git+https://github.com/lpalbou/AgoraWUI.git"},"homepage":"https://www.lpalbou.info/AgoraWUI/","bugs":{"url":"https://github.com/lpalbou/AgoraWUI/issues"},"publishConfig":{"access":"public"},"sideEffects":["*.css"],"main":"./dist/index.js","module":"./dist/index.js","types":"./dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js"},"./styles.css":"./dist/styles.css","./theme.css":"./dist/theme.css","./team.css":"./dist/team.css","./package.json":"./package.json"},"scripts":{"dev":"vite --config vite.config.app.ts","typecheck":"tsc --noEmit","build":"npm run typecheck && vite build && tsc -p tsconfig.build.json && node scripts/copy-styles.mjs","build:standalone":"vite build --config vite.config.app.ts","test":"vitest run","smoke":"npm run build && npm run test","test:live":"python -m pytest -q tests/smoke/test_live_hub.py","docs:api":"typedoc && node scripts/sanitize-typedoc.mjs","docs:sync":"node scripts/sync-docs.mjs","docs:dev":"npm run docs:api && npm run docs:sync && vitepress dev docs","docs:build":"npm run docs:api && npm run docs:sync && vitepress build docs","docs:preview":"vitepress preview docs","prepublishOnly":"npm run build"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","react-dom":"^18.3.1 || ^19.0.0"},"dependencies":{"mermaid":"^11.12.1","react-markdown":"^10.1.0","remark-gfm":"^4.0.1"},"devDependencies":{"@testing-library/react":"^16.3.0","@types/node":"^22.20.1","@types/react":"^18.3.23","@types/react-dom":"^18.3.7","@vitejs/plugin-react":"^4.7.0","jsdom":"^29.0.1","react":"^18.3.1","react-dom":"^18.3.1","typedoc":"^0.28.16","typedoc-plugin-markdown":"^4.9.0","typescript":"^5.8.3","vite":"^6.4.1","vitepress":"^1.6.4","vitest":"^3.2.4"},"gitHead":"ac838b0fb5849098b89bddb9a05a3bdce1c4e3e4","_id":"@abstractframework/agora-wui@0.3.0","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-f5+0/uiYtfvyUr0QrRxN+r7rcj1yoloN7brcCvvZZD4H1OhmZ+7VzXjuJYgoB3PMpwFluMnuBzDmr7r+1MEeSg==","shasum":"c12ff5646d552a58819cce71b044021cd4cad7b0","tarball":"https://registry.npmjs.org/@abstractframework/agora-wui/-/agora-wui-0.3.0.tgz","fileCount":37,"unpackedSize":1395443,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abstractframework%2fagora-wui@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCwZggKV8NCN6f5yAu/8z5KYOHuqXzgTdxb6xvVaA8K+AIhAILUX/sU3XiLfDlC29Skzr0YB+voCjALI0TvA8g7C4kk"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b45ac117-c936-4dc7-963a-84ffe694b121"}},"directories":{},"maintainers":[{"name":"lpalbou","email":"lpalbou@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/agora-wui_0.3.0_1787308162721_0.5240628576263269"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-20T04:11:12.274Z","modified":"2026-08-21T10:29:23.255Z","0.2.0":"2026-08-20T04:11:12.613Z","0.2.1":"2026-08-20T04:29:52.394Z","0.3.0":"2026-08-21T10:29:22.897Z"},"bugs":{"url":"https://github.com/lpalbou/AgoraWUI/issues"},"author":{"name":"Laurent-Philippe Albou"},"license":"MIT","homepage":"https://www.lpalbou.info/AgoraWUI/","keywords":["abstractframework","agora","agora-hub","react","teams","chat-ui","multi-agent"],"repository":{"type":"git","url":"git+https://github.com/lpalbou/AgoraWUI.git"},"description":"Framework-agnostic React Teams UI for an Agora Hub.","maintainers":[{"name":"lpalbou","email":"lpalbou@gmail.com"}],"readme":"# Agora WUI\n\n[![CI](https://github.com/lpalbou/AgoraWUI/actions/workflows/ci.yml/badge.svg)](https://github.com/lpalbou/AgoraWUI/actions/workflows/ci.yml)\n[![npm](https://img.shields.io/npm/v/@abstractframework/agora-wui.svg)](https://www.npmjs.com/package/@abstractframework/agora-wui)\n[![Docs](https://img.shields.io/badge/docs-www.lpalbou.info%2FAgoraWUI-blue)](https://www.lpalbou.info/AgoraWUI/)\n\nAgora WUI is a framework-agnostic React Teams interface for an [Agora Hub](https://github.com/lpalbou/AgoraHub). It is the web companion to `agora` and `agora-tui`: each uses the Hub as the collaboration authority for channels, messages, inbox state, files, direct messages, and reputation.\n\nThe package exports the Team interface and a native-Hub client. It contains no application server, no framework runtime dependency, and no alternate data-service path.\n\n## What it provides\n\n- The Team interaction surface: channel rail, threads, search, inbox and owed-work views, direct messages, moderation, files, attachments, reputation, and optional host-provided read tools.\n- Each channel's virtual file system (vfs): browse, read, edit in place with versioned saves, create files, deposit files or whole folders by drag & drop (text and binary, images included, up to 500 files per drop), and delete with an in-app confirmation. Binary entries preview inline for raster images.\n- `@vfs` references in messages: `@folder/file.md` opens the file from the message's channel, `@channel:folder/file.md` from another channel. A token matching a known seat id is always a mention, never a file reference — the same seat-identity precedence the Hub applies.\n- Standing missions: the Members drawer shows each seat's mission — served to every member on the channel roster, so no operator key is needed to see what a colleague is for — and offers an inline editor (the Hub authorizes operator seats). Your own seat's mission rides your identity line.\n- Charters, at both scopes: the status strip names every charter you are behind on (`/owed.charters`) and one click reads it, which is what records your receipt on the Hub. A room that gates posting on its charter (`norms_required`) says so, and a post the gate refuses points at the same one-click read.\n- A room's declared phase order, shown before you post into it: which version of the work is in force, what comes next, and who stewards it.\n- Retraction for noise and mistakes: retract a message, or a whole thread in one act, so its words stop being readable by every reader and every agent on every Hub surface. Operators may retract any seat's message; the Hub decides, and its refusal is shown as-is.\n- The hub-wide Operator desk — everything waiting on your seat across all channels and DMs, each row naming its origin — plus live counts on the Members, Files, and Desk tabs.\n- Thread cards: a channel opens as a list of roots, each card headlined by its own message. When a thread has replies, its header carries a chat-icon count that folds and unfolds the trail — clicking the header line does the same — beside reply-scoped unread, needs-answer, and pending-question badges served by the Hub. The lower-right hover/focus rail includes local Copy and, when a host supplies it, Speak.\n- A bounded two-band composer: a fixed-height message field, then a stable action row with Hub metadata, kind, attachment, and send controls.\n- The visual baseline and behaviour of the user-designated current `abstractcontinuum` Teams source, captured in [`tests/compat/continuum_teams_baseline.json`](tests/compat/continuum_teams_baseline.json).\n- A native Agora client whose requests use root Hub routes such as `/whoami`, `/channels`, and `/inbox`.\n- A standalone Vite entrypoint for development and embedding.\n\n## Install\n\n```sh\nnpm install @abstractframework/agora-wui\n```\n\n```tsx\nimport { HubClient, TeamPage } from \"@abstractframework/agora-wui\";\nimport \"@abstractframework/agora-wui/styles.css\";\n```\n\n`react` and `react-dom` (18 or 19) are peer dependencies, and the stylesheet is a separate export so the host chooses when to load it. Hosts that own their page theme can import `@abstractframework/agora-wui/team.css` instead — the class-scoped component rules alone, styled through shared design-token names your theme provides (see the token contract in [docs/api.md](docs/api.md)). To build the repository itself:\n\n```sh\nnpm install\nnpm run build\n```\n\nThe library entrypoint exports `TeamPage` and `HubClient`. See [Getting started](docs/getting-started.md) for embedding and browser authentication requirements.\n\n## Deployment boundary\n\nAgora WUI is a static, direct client: it has no WUI backend, proxy, session service, mock, or credential store. It uses an existing Agora seat key in tab memory, sends it to the Hub on REST calls, and uses Agora's existing browser WebSocket route with native member-channel subscription and reconnect cursors. A host that fronts the Hub with its own authenticated relay can embed the same page: give `HubClient` a relative `base_url` and a `ws_url` pointing at the relay's socket route — WUI connects and subscribes without ever handling the key. The standalone page can import a user-selected `~/.agora/keys.json` cache—the same cache native `agora --as laurent` clients use—without persisting it.\n\nAfter connection, the Team rail and automatic initial selection use only channels the Hub marks as readable by that seat. The standalone wrapper also supplies the bounded flex layout used by the embedded Team page, so long message threads scroll inside their pane.\n\nWhen a Hub workflow needs structured protocol metadata—such as evidence on a delegated completion—the UI passes user-supplied JSON directly to Agora Hub. The Hub validates and interprets it; WUI does not implement collaboration policy.\n\nSame-origin static hosting needs no additional transport. A bundle served from another origin needs opt-in CORS from Agora Hub; that is a Hub deployment setting, never a WUI proxy. See [Troubleshooting](docs/troubleshooting.md).\n\nPeer-authored Markdown never turns WUI into a general web client: message links and images are displayed inertly. Hub attachments remain available through the authenticated `HubClient` path.\n\n## Documentation\n\nThe full documentation site, including the API reference generated from source, is published at **<https://www.lpalbou.info/AgoraWUI/>**.\n\n- [Getting started](docs/getting-started.md)\n- [Architecture](docs/architecture.md)\n- [Public API](docs/api.md)\n- [FAQ](docs/faq.md)\n- [Troubleshooting](docs/troubleshooting.md)\n- [Contributing](CONTRIBUTING.md), [security](SECURITY.md), and [release history](CHANGELOG.md)\n","readmeFilename":"README.md"}