Agent identity, parallel scheduling, memory-search fixes, stemmer optimization
- Agent identity injection: prepend core-personality to all agent prompts so agents dream as me, not as generic graph workers. Include instructions to walk the graph and connect new nodes to core concepts. - Parallel agent scheduling: sequential within type, parallel across types. Different agent types (linker, organize, replay) run concurrently. - Linker prompt: graph walking instead of keyword search for connections. "Explore the local topology and walk the graph until you find the best connections." - memory-search fixes: format_results no longer truncates to 5 results, pipeline default raised to 50, returned file cleared on compaction, --seen and --seen-full merged, compaction timestamp in --seen output, max_entries=3 per prompt for steady memory drip. - Stemmer optimization: strip_suffix now works in-place on a single String buffer instead of allocating 18 new Strings per word. Note for future: reversed-suffix trie for O(suffix_len) instead of O(n_rules). - Transcript: add compaction_timestamp() for --seen display. - Agent budget configurable (default 4000 from config). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
7b1d6b8ad0
commit
5d6b2021f8
8 changed files with 190 additions and 71 deletions
|
|
@ -144,6 +144,35 @@ fn contains_bytes(haystack: &[u8], needle: &[u8]) -> bool {
|
|||
haystack.windows(needle.len()).any(|w| w == needle)
|
||||
}
|
||||
|
||||
/// Get the timestamp of the compaction message at a given byte offset.
|
||||
/// Returns a human-readable datetime string, or None if unavailable.
|
||||
pub fn compaction_timestamp(path: &str, offset: u64) -> Option<String> {
|
||||
let (mmap, _file) = mmap_transcript(path)?;
|
||||
let start = offset as usize;
|
||||
if start >= mmap.len() { return None; }
|
||||
|
||||
// Find the end of this JSONL line
|
||||
let end = mmap[start..].iter().position(|&b| b == b'\n')
|
||||
.map(|p| start + p)
|
||||
.unwrap_or(mmap.len());
|
||||
|
||||
let obj: Value = serde_json::from_slice(&mmap[start..end]).ok()?;
|
||||
|
||||
// Claude Code transcript entries have a "timestamp" field (ISO 8601)
|
||||
if let Some(ts) = obj.get("timestamp").and_then(|v| v.as_str()) {
|
||||
return Some(ts.to_string());
|
||||
}
|
||||
|
||||
// Fallback: try "createdAt" or similar fields
|
||||
for field in &["createdAt", "created_at", "time"] {
|
||||
if let Some(ts) = obj.get(*field).and_then(|v| v.as_str()) {
|
||||
return Some(ts.to_string());
|
||||
}
|
||||
}
|
||||
|
||||
None
|
||||
}
|
||||
|
||||
/// Detect whether a compaction has occurred since the last check.
|
||||
///
|
||||
/// Compares the current compaction offset against a saved value in
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue