{
  "interval": {
    "intervalStart": "2025-12-29T00:00:00.000Z",
    "intervalEnd": "2025-12-30T00:00:00.000Z",
    "intervalType": "day"
  },
  "repository": "elizaos/eliza",
  "overview": "From 2025-12-29 to 2025-12-30, elizaos/eliza had 4 new PRs (4 merged), 4 new issues, and 6 active contributors.",
  "topIssues": [
    {
      "id": "I_kwDOMT5cIs7gADwf",
      "title": "Add feedback button",
      "author": "borisudovicic",
      "number": 6280,
      "repository": "elizaos/eliza",
      "body": "For users to submit feedback",
      "createdAt": "2025-12-23T17:55:16Z",
      "closedAt": "2025-12-29T14:35:47Z",
      "state": "CLOSED",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7f_y2i",
      "title": "Chat Renaming",
      "author": "borisudovicic",
      "number": 6278,
      "repository": "elizaos/eliza",
      "body": "Summarize chat name",
      "createdAt": "2025-12-23T17:21:47Z",
      "closedAt": "2025-12-29T14:35:48Z",
      "state": "CLOSED",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7gkBAw",
      "title": "If agent has at least one conversation, it should be opened when user clicks on that agent",
      "author": "borisudovicic",
      "number": 6295,
      "repository": "elizaos/eliza",
      "body": "Right now it goes to brand new chat each time.\n\n<img src=\"https://uploads.linear.app/186bdefa-3633-464a-80cd-6e86fe765a5c/b7febbb3-92d8-4e40-91cd-5a59c5573b5b/1b1a47e2-3fc6-4aa4-ac6a-6020f072c220?signature=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXRoIjoiLzE4NmJkZWZhLTM2MzMtNDY0YS04MGNkLTZlODZmZTc2NWE1Yy9iN2ZlYmJiMy05MmQ4LTRlNDAtOTFjZC01YTU5YzU1NzNiNWIvMWIxYTQ3ZTItM2ZjNi00YWE0LWFjNmEtNjAyMGYwNzJjMjIwIiwiaWF0IjoxNzY3MDE4MTI4LCJleHAiOjE3OTg1ODg2ODh9.H2iPWstBGQSE5rBMlKtq3HYprQ6jKs6_91M1OdJz8y4 \" alt=\"Screenshot 2025-12-29 at 15.21.57.png\" width=\"1512\" data-linear-height=\"982\" />",
      "createdAt": "2025-12-29T14:22:09Z",
      "closedAt": "2025-12-30T18:45:34Z",
      "state": "CLOSED",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7gjt3t",
      "title": "Add CoT reasoning streaming support",
      "author": "linear",
      "number": 6294,
      "repository": "elizaos/eliza",
      "body": "```\nAdd `onReasoningChunk` callback support at the core level to enable real-time chain-of-thought streaming. Benefits both `packages/server` and `eliza-cloud-v2`.\n\n### Core\n- Add `ReasoningChunkPayload` type with phases: `planning` | `actions` | `response`\n- Extend `StreamingContext` with `onReasoningChunk` callback\n- Create `ReasoningStreamExtractor` to extract `<thought>` (by default) content\n- Wire through message service pipeline\n\n### Server\n- Emit `messageReasoningChunk` via Socket.IO\n\n### Client\n- Add `ThinkingIndicator` component (aligned with cloud-v2)\n- Handle reasoning chunks in `use-socket-chat.ts`\n```",
      "createdAt": "2025-12-29T13:47:26Z",
      "closedAt": null,
      "state": "OPEN",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7getZS",
      "title": "Epic: World-Class TypeScript Patterns - Decorators, DI, and Advanced Type System",
      "author": "wtfsayo",
      "number": 6292,
      "repository": "elizaos/eliza",
      "body": "## Overview\n\nThis epic captures opportunities to implement advanced TypeScript patterns including decorators, dependency injection, and type system enhancements that would make ElizaOS a world-class TypeScript codebase.\n\n**Analysis performed by**: 6 parallel senior TypeScript engineer agents analyzing the entire monorepo\n\n---\n\n## Executive Summary\n\n| Category | Pattern | Impact | Effort | Breaking Changes |\n|----------|---------|--------|--------|------------------|\n| **Types** | Branded UUIDs | 🟢 High | Low | Gradual migration |\n| **Core** | Service Decorators | 🟢 High | High | Medium |\n| **Plugin** | @Action/@Provider Decorators | 🟢 High | Medium | Low (opt-in) |\n| **Server** | Shared API Contracts | 🟢 High | Medium | Low |\n| **CLI** | @Command Decorators | 🟡 Medium | Medium | Low |\n| **Database** | @Transactional Decorator | 🟡 Medium | Low | None |\n| **Core** | DI Container | 🟡 Medium | High | High |\n\n---\n\n## 1. Branded UUID Types (Priority: Critical)\n\n**Problem**: All UUIDs are interchangeable - `agentId`, `roomId`, `entityId` can be accidentally swapped at runtime.\n\n**Solution**:\n```typescript\n// Branded types prevent mixing at compile-time\ndeclare const __brand: unique symbol;\ntype Brand<T, B> = T & { readonly [__brand]: B };\n\ntype AgentId = Brand<UUID, 'AgentId'>;\ntype RoomId = Brand<UUID, 'RoomId'>;\ntype EntityId = Brand<UUID, 'EntityId'>;\n\n// Compile-time error:\nfunction getAgent(agentId: AgentId): Agent;\ngetAgent(someRoomId); // ❌ Error: RoomId not assignable to AgentId\n```\n\n**Files**: `packages/core/src/types/primitives.ts`\n\n---\n\n## 2. Component Decorators (@Action, @Provider, @Service)\n\n**Current** - Manual plugin assembly:\n```typescript\nexport const bootstrapPlugin: Plugin = {\n  name: 'bootstrap',\n  actions: [action1, action2, action3, ...], // 15+ manual entries\n  providers: [provider1, provider2, ...],\n  services: [Service1, Service2],\n};\n```\n\n**Proposed** - Auto-discovered via decorators:\n```typescript\n@Action({ name: 'REPLY', similes: ['GREET', 'RESPOND'] })\nexport class ReplyAction implements IAction {\n  @Inject() private runtime!: IAgentRuntime;\n  \n  async validate(): Promise<boolean> { return true; }\n  \n  async handler(message: Memory): Promise<ActionResult> {\n    // Runtime auto-injected, cleaner signatures\n  }\n}\n\n@Provider({ name: 'TIME', position: 1 })\nexport class TimeProvider implements IProvider {\n  async get(): Promise<ProviderResult> { /* ... */ }\n}\n\n@Plugin({ name: 'bootstrap' })\nexport class BootstrapPlugin {} // Components auto-registered via decorator metadata\n```\n\n**Files**: Create `packages/core/src/decorators/`\n\n---\n\n## 3. Shared API Contracts Package\n\n**Problem**: Server and client have duplicated/divergent type definitions\n\n**Solution**:\n```typescript\n// packages/api-contracts/src/index.ts - Single source of truth\nimport { z } from 'zod';\n\nexport const CreateAgentSchema = z.object({\n  characterPath: z.string().optional(),\n  characterJson: z.record(z.unknown()).optional(),\n});\nexport type CreateAgentRequest = z.infer<typeof CreateAgentSchema>;\n\nexport const AgentSchema = z.object({\n  id: z.string().uuid(),\n  name: z.string(),\n  status: z.enum(['active', 'inactive']),\n});\nexport type Agent = z.infer<typeof AgentSchema>;\n\n// Route contracts for type-safe client\nexport const API_ROUTES = {\n  agents: {\n    list: { method: 'GET', path: '/api/agents', response: z.array(AgentSchema) },\n    create: { method: 'POST', path: '/api/agents', body: CreateAgentSchema, response: AgentSchema },\n  },\n} as const;\n```\n\n**Files**: Create `packages/api-contracts/`\n\n---\n\n## 4. CLI Command Decorators\n\n**Current**:\n```typescript\ncommand('agent')\n  .option('-j, --json', 'output as JSON')\n  .option('-r, --remote-url <url>', 'URL of remote runtime')\n  .action(handler);\n```\n\n**Proposed**:\n```typescript\n@CommandModule({ name: 'agent', description: 'Manage ElizaOS agents' })\nexport class AgentCommand {\n  constructor(@Inject(AgentsService) private agentsService: AgentsService) {}\n\n  @SubCommand({ name: 'list', alias: 'ls' })\n  async list(\n    @Option({ flags: '-j, --json' }) json: boolean,\n    @Option({ flags: '-r, --remote-url <url>' }) remoteUrl: string,\n    @Option({ flags: '-p, --port <port>' }) @Validate(IsPort()) port: number,\n  ): Promise<void> {\n    const agents = await this.agentsService.listAgents();\n    // ...\n  }\n}\n```\n\n**Files**: Create `packages/cli/src/decorators/`\n\n---\n\n## 5. Database Decorators\n\n**@Transactional Decorator**:\n```typescript\n@Transactional({ isolation: 'serializable' })\nasync transferData(sourceId: AgentId, targetId: AgentId): Promise<void> {\n  // All operations automatically wrapped in transaction with rollback on error\n}\n```\n\n**Repository Pattern**:\n```typescript\n@Repository({ entity: AgentEntity })\nexport class AgentRepository extends BaseRepository<Agent, AgentId> {\n  // Automatic CRUD: findById, findAll, create, update, delete\n  \n  async findByName(name: string): Promise<Agent | null> {\n    // Custom queries\n  }\n}\n```\n\n**Files**: Create `packages/plugin-sql/src/decorators/`\n\n---\n\n## 6. Type-Safe Event System\n\n**Current**: String event names with manual typing\n**Proposed**: Template literal types\n```typescript\ntype PlatformEventType = `${PlatformPrefix}:${EventType}`;\n// Generates: 'DISCORD:MESSAGE_RECEIVED' | 'TELEGRAM:MESSAGE_RECEIVED' | ...\n\nruntime.registerEvent('DISCORD:INVALID', handler); // ❌ Compile error\nruntime.registerEvent('DISCORD:MESSAGE_RECEIVED', handler); // ✅ Type-safe\n```\n\n**Files**: `packages/core/src/types/events.ts`\n\n---\n\n## 7. Dependency Injection Container (Future)\n\n```typescript\n@Injectable()\nexport class AgentService {\n  constructor(\n    @Inject(DI_TOKENS.RUNTIME) private runtime: IAgentRuntime,\n    @Inject(DI_TOKENS.DATABASE) private db: IDatabaseAdapter,\n  ) {}\n}\n\n// Container resolves dependencies automatically\nconst agentService = container.resolve(AgentService);\n```\n\n**Recommendation**: Consider for v2.0 due to architectural impact\n\n---\n\n## Implementation Roadmap\n\n### Phase 1: Quick Wins (1-2 weeks)\n- [ ] Branded UUID types in `primitives.ts`\n- [ ] Type predicates file (`types/guards.ts`)\n- [ ] Eliminate `any` types in `elizaos.ts`\n- [ ] Template literal event types\n\n### Phase 2: Decorator Foundation (2-4 weeks)\n- [ ] Create decorator infrastructure in `packages/core/src/decorators/`\n- [ ] Implement @Action, @Provider, @Service decorators\n- [ ] Add @Transactional to database layer\n- [ ] Create shared API contracts package\n\n### Phase 3: CLI & Server Enhancement (2-3 weeks)\n- [ ] @CommandModule decorators for CLI\n- [ ] Controller decorators for server\n- [ ] Zod validation middleware\n- [ ] OpenAPI documentation decorators\n\n### Phase 4: Advanced Patterns (4-6 weeks)\n- [ ] Full DI container implementation\n- [ ] Module system with imports/exports\n- [ ] CQRS pattern for complex operations\n\n---\n\n## Files to Create\n\n| File | Purpose |\n|------|---------|\n| `packages/core/src/types/guards.ts` | Type predicates and guards |\n| `packages/core/src/decorators/index.ts` | Decorator exports |\n| `packages/core/src/decorators/action.ts` | @Action decorator |\n| `packages/core/src/decorators/provider.ts` | @Provider decorator |\n| `packages/core/src/decorators/service.ts` | @Service decorator |\n| `packages/core/src/decorators/inject.ts` | @Inject decorator |\n| `packages/core/src/di/container.ts` | DI container |\n| `packages/api-contracts/src/index.ts` | Shared API schemas |\n| `packages/cli/src/decorators/command.ts` | @Command decorator |\n| `packages/plugin-sql/src/decorators/transactional.ts` | @Transactional |\n\n## Files to Modify\n\n| File | Changes |\n|------|---------|\n| `packages/core/src/types/primitives.ts` | Add branded UUID types |\n| `packages/core/src/types/events.ts` | Template literal types |\n| `packages/core/src/types/database.ts` | Discriminated unions for logs |\n| `packages/core/src/types/elizaos.ts` | Replace `any` with specific types |\n| `packages/core/src/types/service.ts` | Enhanced ServiceClassMap |\n| `packages/core/src/runtime.ts` | Integrate decorator registry |\n| `packages/plugin-bootstrap/src/index.ts` | Optional module pattern |\n| `packages/server/src/middleware/validation.ts` | Zod integration |\n\n---\n\n## Benefits\n\n| Benefit | Description |\n|---------|-------------|\n| **Type Safety** | Compile-time prevention of ID mixing, event typos, service mismatches |\n| **Reduced Boilerplate** | 40-60% less manual wiring code in plugins |\n| **Better DX** | IDE autocomplete, inline documentation, better error messages |\n| **Testability** | DI enables easy mocking and isolation |\n| **Maintainability** | Self-documenting decorators, single source of truth |\n| **Scalability** | Module boundaries, lazy loading, tree-shaking |\n\n---\n\n## References\n\n- [TypeScript Decorators](https://www.typescriptlang.org/docs/handbook/decorators.html)\n- [reflect-metadata](https://github.com/rbuckton/reflect-metadata)\n- [TSyringe](https://github.com/microsoft/tsyringe) - Lightweight DI container\n- [NestJS Architecture](https://docs.nestjs.com/) - Decorator patterns\n- [Zod](https://zod.dev/) - Runtime validation with TypeScript inference\n\n---\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)",
      "createdAt": "2025-12-29T00:24:18Z",
      "closedAt": null,
      "state": "OPEN",
      "commentCount": 0
    }
  ],
  "topPRs": [
    {
      "id": "PR_kwDOMT5cIs6v8hih",
      "title": "feat(server): Add x402 payment middleware to Jobs API",
      "author": "wtfsayo",
      "number": 6099,
      "body": "## Summary\n\nThis PR adds x402 payment middleware integration to the Jobs API, enabling cryptocurrency payments for AI agent access.\n\n## Key Features\n\n### Flexible Authentication Modes\n- **Both API key + x402 enabled**: Requires BOTH `X-API-KEY` AND `X-PAYMENT` headers\n- **Only API key** (x402=false): Requires only `X-API-KEY` header  \n- **Only x402** (no API token): Requires only `X-PAYMENT` header\n- **Neither enabled**: No authentication required\n\n### Environment-Based Configuration\nAll settings via `.env` variables:\n- `X402_ENABLED` - Enable/disable payment middleware\n- `X402_WALLET_ADDRESS` - Receiving wallet address\n- `X402_PRICE` - Price in USDC (default: $0.01)\n- `X402_NETWORK` - Blockchain network (default: base-sepolia)\n- `X402_USE_MAINNET` - Use CDP facilitator for production\n- `CDP_API_KEY_ID`/`CDP_API_KEY_SECRET` - Required for mainnet\n\n### Auto-Discovery\nEndpoints automatically listed in x402 Bazaar (mainnet) with:\n- Full JSON schemas (input/output)\n- Descriptive documentation\n- Pricing information\n\n## Files Changed\n\n### New Files\n- `packages/server/src/middleware/x402.ts` - Main middleware implementation\n- `packages/server/src/middleware/__tests__/x402.test.ts` - Comprehensive test suite (12 tests)\n- `docs/x402-payment-integration.md` - Full documentation\n\n### Modified Files  \n- `packages/server/src/middleware/index.ts` - Export x402 middleware\n- `packages/server/src/api/messaging/jobs.ts` - Integrated x402 on POST /jobs route\n- `packages/server/package.json` - Added x402 dependencies\n- `bun.lock` - Lockfile update\n\n## Dependencies Added\n- `x402-express@0.7.0` - Express middleware for x402 protocol\n- `@coinbase/x402@0.7.0` - CDP facilitator for mainnet\n\n## Testing\n\n✅ All 12 unit tests passing  \n✅ Build successful\n✅ No linter errors\n✅ TypeScript types validated\n\nRun tests:\n```bash\ncd packages/server\nbun test src/middleware/__tests__/x402.test.ts\n```\n\n## Documentation\n\nSee `docs/x402-payment-integration.md` for:\n- Complete setup instructions\n- Configuration examples\n- Testing guide\n- Security considerations\n- Troubleshooting\n\n## Breaking Changes\n\nNone - x402 is disabled by default and completely optional.\n\n## References\n\n- [x402 Protocol Docs](https://docs.cdp.coinbase.com/x402/)\n- [x402 Quickstart for Sellers](https://docs.cdp.coinbase.com/x402/quickstart-for-sellers)\n- [Coinbase Developer Platform](https://cdp.coinbase.com)\n\n<!-- CURSOR_SUMMARY -->\n---\n\n> [!NOTE]\n> Integrates x402 crypto payments into POST /api/messaging/jobs with env-configurable pricing/networks, adds docs/tests, and required dependencies.\n> \n> - **Server/Middleware**:\n>   - Add x402 payment middleware `createX402Middleware` and `x402LoggingMiddleware` in `packages/server/src/middleware/x402.ts`; export via `middleware/index.ts`.\n>   - Supports dual auth: API key and/or x402 (`X-API-KEY`, `X-PAYMENT`) with env-based config (`X402_*`, `CDP_*`).\n> - **API**:\n>   - Protect `POST /api/messaging/jobs` using x402; includes route metadata (input/output schemas) for Bazaar discovery.\n> - **Docs/Tests**:\n>   - Add `docs/x402-payment-integration.md` with setup, modes, and examples.\n>   - Add unit tests `packages/server/src/middleware/__tests__/x402.test.ts`.\n> - **Dependencies**:\n>   - Add `x402-express`, `@coinbase/x402`; update `packages/server/package.json`.\n> \n> <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 57ae3cf5914a740335e67133ada19951df0125e5. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup>\n<!-- /CURSOR_SUMMARY -->",
      "repository": "elizaos/eliza",
      "createdAt": "2025-10-27T17:07:39Z",
      "mergedAt": null,
      "additions": 4066,
      "deletions": 262
    },
    {
      "id": "PR_kwDOMT5cIs63dqrL",
      "title": "[DRAFT] feat(core): Implement parallel action execution in processActions",
      "author": "wtfsayo",
      "number": 6209,
      "body": "## Summary\n\nThis PR implements parallel action execution within the `processActions()` method to improve performance for multi-action responses.\n\n## Changes\n\n### Core Runtime (`packages/core/src/runtime.ts`)\n- Execute actions within a single response batch **in parallel** using `Promise.allSettled()`\n- All actions in a batch receive the **same initial state snapshot**\n- State accumulates **sequentially between response batches**\n- Merge all `ActionResult.values` after parallel batch completes\n- Preserve fault tolerance: if one action fails, others still complete\n\n### Prompts (`packages/core/src/prompts.ts`)\n- Updated `messageHandlerTemplate` to reflect parallel execution model\n- Changed \"IMPORTANT ACTION ORDERING RULES\" to \"IMPORTANT ACTION EXECUTION RULES\"\n- Clarified that actions listed in a single response execute in parallel\n- Added guidance to use multi-step workflow for sequential dependencies\n\n### Action State Provider (`packages/plugin-bootstrap/src/providers/actionState.ts`)\n- Updated JSDoc and description to clarify \"previous results\" refers to prior response batches, not sibling parallel actions\n\n### Tests\n- Updated `runtime.test.ts` to match new state initialization behavior\n- Updated `prompts.test.ts` to match new prompt text\n\n## Key Data Flow\n\n```\nResponse 1: [action1, action2, action3]\n  ├─> Execute ALL in parallel with initialState\n  ├─> Wait for all to complete\n  └─> Merge results → accumulatedState\n\nResponse 2: [action4, action5]\n  ├─> Execute ALL in parallel with accumulatedState from Response 1\n  ├─> Wait for all to complete\n  └─> Merge results → new accumulatedState\n```\n\n## Testing\n\n- All existing runtime tests pass\n- All prompt tests pass\n- All multi-step workflow tests pass\n- Action chaining tests pass\n\n## Breaking Changes\n\nNone - backward compatible. Actions that previously assumed sequential execution within a batch will now run in parallel, but since they all receive the same state snapshot, behavior should be equivalent for independent actions.\n\n<!-- CURSOR_SUMMARY -->\n---\n\n> [!NOTE]\n> Execute actions in a response batch in parallel with a shared state snapshot, accumulate results across batches, and introduce AsyncLocalStorage-based prompt tracking with prompt/provider/test updates.\n> \n> - **Core (runtime.ts)**:\n>   - Parallelize `processActions` per response using `Promise.allSettled()`; each batch shares a composed state snapshot; accumulate `ActionResult.values` and plan state between batches.\n>   - Add robust action resolution (exact/fuzzy/similes), error paths for missing action/handler, and consistent action memory/logging.\n>   - Preserve legacy returns (void/boolean) as completed; treat `{ success:false }` (including minimal/error-only) as failed.\n>   - Merge working memory with size cap; cache `action_results`; update action plan immutably per step.\n>   - Introduce AsyncLocalStorage context: `ActionContextStore`, `getCurrentActionContext`, and browser fallback `createBrowserFallback` for prompt collection; include action context in `useModel` logs; skip collecting `TEXT_EMBEDDING` prompts.\n> - **Prompts (prompts.ts)**:\n>   - Update `messageHandlerTemplate` for parallel execution model and guidance on multi-step dependencies.\n> - **Provider (plugin-bootstrap/actionState.ts)**:\n>   - Clarify description/docs: \"previous results\" are from prior response batches; parallel actions share the same snapshot.\n> - **Tests**:\n>   - Expand `runtime.test.ts`: parallel execution behavior, action result status semantics, prompt collection/isolation via AsyncLocalStorage, browser fallback behavior, exact vs fuzzy action matching.\n>   - Update `prompts.test.ts` for new execution rules and wording.\n> \n> <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 55765fc289c965232d5d690c363f73c7ea1b81f6. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup>\n<!-- /CURSOR_SUMMARY -->",
      "repository": "elizaos/eliza",
      "createdAt": "2025-12-06T19:03:17Z",
      "mergedAt": null,
      "additions": 1467,
      "deletions": 292
    },
    {
      "id": "PR_kwDOMT5cIs66o0Al",
      "title": "fix(server): standardize message server route naming",
      "author": "standujar",
      "number": 6285,
      "body": "## fix(server): standardize message server route naming\r\n\r\n### Problem\r\n\r\nThe `api-client` package was calling `/message-servers/*` routes that didn't exist on the server. The server had inconsistent naming with `/servers/*` routes instead.\r\n\r\n```\r\nClient calls:  POST /message-servers\r\nServer had:    POST /servers          → 404!\r\n```\r\n\r\n### Solution\r\n\r\n- Renamed `/servers/*` → `/message-servers/*`\r\n- Renamed `:serverId` → `:messageServerId`\r\n- Added deprecated routes with forwarding for backward compatibility\r\n\r\n### Routes Changed\r\n\r\n| Old Route | New Route |\r\n|-----------|-----------|\r\n| `POST /servers` | `POST /message-servers` |\r\n| `GET /servers/:serverId/agents` | `GET /message-servers/:messageServerId/agents` |\r\n| `POST /servers/:serverId/agents` | `POST /message-servers/:messageServerId/agents` |\r\n| `DELETE /servers/:serverId/agents/:agentId` | `DELETE /message-servers/:messageServerId/agents/:agentId` |\r\n\r\n### Backward Compatibility\r\n\r\nOld routes still work but log deprecation warnings:\r\n```\r\n[DEPRECATED] POST /servers is deprecated. Use POST /message-servers instead.\r\n```\r\n\r\n### Tests\r\n\r\n- Added 17 unit tests for route naming conventions\r\n- All 420 server unit tests pass\r\n",
      "repository": "elizaos/eliza",
      "createdAt": "2025-12-26T14:04:10Z",
      "mergedAt": "2025-12-29T12:41:22Z",
      "additions": 638,
      "deletions": 109
    },
    {
      "id": "PR_kwDOMT5cIs66xbhj",
      "title": "fix: Enable hot reload for backend development",
      "author": "wtfsayo",
      "number": 6293,
      "body": "## Summary\n\nImplements comprehensive hot reload functionality for backend development. When TypeScript files in watched packages are modified, the system automatically rebuilds the CLI and restarts the server with health verification.\n\nPreviously, `bun run dev` only built the CLI once and ran it without watching for file changes. Backend code modifications required manually restarting the dev server.\n\n## Changes\n\n### Core Functionality\n- ✅ Add file watching for all CLI dependency packages:\n  - `packages/cli/src`, `packages/core/src`, `packages/server/src`\n  - `packages/api-client/src`, `packages/plugin-bootstrap/src`\n  - `packages/plugin-sql/src`, `packages/config/src`\n- ✅ Implement automatic rebuild and server restart on file changes\n- ✅ Add 300ms debounce to prevent rapid rebuilds\n- ✅ Handle graceful server shutdown with SIGTERM/SIGKILL fallback\n- ✅ Server health check verification after rebuilds\n- ✅ Rebuild queueing for changes during active rebuilds\n\n### Code Quality (Addressing PR Reviews)\n- ✅ **Replace Node.js spawn with Bun.spawn()** per project standards (CLAUDE.md)\n- ✅ **Add comprehensive TypeScript type annotations** with JSDoc throughout\n- ✅ **Fix SIGKILL fallback** using exit event listeners instead of killed property\n- ✅ **Add directory existence checks** before fs.watch to handle optional packages\n- ✅ **Fix server crash detection** - health check now runs after every rebuild\n- ✅ **Implement rebuild queueing** - file changes during rebuilds no longer dropped\n- ✅ **Update tests** to use temp directory instead of source directory (CI/CD compatible)\n- ✅ **Convert to ES6 imports** - removed all Node.js require() statements\n\n### Testing\n- ✅ Create comprehensive test suite (13 tests, all passing)\n- ✅ Tests verify: watch targets, debounce, rebuild behavior, TypeScript filtering, cleanup, Bun.spawn usage, rebuild queueing, directory checks, exit events, health checks\n\n## How It Works\n\nWhen you run `bun run dev`, the script:\n1. Builds and starts the CLI server\n2. Waits for health check (GET /api/server/ping)\n3. Starts the Vite dev server for frontend\n4. **NEW:** Watches all backend source directories for `.ts`/`.tsx` file changes\n5. **NEW:** On file change:\n   - Debounces 300ms to batch rapid changes\n   - Stops server gracefully (SIGTERM with SIGKILL fallback)\n   - Rebuilds CLI package\n   - Restarts server and waits for health check\n   - Queues additional changes if they occur during rebuild\n\n## Test Results\n\n```bash\n✅ All 13 tests passing\n✅ Build successful (15/15 packages)\n✅ No TypeScript errors\n```\n\n**Test coverage includes:**\n- File watcher configuration\n- Debounce mechanism\n- Server shutdown/restart\n- TypeScript file filtering\n- Cleanup handling\n- Rebuild queueing\n- Directory existence checks\n- SIGKILL fallback behavior\n- Health check after rebuild\n- Bun.spawn usage verification\n\n## Benefits\n\n- 🔄 Backend now has hot reload similar to frontend's Vite HMR\n- ⚡ Faster development workflow - no manual restarts needed\n- 🎯 Watches all relevant packages - changes anywhere trigger rebuilds\n- 🛡️ Debouncing prevents rebuild storms from multiple file saves\n- 🏥 Health checks ensure server is responsive after rebuild\n- 📦 Queuing ensures no changes are lost during rebuilds\n- 🔒 Follows project standards (Bun.spawn, TypeScript annotations)\n\n## Demo\n\nAfter running `bun run dev`, modify any backend file:\n```\n[WATCH] 📝 File changed in cli: index.ts\n[REBUILD] 🔄 Rebuilding CLI...\n[REBUILD] Stopping server...\n[REBUILD] Server stopped gracefully\n[REBUILD] ✅ Build completed, restarting server...\n[HEALTH] Waiting for server to be ready...\n[HEALTH] ✅ Server is ready! (attempt 1)\n[REBUILD] ✅ Server restarted successfully!\n```\n\n## Review Status\n\nAll critical and important issues from PR reviews have been addressed:\n\n| Issue | Status | Fix |\n|-------|--------|-----|\n| Node.js spawn instead of Bun.spawn | ✅ Fixed | Now uses Bun.spawn() throughout |\n| Missing TypeScript types | ✅ Fixed | Comprehensive JSDoc annotations added |\n| Server crash detection flaw | ✅ Fixed | Health check after every rebuild |\n| SIGKILL fallback never executes | ✅ Fixed | Uses exit event listener |\n| Missing directory existence checks | ✅ Fixed | Checks before fs.watch() |\n| File changes during rebuild dropped | ✅ Fixed | Rebuild queueing implemented |\n| Test fails in read-only environments | ✅ Fixed | Uses temp directory |\n| Node.js require() in tests | ✅ Fixed | ES6 imports only |\n\n**Reviewers:** @cursor, @greptile-apps, @claude\n\n<!-- CURSOR_SUMMARY -->\n---\n\n> [!NOTE]\n> Enables reliable backend hot reload and modernizes the dev runner.\n> \n> - Overhauls `scripts/dev-watch.js` to watch backend packages (`cli`, `core`, `server`, `api-client`, `plugin-bootstrap`, `plugin-sql`, `config`) for `.ts/.tsx` changes and trigger CLI rebuild + server restart\n> - Adds debounce (300ms) and rebuild queueing; waits for health check (`/api/server/ping`) after each restart\n> - Replaces Node `spawn` usage with `Bun.spawn`, adds JSDoc types, and improves cross-platform package name resolution\n> - Implements graceful shutdown with `SIGTERM` and `SIGKILL` fallback using exit promises; robust cleanup for processes and file watchers\n> - Adds comprehensive tests in `scripts/__tests__/dev-watch.test.ts` covering watch targets, debounce, rebuild behavior, TypeScript filtering, cleanup, queueing, directory existence checks, exit handling, health checks, and Bun usage\n> \n> <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 80105c84ab174d999aadc0615fb8fb8e71a09f81. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup>\n<!-- /CURSOR_SUMMARY -->",
      "repository": "elizaos/eliza",
      "createdAt": "2025-12-29T04:19:27Z",
      "mergedAt": null,
      "additions": 635,
      "deletions": 57
    },
    {
      "id": "PR_kwDOMT5cIs66wshh",
      "title": "docs(plugin-dummy-services): add comprehensive README",
      "author": "wtfsayo",
      "number": 6290,
      "body": "## Summary\nAdded comprehensive README.md documentation for the `@elizaos/plugin-dummy-services` package.\n\n## Documentation Includes\n- Package overview and purpose\n- Installation instructions (using bun)\n- Table of all 9 available dummy services with service types\n- Full plugin usage example\n- Individual service import examples\n- Detailed API documentation for each service:\n  - DummyTokenDataService\n  - DummyLpService\n  - DummyWalletService\n  - DummyPdfService\n  - DummyVideoService\n  - DummyBrowserService\n  - DummyTranscriptionService\n  - DummyWebSearchService\n  - DummyEmailService\n- Guide on when to use dummy vs real services\n- Testing information\n\n## Test plan\n- [x] README follows project documentation style\n- [x] Code examples are accurate based on source files\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n<!-- CURSOR_SUMMARY -->\n---\n\n> [!NOTE]\n> Provides full documentation for `@elizaos/plugin-dummy-services` to enable testing agents without external dependencies.\n> \n> - Adds detailed README with installation, full-plugin and per-service usage examples\n> - Documents APIs for 9 dummy services (`token_data`, `lp`, `wallet`, `pdf`, `video`, `browser`, `transcription`, `web_search`, `email`) with code snippets\n> - Includes guidance on when to use dummy vs real services and basic testing instructions\n> \n> <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit a62e249df71d7d66d8c350c894ea7d8dfaed3d5d. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup>\n<!-- /CURSOR_SUMMARY -->\n\n<!-- greptile_comment -->\n\n<h3>Greptile Summary</h3>\n\n\nAdded comprehensive README documentation for the `@elizaos/plugin-dummy-services` package. The README provides detailed API documentation for all 9 dummy services with usage examples, installation instructions, and guidance on when to use dummy vs real services.\n\nThe PR also includes unrelated improvements to multi-step workflow functionality:\n- Enhanced parameter extraction and formatting in multi-step actions\n- Added retry logic for XML parsing failures with exponential backoff\n- Improved streaming support for multi-step workflows\n- Added comprehensive test coverage for retry logic and parameter handling\n\n**Key additions:**\n- Complete service API documentation with code examples for each service\n- Usage patterns for both plugin-wide and individual service imports\n- Decision matrix for when to use dummy services vs real services\n- Testing information and examples\n\n<h3>Confidence Score: 4/5</h3>\n\n\n- This PR is safe to merge with minor considerations\n- The README documentation is comprehensive, accurate, and well-structured. The multi-step workflow improvements include proper error handling, retry logic, and test coverage. Score is 4/5 due to the PR containing multiple unrelated commits beyond just the documentation (title claims only docs, but includes 6 other commits with core functionality changes)\n- No files require special attention. All changes are well-implemented with proper error handling and test coverage\n\n<h3>Important Files Changed</h3>\n\n\n\n\n| Filename | Overview |\n|----------|----------|\n| packages/plugin-dummy-services/README.md | Added comprehensive documentation for the dummy services plugin with API examples and usage guidance |\n| packages/core/src/prompts.ts | Updated prompts for multi-step workflows with parameter handling instructions |\n| packages/core/src/runtime.ts | Enhanced runtime with retry logic and improved error handling for multi-step actions |\n| packages/core/src/services/default-message-service.ts | Significantly enhanced message service with streaming support, action chaining, and improved logging |\n| packages/plugin-bootstrap/src/__tests__/multi-step.test.ts | Added comprehensive test suite for multi-step action workflows with various scenarios |\n| packages/plugin-bootstrap/src/providers/actions.ts | Enhanced actions provider with improved parameter formatting and action result tracking |\n\n</details>\n\n\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant User\n    participant MessageService\n    participant Runtime\n    participant LLM\n    participant Action\n    participant Provider\n    \n    User->>MessageService: Send message\n    MessageService->>MessageService: Check USE_MULTI_STEP setting\n    \n    alt Multi-Step Mode\n        loop For each step (max iterations)\n            MessageService->>Runtime: composeState()\n            Runtime-->>MessageService: State with context\n            \n            MessageService->>Runtime: Generate decision prompt\n            Runtime->>LLM: Decision request with actionsWithParams\n            \n            loop Retry with exponential backoff\n                LLM-->>Runtime: XML response\n                Runtime->>Runtime: parseKeyValueXml()\n                alt Parse Success\n                    Runtime-->>MessageService: Parsed step (thought, action, parameters, providers, isFinish)\n                    Note over Runtime,MessageService: Break retry loop\n                else Parse Failure\n                    Runtime->>Runtime: Wait with exponential backoff\n                end\n            end\n            \n            alt Has Parameters\n                MessageService->>MessageService: Extract parameters (JSON or object)\n                MessageService->>MessageService: Store in state.data.actionParams\n            end\n            \n            alt Has Providers\n                MessageService->>Provider: Call provider.get()\n                Provider-->>MessageService: Context data\n                MessageService->>MessageService: Update state\n            end\n            \n            alt Has Action\n                MessageService->>Action: Execute with parameters from state\n                Action-->>MessageService: ActionResult\n                MessageService->>MessageService: Store result in traceActionResult\n            end\n            \n            alt isFinish == true\n                Note over MessageService: Exit loop\n            end\n        end\n        \n        MessageService->>Runtime: Generate summary prompt\n        Runtime->>LLM: Summary request with action history\n        \n        loop Retry summary parsing\n            LLM-->>Runtime: XML summary response\n            Runtime->>Runtime: parseKeyValueXml()\n            alt Parse Success\n                Runtime-->>MessageService: Summary with thought and text\n            else Parse Failure\n                Runtime-->>MessageService: Fallback summary\n            end\n        end\n        \n        MessageService->>User: Final response with summary\n    else Single-Shot Mode\n        MessageService->>Runtime: processActions()\n        Runtime->>Action: Execute action\n        Action-->>Runtime: Result\n        Runtime-->>MessageService: Response\n        MessageService->>User: Direct response\n    end\n```\n\n<!-- greptile_other_comments_section -->\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2025-12-29T00:14:21Z",
      "mergedAt": "2025-12-29T07:56:49Z",
      "additions": 343,
      "deletions": 0
    }
  ],
  "codeChanges": {
    "additions": 1142,
    "deletions": 201,
    "files": 9,
    "commitCount": 20
  },
  "completedItems": [
    {
      "title": "fix(server): standardize message server route naming",
      "prNumber": 6285,
      "type": "bugfix",
      "body": "## fix(server): standardize message server route naming\r\n\r\n### Problem\r\n\r\nThe `api-client` package was calling `/message-servers/*` routes that didn't exist on the server. The server had inconsistent naming with `/servers/*` routes instead.",
      "files": [
        "packages/server/src/__tests__/unit/api/message-servers.test.ts",
        "packages/server/src/api/messaging/messageServers.ts"
      ]
    },
    {
      "title": "docs(plugin-dummy-services): add comprehensive README",
      "prNumber": 6290,
      "type": "docs",
      "body": "## Summary\nAdded comprehensive README.md documentation for the `@elizaos/plugin-dummy-services` package.\n\n## Documentation Includes\n- Package overview and purpose\n- Installation instructions (using bun)\n- Table of all 9 available dummy serv",
      "files": [
        "packages/plugin-dummy-services/README.md"
      ]
    },
    {
      "title": "fix(cli): replace execa and child_process with Bun.spawn and bun-exec utilities",
      "prNumber": 6289,
      "type": "bugfix",
      "body": "## Summary\nPer project guidelines in CLAUDE.md, replaced prohibited process execution libraries with Bun-native alternatives.\n\n## Changes\n- **docker-build.ts**: Replaced `execa` with `bunExec` for docker commands\n- **phala-wrapper.ts**: Rep",
      "files": [
        "packages/cli/src/commands/deploy/utils/docker-build.ts",
        "packages/cli/src/commands/report/src/__tests__/integration.test.ts",
        "packages/cli/src/commands/tee/phala-wrapper.ts"
      ]
    },
    {
      "title": "docs: fix documentation inconsistencies and add missing test flags",
      "prNumber": 6288,
      "type": "bugfix",
      "body": "## Summary\n- Change `npm install` to `bun add` in packages/server/README.md (project uses bun exclusively)\n- Replace broken BUILD_SYSTEM.md link with inline explanation in packages/core/README.md\n- Add `--port` and `--skip-type-check` flags",
      "files": [
        "CLAUDE.md",
        "packages/core/README.md",
        "packages/server/README.md"
      ]
    }
  ],
  "topContributors": [
    {
      "username": "wtfsayo",
      "avatarUrl": "https://avatars.githubusercontent.com/u/82053242?u=98209a1f10456f42d4d2fa71db4d5bf4a672cbc3&v=4",
      "totalScore": 137.05460688390212,
      "prScore": 134.61660688390214,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0.43799999999999994,
      "summary": null
    },
    {
      "username": "standujar",
      "avatarUrl": "https://avatars.githubusercontent.com/u/16385918?u=718bdcd1585be8447bdfffb8c11ce249baa7532d&v=4",
      "totalScore": 67.7207738965761,
      "prScore": 42.7207738965761,
      "issueScore": 0,
      "reviewScore": 25,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "tdnupe3",
      "avatarUrl": "https://avatars.githubusercontent.com/u/25161668?u=94680b6bcbcfce954c7a9dd09d667a3919953041&v=4",
      "totalScore": 13.547573590279972,
      "prScore": 13.547573590279972,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "greptile-apps",
      "avatarUrl": "https://avatars.githubusercontent.com/in/867647?v=4",
      "totalScore": 13.5,
      "prScore": 0,
      "issueScore": 0,
      "reviewScore": 13.5,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "borisudovicic",
      "avatarUrl": "https://avatars.githubusercontent.com/u/31806472?u=8935f4d43fd7e4eb9bf5ff92d54d4d2f8ac8a786&v=4",
      "totalScore": 4,
      "prScore": 0,
      "issueScore": 4,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "linear",
      "avatarUrl": "https://avatars.githubusercontent.com/in/20150?v=4",
      "totalScore": 2,
      "prScore": 0,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    }
  ],
  "newPRs": 4,
  "mergedPRs": 4,
  "newIssues": 4,
  "closedIssues": 3,
  "activeContributors": 6
}