{
  "interval": {
    "intervalStart": "2025-11-10T00:00:00.000Z",
    "intervalEnd": "2025-11-11T00:00:00.000Z",
    "intervalType": "day"
  },
  "repository": "elizaos/eliza",
  "overview": "From 2025-11-10 to 2025-11-11, elizaos/eliza had 3 new PRs (0 merged), 2 new issues, and 4 active contributors.",
  "topIssues": [
    {
      "id": "I_kwDOMT5cIs7XCsUe",
      "title": "Bug: Disabling Web UI blocks all endpoints",
      "author": "humuhimi",
      "number": 6138,
      "repository": "elizaos/eliza",
      "body": "",
      "createdAt": "2025-11-10T12:26:11Z",
      "closedAt": "2025-11-10T12:47:31Z",
      "state": "CLOSED",
      "commentCount": 2
    },
    {
      "id": "I_kwDOMT5cIs7XJ6X_",
      "title": "Error      [E.v.A] MessageBusService: Error processing message via elizaOS.sendMessage() No handler found for delegate type: TEXT_LARGE",
      "author": "christophwallacher-web",
      "number": 6140,
      "repository": "elizaos/eliza",
      "body": "**Describe the bug**\n\nAgent dont answer on any questions\n\n**To Reproduce**\n\nstart from gitbash von windows\n\n**Expected behavior**\n\nagent should answer to all question like norma\n\n\n**Additional context**\n\n Warn       [MessageService] Updating response ID for room aea8a296-5161-09ee-9abc-3129a271ff2b from 466795e9-830c-4431-a973-cf9315978eef to a3d87c43-15f0-48e0-aa79-33f10306b33a\n Info       Using server ID: 00000000-0000-0000-0000-000000000000\n Info       No ownership data found for server 00000000-0000-0000-0000-000000000000, initializing empty role hierarchy\n Info       No settings state found for server 00000000-0000-0000-0000-000000000000\nerror is 45963 |     const modelKey = typeof modelType === \"string\" ? modelType : ModelType[modelType];\n45964 |     const promptContent = params?.prompt || params?.input || (Array.isArray(params?.messages) ? JSON.stringify(params.messages) : null);\n45965 |     const model = this.getModel(modelKey, provider);\n45966 |     if (!model) {\n45967 |       const errorMsg = `No handler found for delegate type: ${modelKey}`;\n45968 |       throw new Error(errorMsg);\n                        ^\nerror: No handler found for delegate type: TEXT_LARGE\n      at useModel (C:\\Users\\NOTE1\\eva\\node_modules\\@elizaos\\core\\dist\\node\\index.node.js:45968:17)\n      at useModel (C:\\Users\\NOTE1\\eva\\node_modules\\@elizaos\\core\\dist\\node\\index.node.js:45962:18)\n      at runSingleShotCore (C:\\Users\\NOTE1\\eva\\node_modules\\@elizaos\\core\\dist\\node\\index.node.js:43483:38)\n      at async processMessage (C:\\Users\\NOTE1\\eva\\node_modules\\@elizaos\\core\\dist\\node\\index.node.js:43165:126)\n\n Error      #E.v.A  [MessageService] Error in handleMessage: {\n  error: 45963 |     const modelKey = typeof modelType === \"string\" ? modelType : ModelType[modelType];\n45964 |     const promptContent = params?.prompt || params?.input || (Array.isArray(params?.messages) ? JSON.stringify(params.messages) : null);\n45965 |     const model = this.getModel(modelKey, provider);\n45966 |     if (!model) {\n45967 |       const errorMsg = `No handler found for delegate type: ${modelKey}`;\n45968 |       throw new Error(errorMsg);\n                        ^\nerror: No handler found for delegate type: TEXT_LARGE\n      at useModel (C:\\Users\\NOTE1\\eva\\node_modules\\@elizaos\\core\\dist\\node\\index.node.js:45968:17)\n      at useModel (C:\\Users\\NOTE1\\eva\\node_modules\\@elizaos\\core\\dist\\node\\index.node.js:45962:18)\n      at runSingleShotCore (C:\\Users\\NOTE1\\eva\\node_modules\\@elizaos\\core\\dist\\node\\index.node.js:43483:38)\n      at async processMessage (C:\\Users\\NOTE1\\eva\\node_modules\\@elizaos\\core\\dist\\node\\index.node.js:43165:126)\n,\n}\n Error      [E.v.A] MessageBusService: Error processing message via elizaOS.sendMessage() No handler found for delegate type: TEXT_LARGE\n\n",
      "createdAt": "2025-11-10T21:07:59Z",
      "closedAt": null,
      "state": "OPEN",
      "commentCount": 0
    }
  ],
  "topPRs": [
    {
      "id": "PR_kwDOMT5cIs6yoPHs",
      "title": "fix: load environment variables from process.env instead of .env file",
      "author": "standujar",
      "number": 6141,
      "body": "## Relates to\r\n\r\nFixes the issue where `runtime.getSetting(\"ANY_VARIABLES\")` returns `undefined` when environment variables are exported on the host (`export VAR=value`) instead of being defined in a `.env` file, causing agents to use incorrect configuration or fallback to defaults.\r\n\r\n## Risks\r\n\r\n**Low**\r\n\r\n## Background\r\n\r\n### What does this PR do?\r\n\r\nThis PR fixes environment variable loading to work correctly with exported shell variables, not just `.env` files:\r\n\r\n1. **Changes `loadSecretsNodeImpl()`** to read directly from `process.env` instead of re-reading the `.env` file\r\n2. **Creates centralized `loadEnvFile()`** function in `core/utils/environment.ts` for consistent `.env` file loading\r\n3. **Updates CLI and Server** to use the centralized function\r\n4. **Updates all tests** to reflect the new behavior\r\n\r\n### What kind of change is this?\r\n\r\n- ✅ **Bug fixes** (non-breaking change which fixes an issue)\r\n- ✅ **Improvements** (misc. changes to existing features)\r\n\r\n### Why are we doing this?\r\n\r\n#### Problem Discovered\r\n\r\nWhen running agents in environments where variables are exported directly on the host system (e.g., `export POSTGRES_URL=postgresql://...`), the variables were not accessible via `runtime.getSetting()`, even though they were correctly set in the environment.\r\n\r\n**Testing confirmed the issue**:\r\n- ✅ With `.env` file: Works\r\n- ❌ With `export POSTGRES_URL=...`: **Doesn't work**\r\n- ❌ With system environment variables: **Doesn't work**\r\n\r\nThis is problematic for:\r\n- Production deployments where secrets are managed via exported environment variables\r\n- Container orchestration systems (Docker, ECS, Kubernetes) that inject env vars\r\n- CI/CD pipelines that set variables programmatically\r\n- Development workflows that prefer `export` over `.env` files\r\n\r\n#### Root Cause\r\n\r\nThe `loadSecretsNodeImpl()` function in `packages/core/src/secrets.ts` was:\r\n1. **Only** reading the `.env` FILE directly using `fs.readFileSync()`\r\n2. Parsing it with `dotenv.parse()`\r\n3. Merging those parsed values into `character.settings`\r\n\r\nThis approach **completely ignored** `process.env`, which contains:\r\n- Variables loaded from `.env` by the CLI (via `dotenv.config()`)\r\n- **Exported shell variables** (`export FOO=bar`) ← **Main issue**\r\n- Container-injected environment variables\r\n- System environment variables\r\n\r\n**Why was this a problem?**\r\n\r\nWhen you run:\r\n```bash\r\nexport POSTGRES_URL=postgresql://production:5432/eliza\r\nbunx elizaos start --character=./characters/sample.json\r\n```\r\n\r\nThe variable is in `process.env`, but `loadSecretsNodeImpl()` was looking for a `.env` file instead. If no `.env` file existed, it would fail to load ANY environment variables, even though they were available in `process.env`.\r\n\r\n#### Solution\r\n\r\nThe fix reads `process.env` directly instead of re-reading the `.env` file\r\n\r\n**Why this works:**\r\n\r\n1. **When using `.env` files**: The CLI calls `dotenv.config()` which loads `.env` → `process.env`\r\n2. **When using exported variables**: Shell already puts them in `process.env`\r\n3. **When using container env vars**: Runtime injects them into `process.env`\r\n4. **Result**: `loadSecretsNodeImpl()` now sees ALL variables, regardless of source\r\n\r\n## Documentation changes needed?\r\n\r\n- ✅ My changes do not require a change to the project documentation.\r\n\r\nThe behavior is now more intuitive - environment variables work as expected from any source. No user-facing documentation changes needed.\r\n\r\n## Testing\r\n\r\n### Where should a reviewer start?\r\n\r\n1. Review the changes in [packages/core/src/secrets.ts](packages/core/src/secrets.ts:26-66) - the core fix\r\n2. Review [packages/core/src/utils/environment.ts](packages/core/src/utils/environment.ts:384-410) - centralized `loadEnvFile()`\r\n3. Check test updates in [packages/core/src/__tests__/secrets.test.ts](packages/core/src/__tests__/secrets.test.ts:76-190)\r\n4. Verify CLI integration in [packages/cli/src/commands/start/index.ts](packages/cli/src/commands/start/index.ts:38-46)\r\n5. Verify Server integration in [packages/server/src/index.ts](packages/server/src/index.ts:332)\r\n\r\n### Detailed testing steps\r\n\r\n#### Automated Tests\r\n\r\n```bash\r\ncd packages/core\r\nbun test\r\n\r\n# Results:\r\n# ✅ 675 pass\r\n# ❌ 0 fail\r\n# ⏭️ 4 skip\r\n```\r\n\r\nAll tests pass, including:\r\n- `secrets.test.ts` - 8 tests verifying environment variable loading\r\n- `settings.test.ts` - 49 tests verifying character settings merge\r\n- `environment.test.ts` - 29 tests verifying environment abstraction\r\n\r\n#### Manual Testing\r\n\r\n**Test 1: .env file (already working, should still work)**\r\n```bash\r\necho 'POSTGRES_URL=postgresql://localhost:5432/test' > .env\r\nbunx elizaos start --character=./characters/sample.json\r\n# ✅ Agent uses POSTGRES_URL from .env file\r\n```\r\n\r\n**Test 2: Exported environment variable (was broken, NOW FIXED)**\r\n```bash\r\n# Remove .env file to test pure exported variables\r\nrm -f .env\r\n\r\nexport POSTGRES_URL=postgresql://localhost:5432/test\r\nexport OPENAI_API_KEY=sk-test-key\r\nbunx elizaos start --character=./characters/sample.json\r\n\r\n# ✅ Agent now correctly reads exported variables (FIXED)\r\n# ✅ runtime.getSetting(\"POSTGRES_URL\") returns the correct value\r\n```\r\n\r\n**Test 3: Mixed approach (both .env and exports)**\r\n```bash\r\n# .env has some vars\r\necho 'POSTGRES_URL=postgresql://localhost:5432/test' > .env\r\n\r\n# Override with export (export should win because it's already in process.env)\r\nexport POSTGRES_URL=postgresql://production:5432/eliza\r\nbunx elizaos start --character=./characters/sample.json\r\n\r\n# ✅ Uses the exported value (not the .env value)\r\n```\r\n\r\n**Test 4: Server standalone (without CLI)**\r\n```typescript\r\nimport { AgentServer } from '@elizaos/server';\r\n\r\n// Set env var before importing\r\nprocess.env.POSTGRES_URL = 'postgresql://localhost:5432/test';\r\n\r\nconst server = new AgentServer();\r\nawait server.start({\r\n  port: 3000,\r\n  agents: [{ character: myCharacter }]\r\n});\r\n// ✅ Works because Server calls loadEnvFile() at initialization\r\n```\r\n\r\n## Environment Variable Loading Flow (After Fix)\r\n\r\n```\r\n┌─────────────────────────────────────────────────────────────┐\r\n│                     Deployment Context                       │\r\n└─────────────────────────────────────────────────────────────┘\r\n                              │\r\n                              ▼\r\n        ┌─────────────────────────────────────────────┐\r\n        │          Where do env vars come from?       │\r\n        └─────────────────────────────────────────────┘\r\n                              │\r\n           ┌──────────────────┼──────────────────┐\r\n           │                  │                  │\r\n           ▼                  ▼                  ▼\r\n    ┌──────────┐      ┌──────────┐      ┌──────────┐\r\n    │.env file │      │ export   │      │ System   │\r\n    │  (CLI)   │      │VAR=value │      │ env vars │\r\n    └──────────┘      └──────────┘      └──────────┘\r\n           │                  │                  │\r\n           │                  │                  │\r\n           └──────────────────┼──────────────────┘\r\n                              │\r\n                              ▼\r\n                       ┌─────────────┐\r\n                       │ process.env │ ← All sources merged here\r\n                       └─────────────┘\r\n                              │\r\n                              ▼\r\n                    ┌──────────────────┐\r\n                    │loadSecretsNodeImpl│ ← Reads process.env\r\n                    └──────────────────┘\r\n                              │\r\n                              ▼\r\n                  ┌────────────────────────┐\r\n                  │character.settings.secrets│\r\n                  └────────────────────────┘\r\n                              │\r\n                              ▼\r\n                      ┌──────────────┐\r\n                      │runtime.getSetting()│ ✅ Works!\r\n                      └──────────────┘\r\n```\r\n\r\n## Benefits\r\n\r\n1. ✅ **Exported variables work** - `export FOO=bar` is now accessible (main fix)\r\n2. ✅ **No `.env` file required** - Works in environments without `.env` files\r\n3. ✅ **Backward compatible** - `.env` files still work as before\r\n4. ✅ **Production-ready** - Secrets can be injected via environment, not files\r\n5. ✅ **Container-friendly** - Works with Docker, ECS, Kubernetes env injection\r\n6. ✅ **Simpler code** - No need to re-read `.env` file\r\n7. ✅ **Consistent behavior** - Works the same in all environments\r\n8. ✅ **Idempotent** - Safe to call `loadEnvFile()` multiple times",
      "repository": "elizaos/eliza",
      "createdAt": "2025-11-10T21:55:04Z",
      "mergedAt": "2025-11-12T11:03:00Z",
      "additions": 363,
      "deletions": 284
    },
    {
      "id": "PR_kwDOMT5cIs6yifTM",
      "title": "fix: RLS (Row-Level Security) server_id validation checks blocking all users when RLS isolation is disabled.",
      "author": "standujar",
      "number": 6139,
      "body": "# Relates to\r\n\r\nFix for RLS (Row-Level Security) server_id validation checks blocking all users when RLS isolation is disabled.\r\n\r\nMaybe: https://github.com/elizaOS/eliza/issues/6138\r\n\r\n# Risks\r\n\r\n**Low**. Changes only affect RLS security checks in messaging API endpoints. When `ENABLE_RLS_ISOLATION=false` (default), validation is skipped for backward compatibility.\r\n\r\n# Background\r\n\r\n## What does this PR do?\r\n\r\nMakes RLS server_id validation checks conditional based on `ENABLE_RLS_ISOLATION` environment variable:\r\n- When `true`: Enforces strict server_id matching (multi-tenant isolation)\r\n- When `false`: Skips validation (backward compatible, no breaking changes)\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# Documentation changes needed?\r\n\r\nMy changes do not require a change to the project documentation.\r\n\r\n# Testing\r\n\r\n## Where should a reviewer start?\r\n\r\nReview the conditional RLS logic in:\r\n- [packages/server/src/api/messaging/core.ts](../packages/server/src/api/messaging/core.ts) (3 endpoints)\r\n- [packages/server/src/api/messaging/channels.ts](../packages/server/src/api/messaging/channels.ts) (2 endpoints)\r\n\r\n## Detailed testing steps\r\n\r\nRun test suite:\r\n```bash\r\nbun test packages/server/src/__tests__/rls-server.test.ts\r\nAll 44 tests pass, including new conditional validation tests for:\r\nPOST /submit\r\nPOST /action\r\nPATCH /action/:id\r\nPOST /central-channels/:channelId/messages\r\nPOST /central-channels\r\nTest coverage\r\n✅ RLS enabled + matching server_id → Accept\r\n✅ RLS enabled + mismatched server_id → Reject (403)\r\n✅ RLS disabled + any server_id → Accept\r\n✅ RLS undefined + any server_id → Accept",
      "repository": "elizaos/eliza",
      "createdAt": "2025-11-10T13:48:36Z",
      "mergedAt": "2025-11-11T17:37:59Z",
      "additions": 237,
      "deletions": 21
    },
    {
      "id": "PR_kwDOMT5cIs6ybkFD",
      "title": "chore: rm the message emit in src api to avoid race condition",
      "author": "tungpun",
      "number": 6137,
      "body": "# Relates to\r\n\r\n\r\n# Risks\r\n\r\n**Low** - This change removes a duplicate message emit that was causing race conditions. The message is still properly emitted through `serverInstance.createMessage()`, so there is no risk of losing message processing functionality. The change only affects the `/central-channels/:channelId/messages` endpoint in the channels router.\r\n\r\n# Background\r\n\r\n## What does this PR do?\r\n\r\nThis PR removes a duplicate `internalMessageBus.emit('new_message', messageForBus)` call from the `/central-channels/:channelId/messages` endpoint in `packages/server/src/api/messaging/channels.ts`. \r\n\r\nThe message is already emitted as a root message when `serverInstance.createMessage(newRootMessageData)` is called (see `packages/server/src/index.ts` lines 1702-1723), which automatically publishes the message to the internal message bus for agent consumption.\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\nWhen a message was created through the `/central-channels/:channelId/messages` endpoint, it was being emitted to the internal message bus twice:\r\n1. Once in `serverInstance.createMessage()` (which is the correct place)\r\n2. Once again explicitly in the channels router endpoint\r\n\r\nThis double emission caused a race condition where the message processing race check in `DefaultMessageService.processMessage()` (see `packages/core/src/services/default-message-service.ts` lines 361-374) would fail, resulting in the error: **\"Response discarded - newer message being processed for agent\"**.\r\n\r\nBy removing the duplicate emit, messages are now only emitted once through the proper channel (`serverInstance.createMessage()`), eliminating the race condition and ensuring messages are processed correctly.\r\n\r\n# Documentation changes needed?\r\n\r\nMy changes do not require a change to the project documentation.\r\n\r\n# Testing\r\n\r\n## Where should a reviewer start?\r\n\r\nReview the change in `packages/server/src/api/messaging/channels.ts` around line 245, where the duplicate `internalMessageBus.emit()` call was removed. Verify that `serverInstance.createMessage()` in `packages/server/src/index.ts` still properly emits messages to the internal message bus.\r\n\r\n## Detailed testing steps\r\n\r\n1. **Verify message emission still works:**\r\n   - Send a message through the `/central-channels/:channelId/messages` endpoint\r\n   - Verify that the message is properly emitted to the internal message bus (check logs for `[AgentServer] Published message {id} to internal message bus`)\r\n   - Verify that agents can still process messages from the GUI\r\n\r\n2. **Verify race condition is fixed:**\r\n   - Send multiple messages in quick succession through the GUI\r\n   - Verify that messages are processed correctly without the \"Response discarded - newer message being processed for agent\" error\r\n   - Check that agent responses are generated properly\r\n\r\n3. **Verify no duplicate processing:**\r\n   - Monitor the internal message bus logs\r\n   - Confirm that each message is only emitted once (not twice)\r\n   - Verify that agents receive each message exactly once\r\n\r\nNone: Automated tests are acceptable.",
      "repository": "elizaos/eliza",
      "createdAt": "2025-11-10T04:39:54Z",
      "mergedAt": null,
      "additions": 0,
      "deletions": 1
    }
  ],
  "codeChanges": {
    "additions": 0,
    "deletions": 0,
    "files": 0,
    "commitCount": 11
  },
  "completedItems": [],
  "topContributors": [
    {
      "username": "standujar",
      "avatarUrl": "https://avatars.githubusercontent.com/u/16385918?u=718bdcd1585be8447bdfffb8c11ce249baa7532d&v=4",
      "totalScore": 73.16446258167224,
      "prScore": 72.82446258167224,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0.33999999999999997,
      "summary": null
    },
    {
      "username": "tungpun",
      "avatarUrl": "https://avatars.githubusercontent.com/u/5058370?u=59cb956de322867be56c0abee49ab3f28f819e2f&v=4",
      "totalScore": 13.943573590279971,
      "prScore": 13.943573590279971,
      "issueScore": 0,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    },
    {
      "username": "humuhimi",
      "avatarUrl": "https://avatars.githubusercontent.com/u/35215680?u=029a1ed6ea6a26ebf1cfd081cba6af2e6d32ef6d&v=4",
      "totalScore": 4.3,
      "prScore": 0,
      "issueScore": 4.1,
      "reviewScore": 0,
      "commentScore": 0.2,
      "summary": null
    },
    {
      "username": "christophwallacher-web",
      "avatarUrl": "https://avatars.githubusercontent.com/u/233379771?v=4",
      "totalScore": 2,
      "prScore": 0,
      "issueScore": 2,
      "reviewScore": 0,
      "commentScore": 0,
      "summary": null
    }
  ],
  "newPRs": 3,
  "mergedPRs": 0,
  "newIssues": 2,
  "closedIssues": 1,
  "activeContributors": 4
}