Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
4ee129f
feat(memory): add memory system v2 with search, metadata, and lite re…
w0wl0lxd Jul 27, 2026
e142311
fix(memory): harden search, YAML frontmatter, hints, and append
w0wl0lxd Jul 27, 2026
a5eaed3
fix(memory): resolve spellcheck false positive and add changelog frag…
w0wl0lxd Jul 27, 2026
5a5e64b
fix(token-profile): regenerate cold_start baseline for memory-system-v2
w0wl0lxd Jul 28, 2026
fa6bc4c
fix(memory): preserve existing frontmatter on body-only write
cursoragent Jul 29, 2026
4eea5d3
fix(memory): align write limits, lite budget, and empty metadata
cursoragent Jul 29, 2026
5effec1
fix(memory): collect lite hints until limit, not first N entries
cursoragent Jul 29, 2026
fffa54f
fix(memory): address PR review on sanitize, YAML, and specs
w0wl0lxd Jul 29, 2026
ef9d435
feat(agent): background server, management CLI, and mode-aware goal p…
w0wl0lxd Jul 29, 2026
d7d256a
Merge remote-tracking branch 'origin/main' into feat/memory-system-v2
w0wl0lxd Jul 29, 2026
a711d17
merge(main): sync PR #175 after explore stack (#170)
w0wl0lxd Jul 29, 2026
1ef33b8
merge(main): sync after #192
w0wl0lxd Jul 29, 2026
27ce660
merge(main): resolve conflicts for #175
w0wl0lxd Jul 29, 2026
01caa19
fix(token-profile): regenerate cold_start baseline after main sync
w0wl0lxd Jul 29, 2026
72e122b
merge(main): sync memory-system-v2 after #180
w0wl0lxd Jul 29, 2026
0a539f1
Merge remote-tracking branch 'origin/main' into feat/memory-system-v2
w0wl0lxd Jul 29, 2026
7148f5f
fix(docgen): raise tool-def byte budget for memory tools
w0wl0lxd Jul 29, 2026
55709f9
merge(main): sync memory-system-v2 after #187
w0wl0lxd Jul 29, 2026
1f7c8f0
fix(memory): address CodeRabbit review comments
w0wl0lxd Jul 29, 2026
8826908
docs(tools): regenerate tools index after CodeRabbit memory fixes
w0wl0lxd Jul 29, 2026
3b5a038
fix(memory): sync tags param description with generated docs
w0wl0lxd Jul 29, 2026
c576e03
docs(tools): regenerate tools index for memory tags description
w0wl0lxd Jul 29, 2026
ee00c14
Merge remote-tracking branch 'origin/main' into feat/memory-system-v2…
w0wl0lxd Jul 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/175.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Memory tool v2: keyword search, YAML frontmatter metadata, append, and lite-layer session recall hints.
4 changes: 2 additions & 2 deletions n00n-docgen/src/gen_tools.rs
Original file line number Diff line number Diff line change
Expand Up @@ -420,8 +420,8 @@ mod tests {
assert!(cleaned.starts_with(remaining_prefix), "cleaned: {cleaned}");
}

// Room for fusion_delegate + skill-system tools; keep definitions lean.
const MAX_TOOL_DEFINITION_BYTES: usize = 38_500;
// Room for fusion_delegate + skill-system + memory-system tools; keep definitions lean.
const MAX_TOOL_DEFINITION_BYTES: usize = 40_000;

#[test]
fn tool_definitions_fit_byte_budget() {
Expand Down
132 changes: 132 additions & 0 deletions n00n-lua/tests/plugin_host.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5884,3 +5884,135 @@ fn live_followup_schema_debloat_suite() {
.is_none()
);
}

#[test]
fn memory_tool_search_ranks_keyword_match() {
let (reg, _host) = builtins_host();
exec_tool(
&reg,
"memory",
serde_json::json!({
"command": "write",
"path": "auth.md",
"content": "JWT refresh rotation required",
"tags": "auth,security",
"topic": "auth"
}),
)
.expect("seed auth memory");
exec_tool(
&reg,
"memory",
serde_json::json!({
"command": "write",
"path": "lua.md",
"content": "plugin host integration tests",
"topic": "lua"
}),
)
.expect("seed lua memory");
let out = exec_tool(
&reg,
"memory",
serde_json::json!({
"command": "search",
"query": "JWT refresh"
}),
)
.expect("search memories");
let auth_pos = out
.find("auth.md")
.expect("auth.md should be in search results");
if let Some(lua_pos) = out.find("lua.md") {
assert!(
auth_pos < lua_pos,
"auth.md should appear before lua.md in ranked results: {out}"
);
}
assert!(out.contains("score="), "search should include score: {out}");
}

#[test]
fn memory_tool_append_preserves_frontmatter() {
let (reg, _host) = builtins_host();
exec_tool(
&reg,
"memory",
serde_json::json!({
"command": "write",
"path": "notes.md",
"content": "line one",
"topic": "notes",
"layer": "lite"
}),
)
.expect("seed memory");
let out = exec_tool(
&reg,
"memory",
serde_json::json!({
"command": "append",
"path": "notes.md",
"content": "line two"
}),
)
.expect("append memory");
assert!(out.contains("appended"), "append should succeed: {out}");
let view = exec_tool(
&reg,
"memory",
serde_json::json!({
"command": "view",
"path": "notes.md"
}),
)
.expect("view memory");
assert!(view.contains("line one"), "original body preserved: {view}");
assert!(view.contains("line two"), "appended body present: {view}");
let search = exec_tool(
&reg,
"memory",
serde_json::json!({
"command": "search",
"query": "line"
}),
)
.expect("search memory");
assert!(
search.contains("topic=notes"),
"append must preserve topic frontmatter: {search}"
);
assert!(
search.contains("notes.md"),
"search should still find appended memory: {search}"
);
}

#[test]
fn memory_tool_search_omits_non_matching_query() {
let (reg, _host) = builtins_host();
exec_tool(
&reg,
"memory",
serde_json::json!({
"command": "write",
"path": "alpha.md",
"content": "architecture notes",
"importance": 5
}),
)
.expect("seed memory");
let out = exec_tool(
&reg,
"memory",
serde_json::json!({
"command": "search",
"query": "zzzznonexistent"
}),
)
.expect("search memories");
assert!(
out.contains("No matching memories"),
"search should omit importance-only matches: {out}"
);
}
12 changes: 6 additions & 6 deletions n00n-token-profile/baselines/cold_start.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,20 @@
"surfaces": {
"cache_prefix": {
"name": "cache_prefix",
"bytes": 17017,
"tokens": 4186
"bytes": 17797,
"tokens": 4381
},
"main_tools_payload": {
"name": "main_tools_payload",
"tool_count": 29,
"bytes": 23934,
"tokens": 5983
"bytes": 24865,
"tokens": 6216
},
"main_tools_schemas": {
"name": "main_tools_schemas",
"tool_count": 29,
"bytes": 14498,
"tokens": 3624
"bytes": 15278,
"tokens": 3819
},
"system_prompt": {
"name": "system_prompt",
Expand Down
Loading
Loading