npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@flashautomat/plugin-ai-employees-conversation-filter

v1.0.2

Published

Filters chat conversation history by selected AI employee/worker in NocoBase chat window.

Readme

AI Employees Conversation Filter

Plugin dla NocoBase 2.x, który filtruje historię rozmów w oknie AI Chat według aktualnie wybranego AI employee/workera.

Cel

Standardowy panel AI Chat w NocoBase pokazuje w zakładce Conversations rozmowy ze wszystkich AI workerów. Ten plugin dopina brakujące zachowanie: po wybraniu konkretnego workera lista rozmów pokazuje tylko historię tego workera.

Przykład:

  • wybrany worker atlas -> lista pokazuje tylko rozmowy atlas,
  • wybrany worker dex i brak rozmów w bazie -> lista jest pusta,
  • brak wybranego workera -> lista pokazuje wszystkie rozmowy.

Zakres Funkcjonalny

  • Filtruje endpoint aiConversations:list po aiEmployeeUsername.
  • Obserwuje zmianę workera w globalnym store AI Chat.
  • Pobiera przefiltrowaną listę rozmów z API.
  • Aktualizuje chat-conversations-store, z którego renderuje się zakładka Conversations.
  • Chroni wynik filtra przed natywnym refreshem NocoBase, który potrafi ponownie załadować pełną listę rozmów.
  • Działa po restarcie kontenera dzięki startup scriptowi storage/scripts/90-inject-ai-filter.sh.
  • Używa cache-bustingu ?v=3, żeby przeglądarka nie ładowała starego skryptu.

Lokalizacja

Plugin powinien znajdować się tutaj:

packages/plugins/@flashautomat/plugin-ai-employees-conversation-filter

Główne pliki:

package.json
server.js
dist/server/index.js
dist/client/ai-filter.js
src/server/plugin.ts
src/client-v2/ai-filter.js
README.md

Instalacja

Po umieszczeniu pluginu w katalogu packages/plugins/@flashautomat/plugin-ai-employees-conversation-filter uruchom:

yarn pm enable @flashautomat/plugin-ai-employees-conversation-filter

Następnie odśwież stronę w przeglądarce. Jeśli przeglądarka trzyma starą wersję skryptu, wykonaj twarde odświeżenie:

Ctrl+F5

Deployment W Kontenerze

W obecnym środowisku plugin jest kopiowany do kontenera pod ścieżkę:

/app/nocobase/packages/plugins/@flashautomat/plugin-ai-employees-conversation-filter

Po skopiowaniu zmian najlepiej zrestartować kontener:

docker restart nocobase-app-1

Plugin podczas startu sam dopisuje skrypt do HTML NocoBase.

Jak To Działa

Server

Server plugin rejestruje middleware w pipeline NocoBase Resource Manager:

this.app.resourceManager.use(..., { tag: 'ai-conversation-filter', after: 'acl' })

Middleware działa tylko dla endpointu:

/api/aiConversations:list

Jeśli request zawiera parametr:

aiEmployee=<username>

to plugin dopisuje filtr:

ctx.action.params.filter.aiEmployeeUsername = aiEmployee;

Dzięki temu NocoBase zwraca tylko rozmowy wybranego workera.

Client

Client script dist/client/ai-filter.js jest wstrzykiwany do HTML NocoBase jako:

<script src="/static/plugins/@flashautomat/plugin-ai-employees-conversation-filter/dist/client/ai-filter.js?v=3"></script>

Skrypt korzysta z globalnych store NocoBase AI Chat:

@nocobase/plugin-ai/chat-box-store
@nocobase/plugin-ai/chat-conversations-store

Przepływ działania:

  1. Skrypt czeka, aż store AI Chat będą dostępne.
  2. Subskrybuje chat-box-store.
  3. Wykrywa zmianę currentEmployee.
  4. Pobiera rozmowy przez aiConversations:list?aiEmployee=<username>.
  5. Ustawia wynik w chat-conversations-store.
  6. Jeśli natywny refresh NocoBase nadpisze wynik pełną listą, guard ponownie aplikuje ostatnią przefiltrowaną listę.

Runtime Injection

NocoBase serwuje główny HTML statycznie przez nginx, więc zwykłe middleware aplikacji nie wystarczy do dopięcia skryptu w przeglądarce.

Plugin robi dwie rzeczy:

  • przy load() aktualizuje index.html i v/index.html,
  • tworzy startup fallback storage/scripts/90-inject-ai-filter.sh.

Startup script jest potrzebny, bo NocoBase potrafi regenerować HTML podczas startu kontenera.

Pliki HTML aktualizowane przez plugin:

node_modules/@nocobase/app/dist/client/index.html
node_modules/@nocobase/app/dist/client/v/index.html

Weryfikacja

Sprawdzenie, czy HTML zawiera aktualny skrypt:

grep -c "ai-filter.js?v=3" node_modules/@nocobase/app/dist/client/index.html
grep -c "ai-filter.js?v=3" node_modules/@nocobase/app/dist/client/v/index.html

Oczekiwany wynik dla każdego pliku:

1

Sprawdzenie, czy startup script jest poprawny składniowo:

sh -n storage/scripts/90-inject-ai-filter.sh

Sprawdzenie dostępności client scriptu:

curl -I http://localhost/static/plugins/@flashautomat/plugin-ai-employees-conversation-filter/dist/client/ai-filter.js?v=3

Oczekiwany status:

200

Test Manualny

  1. Otwórz NocoBase w przeglądarce.
  2. Otwórz AI Chat.
  3. Przejdź do zakładki Conversations.
  4. Wybierz workera, który ma rozmowy, np. atlas albo Action.
  5. Lista powinna pokazać tylko rozmowy tego workera.
  6. Wybierz workera bez rozmów, np. dex jeśli w bazie ma 0 rozmów.
  7. Lista powinna być pusta.

Debug

Logi debug są domyślnie wyłączone, żeby plugin nie spamował konsoli.

Włącz debug w konsoli przeglądarki:

localStorage.setItem('AI_FILTER_DEBUG', '1');
location.reload();

Wyłącz debug:

localStorage.removeItem('AI_FILTER_DEBUG');
location.reload();

Po włączeniu debug logi mają prefix:

[AI-FILTER]

Przy poprawnym działaniu można zobaczyć logi podobne do:

[AI-FILTER] chat box subscription ready
[AI-FILTER] conversations guard ready
[AI-FILTER] employee changed: atlas
[AI-FILTER] applied employee=atlas rows=41
[AI-FILTER] native refresh overwritten filter, reapplying rows=41

API

Plugin rozszerza działanie istniejącego endpointu NocoBase:

GET /api/aiConversations:list

Dodatkowy parametr obsługiwany przez plugin:

aiEmployee=<username>

Przykład:

/api/aiConversations:list?sort=-createdAt&appends=aiEmployee&pageSize=200&aiEmployee=atlas

Wewnętrznie parametr aiEmployee=atlas jest mapowany na filtr kolekcji:

{
  "aiEmployeeUsername": "atlas"
}

Struktura Kodu

src/server/plugin.ts

Źródłowa wersja server pluginu.

Odpowiada za:

  • wykrycie katalogu statycznego HTML NocoBase,
  • wstrzyknięcie <script> do HTML,
  • utworzenie startup scriptu,
  • rejestrację middleware resourceManager,
  • dopisanie filtra aiEmployeeUsername do aiConversations:list.

dist/server/index.js

Runtime server entry używany przez NocoBase, wskazany w package.json jako:

"main": "dist/server/index.js"

src/client-v2/ai-filter.js

Źródłowa kopia client scriptu. Jest utrzymywana razem z dist/client/ai-filter.js, żeby było wiadomo, co dokładnie jest wstrzykiwane do przeglądarki.

dist/client/ai-filter.js

Runtime client script serwowany przez NocoBase pod URL:

/static/plugins/@flashautomat/plugin-ai-employees-conversation-filter/dist/client/ai-filter.js?v=3

Znane Ograniczenia

  • Plugin zależy od wewnętrznych store AI Chat NocoBase: @nocobase/plugin-ai/chat-box-store i @nocobase/plugin-ai/chat-conversations-store.
  • Jeśli NocoBase zmieni nazwy store albo strukturę AI Chat, client script będzie wymagał aktualizacji.
  • Plugin celowo nie tworzy własnego UI ani settings page.
  • Plugin nie modyfikuje danych w bazie, tylko filtruje odczyt listy rozmów.
  • Maksymalnie pobiera pageSize=200 rozmów dla wybranego workera.

Troubleshooting

Lista dalej pokazuje wszystkie rozmowy

  1. Sprawdź, czy HTML zawiera ai-filter.js?v=3.
  2. Wykonaj Ctrl+F5 w przeglądarce.
  3. Włącz debug przez AI_FILTER_DEBUG.
  4. Sprawdź, czy w konsoli pojawia się chat box subscription ready.
  5. Sprawdź, czy po zmianie workera pojawia się employee changed: <username>.

Worker bez rozmów nie pokazuje pustej listy

To oznacza, że natywny refresh NocoBase prawdopodobnie nadpisuje store. Z debugiem powinien pojawić się log:

native refresh overwritten filter, reapplying rows=0

Jeśli go nie ma, sprawdź czy skrypt v=3 jest faktycznie załadowany.

Script nie ładuje się po restarcie kontenera

Uruchom ręcznie startup script:

sh storage/scripts/90-inject-ai-filter.sh

Potem sprawdź HTML:

grep -c "ai-filter.js?v=3" node_modules/@nocobase/app/dist/client/index.html
grep -c "ai-filter.js?v=3" node_modules/@nocobase/app/dist/client/v/index.html

Plugin nie działa po zmianach w kodzie

Po zmianie dist/client/ai-filter.js podbij SCRIPT_VERSION w src/server/plugin.ts i dist/server/index.js, np. z 3 na 4, żeby przeglądarka nie używała starego cache.

Kompatybilność

  • NocoBase 2.x
  • Wymaga pluginu AI: @nocobase/plugin-ai
  • Testowane z AI Chat stores:
    • @nocobase/plugin-ai/chat-box-store
    • @nocobase/plugin-ai/chat-conversations-store

Aktualny Status

  • Wersja pluginu: 1.0.2
  • Aktualna wersja injected client scriptu: v=3
  • Plugin działa bez settings page.
  • Plugin jest gotowy do działania po instalacji i yarn pm enable.