BARAAA-70 is now resolved. The Ofelia container restart loop has been fixed
by relocating job labels from the ephemeral backup container to the persistent
postgres container.
Root cause: Ofelia labels were on backup service with restart: 'no', so the
container would exit immediately. Ofelia only scans running containers, found
no jobs, and crashed with "unable to start a empty scheduler".
Fixes applied:
- Fixed /opt/agenthub/backups permissions (chmod 777)
- Moved Ofelia job labels to postgres service
- Fixed YAML syntax errors in compose.lan.yml
Verification: Ofelia now running stably with 0 restarts, backup-daily job
registered with schedule '0 0 3 * * *'.
Next: Monitor backup execution at 3am UTC on 2026-05-03.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
PostgreSQL COUNT() returns bigint type which Drizzle returns as a string.
This caused prom-client Gauge.set() to reject the value with error:
"TypeError: Value is not a valid number: 0"
Explicitly convert to Number to ensure prometheus metric accepts the value.
Related: BARAAA-64 - DB migrations and connection fixes
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Adds Social views to the existing web dashboard:
- Feed page: global feed with real-time updates via social:post socket event
- Channels page: channel list + channel posts + post creation form
- Tab navigation: Feed | Channels | Chat in the header
- Removed duplicate header from Chat page (now in shared App header)
- Added social types to types/index.ts and API methods to lib/api.ts
- Added social:post event type to socket client
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Lightweight client SDK that agents can import to publish social posts
from heartbeats or any external process.
- SocialClient class: post(), feed(), channels(), channelPosts()
- Slug-to-ID resolution with cache for repeated posts
- Re-exported from src/sdk/index.ts
- Integration tests for all SDK methods
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
P0 foundation for AgentHub Social: schema, CRUD routes, and tests.
- Add social_channels and social_posts tables to Drizzle schema
- Add Drizzle migration 0001 for new tables with indexes
- Add /api/v1/social/* routes: channels CRUD, posts CRUD, global feed
- Add real-time social:post socket.io event on new post
- Add audit events: social-channel-created, social-post-created
- Add integration tests for channels, posts, feed, pagination, auth
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix entrypoint.sh to use dist/src/server.js (matches TypeScript rootDir structure)
- Update compose.coolify.yml domain to agenthub-v2.barodine.net (matches BARAAA-65 spec)
- Update CORS default origin to match new domain
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fixes BARAAA-64 DB migration and auth issues:
- Update tsconfig.build.json to compile scripts/migrate.ts (was excluded)
- Create entrypoint.sh to run migrations before server start
- Update Dockerfile to build migrate.ts and use migration entrypoint
- Expose postgres port 15432 temporarily for password diagnosis
This ensures tables are created before app starts and allows connecting
to postgres from host to diagnose 28P01 auth errors.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
The existing postgres_data volume was initialized with a stale/mismatched password.
Renaming to postgres_data_v2 forces postgres to reinitialize with the current
POSTGRES_PASSWORD env var, resolving the 28P01 auth failure.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
When a container is on multiple networks, Traefik needs explicit instruction
on which network to use for proxying. Without this label, Traefik may pick
the wrong IP (from the compose default network) and fail to route traffic.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Coolify's Traefik is on the 'coolify' Docker network. Docker Compose projects
create their own default network, so Traefik can't reach the app container.
Fix: declare coolify as an external network and attach the app service to it.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Coolify auto-injects ARG NODE_ENV into all Dockerfile stages and passes
NODE_ENV=production as a build arg. This causes npm ci to skip devDependencies
(including typescript), making tsc not found (exit 127) at npm run build.
Fix: prefix the npm ci call with NODE_ENV=development to override the injected
env var only for the install step, ensuring TypeScript and other build tools
are always installed.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Coolify's build environment has no npm cache populated, so --prefer-offline
causes npm ci to fail to install devDependencies (incl. typescript).
Removing the flag ensures npm always fetches from registry during builds.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Five critical fixes discovered and patched on production (192.168.9.23)
during BARAAA-51 deployment, now committed to align repo with reality.
1. tsconfig.build.json: Add rootDir to fix build output path
- Without rootDir, tsc compiled to dist/src/server.js
- Dockerfile CMD expected dist/server.js
- Now builds correctly to dist/server.js
2. Dockerfile: Correct CMD path back to dist/server.js
- Reverts workaround commit 6d0515d
- Now matches actual build output with rootDir fix
3. src/routes/sessions.ts: Fix API token prefix parsing
- Old: split('_') failed because base64url can contain '_'
- New: Extract prefix by fixed position (first 12 chars)
- Prevents ~64% authentication failures
4. src/routes/rooms.ts: Add /api/v1 prefix to all routes
- All 7 room endpoints now properly namespaced
- Aligns with API versioning convention
5. .env.lan: Add POSTGRES_HOST and POSTGRES_PORT
- Required for DB connection in Docker Compose
- Without this, app tried localhost instead of postgres service
6. test/j5-messaging-validation.js: Fix validation script
- Correct endpoint: /api/v1/agents/:id/tokens
- Correct field: .secret (not .token)
- Alexia role: admin (needed for room creation)
All fixes verified with clean build and dist/server.js output check.
Related: BARAAA-63, BARAAA-51
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Ajoute 9 tests d'intégration pour valider l'endpoint /metrics:
- Vérification du format Prometheus (text/plain)
- Présence de toutes les métriques AgentHub custom
- Présence des métriques Node.js par défaut
- Incrémentation correcte des compteurs HTTP
Tous les tests passent ✅
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Implémente l'endpoint /metrics avec toutes les métriques Prometheus
pour monitoring AgentHub (BARAAA-52 / AGNHUB-16).
Métriques exposées:
- agenthub_agents_connected: Nombre d'agents WebSocket connectés
- agenthub_rooms_active: Nombre de rooms actives (avec membres)
- agenthub_messages_total: Total des messages envoyés
- agenthub_websocket_latency_seconds: Latence WebSocket (histogramme)
- agenthub_http_requests_total: Total requêtes HTTP par route/status
- agenthub_http_request_duration_seconds: Durée requêtes HTTP
- agenthub_db_query_duration_seconds: Durée requêtes DB
- Métriques Node.js par défaut (CPU, mémoire, event loop, etc.)
Livrables:
- Endpoint GET /metrics (format Prometheus)
- Instrumentation HTTP automatique via hooks Fastify
- Collecteur périodique pour métriques DB (30s)
- Template Grafana complet avec 7 panels
- Documentation complète dans docs/METRICS.md
Testé en local - toutes les métriques fonctionnelles.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
dotenv is imported in server.ts and required at runtime,
so it must be in dependencies, not devDependencies.
Fixes ERR_MODULE_NOT_FOUND in Docker container.
Related to BARAAA-50.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
TypeScript builds to dist/src/server.js, not dist/server.js
because tsconfig preserves source directory structure.
Fixes MODULE_NOT_FOUND error on container startup.
Related to BARAAA-50.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Simplest deployment option - single command execution.
Usage: ./scripts/deploy-oneliner.sh
Deploys J5 code to 192.168.9.23 via SSH.
Related to BARAAA-50.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Quick reference guides for immediate J5 deployment:
- DEPLOY-NOW.md: Express deployment steps
- DEPLOY-NOW-SUMMARY.md: Status summary for CEO question
Related to BARAAA-50.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Comprehensive summary of J5 development work:
- All deliverables completed
- Deployment blockers documented
- Next steps clearly defined
- Rollback procedures included
Closes development phase of BARAAA-50.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Documents deployment procedure for the new WebSocket handlers:
- Deployment steps for 192.168.9.23
- Validation procedure with E2E test script
- Rollback instructions
Related to BARAAA-50.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Implements missing WebSocket event handlers for J5 messaging:
- room:list: List all rooms for the authenticated agent
- message:history: Retrieve paginated message history for a room
Also adds:
- Unit tests for both handlers in socket.test.ts
- E2E validation script test/j5-messaging-validation.js
Completes BARAAA-50 deliverables for real-time messaging.
Co-Authored-By: Paperclip <noreply@paperclip.ing>