Add four new infrastructure packages with CLI commands: - pkg/config: layered configuration (defaults → file → env → flags) - pkg/crypt: crypto primitives (Argon2id, AES-GCM, ChaCha20, HMAC, checksums) - pkg/plugin: plugin system with GitHub-based install/update/remove - pkg/collect: collection subsystem (GitHub, BitcoinTalk, market, papers, excavate) Fix all golangci-lint issues across the entire codebase (~100 errcheck, staticcheck SA1012/SA1019/ST1005, unused, ineffassign fixes) so that `core go qa` passes with 0 issues. Closes #167, #168, #170, #250, #251, #252, #253, #254, #255, #256 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
58 lines
1.4 KiB
Go
58 lines
1.4 KiB
Go
package ai
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/host-uk/core/pkg/rag"
|
|
)
|
|
|
|
// TaskInfo carries the minimal task data needed for RAG queries,
|
|
// avoiding a direct dependency on pkg/agentic (which imports pkg/ai).
|
|
type TaskInfo struct {
|
|
Title string
|
|
Description string
|
|
}
|
|
|
|
// QueryRAGForTask queries Qdrant for documentation relevant to a task.
|
|
// It builds a query from the task title and description, queries with
|
|
// sensible defaults, and returns formatted context. Returns "" on any
|
|
// error (e.g. Qdrant/Ollama not running) for graceful degradation.
|
|
func QueryRAGForTask(task TaskInfo) string {
|
|
query := task.Title + " " + task.Description
|
|
|
|
// Truncate to 500 runes to keep the embedding focused.
|
|
runes := []rune(query)
|
|
if len(runes) > 500 {
|
|
query = string(runes[:500])
|
|
}
|
|
|
|
qdrantCfg := rag.DefaultQdrantConfig()
|
|
qdrantClient, err := rag.NewQdrantClient(qdrantCfg)
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
defer func() { _ = qdrantClient.Close() }()
|
|
|
|
ollamaCfg := rag.DefaultOllamaConfig()
|
|
ollamaClient, err := rag.NewOllamaClient(ollamaCfg)
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
|
defer cancel()
|
|
|
|
queryCfg := rag.QueryConfig{
|
|
Collection: "hostuk-docs",
|
|
Limit: 3,
|
|
Threshold: 0.5,
|
|
}
|
|
|
|
results, err := rag.Query(ctx, qdrantClient, ollamaClient, query, queryCfg)
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
|
|
return rag.FormatResultsContext(results)
|
|
}
|