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

@ykurilov/agent-chat-sandbox

v0.75.0

Published

Песочница агента для админа приложения: чат с боевым агентом, журнал каждого обращения к модели и вызова инструмента, правка любого сообщения с веткой, своя модель и своя системная инструкция на чат. Отдельное расширение: приложению без песочницы пакет не

Readme

@ykurilov/agent-chat-sandbox

Песочница агента для админа приложения: чат с боевым агентом, журнал каждого обращения к модели и вызова инструмента, правка любого сообщения с веткой, своя модель и своя системная инструкция на чат. Отдельное расширение: приложению без песочницы пакет не нужен, и в боевом чате ничего не меняется (ни таблиц, ни записи журнала).

react, @ykurilov/agent-chat-react, better-sqlite3 и pg — необязательные зависимости (peer): ставьте те, что нужны.

Сервер

import { createSandboxHandler } from "@ykurilov/agent-chat-sandbox";
import { createSqliteSandboxJournal } from "@ykurilov/agent-chat-sandbox/sqlite"; // или …/postgres
import { mountChat } from "@ykurilov/agent-chat-server/hono";

mountChat(app, createChatHandler(chatOptions));
mountChat(app, createSandboxHandler({
  chat: chatOptions, // те же настройки, что у боевого чата
  isAdmin: (user) => adminIds.has(user.id), // на каждом запросе; не админ получает 404
  journal: await createSqliteSandboxJournal({ filePath: "app.sqlite" }),
}));

Next.js: createNextRouteHandlers(sandboxHandler) в app/api/sandbox/[[...path]]/route.ts.

Экран

import { AgentSandbox } from "@ykurilov/agent-chat-sandbox/react";
import { tandemSandboxSkin } from "@ykurilov/agent-chat-skin-tandem/sandbox";

<AgentSandbox skin={tandemSkin} sandboxSkin={tandemSandboxSkin} chatListSkin={tandemSkin} chatProps={{ attachments, images, videos }} />

Что важно знать

  • Доступ. resolveUser → isAdmin на каждом запросе, результат не кэшируется. Песочные чаты личные: владелец sandbox:<id админа>, боевые адреса, списки и траты их не видят. isSandboxOwner(ownerId) отделяет их в отчётах о тратах.
  • Журнал. Таблицы sandbox_* в SQLite или PostgreSQL (createMemorySandboxJournal для тестов), миграции сами. Живёт 30 дней (retentionDays), удаляется вместе с чатом. Запись не задерживает ответ; ключи из окружения (по именам KEY, TOKEN, SECRET… от 8 знаков), пароли из адресов подключения и заголовки не пишутся.
  • Память только на чтение. Агент видит боевую память админа, записать ничего не может; экран памяти в песочнице закрыт.
  • Правка ответа. Меняются текст и результаты обычных инструментов; вызовы, картинки, видео и ответы на виджеты остаются, рассуждения убираются. chat.lockedToolOutputs добавляет инструменты, чей результат менять нельзя.
  • Инструменты. В agent.tools(model) приходит настоящий ownerId админа. Инструментам из chatOwnedTools (по умолчанию generate_images) — песочный владелец: файлы и траты принадлежат песочному чату.
  • Закрытый чат. Инструмент закрывает песочный чат так же, как боевой: видно, что закрытие работает. Продолжить тест — кнопка «Открыть чат снова» (POST {sandboxBase}/chats/:chatId/reopen) или новая копия чата человека: она всегда открыта. Права приложения (chatCapabilities) и beforeCreateChat песочница не применяет.
  • Осторожно. Инструменты приложения в песочнице выполняются по-настоящему от имени админа (письма, платежи, запись в базу). Опасные подмените заглушками: см. docs/sandbox.md, «Инструменты агента».
  • Чаты людей. Только с опцией people у обработчика и people у AgentSandbox: people: { find } — человека ищет приложение, people: true — его id вводят вручную. Без опции раздела нет, экран прежний. Чат человека только читается; «Проверить в копии» делает песочный чат админа, агент в нём читает память человека. В копии agent.tools(model) получает ownerId человека, model.staff и объект исходного чата (model.subject, ключ копии наружу не идёт): при model.staff любая запись в данные ownerId запрещена — это обязанность инструментов приложения, ядро их записи не перехватывает. afterTurn приложения зовётся только в копии, так же с staff, человеком и его объектом: при turn.staff в данные человека не писать. В обычном песочном чате afterTurn и beforeTurn не зовутся.
  • Лимиты. Картинки считаются на песочного владельца по правилам приложения; у модели лимит только если задан createSandboxHandler({ limits }).

Подробно — docs/sandbox.md. Живая проверка: pnpm test:live sandbox.