- Add profile settings page for username management
- Add username prompt in dashboard when not set
- Improve MCP endpoint to show specific error for missing user vs collection
- Make sign-up flow retry username PATCH and redirect to setup if fails
- Add backfill script for existing users without usernames
- Add Profile link to dashboard sidebar
- Skip conversation tests until API_KEY_ENCRYPTION_SECRET is in GitHub secrets
- Remove stats/history and stats/categories tests (endpoints don't exist)
- Add categories check to main stats test
- Skip keyword sync test (takes 2-3 minutes, times out)
- Fix user-profile tests to use apiKeyClient instead of session auth
- Fix stats test for new nested response structure (data.overview.*)
- Enable conversation tests with CI OpenAI key setup
- Add setup-openai-key.ts script to configure test user's OPENAI_API_KEY
- Update workflow to run OpenAI key setup before tests
- Fix public agents route: use /api/public/users/:username/agents/:uid
- Fix public collections route: use /api/public/users/:username/collections/:slug
- Remove isPublic check (not returned in response, implied by endpoint)
- Skip agent conversation tests that require AI provider API keys
- Fix MCP HTTP test to check for protocol/transport instead of protocolVersion
- Skip TPMJS API keys tests that require session auth (security requirement)
- MCP HTTP test: use unique collection name
- Public collections test: use unique collection name
- Remove isPublic assertion since public API doesn't return that field
- Add timestamps to test agent/collection names to make them unique
- Fix duplicate UID test to verify auto-suffix behavior instead of rejection
- Use agent id instead of uid for cleanup tracking
Since our manually-created session tokens don't work with better-auth's
session validation, these tests now use API key authentication which
works correctly with the authenticateRequest() middleware.
Session auth requires valid better-auth sessions which can't be
created programmatically. Switch factories to use API key auth
which is properly supported.
- Add Vitest integration test config with sequential execution
- Create test helpers (auth, cleanup, SSE parser, API client)
- Create test data factories for agents and collections
- Add test context manager for unified test setup
- Create integration tests for:
- Health and stats endpoints
- Tools list and search
- Collections CRUD
- Agents CRUD and conversations
- MCP HTTP transport
- User profile, API keys, and usage
- Public agents and collections
- Sync endpoints (cron-authenticated)
- Add GitHub Actions workflow running on push to main
- Add cleanup-orphans script for test data cleanup
- Add setup-test-credentials script for generating auth tokens
Update all documentation, code, and tests to use the new endpoint formats:
- MCP: /api/mcp/{username}/{collection-slug}/{transport}
- Agent: /api/{username}/agents/{agent-uid}/conversation/{id}
Changes include:
- Update MCP URLs in collections page, docs, and test script
- Update agent API URLs in chat page, docs, tests, and cron job
- Add API key authentication requirements to all examples
- Update ARCHITECTURE.md with correct endpoint formats
- Update discord cron job to fetch owner username for new URL format
- Add /api/[username]/agents/[agentSlug]/conversation/[conversationId]
- Add /api/[username]/agents/[agentSlug]/conversations
- Update agent dashboard API docs to use new URL format
- Include user.username in agent API response
- Update Discord summary workflow to use new endpoint format
- Add /api/[username]/agents/[agentSlug]/conversation/[conversationId]
- Add /api/[username]/agents/[agentSlug]/conversations
- Update agent dashboard API docs to use new URL format
- Include user.username in agent API response
Fork-based ownership:
- Add forkedFromId, forkCount fields to Collection and Agent models
- Add fork-status API endpoints for collections and agents
- Add ForkButton and ForkedFromBadge UI components
- Update clone endpoints to set forkedFromId and increment forkCount
- Add COLLECTION_FORKED and AGENT_FORKED activity types
- Enforce owner-only access for MCP tool execution and agent chat
MCP fix:
- Fix parseToolName to handle non-scoped packages like firecrawl-aisdk
- Try both scoped (@scope/name) and literal (name-with-hyphens) interpretations
- Pass collection envVars to tool executor for API key support
- Add gradient fills for machine, bridge, and cloud sections
- Add glow effect on bridge component
- Add drop shadows for depth
- Add animated arrows that draw on load with stagger
- Add pulse animation on connection status indicator
- Add animated data flow dots between bridge and cloud
- Add hover effects on MCP server boxes
- Add traffic light dots and icons for visual appeal
- Improve typography and spacing
- Add @tpmjs/mcp-client package for connecting to MCP servers
- Add @tpmjs/bridge CLI for bridging local MCP servers to TPMJS
- Add @tpmjs/test-file-writer test MCP server
- Add BridgeConnection and CollectionBridgeTool database models
- Add /api/bridge endpoints for bridge communication
- Add /api/collections/[id]/bridge-tools API for managing bridge tools
- Update MCP handlers to include bridge tools in tools/list
- Add bridge status UI at /dashboard/settings/bridge
- Add interactive bridge tutorial at /docs/tutorials/bridge
- 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>