{
  "interval": {
    "intervalStart": "2025-12-30T00:00:00.000Z",
    "intervalEnd": "2025-12-31T00:00:00.000Z",
    "intervalType": "day"
  },
  "repository": "elizaos/eliza",
  "overview": "From 2025-12-30 to 2025-12-31, elizaos/eliza had 3 new PRs (1 merged), 2 new issues, and 8 active contributors.",
  "topIssues": [
    {
      "id": "I_kwDOMT5cIs7gKJ81",
      "title": "Fix monorepo docs",
      "author": "linear",
      "number": 6284,
      "repository": "elizaos/eliza",
      "body": "",
      "createdAt": "2025-12-24T17:31:42Z",
      "closedAt": "2025-12-30T18:45:34Z",
      "state": "CLOSED",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7gJ_l_",
      "title": "Issues with spacing in numbered items",
      "author": "borisudovicic",
      "number": 6283,
      "repository": "elizaos/eliza",
      "body": "\n<img src=\"https://uploads.linear.app/186bdefa-3633-464a-80cd-6e86fe765a5c/7fc88e8a-528f-4a34-a929-dcff3e7e22ff/f1aaa49d-d7b9-4fee-ae9c-15ea433a0cd4?signature=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXRoIjoiLzE4NmJkZWZhLTM2MzMtNDY0YS04MGNkLTZlODZmZTc2NWE1Yy83ZmM4OGU4YS01MjhmLTRhMzQtYTkyOS1kY2ZmM2U3ZTIyZmYvZjFhYWE0OWQtZDdiOS00ZmVlLWFlOWMtMTVlYTQzM2EwY2Q0IiwiaWF0IjoxNzY2NTk1NDg3LCJleHAiOjE3OTgxNjYwNDd9.5u6brrhFoZsckFV9YiGcPrX89Anb262ksBobSIEX_ok \" alt=\"Screenshot 2025-12-24 at 17.57.29.png\" width=\"1181\" data-linear-height=\"675\" />",
      "createdAt": "2025-12-24T16:58:07Z",
      "closedAt": "2025-12-30T18:45:34Z",
      "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_kwDOMT5cIs7gesWY",
      "title": "My agent cards resizing to match dashboard agent cards",
      "author": "borisudovicic",
      "number": 6291,
      "repository": "elizaos/eliza",
      "body": "",
      "createdAt": "2025-12-29T00:19:09Z",
      "closedAt": "2025-12-30T18:45:34Z",
      "state": "CLOSED",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7gwUMG",
      "title": "Unslop Apps",
      "author": "borisudovicic",
      "number": 6299,
      "repository": "elizaos/eliza",
      "body": "",
      "createdAt": "2025-12-30T17:02:05Z",
      "closedAt": null,
      "state": "OPEN",
      "commentCount": 0
    }
  ],
  "topPRs": [
    {
      "id": "PR_kwDOMT5cIs67Avaq",
      "title": "feat: unified hooks with multi-transport support (HTTP/SSE/WebSocket)",
      "author": "standujar",
      "number": 6300,
      "body": "This PR introduces unified client hooks with multi-transport support and aligns transport naming between `api-client` and `server` packages.\r\n\r\n### Key Changes\r\n\r\n**Client Hooks (packages/client)**\r\n- New `useElizaChat` hook - unified interface for all transport types (websocket, sse, http)\r\n- New `useEliza` hook - simplified hook combining chat, agents, and server state\r\n- Transport-specific hooks: `useSocketChat`, `useSSEChat`, `useHTTPChat`\r\n- Lifecycle callbacks for custom side effects (onMessageAdded, onMessageUpdated, onError)\r\n\r\n**Server Transport Alignment (packages/server)**\r\n- Renamed `mode` → `transport` parameter across messaging endpoints\r\n- Transport types: `\"http\"` (sync), `\"sse\"` (streaming), `\"websocket\"` (async via Socket.IO)\r\n- Legacy `mode` parameter still supported for backward compatibility (deprecated)\r\n- Fixed double/triple message processing by separating DB persistence from bus emission\r\n\r\n**API Client (packages/api-client)**\r\n- Added `TransportType` export aligned with server\r\n- Updated session service to use transport types\r\n\r\n**Tests**\r\n- Integration tests for all 3 transports (http, sse, websocket)\r\n- Unit tests for response handlers and transport validation\r\n- Tests for new client hooks (useHTTPChat, useSSEChat)\r\n\r\n**Test Exemple**\r\n![IMG_0035](https://github.com/user-attachments/assets/9748f7f1-5763-4a67-ac52-7f981a22ed82)\r\n\r\n## Test plan\r\n\r\n- [x] Run server unit tests: `bun test packages/server/src/__tests__/unit/api/`\r\n- [x] Run client hook tests\n\n<!-- greptile_comment -->\n\n<h3>Greptile Summary</h3>\n\n\n- Unifies client-side chat hooks providing a single interface for all transport types (websocket, sse, http) with lifecycle callbacks for custom side effects\n- Renames `mode` parameter to `transport` across messaging endpoints with backward compatibility mapping (sync→http, stream→sse) via `LEGACY_MODE_MAP`  \n- Fixes critical double/triple message processing issue by moving message bus emission to `onWebSocketTransport` callback for websocket transport only\n\n<h3>Important Files Changed</h3>\n\n\n| Filename | Overview |\n|----------|----------|\n| packages/client/src/hooks/use-eliza-chat.ts | New unified hook supporting websocket, sse, and http transports with lifecycle callbacks and consistent interface |\n| packages/server/src/api/messaging/sessions.ts | Updated to use transport parameter, added onWebSocketTransport callback to emit to message bus, fixing double message processing |\n| packages/server/src/api/shared/validation.ts | Added validateTransport with legacy mode mapping support (sync→http, stream→sse) for backward compatibility |\n| packages/server/src/api/shared/constants.ts | Defined TransportType with LEGACY_MODE_MAP for backward compatibility mapping |\n\n<h3>Confidence score: 5/5</h3>\n\n\n- This PR is safe to merge with excellent backward compatibility and thorough test coverage\n- The refactoring maintains full backward compatibility through legacy mode mapping, includes comprehensive unit and integration tests for all transport types, follows consistent naming conventions, and properly fixes the double message processing issue\n- No files require special attention\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant User as User\n    participant Client as Client App\n    participant Router as Sessions Router\n    participant ElizaOS as ElizaOS\n    participant Agent as Agent Runtime\n    participant Database as Database\n    participant MessageBus as Message Bus\n\n    User->>Client: \"Send message\"\n    Client->>Router: \"POST /api/messaging/sessions/{sessionId}/messages\"\n    Router->>Database: \"Create message record\"\n    Database-->>Router: \"Message created\"\n    Router->>ElizaOS: \"handleMessage(agentId, messageMemory)\"\n    ElizaOS->>Agent: \"Process message\"\n    Agent->>Agent: \"Generate response\"\n    Agent-->>ElizaOS: \"Response content\"\n    ElizaOS-->>Router: \"Processing result\"\n    Router->>MessageBus: \"Emit new_message event\"\n    Router-->>Client: \"HTTP response with userMessage\"\n    MessageBus->>Agent: \"Process for agent response\"\n    Agent->>Agent: \"Generate agent reply\"\n    Agent-->>Client: \"Agent response via WebSocket\"\n    Client-->>User: \"Display conversation\"\n```\n\n<!-- greptile_other_comments_section -->\n\n<details><summary><h3>Context used (3)</h3></summary>\n\n- Context from `dashboard` - CLAUDE.md ([source](https://app.greptile.com/review/custom-context?memory=8ef4c9a3-e221-4aef-8556-8c9b88bf6bbb))\n- Context from `dashboard` - .cursorrules ([source](https://app.greptile.com/review/custom-context?memory=00074882-001f-44b1-89c4-859ed3656db9))\n- Context from `dashboard` - AGENTS.md ([source](https://app.greptile.com/review/custom-context?memory=51febe90-8918-4f18-be1f-d43bb68d696c))\n</details>\n\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2025-12-30T18:53:17Z",
      "mergedAt": null,
      "additions": 3009,
      "deletions": 529
    },
    {
      "id": "PR_kwDOMT5cIs668n-1",
      "title": "fix(core): log streaming LLM calls to database",
      "author": "standujar",
      "number": 6296,
      "body": "## Summary\r\n\r\nStreaming model calls were not being logged to the database because the logging code was placed after the `return` statement in the streaming path. This caused LLM calls (TEXT_SMALL, TEXT_LARGE) to not appear in the Model Calls panel.\r\n\r\n## Changes\r\n\r\n- **packages/core/src/runtime.ts**\r\n  - Extract model logging logic into `logModelCall()` helper method to avoid duplication\r\n  - Call helper in both streaming and non-streaming paths (fixes the bug)\r\n\r\n- **packages/client/src/hooks/use-query-hooks.ts**\r\n  - Filter client logs to show `useModel:*` and `action` types\r\n\r\n- **packages/client/src/components/agent-action-viewer.tsx**\r\n  - Add `REASONING` type support in model usage categorization\r\n  - Simplify `getModelUsageType()` function\r\n\r\n- **packages/core/src/__tests__/runtime-streaming.test.ts**\r\n  - Add tests for database logging in streaming and non-streaming paths\r\n\r\n## Test plan\r\n\r\n- [x] Start an agent and have a conversation\r\n- [x] Verify LLM calls appear in the Model Calls panel with correct type (LLM, TEXT_LARGE, etc.)\r\n- [x] Verify streaming responses are logged\r\n- [x] Verify non-streaming responses are still logged\r\n- [x] Run `bun test packages/core/src/__tests__/runtime-streaming.test.ts` - 13 tests pass\r\n\r\n## Screenshots\r\n\r\nBefore: Only embeddings and events visible, LLM calls missing\r\n\r\nAfter:\r\n\r\n<img width=\"552\" height=\"645\" alt=\"Capture d’écran 2025-12-30 à 11 27 18\" src=\"https://github.com/user-attachments/assets/1594053c-0ad4-4746-88b8-c71f487062ac\" />\n\n<!-- greptile_comment -->\n\n<h3>Greptile Summary</h3>\n\n\nFixed critical bug where streaming LLM calls (TEXT_SMALL, TEXT_LARGE) were not being logged to the database because the logging code was unreachable after the `return` statement in the streaming path. The fix extracts logging logic into a reusable `logModelCall()` helper method that is called in both streaming and non-streaming code paths.\n\n**Key changes:**\n- Extracted database logging into `logModelCall()` helper method in `packages/core/src/runtime.ts:2172-2222`\n- Streaming path now calls `logModelCall()` after accumulating full text at line 2390\n- Non-streaming path refactored to use the same helper at line 2418\n- Added comprehensive test coverage for both paths\n- Client filtering now correctly displays model calls with `useModel:*` types\n- Added support for `REASONING` model type and improved UI categorization\n\n<h3>Confidence Score: 5/5</h3>\n\n\n- This PR is safe to merge with no identified risks\n- The fix correctly addresses a real bug with a clean refactoring approach, includes comprehensive test coverage for both code paths, and all changes follow existing patterns in the codebase\n- No files require special attention\n\n<h3>Important Files Changed</h3>\n\n\n\n\n| Filename | Overview |\n|----------|----------|\n| packages/core/src/runtime.ts | Extracted logging logic into `logModelCall()` helper and fixed streaming path bug by calling it after stream completes |\n| packages/core/src/__tests__/runtime-streaming.test.ts | Added comprehensive tests for database logging in both streaming and non-streaming paths |\n| packages/client/src/hooks/use-query-hooks.ts | Filtered logs to show only `useModel:*` and `action` types in Model Calls panel |\n| packages/client/src/components/agent-action-viewer.tsx | Added `REASONING` model type support, simplified categorization logic, and added embedding filter option |\n\n</details>\n\n\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant Client as Client UI\n    participant Runtime as AgentRuntime\n    participant Handler as Model Handler\n    participant DB as Database Adapter\n    \n    Note over Client,DB: Streaming Path (Before Fix)\n    Client->>Runtime: useModel(TEXT_LARGE, {onStreamChunk, prompt})\n    Runtime->>Handler: handler(runtime, params)\n    Handler-->>Runtime: TextStreamResult with textStream\n    loop For each chunk\n        Runtime->>Runtime: Iterate textStream\n        Runtime->>Client: onStreamChunk(chunk)\n    end\n    Runtime->>Runtime: return fullText\n    Note over Runtime,DB: ❌ Return happened before logging\n    \n    Note over Client,DB: Streaming Path (After Fix)\n    Client->>Runtime: useModel(TEXT_LARGE, {onStreamChunk, prompt})\n    Runtime->>Handler: handler(runtime, params)\n    Handler-->>Runtime: TextStreamResult with textStream\n    loop For each chunk\n        Runtime->>Runtime: Iterate textStream\n        Runtime->>Client: onStreamChunk(chunk)\n    end\n    Runtime->>Runtime: logModelCall(modelType, params, fullText)\n    Runtime->>DB: adapter.log({type: 'useModel:TEXT_LARGE', body: {...}})\n    Runtime->>Runtime: return fullText\n    \n    Note over Client,DB: Non-Streaming Path (Unchanged)\n    Client->>Runtime: useModel(TEXT_LARGE, {prompt})\n    Runtime->>Handler: handler(runtime, params)\n    Handler-->>Runtime: response string\n    Runtime->>Runtime: logModelCall(modelType, params, response)\n    Runtime->>DB: adapter.log({type: 'useModel:TEXT_LARGE', body: {...}})\n    Runtime->>Runtime: return response\n```\n\n<!-- greptile_other_comments_section -->\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2025-12-30T10:25:02Z",
      "mergedAt": "2025-12-30T19:52:48Z",
      "additions": 159,
      "deletions": 60
    },
    {
      "id": "PR_kwDOMT5cIs66--VG",
      "title": "fix: saftey → safety",
      "author": "efeecllk",
      "number": 6297,
      "body": "## 🚨 Critical Infrastructure Fix\n\n### The Problem\nA rogue 'f' has been terrorizing the CHANGELOG since PR #494, convincing innocent developers that \"type saftey\" is a thing.\n\n### The Solution\nRelocated the 'f' to its proper position, restoring order to the TypeScript universe.\n\n### Changes\n- `saftey` → `safety` (CHANGELOG.md:1063)\n\n### Impact Assessment\n- **Before:** Developers confused, types feeling falsely secure\n- **After:** World peace, perfect type inference, and probably a Nobel Prize\n\n### Testing\n- [x] Confirmed 'safety' is now spelled correctly\n- [x] Verified the 'f' is in its designated position\n- [x] No types were harmed in the making of this PR\n\n---\n\n*Found by an AI typo hunter on a mission. The codebase is otherwise impressively clean!* 🔍\n\n<!-- greptile_comment -->\n\n<h3>Greptile Summary</h3>\n\n\nThis PR corrects a typo in `CHANGELOG.md` (`saftey` → `safety`) and includes several other changes from multiple commits:\n\n- Fixed the spelling of \"safety\" in the changelog reference to PR #494\n- Updated `agent/package.json` start script to use the newer `--import` flag instead of deprecated `--loader` for ts-node ESM loading\n- Added `discord` client to `trump.character.json` configuration\n- Updated various dependencies in `pnpm-lock.yaml` including `@lit-protocol/aw-tool` and ESLint-related packages\n\nThe PR title focuses on the typo fix, but the branch contains additional configuration and dependency updates that should be noted.\n\n<h3>Confidence Score: 5/5</h3>\n\n\n- This PR is safe to merge with minimal risk\n- All changes are low-risk: a typo fix, a Node.js flag modernization (from deprecated --loader to --import), a character configuration update, and standard dependency updates. No logic changes or potential breaking changes detected.\n- No files require special attention\n\n<h3>Important Files Changed</h3>\n\n\n\n\n| Filename | Overview |\n|----------|----------|\n| CHANGELOG.md | Typo fix: corrected 'saftey' to 'safety' in PR #494 reference |\n| agent/package.json | Updated start script from deprecated --loader to --import flag with inline ESM registration |\n| characters/trump.character.json | Added discord client to trump character configuration |\n| pnpm-lock.yaml | Updated dependencies including @lit-protocol/aw-tool, eslint packages, and various transitive dependencies |\n\n</details>\n\n\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant Dev as Developer\n    participant Repo as Repository\n    participant CI as CI/Build System\n    participant Agent as Agent Runtime\n    \n    Dev->>Repo: Fix typo in CHANGELOG.md (saftey → safety)\n    Dev->>Repo: Update agent/package.json (--loader → --import)\n    Dev->>Repo: Add discord client to trump.character.json\n    Dev->>Repo: Update dependencies (pnpm-lock.yaml)\n    \n    Note over Repo: Multiple commits merged in PR #6297\n    \n    Repo->>CI: Trigger build on PR\n    CI->>CI: Run type checks\n    CI->>CI: Run tests\n    \n    Note over Agent: When agent starts with new config\n    Agent->>Agent: Load ts-node with --import flag\n    Agent->>Agent: Load trump character with discord client\n    Agent->>Agent: Use updated dependencies\n    \n    CI->>Repo: Build successful\n    Repo->>Dev: Ready for merge\n```\n\n<!-- greptile_other_comments_section -->\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2025-12-30T14:54:50Z",
      "mergedAt": null,
      "additions": 80,
      "deletions": 15
    }
  ],
  "codeChanges": {
    "additions": 159,
    "deletions": 60,
    "files": 4,
    "commitCount": 15
  },
  "completedItems": [
    {
      "title": "fix(core): log streaming LLM calls to database",
      "prNumber": 6296,
      "type": "bugfix",
      "body": "## Summary\r\n\r\nStreaming model calls were not being logged to the database because the logging code was placed after the `return` statement in the streaming path. This caused LLM calls (TEXT_SMALL, TEXT_LARGE) to not appear in the Model Call",
      "files": [
        "packages/client/src/components/agent-action-viewer.tsx",
        "packages/client/src/hooks/use-query-hooks.ts",
        "packages/core/src/__tests__/runtime-streaming.test.ts",
        "packages/core/src/runtime.ts"
      ]
    }
  ],
  "topContributors": [
    {
      "username": "standujar",
      "avatarUrl": "https://avatars.githubusercontent.com/u/16385918?u=718bdcd1585be8447bdfffb8c11ce249baa7532d&v=4",
      "totalScore": 98.67102898928083,
      "prScore": 89.33102898928082,
      "issueScore": 0,
      "reviewScore": 9,
      "commentScore": 0.33999999999999997,
      "summary": null
    },
    {
      "username": "odilitime",
      "avatarUrl": "https://avatars.githubusercontent.com/u/16395496?u=c9bac48e632aae594a0d85aaf9e9c9c69b674d8b&v=4",
      "totalScore": 25.021023349349527,
      "prScore": 25.021023349349527,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "efeecllk",
      "avatarUrl": "https://avatars.githubusercontent.com/u/98906252?u=2e61afdda01f49499ce519e4024e5f0a20fa091e&v=4",
      "totalScore": 22.95669638293567,
      "prScore": 22.95669638293567,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "greptile-apps",
      "avatarUrl": "https://avatars.githubusercontent.com/in/867647?v=4",
      "totalScore": 13.7,
      "prScore": 0,
      "issueScore": 0,
      "reviewScore": 13.5,
      "commentScore": 0.2,
      "summary": null
    },
    {
      "username": "ChristopherTrimboli",
      "avatarUrl": "https://avatars.githubusercontent.com/u/27584221?u=0d816ce1dcdea8f925aba18bb710153d4a87a719&v=4",
      "totalScore": 5,
      "prScore": 0,
      "issueScore": 0,
      "reviewScore": 5,
      "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
    },
    {
      "username": "borisudovicic",
      "avatarUrl": "https://avatars.githubusercontent.com/u/31806472?u=8935f4d43fd7e4eb9bf5ff92d54d4d2f8ac8a786&v=4",
      "totalScore": 2,
      "prScore": 0,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    }
  ],
  "newPRs": 3,
  "mergedPRs": 1,
  "newIssues": 2,
  "closedIssues": 4,
  "activeContributors": 8
}