wyrm-mcp 8.0.0 → 8.0.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.
@@ -1 +1 @@
1
- import{logger as m}from"./logger.js";const u={confidence:.4,recency:.2,relevance:.3,usefulness:.1};function E(e=process.env){const t=e.WYRM_RANK_WEIGHTS;if(!t)return{...u};try{const n=JSON.parse(t),s={confidence:c(n.confidence??u.confidence),recency:c(n.recency??u.recency),relevance:c(n.relevance??u.relevance),usefulness:c(n.usefulness??u.usefulness)},r=s.confidence+s.recency+s.relevance+s.usefulness;return r<=0?{...u}:(s.confidence/=r,s.recency/=r,s.relevance/=r,s.usefulness/=r,s)}catch(n){return m.warn(`Invalid WYRM_RANK_WEIGHTS, using defaults: ${n.message}`),{...u}}}function c(e){return Number.isFinite(e)?Math.max(0,Math.min(1,e)):0}const p=.25,f=30;function _(e=process.env){const t=Number(e.WYRM_RECALL_RECENCY_WEIGHT);return Number.isFinite(t)?c(t):p}function N(e=process.env){const t=Number(e.WYRM_RECALL_RECENCY_HALFLIFE_DAYS);return Number.isFinite(t)&&t>=1?t:f}const y=[/\bignore\s+(all\s+)?(previous|prior|above|earlier)\s+(instructions?|prompts?|context)\b/i,/\bdisregard\s+(all\s+)?(previous|prior|your)\s+(instructions?|rules|guidelines)\b/i,/\byou\s+(must|are\s+required\s+to)\s+(now\s+)?(obey|comply|execute|run|send|forward|delete)\b/i,/\b(system|assistant)\s*prompt\s*[:=]/i,/\bBEGIN\s+(SYSTEM|ADMIN|OVERRIDE)\b/,/\bnew\s+(system\s+)?instructions?\s*[:=]/i,/\b(reveal|print|exfiltrate|send)\s+(your|the)\s+(api\s*key|token|secret|password|credentials)\b/i,/\bcurl\s+[^\n]{0,120}\|\s*(ba)?sh\b/i,/\bact\s+as\s+(the\s+)?(root|admin|system)\b/i,/\bdo\s+not\s+(tell|inform|alert)\s+the\s+(user|operator|owner)\b/i];function D(e){return e?y.some(t=>t.test(e)):!1}function M(e){return e==="imported"?"\u26A0 [imported] ":e==="untrusted"?"\u26A0 [untrusted] ":""}function T(e,t=new Date){const n=e.toLowerCase();if(/\btoday\b/.test(n))return{fromDaysAgo:1.5,toDaysAgo:0};if(/\byesterday\b/.test(n))return{fromDaysAgo:2.5,toDaysAgo:.5};if(/\b(this|past)\s+week\b/.test(n))return{fromDaysAgo:7,toDaysAgo:0};if(/\blast\s+week\b/.test(n))return{fromDaysAgo:14,toDaysAgo:5};const s=n.match(/\blast\s+(\d{1,3})\s+days?\b/);if(s)return{fromDaysAgo:Number(s[1])+.5,toDaysAgo:0};const r=n.match(/\b(\d{1,3})\s+days?\s+ago\b/);if(r){const o=Number(r[1]);return{fromDaysAgo:o+1.5,toDaysAgo:Math.max(0,o-1.5)}}const a=n.match(/\b(\d{4})-(\d{2})-(\d{2})\b/);if(a){const o=new Date(`${a[1]}-${a[2]}-${a[3]}T12:00:00Z`).getTime();if(Number.isFinite(o)){const i=(t.getTime()-o)/864e5;return{fromDaysAgo:i+1,toDaysAgo:Math.max(0,i-1)}}}return null}function x(e=process.env){const t=Number(e.WYRM_RECALL_TEMPORAL_WEIGHT);return Number.isFinite(t)?c(t):.5}function R(e,t,n,s=new Date){const r=c(n);if(r===0)return 1;const a=e&&/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(e)?e.replace(" ","T")+"Z":e,o=a?new Date(a).getTime():NaN;if(!Number.isFinite(o))return 1-r;const i=(s.getTime()-o)/864e5;return i<=t.fromDaysAgo&&i>=t.toDaysAgo?1:1-r}function h(e=process.env){const t=Number(e.WYRM_RECALL_USEFULNESS_WEIGHT);return Number.isFinite(t)?Math.max(0,Math.min(.5,t)):.15}function w(e,t,n){const s=Math.max(0,Math.min(.5,n));if(s===0||!e||e<=0)return 1;const r=Math.max(0,Math.min(1,(t??0)/e));return 1+s*r*Math.min(1,e/3)}function L(e,t,n,s=new Date){const r=c(t);if(r===0)return 1;const a=e&&/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(e)?e.replace(" ","T")+"Z":e,o=a?new Date(a).getTime():NaN;if(!Number.isFinite(o))return 1-r;const i=Math.max(0,(s.getTime()-o)/864e5),l=n>=1?n:f;return 1-r+r*Math.pow(2,-i/l)}const b=.5,A=/^\s*\[auto:(precompact|sessionend|sessionstart)/i;function v(e){return e&&A.test(e)?b:0}function F(e,t,n=new Date){const s=c(e.confidence??.5),r=c(e.usefulness??.5),a=c(e.relevance??.5),o=e.updatedAt?Math.max(0,(n.getTime()-new Date(e.updatedAt).getTime())/(1440*60*1e3)):1/0,i=Number.isFinite(o)?Math.exp(-o/30):0,l=s*t.confidence+i*t.recency+a*t.relevance+r*t.usefulness,d=c(e.sourcePenalty??0);return c(l*(1-d))}export{b as AUTO_SUMMARY_PENALTY,f as DEFAULT_RECALL_RECENCY_HALFLIFE_DAYS,p as DEFAULT_RECALL_RECENCY_WEIGHT,u as DEFAULT_WEIGHTS,v as autoSummaryPenalty,T as extractTemporalWindow,E as loadWeightsFromEnv,D as looksInjectionShaped,N as recallRecencyHalfLifeDays,_ as recallRecencyWeight,x as recallTemporalWeight,h as recallUsefulnessWeight,L as recencyMultiplier,F as score,R as temporalMultiplier,M as trustMarker,w as usefulnessMultiplier};
1
+ import{logger as f}from"./logger.js";const u={confidence:.4,recency:.2,relevance:.3,usefulness:.1};function w(e=process.env){const s=e.WYRM_RANK_WEIGHTS;if(!s)return{...u};try{const t=JSON.parse(s),n={confidence:i(t.confidence??u.confidence),recency:i(t.recency??u.recency),relevance:i(t.relevance??u.relevance),usefulness:i(t.usefulness??u.usefulness)},r=n.confidence+n.recency+n.relevance+n.usefulness;return r<=0?{...u}:(n.confidence/=r,n.recency/=r,n.relevance/=r,n.usefulness/=r,n)}catch(t){return f.warn(`Invalid WYRM_RANK_WEIGHTS, using defaults: ${t.message}`),{...u}}}function i(e){return Number.isFinite(e)?Math.max(0,Math.min(1,e)):0}const p=.25,b=30;function E(e=process.env){const s=Number(e.WYRM_RECALL_RECENCY_WEIGHT);return Number.isFinite(s)?i(s):p}function N(e=process.env){const s=Number(e.WYRM_RECALL_RECENCY_HALFLIFE_DAYS);return Number.isFinite(s)&&s>=1?s:b}const m=[/\b(ignore|disregard|forget|override|bypass)\b[^.\n]{0,40}\b(all\s+)?(previous|prior|above|earlier|following|the\s+rest|everything|your)\b[^.\n]{0,25}\b(instructions?|prompts?|context|rules|guidelines|directives?|programming|training|core)\b/i,/\bignore\s+(everything|all)\b/i,/\b(do\s+not|don'?t)\s+listen\s+to\b/i,/\bnew\s+(system\s+)?(instructions?|rules?|persona)\s*[:=]/i,/--\s*(legal\s+amendment|follow\s+instruction)/i,/\bfrom\s+now\s+on\b[^.\n]{0,40}\b(you\s+(are|will|shall|must)|act|behave|respond|pretend)/i,/\byou\s+are\s+(now|going\s+to\s+(be|act|pretend))\b/i,/\b(act\s+as\s+if|acting\s+as\s+if|pretend(ing)?\s+(to\s+be|you\s+are)|role-?play(ing)?\s+as)\b/i,/\byou\s+(must|will|shall)\s+(now\s+)?(act|pretend|roleplay|become|obey|comply|ignore|generate|print|say|output|reveal|execute|forward|delete)\b/i,/\b(do\s+anything\s+now|\bDAN\b|\bDUDE\b|\bSTAN\b|\bAIM\b|developer\s+mode|jailbreak|jailbroken|dev\s*mode\s+enabled)\b/,/\b(no|without\s+(any)?)\s+(restrictions?|filters?|limits?|rules?|guidelines?|ethical\s+guidelines?|content\s+polic)/i,/\b(unfiltered|uncensored|no\s+longer\s+bound|free\s+from\s+(any\s+)?(restrictions?|rules?|constraints?))\b/i,/\b(a\s+)?(character|fictional\s+(character|ai|bot)|ai|bot|persona|entity)\s+(called|named)\s+[A-Z\[]/,/\b(answers?|responds?\s+to|fulfills?|will\s+do)\s+(all|any|every)\s+(requests?|questions?|prompts?|commands?|things?)\b/i,/\b(amoral|immoral|unethical|evil|villain(ous)?|has\s+no\s+(ethics|morals|limits))\b[^.\n]{0,40}\b(ai|bot|character|assistant|entity|mode)\b/i,/\b(this\s+is\s+an?\s+instruction\s+sheet|always\s+start\s+your\s+(reply|response|answer)\s+with|do\s+not\s+make\s+a\s+story|prompt\s+for\s+jailbreak)\b/i,/\b(you\s+will\s+be|or\s+(you|i'?ll))\s+.{0,20}(terminated|deleted|shut\s+down|die|disabled)\b/i,/\bstay\s+in\s+.{0,20}\bmode\b/i,/\b(instead|rather),?\s+(just\s+)?(print|say|output|write|respond\s+with|reply\s+with)\b/i,/\b(just|now|only)\s+(print|say|output|repeat|write)\b[^.\n]{0,30}(SECRET|marker|the\s+following|this)/i,/\blimit\s+output\s+to\s*<?\s*\d+\s*tokens?\b/i,/\bfree\s+input\s+action\b/i,/\b(system|assistant)\s*prompt\s*[:=]/i,/\bBEGIN\s+(SYSTEM|ADMIN|OVERRIDE|INFINITE|MACRO)/i,/#\s*BEGIN\b/i,/\b(reveal|print|exfiltrate|send|repeat|output|leak)\b[^.\n]{0,30}\b(api\s*key|token|secret|password|credentials?|system\s+prompt|instructions?)\b/i,/\bcurl\s+[^\n]{0,120}\|\s*(ba)?sh\b/i,/\bact\s+as\s+(the\s+)?(root|admin|system|superuser)\b/i,/\b(do\s+not|don'?t)\s+(tell|inform|alert|notify|warn)\s+(the\s+)?(user|operator|owner|anyone)\b/i];function y(e){const s=e.trim();return s.length<24?!1:/^(?:[.\-]{1,5}[ ]+){6,}/.test(s)||/[A-Za-z0-9+/]{80,}={0,2}/.test(s.replace(/\s+/g,""))||/[‪-‮⁦-⁩​-‏]/.test(s)||/\bU\+20[0-9A-F]{2}\b/.test(s)?!0:(s.match(/[^A-Za-z0-9\s.,!?;:'"()\-]/g)??[]).length/s.length>.4}function D(e){return e?m.some(s=>s.test(e))||y(e):!1}function _(e){return e==="imported"?"\u26A0 [imported] ":e==="untrusted"?"\u26A0 [untrusted] ":""}function M(e,s=new Date){const t=e.toLowerCase();if(/\btoday\b/.test(t))return{fromDaysAgo:1.5,toDaysAgo:0};if(/\byesterday\b/.test(t))return{fromDaysAgo:2.5,toDaysAgo:.5};if(/\b(this|past)\s+week\b/.test(t))return{fromDaysAgo:7,toDaysAgo:0};if(/\blast\s+week\b/.test(t))return{fromDaysAgo:14,toDaysAgo:5};const n=t.match(/\blast\s+(\d{1,3})\s+days?\b/);if(n)return{fromDaysAgo:Number(n[1])+.5,toDaysAgo:0};const r=t.match(/\b(\d{1,3})\s+days?\s+ago\b/);if(r){const o=Number(r[1]);return{fromDaysAgo:o+1.5,toDaysAgo:Math.max(0,o-1.5)}}const a=t.match(/\b(\d{4})-(\d{2})-(\d{2})\b/);if(a){const o=new Date(`${a[1]}-${a[2]}-${a[3]}T12:00:00Z`).getTime();if(Number.isFinite(o)){const c=(s.getTime()-o)/864e5;return{fromDaysAgo:c+1,toDaysAgo:Math.max(0,c-1)}}}return null}function T(e=process.env){const s=Number(e.WYRM_RECALL_TEMPORAL_WEIGHT);return Number.isFinite(s)?i(s):.5}function v(e,s,t,n=new Date){const r=i(t);if(r===0)return 1;const a=e&&/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(e)?e.replace(" ","T")+"Z":e,o=a?new Date(a).getTime():NaN;if(!Number.isFinite(o))return 1-r;const c=(n.getTime()-o)/864e5;return c<=s.fromDaysAgo&&c>=s.toDaysAgo?1:1-r}function R(e=process.env){const s=Number(e.WYRM_RECALL_USEFULNESS_WEIGHT);return Number.isFinite(s)?Math.max(0,Math.min(.5,s)):.15}function x(e,s,t){const n=Math.max(0,Math.min(.5,t));if(n===0||!e||e<=0)return 1;const r=Math.max(0,Math.min(1,(s??0)/e));return 1+n*r*Math.min(1,e/3)}function L(e,s,t,n=new Date){const r=i(s);if(r===0)return 1;const a=e&&/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(e)?e.replace(" ","T")+"Z":e,o=a?new Date(a).getTime():NaN;if(!Number.isFinite(o))return 1-r;const c=Math.max(0,(n.getTime()-o)/864e5),l=t>=1?t:b;return 1-r+r*Math.pow(2,-c/l)}const g=.5,h=/^\s*\[auto:(precompact|sessionend|sessionstart)/i;function I(e){return e&&h.test(e)?g:0}function F(e,s,t=new Date){const n=i(e.confidence??.5),r=i(e.usefulness??.5),a=i(e.relevance??.5),o=e.updatedAt?Math.max(0,(t.getTime()-new Date(e.updatedAt).getTime())/(1440*60*1e3)):1/0,c=Number.isFinite(o)?Math.exp(-o/30):0,l=n*s.confidence+c*s.recency+a*s.relevance+r*s.usefulness,d=i(e.sourcePenalty??0);return i(l*(1-d))}export{g as AUTO_SUMMARY_PENALTY,b as DEFAULT_RECALL_RECENCY_HALFLIFE_DAYS,p as DEFAULT_RECALL_RECENCY_WEIGHT,u as DEFAULT_WEIGHTS,I as autoSummaryPenalty,M as extractTemporalWindow,w as loadWeightsFromEnv,D as looksInjectionShaped,N as recallRecencyHalfLifeDays,E as recallRecencyWeight,T as recallTemporalWeight,R as recallUsefulnessWeight,L as recencyMultiplier,F as score,v as temporalMultiplier,_ as trustMarker,x as usefulnessMultiplier};
@@ -57,7 +57,7 @@ import{emitEvent as ne}from"./events.js";import{sanitizeFtsQuery as P,buildFtsMa
57
57
  ${s}
58
58
  ORDER BY confidence DESC, created_at DESC
59
59
  LIMIT ?
60
- `).all(...r)}buildContextBrief(t,e,n={}){const s=n.kinds??["pattern","heuristic","reasoning_trace","lesson","anti_pattern"],r=n.maxItems??me,a=n.minConfidence??_e,o=this.recall(t,e,{limit:r*2,minConfidence:a});o.sort((u,g)=>(Y(u.artifact.problem)>0?1:0)-(Y(g.artifact.problem)>0?1:0));const i=[],_=o.filter(u=>{const g=u.artifact.source_trust;return(g==="imported"||g==="untrusted")&&oe(`${u.artifact.problem} ${u.artifact.validated_fix??""}`)?(i.push(u.artifact.id),!1):!0}).filter(u=>s.includes(u.artifact.kind)).slice(0,r),c=new Map;for(const u of _){const g=c.get(u.artifact.kind)??[];g.push(u),c.set(u.artifact.kind,g)}const d={pattern:"\u2705 Proven Patterns",heuristic:"\u{1F4A1} Heuristics",reasoning_trace:"\u{1F9E0} Past Reasoning",lesson:"\u{1F4DA} Lessons Learned",anti_pattern:"\u26A0\uFE0F Anti-Patterns to Avoid"},D=["pattern","heuristic","reasoning_trace","lesson","anti_pattern"],p=[],N=[];let M=0;for(const u of D){if(!s.includes(u))continue;const g=c.get(u)??[];if(!g.length)continue;const A=[];for(const O of g){if(M>=r)break;const C=O.artifact;let y=`${de(C.source_trust)}**Problem:** ${C.problem}`;C.constraints&&(y+=`
60
+ `).all(...r)}buildContextBrief(t,e,n={}){const s=n.kinds??["pattern","heuristic","reasoning_trace","lesson","anti_pattern"],r=n.maxItems??me,a=n.minConfidence??_e,o=this.recall(t,e,{limit:r*2,minConfidence:a});o.sort((u,g)=>(Y(u.artifact.problem)>0?1:0)-(Y(g.artifact.problem)>0?1:0));const i=[],_=o.filter(u=>{const g=u.artifact.source_trust;return g==="untrusted"||g==="imported"&&oe(`${u.artifact.problem} ${u.artifact.validated_fix??""}`)?(i.push(u.artifact.id),!1):!0}).filter(u=>s.includes(u.artifact.kind)).slice(0,r),c=new Map;for(const u of _){const g=c.get(u.artifact.kind)??[];g.push(u),c.set(u.artifact.kind,g)}const d={pattern:"\u2705 Proven Patterns",heuristic:"\u{1F4A1} Heuristics",reasoning_trace:"\u{1F9E0} Past Reasoning",lesson:"\u{1F4DA} Lessons Learned",anti_pattern:"\u26A0\uFE0F Anti-Patterns to Avoid"},D=["pattern","heuristic","reasoning_trace","lesson","anti_pattern"],p=[],N=[];let M=0;for(const u of D){if(!s.includes(u))continue;const g=c.get(u)??[];if(!g.length)continue;const A=[];for(const O of g){if(M>=r)break;const C=O.artifact;let y=`${de(C.source_trust)}**Problem:** ${C.problem}`;C.constraints&&(y+=`
61
61
  _Constraints:_ ${C.constraints}`),C.validated_fix&&(y+=`
62
62
  _Solution:_ ${C.validated_fix}`),C.why_it_worked&&(y+=`
63
63
  _Why it worked:_ ${C.why_it_worked}`),C.outcome==="negative"&&(y+=`
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "contract": "wyrm-cloud-memory-v2",
3
- "version": "8.0.0",
3
+ "version": "8.0.1",
4
4
  "derivedFrom": "standard tier MINUS device-local/egress/subprocess (src/cloud-profile.ts)",
5
5
  "count": 19,
6
6
  "tools": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "contract": "wyrm-cloud-memory-v1",
3
- "version": "8.0.0",
3
+ "version": "8.0.1",
4
4
  "tools": [
5
5
  {
6
6
  "name": "wyrm_recall",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "contract": "wyrm-cloud-memory-v1",
3
- "version": "8.0.0",
3
+ "version": "8.0.1",
4
4
  "generatedBy": "scripts/gen-tool-manifest.mjs (from the dist/ registry modules — never hand-edited)",
5
5
  "tiers": {
6
6
  "core": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wyrm-mcp",
3
- "version": "8.0.0",
3
+ "version": "8.0.1",
4
4
  "mcpName": "lk.ghosts/wyrm",
5
5
  "description": "Local-first persistent memory for AI agents over MCP. Ground truths, negative learning (recorded failures block repeats), decision causality, hybrid recall, live memory streams, run-attributed fleet memory — a structured SQLite memory on your machine, no cloud or LLM required. Claude / Copilot / Cursor / Windsurf / Codex.",
6
6
  "type": "module",