{
  "interval": {
    "intervalStart": "2026-01-16T00:00:00.000Z",
    "intervalEnd": "2026-01-17T00:00:00.000Z",
    "intervalType": "day"
  },
  "repository": "elizaos/eliza",
  "overview": "From 2026-01-16 to 2026-01-17, elizaos/eliza had 0 new PRs (1 merged), 3 new issues, and 8 active contributors.",
  "topIssues": [
    {
      "id": "I_kwDOMT5cIs7iYiEj",
      "title": "Logging in or signing up should take you back to agent chat where you left off",
      "author": "borisudovicic",
      "number": 6354,
      "repository": "elizaos/eliza",
      "body": "Right now it takes you to dashboard.\n\n[Screen Recording 2026-01-09 at 14.15.18.mov](https://uploads.linear.app/186bdefa-3633-464a-80cd-6e86fe765a5c/4f0c2ba4-fab5-4942-b626-f4d2642f7a9b/e06b3046-253e-438a-95e0-34d1e54b2b37?signature=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXRoIjoiLzE4NmJkZWZhLTM2MzMtNDY0YS04MGNkLTZlODZmZTc2NWE1Yy80ZjBjMmJhNC1mYWI1LTQ5NDItYjYyNi1mNGQyNjQyZjdhOWIvZTA2YjMwNDYtMjUzZS00MzhhLTk1ZTAtMzRkMWU1NGIyYjM3IiwiaWF0IjoxNzY3OTg2MTM0LCJleHAiOjE3OTk1NTY2OTR9.S6h7PYr4pqq-CxQ2Og0NnFFIZKBv6rtsm1-jKyqtAjM)",
      "createdAt": "2026-01-09T19:15:36Z",
      "closedAt": "2026-01-16T17:02:35Z",
      "state": "CLOSED",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7iV-iZ",
      "title": "Remove the + from personality traits and topics of interest fields",
      "author": "borisudovicic",
      "number": 6350,
      "repository": "elizaos/eliza",
      "body": "This is bad UX that we carried over from the Eliza GUI. These should just be fields like bio and system prompt. The bottom two, conversation examples and post examples probably can be okay with the + since it would be difficult to do it otherwise.\n\n<img src=\"https://uploads.linear.app/186bdefa-3633-464a-80cd-6e86fe765a5c/c0a8876c-66d7-4bad-955c-819ea3eb5475/17a308ea-890b-410e-9c3c-d0ba51a95cc0?signature=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXRoIjoiLzE4NmJkZWZhLTM2MzMtNDY0YS04MGNkLTZlODZmZTc2NWE1Yy9jMGE4ODc2Yy02NmQ3LTRiYWQtOTU1Yy04MTllYTNlYjU0NzUvMTdhMzA4ZWEtODkwYi00MTBlLTljM2MtZDBiYTUxYTk1Y2MwIiwiaWF0IjoxNzY3OTczMzc3LCJleHAiOjE3OTk1NDM5Mzd9.QQ1Le9rWyHB_VpSKuOgaHypWOUv5a9DwM01TrtZOoQ0 \" alt=\"Screenshot 2026-01-09 at 10.40.06.png\" width=\"1267\" data-linear-height=\"806\" />",
      "createdAt": "2026-01-09T15:42:57Z",
      "closedAt": "2026-01-16T20:50:40Z",
      "state": "CLOSED",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7j4-a7",
      "title": "[Migration] Eligibility Mismatch & Snapshot Bug - Tangem Hardware Wallet",
      "author": "Zenobow",
      "number": 6369,
      "repository": "elizaos/eliza",
      "body": "Description: I am reporting a discrepancy in my $ai16z migration eligibility. My current $ai16z holdings are consolidated in my Tangem hardware wallet. During the official snapshot on Nov 11, 2025 (11:40 UTC), this wallet held the bulk of my tokens.\n\nThe Problem: When I connect to the migration portal (migrate.elizafoundation.ai), the system only recognizes a small fraction (710 tokens) which were held in a separate Solflare hot-wallet at the time. My Tangem wallet's snapshot balance is not being correctly identified or synced by the portal.\n\nVerified On-Chain Evidence (Tangem Wallet):\n\nHolding Address: 2SELmng3aKdrPKad41PEZA5XAt5Hex8TCpKrwY8AX8K8\n\nSnapshot Balance (Nov 11): 70,000 $ai16z\n\nSupporting Transaction Hashes:\n\n4gPGjNc31yPwJrSomHEgwGAWQyJcPmgYUKw8iu4NaMTQhTgEjvdd1TdwyEphg2qfhHvqmony5kHzJFhQa6syDNWb [43,000 ai16z]\n\n363QaEUbGTnDVK9Uvm9xqnDaphpdSY5YaQjgdC9xi3AcbNZJpW7H7gbEvaCLL5fcSoD1PeGqwddfgXbo6pC5Jfav [17,000 ai16z]\n\n5KDLm7qA71yrGfUW6SxzVTWY4KxBeYxuAPiWZWTAG4Y6xMex1JbjfzAYuDWTR86oKTXMcy2WDLAdnSgagKbR9x6q [8,000 ai16z]\n\n36UzzHTLVVN6xsi96YWZqCApkUfA8Z9T5AuXRuBi8ti1nvpQ6aS2tgcBYbRz497dAzAkdanefBZSGYm2Qyp9TSEi [2,000 ai16z]\n\nRequest: Please manually verify the snapshot data for address 2SELmng3aKdrPKad41PEZA5XAt5Hex8TCpKrwY8AX8K8 and whitelist the full eligible amount for the 1:6 $ELIZAOS swap. As Tangem does not support seed phrase export and has connection issues with the portal, I need this backend update to proceed before the February 4th deadline.\n\nThank you for your help!",
      "createdAt": "2026-01-16T19:31:32Z",
      "closedAt": null,
      "state": "OPEN",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7j3TWy",
      "title": "Add Opus 4.5 to Apps",
      "author": "borisudovicic",
      "number": 6368,
      "repository": "elizaos/eliza",
      "body": "",
      "createdAt": "2026-01-16T17:26:36Z",
      "closedAt": null,
      "state": "OPEN",
      "commentCount": 0
    },
    {
      "id": "I_kwDOMT5cIs7j0krM",
      "title": "Future: able to deploy smart contracts",
      "author": "metatev",
      "number": 6367,
      "repository": "elizaos/eliza",
      "body": "Want to add feature that can deploy smart contract to on-chain",
      "createdAt": "2026-01-16T14:11:01Z",
      "closedAt": null,
      "state": "OPEN",
      "commentCount": 0
    }
  ],
  "topPRs": [
    {
      "id": "PR_kwDOMT5cIs69N1vf",
      "title": "refactor(plugin-sql): extract domain stores from BaseDrizzleAdapter",
      "author": "standujar",
      "number": 6366,
      "body": "Refactors `BaseDrizzleAdapter` (~3,900 lines) into composable domain stores. This improves maintainability, testability, and separation of concerns without changing the public API.\r\n\r\n## Changes\r\n\r\n### New Domain Stores (`src/stores/`)\r\n\r\n| Store | Responsibility | Methods |\r\n|-------|----------------|---------|\r\n| `AgentStore` | Agent CRUD operations | get, getAll, create, update, delete, count |\r\n| `MemoryStore` | Memory & embeddings | get, getById, getByIds, create, update, delete, search, count |\r\n| `RoomStore` | Room management | getByIds, getByWorld, create, update, delete |\r\n| `ParticipantStore` | Room participants | getRoomsForEntity, add, remove, getForRoom, isParticipant, userState |\r\n| `EntityStore` | Entity management | getByIds, getForRoom, create, update, delete, getByNames, searchByName |\r\n| `ComponentStore` | ECS components | get, getAll, create, update, delete |\r\n| `RelationshipStore` | Entity relationships | create, update, get, getAll |\r\n| `CacheStore` | Key-value cache | get, set, delete |\r\n| `WorldStore` | World management | create, get, getAll, update, delete |\r\n| `TaskStore` | Task management | create, getByParams, getByName, get, update, delete |\r\n| `LogStore` | Logging & summaries | create, getMany, getAgentRunSummaries, delete |\r\n| `MessagingStore` | Servers, channels, messages | createServer, getServers, createChannel, getChannels, createMessage, getMessages, participants |\r\n\r\n### Architecture\r\n\r\n```\r\nBaseDrizzleAdapter\r\n    │\r\n    ├── initStores()  ───────────────────────────────┐\r\n    │                                                │\r\n    │   ┌─────────────────────────────────────────┐  │\r\n    │   │           StoreContext                  │◄─┘\r\n    │   │  • getDb()                              │\r\n    │   │  • withRetry()                          │\r\n    │   │  • withIsolationContext()               │\r\n    │   │  • agentId                              │\r\n    │   │  • getEmbeddingDimension()              │\r\n    │   └─────────────────────────────────────────┘\r\n    │                   │\r\n    │         ┌─────────┴─────────┐\r\n    │         ▼                   ▼\r\n    │   ┌──────────┐       ┌──────────┐\r\n    │   │  Store1  │  ...  │  StoreN  │\r\n    │   └──────────┘       └──────────┘\r\n    │\r\n    └── Public methods delegate to stores\r\n```\r\n\r\n### Key Design Decisions\r\n\r\n1. **Shared Context**: All stores receive a `StoreContext` with database access, retry logic, and RLS isolation\r\n\r\n2. **No API Changes**: All public methods remain identical - only internal implementation refactored\r\n\r\n## Impact\r\n\r\n- **Lines reduced**: `base.ts` from ~3,900 to ~1,350 lines (~65% reduction)\r\n- **Files added**: 13 new files in `src/stores/`\r\n- **Public API**: No changes\r\n- **Tests**: All 160 unit + all integration tests pass (PGLite + PostgreSQL)\r\n\r\n## Testing\r\n\r\n```bash\r\n# Unit tests\r\nbun run test:unit        # 160 pass\r\n\r\n# Integration tests (PGLite)\r\nbun run test:integration # All pass\r\n\r\n# Integration tests (PostgreSQL)\r\nbun run test:integration:postgres # All pass (including RLS tests)\r\n```\r\n\r\n## Migration\r\n\r\nNo migration needed - this is a pure refactoring with no public API changes.\n\n<!-- greptile_comment -->\n\n<h3>Greptile Summary</h3>\n\n\n- Refactors monolithic `BaseDrizzleAdapter` class (~3,900 lines) into 11 focused domain stores in `packages/plugin-sql/src/stores/` to improve maintainability and testability while preserving the exact same public API\n- Introduces `StoreContext` pattern that provides shared database access, retry logic, and Row Level Security isolation to all domain stores, maintaining consistency across the codebase\n- Implements comprehensive CRUD operations across stores for agents, memories, rooms, participants, entities, components, relationships, caching, worlds, tasks, and logging\n\n<h3>Important Files Changed</h3>\n\n\n| Filename | Overview |\n|----------|----------|\n| packages/plugin-sql/src/base.ts | Refactored from ~3,900 to ~1,350 lines by extracting domain logic into stores and adding delegation methods |\n| packages/plugin-sql/src/stores/memory.store.ts | New store handling memory CRUD, vector embeddings, and similarity search operations |\n| packages/plugin-sql/src/stores/entity.store.ts | New store for entity management including component aggregation and name-based searching |\n| packages/plugin-sql/src/stores/log.store.ts | New store with complex agent run summaries and JSON sanitization for logging operations |\n\n<h3>Confidence score: 4/5</h3>\n\n\n- This is a well-executed refactoring with comprehensive testing and minimal risk due to preserved public API\n- Score lowered due to minor issues: unused parameter in TaskStore.getAll(), missing agent ID filter in TaskStore.delete(), and complex field mapping logic in RelationshipStore that could be simplified\n- No files require special attention - the refactoring successfully maintains API compatibility while improving code organization\n\n<h3>Sequence Diagram</h3>\n\n```mermaid\nsequenceDiagram\n    participant Client as \"Client\"\n    participant Adapter as \"BaseDrizzleAdapter\"\n    participant StoreContext as \"StoreContext\"\n    participant MemoryStore as \"MemoryStore\"\n    participant Manager as \"ConnectionManager\"\n    participant DB as \"Database\"\n\n    Note over Client,DB: Memory Search Flow (Primary Happy Path)\n\n    Client->>Adapter: searchMemoriesByEmbedding(embedding, params)\n    \n    Adapter->>Adapter: withDatabase(() => operation())\n    \n    Adapter->>MemoryStore: searchByEmbedding(embedding, params)\n    \n    MemoryStore->>StoreContext: withRetry(() => operation())\n    \n    StoreContext->>MemoryStore: Execute operation\n    \n    MemoryStore->>StoreContext: getDb()\n    StoreContext->>MemoryStore: Return database instance\n    \n    MemoryStore->>DB: Execute cosine distance query with conditions\n    DB-->>MemoryStore: Return matching memories with similarity scores\n    \n    MemoryStore->>MemoryStore: Transform results to Memory objects\n    MemoryStore-->>StoreContext: Return transformed memories\n    StoreContext-->>Adapter: Return memories\n    Adapter-->>Client: Return Memory[]\n\n    Note over Client,DB: Memory Creation Flow\n\n    Client->>Adapter: createMemory(memory, tableName)\n    \n    Adapter->>Adapter: withDatabase(() => operation())\n    \n    Adapter->>MemoryStore: create(memory, tableName)\n    \n    MemoryStore->>StoreContext: withIsolationContext(entityId, callback)\n    \n    StoreContext->>Manager: withIsolationContext(entityId, callback)\n    Manager->>DB: Set RLS context for entity\n    Manager->>MemoryStore: Execute callback with transaction\n    \n    MemoryStore->>DB: Insert memory record\n    MemoryStore->>MemoryStore: upsertEmbedding(tx, memoryId, embedding)\n    MemoryStore->>DB: Insert/Update embedding record\n    \n    DB-->>MemoryStore: Return inserted memory ID\n    MemoryStore-->>StoreContext: Return memory ID\n    StoreContext-->>Adapter: Return memory ID\n    Adapter-->>Client: Return UUID\n\n    Note over Client,DB: Agent Operations Flow\n\n    Client->>Adapter: getAgent(agentId)\n    \n    Adapter->>Adapter: withDatabase(() => operation())\n    \n    Adapter->>AgentStore: get(agentId)\n    \n    AgentStore->>StoreContext: withRetry(() => operation())\n    \n    AgentStore->>StoreContext: getDb()\n    StoreContext->>AgentStore: Return database instance\n    \n    AgentStore->>DB: SELECT from agents WHERE id = agentId\n    DB-->>AgentStore: Return agent record\n    \n    AgentStore->>AgentStore: Transform to Agent object\n    AgentStore-->>Adapter: Return Agent\n    Adapter-->>Client: Return Agent\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": "2026-01-14T18:18:05Z",
      "mergedAt": "2026-01-16T17:22:26Z",
      "additions": 3205,
      "deletions": 3002
    }
  ],
  "codeChanges": {
    "additions": 3205,
    "deletions": 3002,
    "files": 34,
    "commitCount": 56
  },
  "completedItems": [
    {
      "title": "refactor(plugin-sql): extract domain stores from BaseDrizzleAdapter",
      "prNumber": 6366,
      "type": "refactor",
      "body": "Refactors `BaseDrizzleAdapter` (~3,900 lines) into composable domain stores. This improves maintainability, testability, and separation of concerns without changing the public API.\r\n\r\n## Changes\r\n\r\n### New Domain Stores (`src/stores/`)\r\n\r\n|",
      "files": [
        "bun.lock",
        "packages/plugin-sql/src/base.ts",
        "packages/plugin-sql/src/neon/adapter.ts",
        "packages/plugin-sql/src/pg/adapter.ts",
        "packages/plugin-sql/src/pglite/adapter.ts",
        "packages/plugin-sql/src/stores/agent.store.ts",
        "packages/plugin-sql/src/stores/cache.store.ts",
        "packages/plugin-sql/src/stores/component.store.ts",
        "packages/plugin-sql/src/stores/entity.store.ts",
        "packages/plugin-sql/src/stores/index.ts",
        "packages/plugin-sql/src/stores/log.store.ts",
        "packages/plugin-sql/src/stores/memory.store.ts",
        "packages/plugin-sql/src/stores/messaging.store.ts",
        "packages/plugin-sql/src/stores/participant.store.ts",
        "packages/plugin-sql/src/stores/relationship.store.ts",
        "packages/plugin-sql/src/stores/room.store.ts",
        "packages/plugin-sql/src/stores/task.store.ts",
        "packages/plugin-sql/src/stores/types.ts",
        "packages/plugin-sql/src/stores/world.store.ts",
        "packages/plugin-sql/src/utils.ts",
        "packages/plugin-sql/tsconfig.build.json",
        "packages/plugin-sql/tsconfig.build.node.json",
        "packages/plugin-sql/src/__tests__/integration/utils.test.ts",
        "packages/plugin-sql/src/__tests__/unit/utils.test.ts",
        "packages/plugin-sql/src/index.ts",
        "packages/plugin-sql/src/schema/channel.ts",
        "packages/plugin-sql/src/schema/entity.ts",
        "packages/plugin-sql/src/schema/memory.ts",
        "packages/plugin-sql/src/schema/message.ts",
        "packages/plugin-sql/src/schema/messageServer.ts",
        "packages/plugin-sql/src/schema/relationship.ts",
        "packages/plugin-sql/src/schema/room.ts",
        "packages/plugin-sql/src/schema/tasks.ts",
        "packages/plugin-sql/src/schema/world.ts"
      ]
    }
  ],
  "topContributors": [
    {
      "username": "0xbbjoker",
      "avatarUrl": "https://avatars.githubusercontent.com/u/54844437?u=90fe1762420de6ad493a1c1582f1f70c0d87d8e2&v=4",
      "totalScore": 5,
      "prScore": 0,
      "issueScore": 0,
      "reviewScore": 5,
      "commentScore": 0,
      "summary": "0xbbjoker: Focused on a significant refactor effort, modifying 34 files with a net change of +203 lines across a single commit, and also provided one approval review."
    },
    {
      "username": "Zenobow",
      "avatarUrl": "https://avatars.githubusercontent.com/u/255418143?v=4",
      "totalScore": 2.1,
      "prScore": 0,
      "issueScore": 2.1,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": "Zenobow: Focused on identifying and documenting potential issues, creating a detailed issue regarding a migration eligibility mismatch and snapshot bug in elizaos/eliza (#6369)."
    },
    {
      "username": "metatev",
      "avatarUrl": "https://avatars.githubusercontent.com/u/26566294?u=a0604d1f9f7a7936e350643ffccaef1f2a808fad&v=4",
      "totalScore": 2,
      "prScore": 0,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": "metatev: Focused on future development, creating an issue in elizaos/eliza (#6367) to track the ability to deploy smart contracts."
    },
    {
      "username": "borisudovicic",
      "avatarUrl": "https://avatars.githubusercontent.com/u/31806472?u=8935f4d43fd7e4eb9bf5ff92d54d4d2f8ac8a786&v=4",
      "totalScore": 2,
      "prScore": 0,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": "borisudovicic: Focused on product improvements and feature requests, creating three issues including a request to add Opus 4.5 to Apps (elizaos/eliza#6368) and closing two issues related to user experience."
    }
  ],
  "newPRs": 0,
  "mergedPRs": 1,
  "newIssues": 3,
  "closedIssues": 2,
  "activeContributors": 8
}