{
  "interval": {
    "intervalStart": "2026-01-07T00:00:00.000Z",
    "intervalEnd": "2026-01-08T00:00:00.000Z",
    "intervalType": "day"
  },
  "repository": "elizaos/eliza",
  "overview": "From 2026-01-07 to 2026-01-08, elizaos/eliza had 3 new PRs (1 merged), 7 new issues, and 7 active contributors.",
  "topIssues": [
    {
      "id": "I_kwDOMT5cIs7hIzMv",
      "title": "Change free credits from $5 to $1",
      "author": "borisudovicic",
      "number": 6315,
      "repository": "elizaos/eliza",
      "body": "",
      "createdAt": "2026-01-02T20:17:10Z",
      "closedAt": "2026-01-07T18:56:43Z",
      "state": "CLOSED",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7hHJWy",
      "title": "Separate public agent states",
      "author": "borisudovicic",
      "number": 6313,
      "repository": "elizaos/eliza",
      "body": "There are three different states of interacting with public agents. They have fundamentally different user intents and should have a distinct UI.\n\n## State 1: Unauthenticated Visitor (Not Signed In)\n\n**User Intent:** \"I clicked a link on Twitter, I'm curious, let me try this agent\"\n\n**What they should see:**\n\n* Clean chat interface focused on the agent\n* Agent avatar, name, @username, and brief bio/description\n* **No** Private/Public toggle\n* **No** Edit button\n* **No** Fork button (yet—they need to sign up first)\n* Copy shareable link button to share with others\n\n**Interaction model:**\n\n* Allow **2-3 free messages** before soft gate\n* After limit: \"Sign up to continue chatting\" overlay\n\n## State 2: Authenticated Non-Owner (Signed In, Not Creator of Agent)\n\n**User Intent:** \"I want to chat with this agent OR I want to make my own version\"\n\n**What they should see:**\n\n* Chat interface\n* Agent info + creator attribution\n* **\"Chat\"** and **\"Fork\"** buttons (NOT Edit)\n* **No** Private/Public toggle\n* Clear indication this isn't their agent\n* Copy shareable link button to share with others\n\n## State 3: Owner (Signed In, Is Creator)\n\n**User Intent:** \"I want to manage/edit my agent\"\n\n**What they should see:**\n\n* Full control UI\n* **Chat** and **Edit** tabs\n* **Private/Public toggle** with clear state indicator\n* Share button (when public)\n* Analytics/stats (future: views, chats, forks)<br><br>\n\nCurrent state for non-authenticated user when clicking on a public agent link.\n\n<img src=\"https://uploads.linear.app/186bdefa-3633-464a-80cd-6e86fe765a5c/98ded985-b07d-40b0-be50-1edec0e16517/f9247e98-c083-44f7-a77f-39c809353323?signature=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXRoIjoiLzE4NmJkZWZhLTM2MzMtNDY0YS04MGNkLTZlODZmZTc2NWE1Yy85OGRlZDk4NS1iMDdkLTQwYjAtYmU1MC0xZWRlYzBlMTY1MTcvZjkyNDdlOTgtYzA4My00NGY3LWE3N2YtMzljODA5MzUzMzIzIiwiaWF0IjoxNzY3MzczMTk4LCJleHAiOjE3OTg5NDM3NTh9.sv05pGTMS83LCg8BnzWBrMXwNPWID4xLADG-onFSbAs \" alt=\"Screenshot 2026-01-02 at 11.59.29.png\" width=\"1510\" data-linear-height=\"771\" />",
      "createdAt": "2026-01-02T16:53:30Z",
      "closedAt": "2026-01-07T18:56:44Z",
      "state": "CLOSED",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7hGKPe",
      "title": "Limit messages for non-signed up user to ~2-3",
      "author": "borisudovicic",
      "number": 6312,
      "repository": "elizaos/eliza",
      "body": "For users who are speaking with a public agent and are not signed in",
      "createdAt": "2026-01-02T14:30:02Z",
      "closedAt": "2026-01-07T18:56:43Z",
      "state": "CLOSED",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7hFxxm",
      "title": "Chat summaries don't really make much sense. Can we improve",
      "author": "borisudovicic",
      "number": 6311,
      "repository": "elizaos/eliza",
      "body": "<img src=\"https://uploads.linear.app/186bdefa-3633-464a-80cd-6e86fe765a5c/c0a05726-991a-4984-afc4-349ef371a44e/6ee05057-7098-4261-9fd9-b0b26c5ccb85?signature=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXRoIjoiLzE4NmJkZWZhLTM2MzMtNDY0YS04MGNkLTZlODZmZTc2NWE1Yy9jMGEwNTcyNi05OTFhLTQ5ODQtYWZjNC0zNDllZjM3MWE0NGUvNmVlMDUwNTctNzA5OC00MjYxLTlmZDktYjBiMjZjNWNjYjg1IiwiaWF0IjoxNzY3MzYxMTM4LCJleHAiOjE3OTg5MzE2OTh9.B4tU_LsgY2eRCX_eGduPH8nUVrYpfC0ehBoKA2Yt1Y8 \" alt=\"Screenshot 2026-01-02 at 08.37.54.png\" width=\"278\" data-linear-height=\"151\" />\n\nShould be more like this\n\n<img src=\"https://uploads.linear.app/186bdefa-3633-464a-80cd-6e86fe765a5c/f370df1e-3860-4b39-9955-09e7a2466739/14faf575-2617-4cc1-a010-8957384da9be?signature=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXRoIjoiLzE4NmJkZWZhLTM2MzMtNDY0YS04MGNkLTZlODZmZTc2NWE1Yy9mMzcwZGYxZS0zODYwLTRiMzktOTk1NS0wOWU3YTI0NjY3MzkvMTRmYWY1NzUtMjYxNy00Y2MxLWEwMTAtODk1NzM4NGRhOWJlIiwiaWF0IjoxNzY3MzYxMTM4LCJleHAiOjE3OTg5MzE2OTh9.zKEvcrH7kX2-8wNbCxYikGRn6uDh2KbQCB39Fd2WA64 \" alt=\"Screenshot 2026-01-02 at 08.38.33.png\" width=\"275\" data-linear-height=\"158\" />",
      "createdAt": "2026-01-02T13:38:17Z",
      "closedAt": "2026-01-07T18:56:43Z",
      "state": "CLOSED",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7hFwt9",
      "title": "Reduce default size of chat box to one line. Dynamic size adjustment as text goes to more lines",
      "author": "borisudovicic",
      "number": 6310,
      "repository": "elizaos/eliza",
      "body": "GPT example\n\n[Screen Recording 2026-01-02 at 08.34.16.mov](https://uploads.linear.app/186bdefa-3633-464a-80cd-6e86fe765a5c/a708c048-bc17-445b-a8db-b7c0cc745de9/2c8b800b-c6a9-4124-9962-c003d72ca647?signature=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXRoIjoiLzE4NmJkZWZhLTM2MzMtNDY0YS04MGNkLTZlODZmZTc2NWE1Yy9hNzA4YzA0OC1iYzE3LTQ0NWItYThkYi1iN2MwY2M3NDVkZTkvMmM4YjgwMGItYzZhOS00MTI0LTk5NjItYzAwM2Q3MmNhNjQ3IiwiaWF0IjoxNzY3MzYwOTMwLCJleHAiOjE3OTg5MzE0OTB9.zGRRifWDQupTsc-z9XylhywmufKHVAykTK5NfTN2zoI)",
      "createdAt": "2026-01-02T13:35:31Z",
      "closedAt": "2026-01-07T18:56:43Z",
      "state": "CLOSED",
      "commentCount": 0
    }
  ],
  "topPRs": [
    {
      "id": "PR_kwDOMT5cIs670Y6I",
      "title": "fix: plugin-bootstrap (+ sql minor) actions/providers for serverId => messageServerId change",
      "author": "odilitime",
      "number": 6333,
      "body": "# Risks\r\n\r\nLow\r\n\r\n# Background\r\n\r\n## What does this PR do?\r\n\r\n## What kind of change is this?\r\n\r\nBug fixes (non-breaking change which fixes an issue)\r\n\r\n## Why are we doing this? Any context or related work?\r\n\r\nUser reports of 1.7.0 not working with plugin-discord 1.3.3\r\n\r\n# Documentation changes needed?\r\n\r\nMy changes do not require a change to the project documentation.\r\n\n<!-- CURSOR_SUMMARY -->\n---\n\n> [!NOTE]\n> **Adds onboarding and role management, refactors providers, and updates schema**\n> \n> - New `UPDATE_SETTINGS` action: extracts multiple settings, persists to `world.metadata.settings` with salting/unsalting, generates success/failure/error responses, and completes onboarding when required settings are done\n> - New/updated `SETTINGS` provider: reads/decrypts settings from world metadata, supports onboarding (DM) vs regular contexts, and outputs concise status with guidance\n> - New/updated `WORLD` provider: surfaces world/room/channel/participant summaries and structured channel categorization for prompts\n> - New `UPDATE_ROLE` action: parses XML for role assignments, enforces permission rules, updates `world.metadata.roles`, and persists via `updateWorld`\n> - Tests: comprehensive event lifecycle and reaction handling, entity join/leave, and platform-agnostic `shouldRespond` mention/reply logic\n> - SQL: `packages/plugin-sql/src/schema/room.ts` now defines `messageServerId` as `uuid('message_server_id')` (doc/comment cleanup)\n> \n> <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 25d98528e8c98217fbaa63a5e430202a575800e6. 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\nCompletes the migration from deprecated `serverId` to `messageServerId` across plugin-bootstrap actions/providers and plugin-sql schema.\n\n**Key Changes:**\n- Updated `packages/plugin-bootstrap/src/actions/roles.ts` validate function to check `room.messageServerId` instead of accessing `message.content.serverId`\n- Updated logger metadata keys from `serverId` to `messageServerId` in actions/settings.ts, providers/settings.ts, and action return data in roles.ts\n- Updated provider output in providers/world.ts to use `messageServerId` field name\n- Updated JSDoc comment in plugin-sql schema to reflect the correct column name\n- Updated test mocks and fixtures to use `messageServerId`\n\nThis PR addresses user-reported compatibility issues between eliza v1.7.0 and plugin-discord v1.3.3 by ensuring consistent use of the new `messageServerId` field name throughout the codebase. The deprecated `serverId` field still exists in the core types for backward compatibility but is no longer referenced in plugin-bootstrap or plugin-sql.\n\n<h3>Confidence Score: 5/5</h3>\n\n\n- This PR is safe to merge with minimal risk\n- The changes are straightforward field name updates that align with an existing migration (commit 6d1b928c). All changes are consistent, the deprecated field remains in core types for backward compatibility, and the PR only updates references in plugin-bootstrap and plugin-sql to use the new field name. The changes fix reported compatibility issues without introducing breaking changes.\n- No files require special attention\n\n<h3>Important Files Changed</h3>\n\n\n\n\n| Filename | Overview |\n|----------|----------|\n| packages/plugin-sql/src/schema/room.ts | Updated JSDoc comment from `serverId` to `messageServerId` to match the column definition |\n| packages/plugin-bootstrap/src/actions/settings.ts | Updated logger metadata keys from `serverId` to `messageServerId` for consistency |\n| packages/plugin-bootstrap/src/providers/settings.ts | Updated logger metadata key from `serverId` to `messageServerId` for consistency |\n| packages/plugin-bootstrap/src/providers/world.ts | Updated provider output to use `messageServerId` instead of deprecated `serverId` field |\n| packages/plugin-bootstrap/src/actions/roles.ts | Refactored validation to check room.messageServerId and updated logger/return data to use `messageServerId` |\n\n</details>\n\n\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant User\n    participant Action as Action/Provider\n    participant Runtime\n    participant Database\n    \n    Note over User,Database: serverId → messageServerId Migration Flow\n    \n    User->>Action: Trigger action (e.g., UPDATE_ROLE)\n    Action->>Runtime: getRoom(roomId)\n    Runtime->>Database: Query room table\n    Database-->>Runtime: Return Room with messageServerId\n    Runtime-->>Action: Room object\n    \n    alt Validate messageServerId exists\n        Action->>Action: Check room.messageServerId\n        Action->>Runtime: getWorld(worldId)\n        Runtime->>Database: Query world\n        Database-->>Runtime: Return World with messageServerId\n        Runtime-->>Action: World object\n    end\n    \n    Action->>Action: Process with world.messageServerId\n    Action->>Runtime: updateWorld(world)\n    Runtime->>Database: Update world metadata\n    Database-->>Runtime: Success\n    \n    Action->>Action: Log with messageServerId key\n    Action-->>User: Return result with messageServerId\n    \n    Note over Action,Database: All references to deprecated serverId<br/>updated to messageServerId\n```\n\n<!-- greptile_other_comments_section -->\n\n<!-- /greptile_comment -->\n\n<!-- This is an auto-generated comment: release notes by coderabbit.ai -->\n\n## Summary by CodeRabbit\n\n* **Breaking Changes**\n  * Renamed field `serverId` to `messageServerId` across room and world data structures, affecting API responses and database schema. This impacts any code consuming room or world context data.\n\n* **Tests**\n  * Updated test utilities and fixtures to reflect the field name change for consistency with production code.\n\n<sub>✏️ Tip: You can customize this high-level summary in your review settings.</sub>\n\n<!-- end of auto-generated comment: release notes by coderabbit.ai -->",
      "repository": "elizaos/eliza",
      "createdAt": "2026-01-07T01:11:56Z",
      "mergedAt": "2026-01-07T10:46:02Z",
      "additions": 5363,
      "deletions": 23
    },
    {
      "id": "PR_kwDOMT5cIs68Atkl",
      "title": "fix: optimize runtime initialization with parallelization and atomic upserts",
      "author": "standujar",
      "number": 6342,
      "body": "## Summary\r\n\r\nOptimize `runtime.initialize()` performance through atomic upserts and parallelization of independent operations.\r\n\r\n**Results:** Cold start -30%, Warm start -40%\r\n\r\n## Problem\r\n\r\nThe current initialization flow has several inefficiencies:\r\n1. Sequential check-then-insert patterns with race condition potential\r\n2. Multiple round-trips to DB for existence checks before inserts\r\n3. Sequential operations that could run in parallel\r\n\r\n## Solution\r\n\r\n### 1. Atomic Upserts (plugin-sql/base.ts)\r\n\r\nReplace check-then-insert with `INSERT ... ON CONFLICT DO NOTHING`:\r\n\r\n```typescript\r\n// Before: Two queries + race condition\r\nconst existing = await this.getWorld(world.id);\r\nif (existing) throw new Error('World already exists');\r\nawait this.db.insert(worldTable).values(world);\r\n\r\n// After: Single atomic query\r\nawait this.db.insert(worldTable).values(world).onConflictDoNothing();\r\n```\r\n\r\nApplied to:\r\n- `createWorld()` - returns silently if world exists\r\n- `createEntities()` - skips existing entities in batch\r\n\r\n### 2. Parallel Initialization (core/runtime.ts)\r\n\r\n```typescript\r\n// Before: Sequential\r\nawait this.ensureWorldExists();\r\nawait this.runMigrations();\r\nconst entity = await this.getEntityById(entityId);\r\nconst room = await this.getRoomById(roomId);\r\n\r\n// After: Parallel where possible\r\nawait Promise.all([\r\n  this.ensureWorldExists(),\r\n  options?.skipMigrations ? Promise.resolve() : this.runMigrations()\r\n]);\r\n\r\nconst [entity, room] = await Promise.all([\r\n  this.getEntityById(entityId),\r\n  this.getRoomById(roomId)\r\n]);\r\n```\r\n\r\n### 3. Idempotent Ensure Methods\r\n\r\n- `ensureWorldExists()` - Always calls `createWorld()`, DB handles duplicates\r\n- `ensureRoomExists()` - Always calls `createRoom()`, DB handles duplicates\r\n- `ensureEntity()` - New method using upsert pattern\r\n\r\n### 4. Code Cleanup (server/message.ts)\r\n\r\nRemoved defensive try/catch blocks that were handling race conditions no longer possible with atomic upserts.\r\n\r\n## Files Changed\r\n\r\n| File | Changes |\r\n|------|---------|\r\n| `packages/plugin-sql/src/base.ts` | Added `onConflictDoNothing()` to createWorld, createEntities |\r\n| `packages/core/src/runtime.ts` | Parallel init, extracted `mergeAgentSettings()`, added `ensureEntity()` |\r\n| `packages/server/src/services/message.ts` | Removed unnecessary try/catch blocks |\r\n| `packages/*/src/__tests__/**` | Updated tests for idempotent behavior |\r\n\r\n## Benchmark Details\r\n\r\n```\r\nEnvironment: PGLite (in-memory), 20 iterations each\r\n\r\n=== COLD START (fresh DB each time) ===\r\nDelta:  -30%\r\n\r\n=== WARM START (agent already exists) ===\r\nDelta:  -40%\r\n```\r\n\r\n## Test Plan\r\n\r\n- [x] `bun test packages/core/src/__tests__/runtime.test.ts` - 47 pass\r\n- [x] `bun test packages/plugin-sql/src/__tests__/unit/` - 147 pass\r\n- [x] `bun test packages/plugin-sql/src/__tests__/integration/` - All suites pass\r\n- [x] Idempotent behavior verified: calling ensure methods multiple times succeeds\n\n<!-- greptile_comment -->\n\n<h3>Greptile Summary</h3>\n\n\nThis PR successfully optimizes runtime initialization by replacing check-then-insert patterns with atomic upserts and parallelizing independent operations, achieving the claimed 30% cold start and 40% warm start improvements.\n\n## Key Changes\n\n- **Atomic Upserts**: Added `.onConflictDoNothing()` to `createWorld()` and `createEntities()` in `plugin-sql/base.ts`, eliminating race conditions and reducing round-trips\n- **Parallelization**: Refactored `runtime.initialize()` to execute world creation and migrations in parallel, then entity/room/participant lookups in parallel\n- **Code Cleanup**: Removed defensive try/catch blocks in `message.ts` that were handling race conditions no longer possible with atomic operations\n- **Refactoring**: Extracted `mergeAgentSettings()` method and added `ensureEntity()` helper for cleaner code organization\n\n## Issues Found\n\n- **`ensureEntity()` implementation** (runtime.ts:2668): Returns the input entity object rather than fetching the actual persisted entity from the database, which differs from typical ensure patterns and could cause issues if callers expect database-populated fields\n\n## Performance Impact\n\nThe changes are well-architected for performance:\n- Atomic operations reduce DB round-trips from 2+ queries per entity/world to 1\n- Parallel execution of independent operations (world creation + migrations, then entity + room + participants) maximizes throughput\n- Idempotent operations enable safe retries without application-level locking\n\nTests properly verify idempotent behavior and preserve-first-write semantics.\n\n<h3>Confidence Score: 4/5</h3>\n\n\n- This PR is safe to merge with one logic issue requiring clarification\n- The atomic upsert pattern and parallelization are well-implemented with proper tests. Score reduced by 1 point due to the `ensureEntity()` implementation question that needs clarification - it may be intentional but differs from expected ensure pattern behavior.\n- Pay close attention to `packages/core/src/runtime.ts` - verify the `ensureEntity()` return behavior is intentional\n\n<h3>Important Files Changed</h3>\n\n\n\n\n| Filename | Overview |\n|----------|----------|\n| packages/core/src/runtime.ts | Refactored initialization to use `Promise.all()` for parallel execution (world creation and migrations), extracted `mergeAgentSettings()` method, and added `ensureEntity()` helper. One potential issue with `ensureEntity()` always returning the input entity. |\n| packages/plugin-sql/src/base.ts | Added `onConflictDoNothing()` to `createWorld()` and `createEntities()` for atomic upserts, eliminating race conditions. Clean implementation with proper idempotency. |\n| packages/server/src/services/message.ts | Removed defensive try/catch blocks around `ensureWorldExists()` and `ensureRoomExists()` as atomic upserts now handle duplicates at DB level. |\n\n</details>\n\n\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant Runtime as AgentRuntime\n    participant Adapter as DatabaseAdapter\n    participant DB as Database\n\n    Note over Runtime,DB: Cold Start Initialization\n\n    Runtime->>Adapter: ensureAgentExists()\n    Adapter->>DB: INSERT agent ON CONFLICT DO NOTHING\n    DB-->>Adapter: Success\n    Adapter-->>Runtime: Agent entity\n\n    Runtime->>Runtime: mergeAgentSettings()\n    \n    par Parallel Initialization\n        Runtime->>Adapter: ensureWorldExists()\n        Adapter->>DB: INSERT world ON CONFLICT DO NOTHING\n        DB-->>Adapter: Success (idempotent)\n        Adapter-->>Runtime: World created/exists\n    and\n        Runtime->>Adapter: runPluginMigrations()\n        Adapter->>DB: Run migrations\n        DB-->>Adapter: Migrations complete\n        Adapter-->>Runtime: Done\n    end\n\n    par Parallel Entity/Room Setup\n        Runtime->>Adapter: ensureEntity()\n        Adapter->>DB: INSERT entity ON CONFLICT DO NOTHING\n        DB-->>Adapter: Success (idempotent)\n        Adapter-->>Runtime: Entity created/exists\n    and\n        Runtime->>Adapter: getRoom()\n        Adapter->>DB: SELECT room\n        DB-->>Adapter: Room data or null\n        Adapter-->>Runtime: Room data\n    and\n        Runtime->>Adapter: getParticipantsForRoom()\n        Adapter->>DB: SELECT participants\n        DB-->>Adapter: Participant list\n        Adapter-->>Runtime: Participants\n    end\n\n    alt Room doesn't exist\n        Runtime->>Adapter: createRoom()\n        Adapter->>DB: INSERT room\n        DB-->>Adapter: Success\n        Adapter-->>Runtime: Room created\n    end\n\n    alt Agent not participant\n        Runtime->>Adapter: addParticipant()\n        Adapter->>DB: INSERT participant\n        DB-->>Adapter: Success\n        Adapter-->>Runtime: Participant added\n    end\n\n    Note over Runtime,DB: Initialization Complete (-30% cold, -40% warm)\n```\n\n<!-- greptile_other_comments_section -->\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2026-01-07T23:58:13Z",
      "mergedAt": null,
      "additions": 190,
      "deletions": 179
    },
    {
      "id": "PR_kwDOMT5cIs678SjA",
      "title": "fix(plugin-sql): skip pgcrypto extension for PGLite",
      "author": "standujar",
      "number": 6339,
      "body": "- Skip installing `pgcrypto` extension for PGLite/development databases\r\n- PGLite uses native `gen_random_uuid()` and doesn't support pgcrypto\r\n- Eliminates unnecessary warning logs\n\n<!-- greptile_comment -->\n\n<h3>Greptile Summary</h3>\n\n\nThis PR improves database compatibility by conditionally skipping the `pgcrypto` extension installation for PGLite databases. The change leverages the existing `isRealPostgresDatabase()` detection logic to determine whether to include `pgcrypto` in the list of required extensions.\n\n**Key changes:**\n- PGLite databases now install only `vector` and `fuzzystrmatch` extensions\n- Real PostgreSQL databases continue to install all three extensions including `pgcrypto`\n- Eliminates unnecessary warning logs when using PGLite, which has native `gen_random_uuid()` support\n\nThe implementation follows the established pattern already used for advisory locks in the same file (lines 333 and 620), ensuring consistency. The schema files use `gen_random_uuid()` extensively (found in `room.ts`, `world.ts`, `relationship.ts`, `component.ts`, `participant.ts`), which works natively in PGLite without requiring the `pgcrypto` extension.\n\n<h3>Confidence Score: 5/5</h3>\n\n\n- This PR is safe to merge with minimal risk\n- The change is a simple, well-targeted fix that follows existing patterns in the codebase. It reuses the `isRealPostgresDatabase()` method that's already used elsewhere in the same file for advisory locks. The logic is sound: PGLite has native `gen_random_uuid()` support and doesn't need the `pgcrypto` extension, while real PostgreSQL databases continue to receive all required extensions. The change eliminates unnecessary warning logs without affecting functionality, and there's no risk of breaking existing behavior since the extension installation uses `CREATE EXTENSION IF NOT EXISTS` with error handling that continues on failure.\n- No files require special attention\n\n<h3>Important Files Changed</h3>\n\n\n\n\n| Filename | Overview |\n|----------|----------|\n| packages/plugin-sql/src/runtime-migrator/runtime-migrator.ts | Conditionally skips `pgcrypto` extension installation for PGLite, which natively supports `gen_random_uuid()` |\n\n</details>\n\n\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant Migrator as RuntimeMigrator\n    participant EnvCheck as Environment Check\n    participant ExtManager as ExtensionManager\n    participant DB as Database\n\n    Migrator->>EnvCheck: Get POSTGRES_URL/DATABASE_URL\n    EnvCheck->>EnvCheck: isRealPostgresDatabase()\n    \n    alt Real PostgreSQL\n        EnvCheck-->>Migrator: isRealPostgres = true\n        Migrator->>Migrator: extensions = ['vector', 'fuzzystrmatch', 'pgcrypto']\n        Migrator->>ExtManager: installRequiredExtensions(extensions)\n        ExtManager->>DB: CREATE EXTENSION vector\n        ExtManager->>DB: CREATE EXTENSION fuzzystrmatch\n        ExtManager->>DB: CREATE EXTENSION pgcrypto\n    else PGLite/Development\n        EnvCheck-->>Migrator: isRealPostgres = false\n        Migrator->>Migrator: extensions = ['vector', 'fuzzystrmatch']\n        Note over Migrator: Skip pgcrypto (native gen_random_uuid)\n        Migrator->>ExtManager: installRequiredExtensions(extensions)\n        ExtManager->>DB: CREATE EXTENSION vector\n        ExtManager->>DB: CREATE EXTENSION fuzzystrmatch\n    end\n    \n    DB-->>ExtManager: Extensions installed/skipped\n    ExtManager-->>Migrator: Continue migration\n```\n\n<!-- greptile_other_comments_section -->\n\n<!-- /greptile_comment -->",
      "repository": "elizaos/eliza",
      "createdAt": "2026-01-07T16:20:44Z",
      "mergedAt": "2026-01-09T04:58:54Z",
      "additions": 6,
      "deletions": 6
    }
  ],
  "codeChanges": {
    "additions": 5363,
    "deletions": 23,
    "files": 8,
    "commitCount": 7
  },
  "completedItems": [
    {
      "title": "fix: plugin-bootstrap (+ sql minor) actions/providers for serverId => messageServerId change",
      "prNumber": 6333,
      "type": "bugfix",
      "body": "# Risks\r\n\r\nLow\r\n\r\n# Background\r\n\r\n## What does this PR do?\r\n\r\n## What kind of change is this?\r\n\r\nBug fixes (non-breaking change which fixes an issue)\r\n\r\n## Why are we doing this? Any context or related work?\r\n\r\nUser reports of 1.7.0 not wor",
      "files": [
        "bun.lock",
        "packages/plugin-bootstrap/src/__tests__/logic.test.ts",
        "packages/plugin-bootstrap/src/__tests__/test-utils.ts",
        "packages/plugin-bootstrap/src/actions/roles.ts",
        "packages/plugin-bootstrap/src/actions/settings.ts",
        "packages/plugin-bootstrap/src/providers/settings.ts",
        "packages/plugin-bootstrap/src/providers/world.ts",
        "packages/plugin-sql/src/schema/room.ts"
      ]
    }
  ],
  "topContributors": [
    {
      "username": "odilitime",
      "avatarUrl": "https://avatars.githubusercontent.com/u/16395496?u=c9bac48e632aae594a0d85aaf9e9c9c69b674d8b&v=4",
      "totalScore": 53.073019117260884,
      "prScore": 52.63501911726088,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0.43799999999999994,
      "summary": null
    },
    {
      "username": "standujar",
      "avatarUrl": "https://avatars.githubusercontent.com/u/16385918?u=718bdcd1585be8447bdfffb8c11ce249baa7532d&v=4",
      "totalScore": 47.47822238626918,
      "prScore": 42.47822238626918,
      "issueScore": 0,
      "reviewScore": 5,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "linear",
      "avatarUrl": "https://avatars.githubusercontent.com/in/20150?v=4",
      "totalScore": 14,
      "prScore": 0,
      "issueScore": 14,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "greptile-apps",
      "avatarUrl": "https://avatars.githubusercontent.com/in/867647?v=4",
      "totalScore": 4.5,
      "prScore": 0,
      "issueScore": 0,
      "reviewScore": 4.5,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "samarth30",
      "avatarUrl": "https://avatars.githubusercontent.com/u/48334430?u=1fc119a6c2deb8cf60448b4c8961cb21dc69baeb&v=4",
      "totalScore": 2,
      "prScore": 0,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    }
  ],
  "newPRs": 3,
  "mergedPRs": 1,
  "newIssues": 7,
  "closedIssues": 17,
  "activeContributors": 7
}