35915ff0cb
- Remove all REST endpoints, replace with WebSocket message-based API
- Add WebSocket gateway with Hub and Client for connection management
- Add WebSocket handlers for Task, Agent, and Orchestrator services
- Add task subscription support for real-time ACP notifications
- Update all documentation to reflect WebSocket-first architecture
- Replace docs/openapi.yaml with docs/asyncapi.yaml
- Update e2e tests to use WebSocket via websocat
WebSocket endpoint: ws://localhost:8080/ws
Message format: {id, type, action, payload, timestamp}
Available actions:
- Board: board.list, board.create, board.get, board.update, board.delete
- Column: column.list, column.create, column.get
- Task: task.list, task.create, task.get, task.update, task.delete,
task.move, task.state, task.subscribe, task.unsubscribe
- Agent: agent.list, agent.launch, agent.status, agent.logs, agent.stop,
agent.prompt, agent.cancel, agent.session, agent.types
- Orchestrator: orchestrator.status, orchestrator.queue, orchestrator.trigger,
orchestrator.start, orchestrator.stop, orchestrator.prompt,
orchestrator.complete
- Health: health.check
40 lines
892 B
Go
40 lines
892 B
Go
package websocket
|
|
|
|
import (
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"github.com/kandev/kandev/internal/common/logger"
|
|
ws "github.com/kandev/kandev/pkg/websocket"
|
|
)
|
|
|
|
// Gateway represents the unified WebSocket gateway
|
|
type Gateway struct {
|
|
Hub *Hub
|
|
Dispatcher *ws.Dispatcher
|
|
Handler *Handler
|
|
logger *logger.Logger
|
|
}
|
|
|
|
// NewGateway creates a new WebSocket gateway with all components initialized
|
|
func NewGateway(log *logger.Logger) *Gateway {
|
|
dispatcher := ws.NewDispatcher()
|
|
hub := NewHub(dispatcher, log)
|
|
handler := NewHandler(hub, log)
|
|
|
|
// Register health check handler
|
|
RegisterHealthHandler(dispatcher)
|
|
|
|
return &Gateway{
|
|
Hub: hub,
|
|
Dispatcher: dispatcher,
|
|
Handler: handler,
|
|
logger: log,
|
|
}
|
|
}
|
|
|
|
// SetupRoutes adds the WebSocket routes to the Gin engine
|
|
func (g *Gateway) SetupRoutes(router *gin.Engine) {
|
|
router.GET("/ws", g.Handler.HandleConnection)
|
|
}
|
|
|