Commit Graph

364 Commits

Author SHA1 Message Date
32c35d327b fix(ci): Use docker:dind with manual login instead of buildx plugin
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
The buildx plugin's credential handling doesn't work properly with
Harbor. The docker-auth-test step proved that standard docker login
works, so we switch to:
- docker:dind image
- Manual docker login before build
- Standard docker build and docker push

This bypasses buildx's separate credential store issue.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-01 17:31:05 -06:00
211c532fb0 fix(ci): Add auth debug step, switch back to buildx
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Added a docker-auth-test step that:
- Shows credential lengths (for debugging)
- Tests docker login directly with Harbor

This will help identify if the issue is with secrets injection
or with how buildx handles authentication.

Reverted to woodpeckerci/plugin-docker-buildx since plugins/docker
requires server-side WOODPECKER_PLUGINS_PRIVILEGED config.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-01 17:24:51 -06:00
b1be63edd6 fix(ci): Correct repo path format for plugins/docker
The repo setting should NOT include the registry prefix - the
registry setting handles that separately.

Changed repo: reg.mosaicstack.dev/mosaic/api -> repo: mosaic/api

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-01 17:23:49 -06:00
da038d3df2 fix(ci): Switch from buildx to plugins/docker for Harbor auth
The woodpeckerci/plugin-docker-buildx plugin was failing with
"insufficient_scope: authorization failed" when pushing to Harbor,
even though the same credentials worked locally.

Switched to the standard plugins/docker which uses traditional
docker login authentication that may work better with Harbor.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-01 17:13:58 -06:00
e1ed98b038 fix: Remove privileged flag (not allowed), keep debug
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 16:18:42 -06:00
55b2ddb58a fix: Add privileged and debug flags to docker-buildx steps
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 16:18:15 -06:00
8ca0b45fcb fix: Allow docker builds on manual pipeline triggers
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
ci/woodpecker/manual/woodpecker Pipeline failed
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 15:10:59 -06:00
cd727f619f feat: Add debug output to Dockerfiles and .dockerignore
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
ci/woodpecker/manual/woodpecker Pipeline was successful
- Add .dockerignore to exclude node_modules, dist, and build artifacts
- Add pre/post build directory listings to diagnose dist not found issue
- Disable turbo cache temporarily with --force flag
- Add --verbosity=2 for more detailed turbo output

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 14:50:13 -06:00
763409cbb4 fix: Remove registry prefix from repo paths in Woodpecker
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
The docker-buildx plugin automatically prepends registry to repo,
so having the full URL caused doubled paths:
reg.mosaicstack.dev/reg.mosaicstack.dev/mosaic/api

Changed from: repo: reg.mosaicstack.dev/mosaic/api
Changed to:   repo: mosaic/api

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 13:45:29 -06:00
45483934c3 Merge branch 'fix/harbor-registry-url' into develop
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2026-02-01 13:39:38 -06:00
442c2f7de2 fix: Dockerfile COPY order - node_modules must come after source
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Docker COPY replaces directory contents, so copying source code
after node_modules was wiping the deps. Reordered to:
1. Copy source code first
2. Copy node_modules second (won't be overwritten)

Fixes API build failure: "dist not found"

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 13:39:25 -06:00
728f68f877 Merge pull request 'fix(ci): Update Harbor registry URL to reg.mosaicstack.dev' (#178) from fix/harbor-registry-url into develop
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2026-02-01 19:26:17 +00:00
365975d76e fix(ci): Update Harbor registry URL to reg.mosaicstack.dev
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
ci/woodpecker/pr/woodpecker Pipeline failed
Changed from reg.diversecanvas.com to reg.mosaicstack.dev

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 13:25:55 -06:00
1bfdd57f04 Merge pull request 'Release: CI/CD Pipeline & Architecture Updates' (#177) from develop into main
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Reviewed-on: #177
2026-02-01 19:18:47 +00:00
4b943fb997 feat: Add Docker build & push to Woodpecker CI pipeline
All checks were successful
ci/woodpecker/manual/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
- Add docker-build-api, docker-build-web, docker-build-postgres steps
- Images pushed to reg.diversecanvas.com/mosaic/* on main/develop
- Create docker-compose.prod.yml for production deployments
- Add .env.prod.example with production configuration

Requires Harbor secrets in Woodpecker:
- harbor_username
- harbor_password

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 01:50:02 -06:00
9246f56687 fix(api): Add AuthModule import to modules using AuthGuard
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Modules using AuthGuard in their controllers need to import AuthModule
to make AuthService available for dependency injection.

Fixed:
- ActivityModule
- WorkspaceSettingsModule

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 01:48:09 -06:00
fb0f6b5b62 fix(docker): Fix module resolution and healthcheck syntax
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Issues fixed:
1. Module not found: Added missing copy of apps/{api,web}/node_modules
   which contains pnpm symlinks to the root node_modules

2. Healthcheck syntax: Fixed broken quoting from prettier reformatting
   Changed to CMD-SHELL with proper escaping

3. Removed obsolete version: "3.9" from docker-compose.yml

The apps need their own node_modules directories because pnpm uses
symlinks that point from apps/*/node_modules to node_modules/.pnpm/*

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 01:37:30 -06:00
aa17b9cb3b fix(docker): Make port configuration consistent and dynamic
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Fixed the mismatch between environment variables:
- docker-compose now passes PORT (what NestJS/Next.js read) instead of API_PORT
- API_PORT/WEB_PORT control host mapping, PORT controls container

Changes:
- docker-compose: Pass PORT=${API_PORT} and PORT=${WEB_PORT} to containers
- docker-compose: Dynamic port mapping on both host and container sides
- docker-compose: Traefik labels use ${API_PORT}/${WEB_PORT} variables
- docker-compose: Healthchecks use PORT env var
- Dockerfiles: Removed hardcoded port values
- Dockerfiles: Healthchecks read PORT at runtime

This allows changing ports via API_PORT/WEB_PORT environment variables
and have all components (app, healthcheck, Traefik) use the correct port.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 01:29:15 -06:00
8f63b3e1dc docs: Add Mosaic Component Architecture and Guard Rails design docs
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- mosaic-component-architecture.md: OpenClaw wrapper pattern, component naming,
  job tracking, chat integration, database schema
- guard-rails-capability-permissions.md: Capability-based permission model

Related: #162 (M4.2 Infrastructure Epic)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 01:26:01 -06:00
e045cb5a45 perf(docker): Add BuildKit cache mounts for faster builds
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Added cache mounts for:
- pnpm store: Caches downloaded packages between builds
- TurboRepo: Caches build outputs between builds

This significantly speeds up subsequent builds:
- First build: Full download and compile
- Subsequent builds: Only changed packages are re-downloaded/rebuilt

Requires Docker BuildKit (default in Docker 23+).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 01:22:51 -06:00
353f04f950 fix(docker): Ensure public directory exists in web builder
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
The production stage was failing because it tried to copy the public
directory which doesn't exist in the source. Added mkdir -p to ensure
the directory exists (even if empty) before the production stage
tries to copy it.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 01:15:34 -06:00
38f22f0b4e fix(scripts): Improve base URL configuration display clarity
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
When detecting existing configuration, the setup script now shows a
detailed breakdown instead of just "Current base URL: ...":

  Mode:    Traefik reverse proxy

  Web URL: https://app.mosaicstack.dev
  API URL: https://api.mosaicstack.dev
  Auth:    https://auth.mosaicstack.dev

This makes it clear:
- What access mode is configured (localhost/IP/domain/Traefik)
- What each URL is used for (Web UI, API, Authentication)
- Whether to change the configuration

Added helper functions:
- detect_access_mode(): Determines mode from existing .env values
- display_access_config(): Formats the URL breakdown display

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 00:57:23 -06:00
0495c48418 fix(docker): Copy node_modules from builder instead of reinstalling
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
pnpm stores the Prisma client in the content-addressable store at
node_modules/.pnpm/.../.prisma, not at apps/api/node_modules/.prisma.
The production stage was trying to copy from the wrong location.

Additionally, running `pnpm install --prod` in production failed because:
1. The husky prepare script runs but husky is a devDependency
2. The Prisma client postinstall can't run without the prisma CLI

Fixed by copying the full node_modules from the builder stage, which
already has all dependencies properly installed and the Prisma client
generated in the correct pnpm store location.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 00:42:34 -06:00
7ee08865fd fix(docker): Use TurboRepo to build workspace dependencies
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
The Docker builds were failing because they ran `pnpm build` directly
in the app directories without first building workspace dependencies
(@mosaic/shared, @mosaic/ui). CI passed because it runs TurboRepo
from the root which respects the dependency graph.

Changed both Dockerfiles to use `pnpm turbo build --filter=@mosaic/{app}`
which ensures dependencies are built in the correct order:
- Web: @mosaic/config → @mosaic/shared → @mosaic/ui → @mosaic/web
- API: @mosaic/config → @mosaic/shared → prisma:generate → @mosaic/api

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 00:37:34 -06:00
a84d06815e fix(docker): Make prepare script work in production builds
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
The husky prepare script was failing during Docker production builds
because husky is a devDependency and isn't available when running
`pnpm install --prod --frozen-lockfile`.

Changed from `husky install` (deprecated in v9+) to `husky || true`
which gracefully handles the case when husky isn't installed.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 00:30:37 -06:00
8c8d065cc2 feat(arch): Add Guard Rails capability-based permission system design
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Guard Rails complement Quality Rails by controlling what agents can do:
- Capability-based permissions (resource:action pattern)
- Read/organize/draft allowed by default
- Execute/admin require explicit grants
- Human-in-the-loop approval for sensitive actions

Examples: email (read/draft , send ), git (commit , force push )

Also:
- Add .admin-credentials and .env.bak.* to .gitignore

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 00:25:53 -06:00
98f80eaf51 fix(scripts): Fix awk env parsing for POSIX compatibility
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
- Use index() instead of regex capture groups for key extraction
- More portable across different awk implementations

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 00:24:31 -06:00
e63c19d158 chore: Cleanup QA reports and improve setup scripts
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Scripts:
- common.sh: Fix select_option to use /dev/tty for interactive prompts
- common.sh: Improve check_docker with detailed error messages
- setup.sh: Add Traefik configuration options
- setup.sh: Add argument validation for --mode, --external-authentik, etc.
- setup.sh: Add fun taglines

QA Reports:
- Remove stale remediation reports
- Keep current pending reports

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 22:53:47 -06:00
cb0948214e feat(auth): Configure Authentik OIDC integration with better-auth
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- Add genericOAuth plugin to auth.config.ts with Authentik provider
- Fix LoginButton to use /auth/signin/authentik (not /auth/callback/)
- Add production URLs to trustedOrigins
- Update .env.example with correct redirect URI documentation

Redirect URI for Authentik: https://api.mosaicstack.dev/auth/callback/authentik

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 18:11:32 -06:00
f2b25079d9 fix(#27): address security issues in intent classification
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- Add input sanitization to prevent LLM prompt injection
  (escapes quotes, backslashes, replaces newlines)
- Add MaxLength(500) validation to DTO to prevent DoS
- Add entity validation to filter malicious LLM responses
- Add confidence validation to clamp values to 0.0-1.0
- Make LLM model configurable via INTENT_CLASSIFICATION_MODEL env var
- Add 12 new security tests (total: 72 tests, from 60)

Security fixes identified by code review:
- CVE-mitigated: Prompt injection via unescaped user input
- CVE-mitigated: Unvalidated entity data from LLM response
- CVE-mitigated: Missing input length validation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 16:50:32 -06:00
fd93be6032 feat: Add comprehensive setup wizard foundation
Modeled after Calibr setup.sh pattern (~/src/calibr/scripts/setup.sh).

Implemented (Foundation):
- Platform detection (Ubuntu, Arch, macOS, Fedora)
- Dependency checking and installation
- Mode selection (Docker vs Native)
- Interactive + non-interactive modes
- Comprehensive logging (clean console + full trace to log file)
- Common utility functions library (450+ lines)

Features in common.sh:
- Output formatting (colors, headers, success/error/warning)
- User input (confirm, select_option)
- Platform detection
- Dependency checking (Docker, Node, pnpm, PostgreSQL)
- Package installation (apt, pacman, dnf, brew)
- Validation (URL, email, port, domain)
- Secret generation (cryptographically secure)
- .env file parsing and management
- Port conflict detection
- File backup with timestamps

To Be Implemented (See scripts/README.md):
- Complete configuration collection
- .env generation with smart preservation
- Port conflict detection
- Password/secret generation
- Authentik blueprint auto-configuration
- Docker deployment execution
- Post-install instructions

Usage:
  ./scripts/setup.sh                    # Interactive
  ./scripts/setup.sh --help             # Show options
  ./scripts/setup.sh --dry-run          # Preview
  ./scripts/setup.sh --non-interactive  # CI/CD

Refs: Setup wizard issue (created)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 16:45:56 -06:00
0eb3abc12c Clean up documents located in the project root.
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2026-01-31 16:42:26 -06:00
d7f04d1148 feat(#27): implement intent classification service
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Implement intent classification for natural language queries in the brain module.

Features:
- Hybrid classification approach: rule-based (fast, <100ms) with optional LLM fallback
- 10 intent types: query_tasks, query_events, query_projects, create_task, create_event, update_task, update_event, briefing, search, unknown
- Entity extraction: dates, times, priorities, statuses, people
- Pattern-based matching with priority system (higher priority = checked first)
- Optional LLM classification for ambiguous queries
- POST /api/brain/classify endpoint

Implementation:
- IntentClassificationService with classify(), classifyWithRules(), classifyWithLlm(), extractEntities()
- Comprehensive regex patterns for common query types
- Entity extraction for dates, times, priorities, statuses, mentions
- Type-safe interfaces for IntentType, IntentClassification, ExtractedEntity, IntentPattern
- ClassifyIntentDto and IntentClassificationResultDto for API validation
- Integrated with existing LlmService (optional dependency)

Testing:
- 60 comprehensive tests covering all intent types
- Edge cases: empty queries, special characters, case sensitivity, multiple whitespace
- Entity extraction tests with position tracking
- LLM fallback tests with error handling
- 100% test coverage
- All tests passing (60/60)
- TDD approach: tests written first

Quality:
- No explicit any types
- Explicit return types on all functions
- No TypeScript errors
- Build successful
- Follows existing code patterns
- Quality Rails compliance: All lint checks pass

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 15:41:10 -06:00
403aba4cd3 docs: Add issue parser estimation strategy
Critical enhancement for real-world usage - parser must handle:
- Unformatted issues (estimate from content)
- Incomplete metadata (best-guess + confidence score)
- Oversized issues (auto-decompose before queuing)

Three-level estimation:
1. Structured metadata → extract directly (95%+ confidence)
2. Content analysis → AI estimates from description (50-95%)
3. Minimal info → defaults + warn user (<50%)

50% rule enforcement:
- Detect issues > 50% of agent's context limit
- Auto-decompose into sub-issues using Opus
- Create sub-issues in Gitea with dependencies
- Label parent as EPIC

Confidence-based workflow:
- ≥60%: Queue automatically
- 30-59%: Queue with warning
- <30%: Don't queue, request more details

Makes coordinator truly autonomous - handles whatever users throw at it.

Refs #158 (COORD-002)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 15:40:34 -06:00
3be60ccd18 docs: Add assignment-based trigger architecture
Implements Phase 0 foundation for non-AI coordinator.

Key features:
- User assigns issue to @mosaic bot user → triggers webhook
- Webhook receiver processes assignment events
- AI agent parses issue metadata (context, difficulty, agent)
- Queue manager tracks dependencies and status
- Orchestration loop spawns agents and monitors progress

Benefits:
- Natural Gitea workflow (just assign issues)
- Visual feedback in Gitea UI
- Granular control (assign what you want)
- Event-driven (webhooks, not polling)
- No CLI needed

Phase 0 issues: #156-161 (6 issues, 290.6K tokens)

Refs #142

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 15:30:21 -06:00
3d6159ae15 fix: address code review issues and cleanup QA reports
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Code review fixes:
- Add error logging to LlmProviderAdminController.testProvider catch block
- Use atomic increment operations in TokenBudgetService.updateUsage to prevent race conditions
- Update test expectations for atomic increment pattern

Cleanup:
- Remove obsolete QA automation reports

All 1169 tests passing.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 15:01:18 -06:00
903109ea40 docs: Add overlap analysis for non-AI coordinator patterns
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Detailed comparison showing:
- Existing doc addresses L-015 (premature completion)
- New doc addresses context exhaustion (multi-issue orchestration)
- ~20% overlap (both use non-AI coordinator, mechanical gates)
- 80% complementary (different problems, different solutions)

Recommends merging into comprehensive document (already done).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 14:47:59 -06:00
a2f06fe75b docs: Add comprehensive non-AI coordinator architecture
Merges two complementary architectural patterns:
1. Quality Enforcement Layer - Prevents premature agent completion
2. Orchestration Layer - Manages multi-agent context and assignment

Key features:
- 50% rule for issue sizing
- Agent profiles and cost optimization
- Context monitoring (compact at 80%, rotate at 95%)
- Mechanical quality gates (build, lint, test, coverage)
- Forced continuation when gates fail
- 4-week PoC plan

Addresses issue #140 and L-015 (Agent Premature Completion)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 14:47:09 -06:00
4b4d21c732 feat(#129): add LLM provider admin API endpoints
Implement REST API endpoints for managing LLM provider instances.

Changes:
- Created DTOs for provider CRUD operations (CreateLlmProviderDto, UpdateLlmProviderDto, LlmProviderResponseDto)
- Implemented LlmProviderAdminController with full CRUD endpoints:
  - GET /llm/admin/providers - List all providers
  - GET /llm/admin/providers/:id - Get provider details
  - POST /llm/admin/providers - Create new provider
  - PATCH /llm/admin/providers/:id - Update provider
  - DELETE /llm/admin/providers/:id - Delete provider
  - POST /llm/admin/providers/:id/test - Test connection
  - POST /llm/admin/reload - Reload from database
- Updated llm-manager.service.ts to support OpenAI and Claude providers
- Added comprehensive test suite with 97.95% coverage
- Proper validation, error handling, and type safety

All tests pass. Pre-commit hooks pass.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 14:37:55 -06:00
772776bfd9 feat(#125): add Claude (Anthropic) LLM provider
Implement Anthropic Claude provider for Claude Opus, Sonnet, and Haiku models.

Implementation details:
- Created ClaudeProvider class implementing LlmProviderInterface
- Added @anthropic-ai/sdk npm package integration
- Implemented chat completion with streaming support
- Claude-specific message format (system prompt separate from messages)
- Static model list (Claude API doesn't provide list models endpoint)
- Embeddings throw error as Claude doesn't support native embeddings
- Added OpenTelemetry tracing with @TraceLlmCall decorator
- 100% statement, function, and line coverage (79% branch coverage)

Tests:
- Created comprehensive test suite with 20 tests
- All tests follow TDD pattern (written before implementation)
- Tests cover initialization, health checks, chat, streaming, and error handling
- Mocked Anthropic SDK client for isolated unit testing

Quality checks:
- All tests pass (1131 total tests across project)
- ESLint passes with no errors
- TypeScript type checking passes
- Follows existing code patterns from OpenAI and Ollama providers

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 14:29:40 -06:00
0fdcfa6ed3 feat(#124): add OpenAI LLM provider
Implement OpenAI provider for GPT-4, GPT-3.5, and other OpenAI models.

Implementation includes:
- OpenAI SDK integration with API key authentication
- Chat completion with streaming support
- Embeddings generation
- Health checks and model listing
- OpenTelemetry tracing
- Comprehensive test suite with 97% coverage

Follows TDD methodology:
- Written tests first (RED phase)
- Implemented minimal code to pass tests (GREEN phase)
- Code passes typecheck, linter, and all quality gates

Test coverage: 97.18% statements, 97.05% lines
All 22 tests passing

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 14:21:38 -06:00
faf6328e0b test(#141): add Non-AI Coordinator integration tests
Comprehensive E2E validation proving coordinator enforces quality
gates and prevents premature completion claims.

Test scenarios (21 tests):
- Rejection Flow: Build/lint/test/coverage gate failures
- Acceptance Flow: All gates pass, required-only pass
- Continuation Flow: Retry, escalation, attempt tracking
- Escalation Flow: Manual review, notifications, history
- Configuration: Workspace-specific, defaults, custom gates
- Performance: Timeout compliance, memory limits
- Complete E2E: Full rejection-continuation-acceptance cycle

Fixtures:
- mock-agent-outputs.ts: Simulated gate execution results
- mock-gate-configs.ts: Various gate configurations

Validates integration of:
- Quality Orchestrator (#134)
- Quality Gate Config (#135)
- Completion Verification (#136)
- Continuation Prompts (#137)
- Rejection Handler (#139)

All 21 tests passing

Fixes #141

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 14:14:56 -06:00
a86d304f07 feat(#139): build Gate Rejection Response Handler
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Implement rejection handling for tasks that fail quality gates after
all continuation attempts are exhausted.

Schema:
- Add TaskRejection model for tracking rejections
- Store failures, attempts, escalation state

Service:
- handleRejection: Main entry point for rejection handling
- logRejection: Database logging
- determineEscalation: Rule-based escalation determination
- executeEscalation: Execute escalation actions
- sendNotification: Notification dispatch
- markForManualReview: Flag tasks for human review
- getRejectionHistory: Query rejection history
- generateRejectionReport: Markdown report generation

Escalation rules:
- max-attempts: Trigger after 3+ attempts
- time-exceeded: Trigger after 2+ hours
- critical-failure: Trigger on security/critical issues

Actions: notify, block, reassign, cancel

Tests: 16 passing with 80% statement coverage

Fixes #139

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 14:01:42 -06:00
0387cce116 feat(#137): create Forced Continuation Prompt System
Implement prompt generation system that produces continuation prompts
based on verification failures to force AI agents to complete work.

Service:
- generatePrompt: Complete prompt from failure context
- generateTestFailurePrompt: Test-specific guidance
- generateBuildErrorPrompt: Build error resolution
- generateCoveragePrompt: Coverage improvement strategy
- generateIncompleteWorkPrompt: Completion requirements

Templates:
- base.template: System/user prompt structure
- test-failure.template: Test fix guidance
- build-error.template: Compilation error guidance
- coverage.template: Coverage improvement strategy
- incomplete-work.template: Completion requirements

Constraint escalation:
- Attempt 1: Normal guidance
- Attempt 2: Focus only on failures
- Attempt 3: Minimal changes only
- Final: Last attempt warning

Priority levels: critical/high/normal based on failure severity

Tests: 24 passing with 95.31% coverage

Fixes #137

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 13:51:46 -06:00
72ae92f5a6 feat(#136): build Completion Verification Engine
Implement verification engine to determine if AI agent work is truly
complete by analyzing outputs and detecting deferred work patterns.

Strategies:
- FileChangeStrategy: Detect TODO/FIXME, placeholders, stubs
- TestOutputStrategy: Validate pass rates, coverage (85%), skipped tests
- BuildOutputStrategy: Detect TS errors, ESLint errors, build failures

Deferred work detection patterns:
- "follow-up", "to be added later"
- "incremental improvement", "future enhancement"
- "TODO: complete", "placeholder implementation"
- "stub", "work in progress", "partially implemented"

Features:
- Confidence scoring (0-100%)
- Verdict system: complete/incomplete/needs-review
- Actionable suggestions for improvements
- Strategy-based extensibility

Integration:
- Complements Quality Orchestrator (#134)
- Uses Quality Gate Config (#135)

Tests: 46 passing with 95.27% coverage

Fixes #136

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 13:44:23 -06:00
4a2909ce1e feat(#135): implement Quality Gate Configuration System
Add database-backed quality gate configuration for workspaces with
full CRUD operations and default gate seeding.

Schema:
- Add QualityGate model with workspace relation
- Support for custom commands and regex patterns
- Enable/disable and ordering support

Service:
- CRUD operations for quality gates
- findEnabled: Get ordered, enabled gates
- reorder: Bulk reorder with transaction
- seedDefaults: Seed 4 default gates
- toOrchestratorFormat: Convert to orchestrator interface

Endpoints:
- GET /workspaces/:id/quality-gates - List
- GET /workspaces/:id/quality-gates/:gateId - Get one
- POST /workspaces/:id/quality-gates - Create
- PATCH /workspaces/:id/quality-gates/:gateId - Update
- DELETE /workspaces/:id/quality-gates/:gateId - Delete
- POST /workspaces/:id/quality-gates/reorder
- POST /workspaces/:id/quality-gates/seed-defaults

Default gates: Build, Lint, Test, Coverage (85%)

Tests: 25 passing with 95.16% coverage

Fixes #135

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 13:33:04 -06:00
a25e9048be feat(#134): design Non-AI Quality Orchestrator service
Implement quality orchestration service to enforce standards on AI
agent work and prevent premature completion claims.

Components:
- QualityOrchestratorService: Core validation and gate execution
- QualityGate interface: Extensible gate definitions
- CompletionClaim/Validation: Track claims and verdicts
- OrchestrationConfig: Per-workspace configuration

Features:
- Validate completions against quality gates (build/lint/test/coverage)
- Run gates with command execution and output validation
- Support string and RegExp output pattern matching
- Smart continuation logic with attempt tracking
- Generate actionable feedback for failed gates
- Strict/lenient mode for gate enforcement
- 5-minute timeout, 10MB output buffer per gate

Default gates:
- Build Check (required)
- Lint Check (required)
- Test Suite (required)
- Coverage Check (optional, 85% threshold)

Tests: 21 passing with 85.98% coverage

Fixes #134

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 13:24:46 -06:00
0c78923138 feat(#133): add workspace-scoped LLM configuration
Implement per-workspace LLM provider and personality configuration
with proper hierarchy (workspace > user > system fallback).

Schema:
- Add WorkspaceLlmSettings model with provider/personality FKs
- One-to-one relation with Workspace
- JSON settings field for extensibility

Service:
- getSettings: Retrieves/creates workspace settings
- updateSettings: Updates with null value support
- getEffectiveLlmProvider: Hierarchy-based provider selection
- getEffectivePersonality: Hierarchy-based personality selection

Endpoints:
- GET /workspaces/:id/settings/llm - Get settings
- PATCH /workspaces/:id/settings/llm - Update settings
- GET /workspaces/:id/settings/llm/effective-provider
- GET /workspaces/:id/settings/llm/effective-personality

Configuration hierarchy:
1. Workspace-configured provider/personality
2. User-specific provider (for providers)
3. System default fallback

Tests: 34 passing with 100% coverage

Fixes #133

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 13:15:36 -06:00
b8805cee50 feat(#132): port MCP (Model Context Protocol) infrastructure
Implement MCP Phase 1 infrastructure for agent tool integration with
central hub, tool registry, and STDIO transport layers.

Components:
- McpHubService: Central registry for MCP server lifecycle
- StdioTransport: STDIO process communication with JSON-RPC 2.0
- ToolRegistryService: Tool catalog management
- McpController: REST API for MCP management

Endpoints:
- GET/POST /mcp/servers - List/register servers
- POST /mcp/servers/:id/start|stop - Lifecycle control
- DELETE /mcp/servers/:id - Unregister
- GET /mcp/tools - List tools
- POST /mcp/tools/:name/invoke - Invoke tool

Features:
- Full JSON-RPC 2.0 protocol support
- Process lifecycle management
- Buffered message parsing
- Type-safe with no explicit any types
- Proper cleanup on shutdown

Tests: 85 passing with 90.9% coverage

Fixes #132

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 13:07:58 -06:00
51e6ad0792 feat(#131): add OpenTelemetry tracing infrastructure
Implement comprehensive distributed tracing for HTTP requests and LLM
operations using OpenTelemetry with GenAI semantic conventions.

Features:
- TelemetryService: SDK initialization with OTLP HTTP exporter
- TelemetryInterceptor: Automatic HTTP request spans
- @TraceLlmCall decorator: LLM operation tracing
- GenAI semantic conventions for model/token tracking
- Graceful degradation when tracing disabled

Instrumented:
- All HTTP requests (automatic spans)
- OllamaProvider chat/chatStream/embed operations
- Token counts, model names, durations

Environment:
- OTEL_ENABLED (default: true)
- OTEL_SERVICE_NAME (default: mosaic-api)
- OTEL_EXPORTER_OTLP_ENDPOINT (default: localhost:4318)

Tests: 23 passing with full coverage

Fixes #131

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 12:55:11 -06:00