447d042022
- primitive_attend retrieves over HTTP (POST /api/search) when ENGRAM_URL is set — the location-independent worker model — falling back to the in-process store otherwise. Proven against the isolated :8901 clone: CCR compiled a bounded context from REAL mind content (VBD/intellectual-dna). - gate the engram work-tracking mirror behind SWARM_MIRROR=1; the durable substrate is always the JSONL journal, so a swarm never depends on the mind to track its work. (Repeated POST /api/nodes mirror writes were observed to crash the isolated daemon — a daemon-side write-path robustness issue; retrieval POST /api/search is solid. Prod :8742 never touched.) - integ_engram: CCR real-retrieval + full swarm completion against live clone.
95 lines
4.6 KiB
EmacsLisp
95 lines
4.6 KiB
EmacsLisp
// primitives.el — the agentic primitive SEAM the swarm composes over.
|
|
//
|
|
// The swarm is orchestration OVER the five CCR primitives, not a replacement for
|
|
// them (CCR §2, "The Five Primitives / The Execution Cycle"): a worker executes
|
|
// its task blueprint as attend -> think -> intend -> act -> learn against its
|
|
// compiled, bounded context.
|
|
//
|
|
// This file is the SEAM. The parallel API-surface reshape exposes the canonical
|
|
// primitive tools; when it lands, bind each primitive below to the reshaped
|
|
// implementation (see PRIMITIVE_BINDING). Until then these are thin, engram-
|
|
// backed fallbacks so the swarm — its fan-out, containment, CCR context
|
|
// compilation, convergence, and work-tracking — is fully exercisable today.
|
|
//
|
|
// Contract: every primitive takes and returns String (JSON where structured), so
|
|
// any primitive is directly threadable via thread.el's spawn (which runs
|
|
// top-level (String)->String El fns).
|
|
//
|
|
// PRIMITIVE_BINDING: to bind the reshape's real tools, replace each fallback body
|
|
// with a call to the reshaped El fn / API endpoint. Signatures here are the
|
|
// stable contract the swarm depends on; keep them.
|
|
|
|
// ── attend — retrieve the minimal relevant context for a focus ───────────────
|
|
// Vantage-read: pull only what this focus needs from the mind. Backed by the
|
|
// engram's spreading-activation retrieval.
|
|
fn primitive_attend(query: String, limit: Int) -> String {
|
|
if str_eq(query, "") {
|
|
return "[]"
|
|
}
|
|
// Location-independent worker model: when an engram daemon is configured,
|
|
// retrieve over HTTP (the worker may run anywhere). POST /api/search
|
|
// {query,limit,_auth}. Falls back to the in-process store otherwise.
|
|
let url: String = env("ENGRAM_URL")
|
|
if str_eq(url, "") {
|
|
return engram_activate(query, limit)
|
|
}
|
|
let kv: [String] = el_list_empty()
|
|
let kv = el_list_append(kv, "query")
|
|
let kv = el_list_append(kv, query)
|
|
let body0: String = json_build_object(kv)
|
|
let body1: String = json_set(body0, "limit", int_to_str(limit))
|
|
let body2: String = json_set_str(body1, "_auth", env("ENGRAM_API_KEY"))
|
|
return http_post(url + "/api/search", body2)
|
|
}
|
|
|
|
// ── think — reason over the compiled context ─────────────────────────────────
|
|
// In production this routes to a model (CCR dynamic model selection). Here it is
|
|
// a deterministic, hermetic transform so swarm behaviour is testable without an
|
|
// external model: it echoes a structured verdict derived from the context. The
|
|
// binding point for a real model is explicit.
|
|
fn primitive_think(compiled_ctx: String, instruction: String) -> String {
|
|
// PRIMITIVE_BINDING: replace with the reshape's think() (model inference).
|
|
let kv: [String] = el_list_empty()
|
|
let kv = el_list_append(kv, "instruction")
|
|
let kv = el_list_append(kv, instruction)
|
|
let kv = el_list_append(kv, "ctx_bytes")
|
|
let kv = el_list_append(kv, int_to_str(str_len(compiled_ctx)))
|
|
let kv = el_list_append(kv, "conclusion")
|
|
let kv = el_list_append(kv, "reasoned:" + instruction)
|
|
return json_build_object(kv)
|
|
}
|
|
|
|
// ── intend — form a bounded plan/decision from a thought ─────────────────────
|
|
fn primitive_intend(thought: String) -> String {
|
|
let concl: String = json_get_string(thought, "conclusion")
|
|
let kv: [String] = el_list_empty()
|
|
let kv = el_list_append(kv, "intent")
|
|
let kv = el_list_append(kv, concl)
|
|
return json_build_object(kv)
|
|
}
|
|
|
|
// ── act — execute a bounded effect and return its result ─────────────────────
|
|
// Workers defer real side-effects to the coordinator (idempotency requirement,
|
|
// Swarm §7.3). Here act produces an artifact-shaped result the coordinator
|
|
// collects during convergence.
|
|
fn primitive_act(intent: String, input_item: String) -> String {
|
|
let kv: [String] = el_list_empty()
|
|
let kv = el_list_append(kv, "acted_on")
|
|
let kv = el_list_append(kv, input_item)
|
|
let kv = el_list_append(kv, "via")
|
|
let kv = el_list_append(kv, json_get_string(intent, "intent"))
|
|
return json_build_object(kv)
|
|
}
|
|
|
|
// ── learn — record an observation into the mind, tagged by correlation ID ────
|
|
// Append-only, naturally idempotent (Swarm §7.3). Best-effort: a worker that
|
|
// cannot reach the mind still returns its result.
|
|
fn primitive_learn(corr_id: String, observation: String) -> String {
|
|
let url: String = env("ENGRAM_URL")
|
|
if str_eq(url, "") {
|
|
return ""
|
|
}
|
|
let content: String = "swarm-worker-obs corr=" + corr_id + " :: " + observation
|
|
return engram_node(content, "Memory", 0.4)
|
|
}
|