db as source of truth: wiki→seeds, archive old artifacts, knowledge ingestion

- Migrations 010 (content_hash) + 011 (search tsvector column)
- new: internal/knowledge/seed.go — knowledge seed ingest engine
- new: internal/httpapi/knowledge.go — SearchKnowledge + GetEntityKnowledge
- wire knowledge ingest into oikos seed pipeline
- convert all 36 wiki docs + 6 investigations + 12 runbooks → seeds/knowledge.yaml
- archive: knowledge/wiki/→archive/, oikos/cards/→archive/, .hermes/plans/→archive/
- delete: 9 superseded Python kernel files, ledger/, mcp/build_host_files.py
- remove empty knowledge/ directory tree
This commit is contained in:
2026-07-07 20:22:30 +02:00
parent b2bfa26f64
commit 6b75f7302d
125 changed files with 7557 additions and 1938 deletions

View File

@@ -14,6 +14,7 @@ import (
"github.com/dtoro/oikos/internal/config"
"github.com/dtoro/oikos/internal/db"
"github.com/dtoro/oikos/internal/httpapi"
"github.com/dtoro/oikos/internal/knowledge"
"github.com/dtoro/oikos/internal/notifier"
"github.com/dtoro/oikos/internal/observability"
"github.com/dtoro/oikos/internal/scheduler"
@@ -125,6 +126,7 @@ Roles:
notifier Run the notification service (Phase 3)
all Run all roles in one process (dev mode)
secret Secret management (Phase 5)
knowledge Convert wiki to knowledge seed (one-shot)
version Print version info
Environment:
@@ -230,6 +232,32 @@ func runSeed(ctx context.Context, cfg config.Config) error {
return err
}
// Ingest knowledge seed (documents, investigations, runbooks)
knContent, err := os.ReadFile(seedsDir + "/knowledge.yaml")
if err != nil {
if os.IsNotExist(err) {
slog.Info("knowledge seed not found, skipping")
} else {
return fmt.Errorf("read knowledge seed: %w", err)
}
} else {
err = pool.SeedIngest(ctx, "knowledge.yaml", knContent,
func(ctx context.Context, tx pgx.Tx, data map[string]any) error {
r, err := knowledge.Ingest(ctx, tx, data)
if err != nil {
return err
}
slog.Info("knowledge ingested",
"documents", r.Documents,
"investigations", r.Investigations,
"runbooks", r.Runbooks)
return nil
})
if err != nil {
return err
}
}
slog.Info("seed ingest complete")
return nil
}