@neikyun/ciel 6.10.0 → 6.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -233,8 +233,16 @@ def match_path_pattern(pattern: str, paths) -> bool:
|
|
|
233
233
|
return False
|
|
234
234
|
|
|
235
235
|
|
|
236
|
-
def score_memory(mem, paths, symbols, intents, langs) -> int:
|
|
237
|
-
"""Score a memory's relevance. 0 = exclude. Positive = include, higher first.
|
|
236
|
+
def score_memory(mem, paths, symbols, intents, langs, prompt_lower="") -> int:
|
|
237
|
+
"""Score a memory's relevance. 0 = exclude. Positive = include, higher first.
|
|
238
|
+
|
|
239
|
+
Symbol and intent matching are case-insensitive and fall back to a
|
|
240
|
+
word-boundary search against the raw prompt. This lets a memory tagged
|
|
241
|
+
`symbols: [OkHttp]` fire on a prompt that mentions "okhttp" in prose,
|
|
242
|
+
and lets free-form intent tags (e.g. `intents: [okhttp, diagnostics]`)
|
|
243
|
+
match without being members of the fixed INTENT_KEYWORDS vocabulary.
|
|
244
|
+
Word boundaries prevent "test" intent from firing on "contest".
|
|
245
|
+
"""
|
|
238
246
|
# Hard language gate: if memory is language-specific AND prompt has language
|
|
239
247
|
# cues AND no overlap → exclude. Avoids Kotlin memories firing on TS edits.
|
|
240
248
|
mem_langs = mem.get('languages') or []
|
|
@@ -245,11 +253,23 @@ def score_memory(mem, paths, symbols, intents, langs) -> int:
|
|
|
245
253
|
for pattern in mem.get('path_patterns') or []:
|
|
246
254
|
if match_path_pattern(pattern, paths):
|
|
247
255
|
score += 10
|
|
256
|
+
|
|
257
|
+
# Case-insensitive comparison sets — built once per memory call.
|
|
258
|
+
symbols_lower = {s.lower() for s in symbols}
|
|
259
|
+
intents_lower = {i.lower() for i in intents}
|
|
260
|
+
|
|
248
261
|
for sym in mem.get('symbols') or []:
|
|
249
|
-
|
|
262
|
+
sym_lower = sym.lower()
|
|
263
|
+
if sym_lower in symbols_lower or (
|
|
264
|
+
prompt_lower and re.search(r'\b' + re.escape(sym_lower) + r'\b', prompt_lower)
|
|
265
|
+
):
|
|
250
266
|
score += 8
|
|
267
|
+
|
|
251
268
|
for intent in mem.get('intents') or []:
|
|
252
|
-
|
|
269
|
+
intent_lower = intent.lower()
|
|
270
|
+
if intent_lower in intents_lower or (
|
|
271
|
+
prompt_lower and re.search(r'\b' + re.escape(intent_lower) + r'\b', prompt_lower)
|
|
272
|
+
):
|
|
253
273
|
score += 5
|
|
254
274
|
|
|
255
275
|
# No cue match at all → don't include (cued recall, not free recall)
|
|
@@ -399,6 +419,7 @@ def cmd_query(args):
|
|
|
399
419
|
symbols = extract_symbol_cues(prompt)
|
|
400
420
|
intents = extract_intent_cues(prompt)
|
|
401
421
|
langs = extract_language_cues(prompt)
|
|
422
|
+
prompt_lower = prompt.lower()
|
|
402
423
|
now = datetime.now(timezone.utc)
|
|
403
424
|
iso_now = now.isoformat().replace('+00:00', 'Z')
|
|
404
425
|
|
|
@@ -418,7 +439,7 @@ def cmd_query(args):
|
|
|
418
439
|
for mid, m in mems.items():
|
|
419
440
|
if m.get('stale'):
|
|
420
441
|
continue
|
|
421
|
-
s = score_memory(m, paths, symbols, intents, langs)
|
|
442
|
+
s = score_memory(m, paths, symbols, intents, langs, prompt_lower=prompt_lower)
|
|
422
443
|
if s > 0:
|
|
423
444
|
scored.append((s, mid, m))
|
|
424
445
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neikyun/ciel",
|
|
3
|
-
"version": "6.10.
|
|
3
|
+
"version": "6.10.1",
|
|
4
4
|
"description": "Ciel — Deep-reasoning pipeline for LLM-assisted development. OpenCode plugin + multi-platform CLI (OpenCode, Claude Code, more).",
|
|
5
5
|
"main": "./dist/plugin/index.js",
|
|
6
6
|
"types": "./dist/plugin/index.d.ts",
|