mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-24 15:38:12 +02:00
API interne : suites d'un outil et archive recall pour le tour tenu par Rust
/internal/v1/tool/exec rend aussi ce que la boucle Go tire du résultat après l'exécution, et qui demande le disque ou le navigateur (toolStepExtras) : capture de web_screenshot pour la bulle, aperçu du navigateur après une action qui change la page (jamais après une erreur), message qui relaie l'image au modèle (capture avec la vision, see_image). /internal/v1/recall/archive range un bloc verbatim pour l'outil recall : son numéro vient de la séquence bbolt, seul ce process peut le donner. 423 si la mémoire est verrouillée, rien d'écrit en clair. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016tcGfJWefW5kUGoC2wL8cv
This commit is contained in:
5 files changed
+140
-2
No files matched your search
@@ -0,0 +1,48 @@
|
||||
package loki
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"io"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// API interne de l'archive recall (lot 6 de la migration Rust).
|
||||
//
|
||||
// La compaction range VERBATIM les gros blocs du torse qu'elle résume, pour
|
||||
// que l'outil recall puisse les rendre plus tard. Le numéro d'un bloc vient de
|
||||
// la séquence bbolt du bucket : seul ce process peut le donner. Une
|
||||
// compaction faite par la façade fait donc archiver ici.
|
||||
//
|
||||
// POST /internal/v1/recall/archive {"label":…,"role":…,"content":…}
|
||||
// → 200 {"id":"r7"} · 423 mémoire verrouillée (rien d'écrit en clair)
|
||||
|
||||
const internalRecallMaxBody = 32 << 20
|
||||
|
||||
func handleInternalRecallArchive(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method != http.MethodPost {
|
||||
w.Header().Set("Allow", http.MethodPost)
|
||||
sendJSON(w, http.StatusMethodNotAllowed, map[string]any{"error": "POST attendu"})
|
||||
return
|
||||
}
|
||||
var in struct {
|
||||
Label string `json:"label"`
|
||||
Role string `json:"role"`
|
||||
Content string `json:"content"`
|
||||
}
|
||||
raw, err := io.ReadAll(io.LimitReader(r.Body, internalRecallMaxBody+1))
|
||||
if err != nil || len(raw) > internalRecallMaxBody || json.Unmarshal(raw, &in) != nil || in.Content == "" {
|
||||
sendJSON(w, http.StatusBadRequest, map[string]any{"error": "bloc illisible"})
|
||||
return
|
||||
}
|
||||
id, err := archiveRecallBlock(in.Label, in.Role, in.Content)
|
||||
if errors.Is(err, errMemLocked) {
|
||||
sendJSON(w, http.StatusLocked, map[string]any{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
if err != nil {
|
||||
sendJSON(w, http.StatusServiceUnavailable, map[string]any{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
sendJSON(w, http.StatusOK, map[string]any{"id": id})
|
||||
}
|
||||
Reference in new issue
Block a user