 131868bdca
			
		
	
	131868bdca
	
	
	
		
			
			Major security, observability, and configuration improvements:
## Security Hardening
- Implemented configurable CORS (no more wildcards)
- Added comprehensive auth middleware for admin endpoints
- Enhanced webhook HMAC validation
- Added input validation and rate limiting
- Security headers and CSP policies
## Configuration Management
- Made N8N webhook URL configurable (WHOOSH_N8N_BASE_URL)
- Replaced all hardcoded endpoints with environment variables
- Added feature flags for LLM vs heuristic composition
- Gitea fetch hardening with EAGER_FILTER and FULL_RESCAN options
## API Completeness
- Implemented GetCouncilComposition function
- Added GET /api/v1/councils/{id} endpoint
- Council artifacts API (POST/GET /api/v1/councils/{id}/artifacts)
- /admin/health/details endpoint with component status
- Database lookup for repository URLs (no hardcoded fallbacks)
## Observability & Performance
- Added OpenTelemetry distributed tracing with goal/pulse correlation
- Performance optimization database indexes
- Comprehensive health monitoring
- Enhanced logging and error handling
## Infrastructure
- Production-ready P2P discovery (replaces mock implementation)
- Removed unused Redis configuration
- Enhanced Docker Swarm integration
- Added migration files for performance indexes
## Code Quality
- Comprehensive input validation
- Graceful error handling and failsafe fallbacks
- Backwards compatibility maintained
- Following security best practices
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
		
	
		
			
				
	
	
		
			132 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Package log provides a global logger for zerolog.
 | |
| package log
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"fmt"
 | |
| 	"io"
 | |
| 	"os"
 | |
| 
 | |
| 	"github.com/rs/zerolog"
 | |
| )
 | |
| 
 | |
| // Logger is the global logger.
 | |
| var Logger = zerolog.New(os.Stderr).With().Timestamp().Logger()
 | |
| 
 | |
| // Output duplicates the global logger and sets w as its output.
 | |
| func Output(w io.Writer) zerolog.Logger {
 | |
| 	return Logger.Output(w)
 | |
| }
 | |
| 
 | |
| // With creates a child logger with the field added to its context.
 | |
| func With() zerolog.Context {
 | |
| 	return Logger.With()
 | |
| }
 | |
| 
 | |
| // Level creates a child logger with the minimum accepted level set to level.
 | |
| func Level(level zerolog.Level) zerolog.Logger {
 | |
| 	return Logger.Level(level)
 | |
| }
 | |
| 
 | |
| // Sample returns a logger with the s sampler.
 | |
| func Sample(s zerolog.Sampler) zerolog.Logger {
 | |
| 	return Logger.Sample(s)
 | |
| }
 | |
| 
 | |
| // Hook returns a logger with the h Hook.
 | |
| func Hook(h zerolog.Hook) zerolog.Logger {
 | |
| 	return Logger.Hook(h)
 | |
| }
 | |
| 
 | |
| // Err starts a new message with error level with err as a field if not nil or
 | |
| // with info level if err is nil.
 | |
| //
 | |
| // You must call Msg on the returned event in order to send the event.
 | |
| func Err(err error) *zerolog.Event {
 | |
| 	return Logger.Err(err)
 | |
| }
 | |
| 
 | |
| // Trace starts a new message with trace level.
 | |
| //
 | |
| // You must call Msg on the returned event in order to send the event.
 | |
| func Trace() *zerolog.Event {
 | |
| 	return Logger.Trace()
 | |
| }
 | |
| 
 | |
| // Debug starts a new message with debug level.
 | |
| //
 | |
| // You must call Msg on the returned event in order to send the event.
 | |
| func Debug() *zerolog.Event {
 | |
| 	return Logger.Debug()
 | |
| }
 | |
| 
 | |
| // Info starts a new message with info level.
 | |
| //
 | |
| // You must call Msg on the returned event in order to send the event.
 | |
| func Info() *zerolog.Event {
 | |
| 	return Logger.Info()
 | |
| }
 | |
| 
 | |
| // Warn starts a new message with warn level.
 | |
| //
 | |
| // You must call Msg on the returned event in order to send the event.
 | |
| func Warn() *zerolog.Event {
 | |
| 	return Logger.Warn()
 | |
| }
 | |
| 
 | |
| // Error starts a new message with error level.
 | |
| //
 | |
| // You must call Msg on the returned event in order to send the event.
 | |
| func Error() *zerolog.Event {
 | |
| 	return Logger.Error()
 | |
| }
 | |
| 
 | |
| // Fatal starts a new message with fatal level. The os.Exit(1) function
 | |
| // is called by the Msg method.
 | |
| //
 | |
| // You must call Msg on the returned event in order to send the event.
 | |
| func Fatal() *zerolog.Event {
 | |
| 	return Logger.Fatal()
 | |
| }
 | |
| 
 | |
| // Panic starts a new message with panic level. The message is also sent
 | |
| // to the panic function.
 | |
| //
 | |
| // You must call Msg on the returned event in order to send the event.
 | |
| func Panic() *zerolog.Event {
 | |
| 	return Logger.Panic()
 | |
| }
 | |
| 
 | |
| // WithLevel starts a new message with level.
 | |
| //
 | |
| // You must call Msg on the returned event in order to send the event.
 | |
| func WithLevel(level zerolog.Level) *zerolog.Event {
 | |
| 	return Logger.WithLevel(level)
 | |
| }
 | |
| 
 | |
| // Log starts a new message with no level. Setting zerolog.GlobalLevel to
 | |
| // zerolog.Disabled will still disable events produced by this method.
 | |
| //
 | |
| // You must call Msg on the returned event in order to send the event.
 | |
| func Log() *zerolog.Event {
 | |
| 	return Logger.Log()
 | |
| }
 | |
| 
 | |
| // Print sends a log event using debug level and no extra field.
 | |
| // Arguments are handled in the manner of fmt.Print.
 | |
| func Print(v ...interface{}) {
 | |
| 	Logger.Debug().CallerSkipFrame(1).Msg(fmt.Sprint(v...))
 | |
| }
 | |
| 
 | |
| // Printf sends a log event using debug level and no extra field.
 | |
| // Arguments are handled in the manner of fmt.Printf.
 | |
| func Printf(format string, v ...interface{}) {
 | |
| 	Logger.Debug().CallerSkipFrame(1).Msgf(format, v...)
 | |
| }
 | |
| 
 | |
| // Ctx returns the Logger associated with the ctx. If no logger
 | |
| // is associated, a disabled logger is returned.
 | |
| func Ctx(ctx context.Context) *zerolog.Logger {
 | |
| 	return zerolog.Ctx(ctx)
 | |
| }
 |