- Create EnvVarsEditor component for editing key-value env vars
- Add paste .env snippet feature with preview of parsed variables
- Refactor agent and collection pages to use the new component
- Extract shared parseEnvString utility for consistent .env parsing
- Update API keys settings page to use shared parser
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Tools like discord-read that fetch data from external APIs need more time.
Previous 10-30 second timeout was causing silent failures.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add structured logging for tool calls, results, and errors
- Log tool call initiation with input parameters
- Distinguish between success and error tool results
- Include isError flag in SSE tool_result events
- Improve error logging with stack traces and context
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add envVars field to Agent and Collection models in Prisma schema
- Add envVars to UpdateAgentSchema and UpdateCollectionSchema types
- Implement env vars merging logic (agent overrides collection)
- Pass env vars through tool executor to sandbox
- Add UI for managing env vars in agent and collection settings pages
- Update API routes to handle envVars PATCH updates
- Refactor discord tool execute functions for biome compatibility
This allows users to configure tool-specific environment variables (like
DISCORD_BOT_TOKEN) at both the collection and agent level, with agent
settings taking precedence over collection settings.
- Remove accent variant from Cell component, simplify to muted boolean
- Remove primary variant from ArchBox component
- Replace all text-primary with text-foreground for consistency
- Remove blue-tinted borders from sections
- Update all cells to use consistent styling
Co-Authored-By: Claude <noreply@anthropic.com>
Create visual architecture documentation at /docs/architecture with:
- Platform overview showing user products, API layer, infrastructure
- Tool execution pipeline flow diagram
- Executor system comparison (default vs custom)
- Collections and Agents data model
- Tool discovery and sync pipeline
- Database entity relationships
Uses NVIDIA-inspired chip diagram aesthetic with nested boxes,
grid layouts, and lime/yellow accent colors on dark background.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
The issue was that tools with complex nested parameters (like arrays of objects)
were losing their structure when converted to Zod schemas. The LLM would then
pass stringified JSON instead of actual arrays.
- Import jsonSchema from AI SDK
- Check if tool.inputSchema exists (full JSON Schema from executor)
- Use jsonSchema() wrapper to preserve nested array/object structures
- Fall back to legacy tpmjsParamsToZodSchema only if inputSchema is missing
This fixes the changelog tool and similar tools with complex parameter types.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Previously, tool calls only rendered during streaming. Now they also
render when loading conversation history from the database, where
tool calls are embedded in ASSISTANT messages.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add error detection for tool call outputs (success=false, error field)
- Display ERROR badge and red styling for failed tool calls
- Show error message preview in tool call header
- Add "JSON" button to view full conversation history as raw JSON
- Support format=json parameter in conversation API endpoint
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Use @tpmjs/hello instead of @anthropic-ai/tpmjs-hello
- Use helloWorldTool instead of helloWorld (correct export name)
- Increase timeout to 30s to account for npm install in sandbox
- Add detailed logging to Vercel executor template
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add /docs/api (API Reference - REST & MCP endpoints) to nav
- Add /docs/executors (Custom Executors - Deploy your own) to nav
- Updated both desktop dropdown and mobile menu
- Fix lint error in MobileMenu backdrop
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Comprehensive REST API and MCP protocol documentation
- Interactive examples with cURL commands
- Covers tools, search, collections, agents, and stats endpoints
- MCP protocol with initialize, tools/list, and tools/call examples
- Response format, error handling, and pagination docs
- Auto-discover tools for packages that only have tpmjs keyword
- Use 'utilities' as default category for keyword-only packages
- Enables packages like fbx2vrma-converter to be synced
- Replace non-existent /api/collections/public and /api/agents/public
with /api/stats which is a public endpoint
- Remove sync_status check (endpoint doesn't exist)
- Update health page labels to match new check names
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add GitHub Action workflow that runs every 5 minutes testing:
- Basic health endpoint
- Database connectivity (tools API)
- Collections and Agents public APIs
- MCP HTTP transport (initialize + tools/list)
- MCP SSE transport
- MCP server info endpoint
- Tool health stats
- Add /api/health/report endpoint for storing health check results
- Add EndpointHealthReport Prisma model for persistence
- Add /health status page with:
- Real-time status banner
- Uptime percentage
- Per-service health stats
- Recent health check history
- Auto-refresh every 30 seconds
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add 10s database query timeout wrapper to prevent indefinite hangs
- Wrap all Prisma calls in MCP handlers with timeout protection
- Reduce maxDuration from 300s to 60s for MCP routes
- Move public conversation route from /api/agents/[username]/[uid] to
/api/chat/[username]/[uid] to resolve Next.js route parameter conflict
- Update sharing docs to reflect new chat API path
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Use useId() instead of Math.random() for stable ID generation in Checkbox and Switch
- Use deterministic rotation/delay calculations instead of Math.random() in CategoryGrid and ProblemSection
- Add eslint-disable comments for intentional setState in useEffect patterns:
- Hydration safety (setMounted)
- Initial localStorage sync
- Route-based UI sync
- Controlled component sync
- Browser API initial sync (scroll position, media queries)
- Add eslint-disable for ref merging pattern in AnimatedCounter and StatCard
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
The new react-hooks/set-state-in-effect ESLint rule flags setState calls
in useEffect hooks. These patterns are intentional in these components:
- ChatHeader: setMounted for hydration safety
- MessageBubble: setPartTimings for streaming state tracking
- SettingsSidebar: setEnvVars for localStorage initialization
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Update all packages to latest versions via pnpm update --latest
- Downgrade Prisma 7 to 6 (v7 requires schema migration)
- Downgrade Tailwind CSS 4 to 3 (v4 requires PostCSS migration)
- Downgrade Storybook 10 to 8 (addons not available in v10)
- Pin cheerio to 1.0.0-rc.12 via pnpm override (type exports changed)
- Fix AI SDK tool definitions: parameters -> inputSchema
- Fix cheerio types in extract-meta and table-extract tools
- Add explicit type annotations to tool execute functions
- Migrate biome config to v2.3.11 schema
All type-checks, tests, and builds pass.
The maxDuration=60 change was causing all API routes to hang/timeout
on Vercel deployments. While the Hobby plan limit is 60s, setting
maxDuration=60 in certain route files appears to cause a deployment
issue where no API routes respond.
Reverting to maxDuration=300 to restore functionality. The actual
runtime timeout will be enforced by Vercel's plan limits anyway.
- Update getCollectionCopyOptions to require username and slug params
- Update getAgentCopyOptions to require username param
- Add slug and username to public collections/agents API responses
- Remove deprecated /mcp/collections/{id} and /mcp/agents/{uid} URL formats
Routes with maxDuration=300 were silently failing on Vercel's edge
routing layer - requests never reached the serverless function (no
logs appeared). Vercel Hobby plan has a 60s max function duration.
Affected routes:
- /api/agents/[id]/conversation/[conversationId]
- /api/agents/[username]/[uid]/conversation/[conversationId]
- /api/mcp/[username]/[slug]/[transport]
The issue caused these routes to hang indefinitely until client timeout.
The distributed rate limiter (checkRateLimitDistributed) was causing
timeouts in production, likely due to @vercel/kv connection issues.
Switch to sync in-memory rate limiter (checkRateLimit) which works
reliably across all other endpoints.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
The rate limiter was calling @vercel/kv without a timeout, which could
hang indefinitely if KV is not configured or responding. This adds a
2-second timeout to prevent requests from timing out.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
The dashboard chat page was calling /api/agents/{uid}/conversation/...
but the only conversation route expected /api/agents/{username}/{uid}/...
This adds a new route at /api/agents/[id]/conversation/[conversationId]
that accepts agent ID directly, and updates the chat page to use it.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Create comprehensive tutorial at /docs/tutorials/custom-executor
- Walk through from zero to running custom executor in 6 steps
- Cover prerequisites, Vercel deployment, environment config
- Include verification, testing, and connection to collections
- Add troubleshooting section for common issues
- Link tutorial from tutorials index and executors reference page
- Add executor configuration to Collection and Agent models in Prisma schema
- Create ExecutorConfigPanel component for selecting default or custom executors
- Add executor resolution logic with cascade (Agent → Collection → System Default)
- Create /api/executors/verify endpoint to test custom executor connectivity
- Add executor documentation page at /docs/executors with API specification
- Create deployable Vercel executor template in templates/vercel-executor/
- Update MCP handlers and agent tool execution to use configurable executors
- Add executor types and schemas to @tpmjs/types package
Users can now deploy their own executor instances and configure collections
or agents to use custom executors instead of the TPMJS default executor.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Remove old endpoints that have been replaced by pretty URL versions:
- /api/collections/[id]/mcp/[transport] → /api/mcp/[username]/[slug]/[transport]
- /api/agents/[id]/conversation/[conversationId] → /api/agents/[username]/[uid]/conversation/[conversationId]
Co-Authored-By: Claude <noreply@anthropic.com>
- Add /api/mcp/[username]/[slug]/[transport] endpoint for MCP servers
- Supports HTTP and SSE transports
- Uses username/slug format instead of collection UUID
- Maintains full JSON-RPC protocol support
- Add /api/agents/[username]/[uid]/conversation/[conversationId] endpoint
- Uses username/uid format instead of agent UUID
- Full SSE streaming support for AI responses
- Update collection detail page with new MCP URL section
- Shows HTTP and SSE transport URLs
- Includes Claude Desktop config snippet
- Copy-to-clipboard functionality
- Add fetchAgentByUsernameAndUidWithTools() to build-tools.ts
- Update sharing docs with new API endpoint URLs
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace bg-white with bg-surface for proper light/dark mode support
- bg-surface maps to white in light mode, dark gray in dark mode
- Fixes broken dark mode appearance from previous commit
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace bg-background with bg-white for form inputs and panel containers
- Fixes gray-on-gray contrast issues in light mode
- Updated pages: agent detail, agent chat, new agent, API keys settings
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace bg-background with bg-white for cards and panels across dashboard
- Add hover:shadow-sm for better visual feedback on interactive elements
- Apply fixes to: collections, agents, likes pages, and dashboard overview
- Cards now properly stand out against the light gray page background
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fix chronological ordering by saving ASSISTANT message before TOOL messages
- Collect tool results during streaming, save after assistant message
- Add "Debug JSON" tab to view raw messages array
- Shows all message fields including toolCalls, toolResult, tokens
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Capture tool call inputs from onChunk and onStepFinish callbacks
- Store toolCalls array in ASSISTANT messages with proper format
- Update chat page to combine ASSISTANT toolCalls (input) with TOOL messages (output)
- Show complete tool call cards with both input args and output results
- Display token usage in assistant messages for debugging
- Handle pending tool calls from ASSISTANT messages without results
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- LikeButton now shows 'Sign in to like' tooltip instead of redirecting
- Added interactive LikeButton to tools table (was static display)
- All three public list pages (tools, collections, agents) now have like functionality
- /agents/[id]/chat/[chatId] instead of /agents/[id]/chat?c=...
- /dashboard/agents/[id]/chat/[chatId] instead of ?c=...
- Base chat routes redirect to new chat with generated ID
- Cleaner URL structure for bookmarking and sharing
- Public chat page: redirect to include ?c= parameter on mount
- Dashboard chat page: sync URL with active conversation ID
- New conversations get ID in URL immediately, not after first message
- Add Chat button to public agent detail page
- Redesign chat page with collapsible sidebar:
- Left sidebar shows agent config, tools, and collections
- Right side shows chat interface
- Toggle button to show/hide sidebar
- Sidebar displays provider, model, temperature, system prompt
- Links to individual tools and collections
- Update conversation API to support cursor-based pagination (before/after params)
- Default behavior now returns most recent messages first
- Add react-virtuoso for efficient virtualized message rendering
- Implement scroll-up loading of older messages
- Show loading indicator when fetching history