memorix 1.1.7 → 1.1.8
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.
- package/CHANGELOG.md +13 -0
- package/CLAUDE.md +6 -1
- package/README.md +21 -0
- package/README.zh-CN.md +21 -0
- package/TEAM.md +86 -86
- package/dist/cli/index.js +730 -150
- package/dist/cli/index.js.map +1 -1
- package/dist/dashboard/static/index.html +201 -201
- package/dist/dashboard/static/style.css +3584 -3584
- package/dist/index.js +15 -8
- package/dist/index.js.map +1 -1
- package/dist/memcode-runtime/CHANGELOG.md +13 -0
- package/dist/memcode-runtime/package.json +4 -4
- package/dist/sdk.js +15 -8
- package/dist/sdk.js.map +1 -1
- package/docs/AGENT_OPERATOR_PLAYBOOK.md +18 -0
- package/docs/DESIGN_DECISIONS.md +357 -357
- package/docs/SETUP.md +10 -0
- package/docs/dev-log/progress.txt +35 -26
- package/package.json +1 -1
- package/src/audit/index.ts +156 -156
- package/src/cli/commands/agent-integrations.ts +623 -0
- package/src/cli/commands/audit-list.ts +89 -89
- package/src/cli/commands/background.ts +659 -659
- package/src/cli/commands/cleanup.ts +255 -255
- package/src/cli/commands/doctor.ts +23 -0
- package/src/cli/commands/formation.ts +48 -48
- package/src/cli/commands/git-hook-install.ts +111 -111
- package/src/cli/commands/handoff.ts +66 -66
- package/src/cli/commands/hooks-status.ts +63 -63
- package/src/cli/commands/ingest-commit.ts +153 -153
- package/src/cli/commands/ingest-image.ts +73 -73
- package/src/cli/commands/ingest-log.ts +180 -180
- package/src/cli/commands/ingest.ts +44 -44
- package/src/cli/commands/integrate-shared.ts +15 -15
- package/src/cli/commands/lock.ts +96 -96
- package/src/cli/commands/message.ts +121 -121
- package/src/cli/commands/poll.ts +70 -70
- package/src/cli/commands/purge-all-memory.ts +85 -85
- package/src/cli/commands/purge-project-memory.ts +83 -83
- package/src/cli/commands/reasoning.ts +132 -132
- package/src/cli/commands/repair.ts +60 -0
- package/src/cli/commands/retention.ts +108 -108
- package/src/cli/commands/serve-shared.ts +118 -118
- package/src/cli/commands/setup.ts +3 -3
- package/src/cli/commands/skills.ts +123 -123
- package/src/cli/commands/task.ts +192 -192
- package/src/cli/commands/transfer.ts +73 -73
- package/src/cli/commands/uninstall-project-artifacts.ts +85 -85
- package/src/cli/index.ts +3 -1
- package/src/cli/tui/ChatView.tsx +234 -234
- package/src/cli/tui/CommandBar.tsx +312 -312
- package/src/cli/tui/ContextRail.tsx +118 -118
- package/src/cli/tui/HeaderBar.tsx +72 -72
- package/src/cli/tui/LogoBanner.tsx +51 -51
- package/src/cli/tui/Panels.tsx +632 -632
- package/src/cli/tui/Sidebar.tsx +179 -179
- package/src/cli/tui/chat-service.ts +742 -742
- package/src/cli/tui/data.ts +547 -547
- package/src/cli/tui/index.ts +41 -41
- package/src/cli/tui/markdown-render.tsx +371 -371
- package/src/cli/tui/theme.ts +178 -178
- package/src/cli/tui/use-mouse.ts +157 -157
- package/src/cli/tui/useNavigation.ts +56 -56
- package/src/cli/update-checker.ts +211 -211
- package/src/cli/version.ts +7 -7
- package/src/cli/workbench.ts +1 -1
- package/src/codegraph/context-pack.ts +5 -1
- package/src/codegraph/lite-provider.ts +5 -1
- package/src/codegraph/project-context.ts +5 -1
- package/src/compact/token-budget.ts +74 -74
- package/src/config/behavior.ts +59 -59
- package/src/dashboard/project-classification.ts +64 -64
- package/src/dashboard/static/index.html +201 -201
- package/src/dashboard/static/style.css +3584 -3584
- package/src/embedding/fastembed-provider.ts +142 -142
- package/src/embedding/transformers-provider.ts +111 -111
- package/src/git/extractor.ts +209 -209
- package/src/git/hooks-path.ts +85 -85
- package/src/git/noise-filter.ts +210 -210
- package/src/hooks/installers/index.ts +4 -4
- package/src/hooks/official-skills.ts +1 -1
- package/src/hooks/pattern-detector.ts +173 -173
- package/src/hooks/rules/memorix-agent-rules.md +2 -2
- package/src/hooks/significance-filter.ts +250 -250
- package/src/llm/memory-manager.ts +328 -328
- package/src/llm/provider.ts +885 -885
- package/src/llm/quality.ts +248 -248
- package/src/memory/attribution-guard.ts +249 -249
- package/src/memory/auto-relations.ts +107 -107
- package/src/memory/consolidation.ts +302 -302
- package/src/memory/disclosure-policy.ts +141 -141
- package/src/memory/entity-extractor.ts +197 -197
- package/src/memory/formation/evaluate.ts +217 -217
- package/src/memory/formation/extract.ts +361 -361
- package/src/memory/formation/index.ts +417 -417
- package/src/memory/formation/resolve.ts +344 -344
- package/src/memory/formation/types.ts +315 -315
- package/src/memory/freshness.ts +122 -122
- package/src/memory/graph.ts +197 -197
- package/src/memory/refs.ts +94 -94
- package/src/memory/retention.ts +433 -433
- package/src/memory/secret-filter.ts +79 -79
- package/src/memory/session.ts +523 -523
- package/src/multimodal/image-loader.ts +143 -143
- package/src/orchestrate/adapters/claude-stream.ts +192 -192
- package/src/orchestrate/adapters/claude.ts +111 -111
- package/src/orchestrate/adapters/codex-stream.ts +134 -134
- package/src/orchestrate/adapters/codex.ts +41 -41
- package/src/orchestrate/adapters/gemini-stream.ts +166 -166
- package/src/orchestrate/adapters/gemini.ts +42 -42
- package/src/orchestrate/adapters/index.ts +73 -73
- package/src/orchestrate/adapters/opencode-stream.ts +143 -143
- package/src/orchestrate/adapters/opencode.ts +47 -47
- package/src/orchestrate/adapters/spawn-helper.ts +286 -286
- package/src/orchestrate/adapters/types.ts +77 -77
- package/src/orchestrate/capability-router.ts +284 -284
- package/src/orchestrate/context-compact.ts +188 -188
- package/src/orchestrate/cost-tracker.ts +219 -219
- package/src/orchestrate/error-recovery.ts +191 -191
- package/src/orchestrate/evidence.ts +140 -140
- package/src/orchestrate/ledger.ts +110 -110
- package/src/orchestrate/memorix-bridge.ts +380 -380
- package/src/orchestrate/output-budget.ts +80 -80
- package/src/orchestrate/permission.ts +152 -152
- package/src/orchestrate/pipeline-trace.ts +131 -131
- package/src/orchestrate/prompt-builder.ts +155 -155
- package/src/orchestrate/ring-buffer.ts +37 -37
- package/src/orchestrate/task-graph.ts +389 -389
- package/src/orchestrate/verify-gate.ts +219 -219
- package/src/orchestrate/worktree.ts +232 -232
- package/src/project/aliases.ts +374 -374
- package/src/project/detector.ts +268 -268
- package/src/rules/adapters/claude-code.ts +99 -99
- package/src/rules/adapters/codex.ts +97 -97
- package/src/rules/adapters/copilot.ts +124 -124
- package/src/rules/adapters/cursor.ts +114 -114
- package/src/rules/adapters/kiro.ts +126 -126
- package/src/rules/adapters/trae.ts +56 -56
- package/src/rules/adapters/windsurf.ts +83 -83
- package/src/rules/syncer.ts +235 -235
- package/src/sdk.ts +327 -327
- package/src/search/intent-detector.ts +289 -289
- package/src/search/query-expansion.ts +52 -52
- package/src/server/formation-timeout.ts +27 -27
- package/src/skills/mini-skills.ts +386 -386
- package/src/store/chat-store.ts +119 -119
- package/src/store/file-lock.ts +100 -100
- package/src/store/graph-store.ts +249 -249
- package/src/store/mini-skill-store.ts +349 -349
- package/src/store/obs-store.ts +255 -255
- package/src/store/persistence-json.ts +212 -212
- package/src/store/persistence.ts +291 -291
- package/src/store/project-affinity.ts +195 -195
- package/src/store/session-store.ts +259 -259
- package/src/store/sqlite-store.ts +339 -339
- package/src/team/event-bus.ts +76 -76
- package/src/team/file-locks.ts +173 -173
- package/src/team/handoff.ts +167 -167
- package/src/team/messages.ts +203 -203
- package/src/team/poll.ts +132 -132
- package/src/team/tasks.ts +211 -211
- package/src/wiki/generator.ts +237 -237
- package/src/wiki/knowledge-graph.ts +334 -334
- package/src/wiki/types.ts +85 -85
- package/src/workspace/mcp-adapters/codex.ts +191 -191
- package/src/workspace/mcp-adapters/copilot.ts +105 -105
- package/src/workspace/mcp-adapters/cursor.ts +53 -53
- package/src/workspace/mcp-adapters/kiro.ts +64 -64
- package/src/workspace/mcp-adapters/opencode.ts +123 -123
- package/src/workspace/mcp-adapters/trae.ts +134 -134
- package/src/workspace/mcp-adapters/windsurf.ts +91 -91
- package/src/workspace/sanitizer.ts +60 -60
- package/src/workspace/workflow-sync.ts +131 -131
|
@@ -1,250 +1,250 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Significance Filter
|
|
3
|
-
*
|
|
4
|
-
* Determines if content is significant enough to be stored as memory.
|
|
5
|
-
* Inspired by Cipher's isSignificantKnowledge() — filters out trivial content
|
|
6
|
-
* while preserving technical knowledge, decisions, and problem-solving.
|
|
7
|
-
*
|
|
8
|
-
* Performance: O(n) regex matching, ~0.1-0.5ms per call.
|
|
9
|
-
* No external dependencies, pure TypeScript.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
// ─── Skip Patterns (content that should NOT be stored) ───
|
|
13
|
-
|
|
14
|
-
const SKIP_PATTERNS: RegExp[] = [
|
|
15
|
-
// Personal information and identity (privacy)
|
|
16
|
-
/\b(my name|user['']?s? name|find my name|who am i|what['']?s my name)\b/i,
|
|
17
|
-
/\b(password|secret|api[_-]?key|access[_-]?token|private[_-]?key)\b/i,
|
|
18
|
-
|
|
19
|
-
// Simple greetings and social interactions
|
|
20
|
-
/^(user:|assistant:)?\s*(hello|hi|hey|good morning|good afternoon|good evening|thanks|thank you|please|sorry|excuse me|bye|goodbye|你好|谢谢|再见)\b/i,
|
|
21
|
-
|
|
22
|
-
// Generic status messages
|
|
23
|
-
/^(task completed|operation successful|processing|loading|waiting|done|finished|ready|完成|成功|处理中)\b/i,
|
|
24
|
-
|
|
25
|
-
// Simple yes/no or acknowledgment responses
|
|
26
|
-
/^(user:|assistant:)?\s*(yes|no|ok|okay|sure|fine|great|good|right|correct|wrong|true|false|是|否|好的|对|错)\s*[.!?]?\s*$/i,
|
|
27
|
-
|
|
28
|
-
// Tool results with no meaningful content
|
|
29
|
-
/^(memorix_search|memorix_store|memorix_detail):\s*(found|completed|no results|error|stored)/i,
|
|
30
|
-
|
|
31
|
-
// Empty or whitespace-only
|
|
32
|
-
/^\s*$/,
|
|
33
|
-
|
|
34
|
-
// Very short content (less than 10 chars after trimming)
|
|
35
|
-
/^.{0,9}$/,
|
|
36
|
-
];
|
|
37
|
-
|
|
38
|
-
// ─── Technical Patterns (content that SHOULD be stored) ───
|
|
39
|
-
|
|
40
|
-
const TECHNICAL_PATTERNS: RegExp[] = [
|
|
41
|
-
// Programming concepts and patterns
|
|
42
|
-
/\b(function|method|class|interface|module|library|framework|algorithm|data structure|design pattern)\b/i,
|
|
43
|
-
/\b(variable|constant|parameter|argument|return|async|await|promise|callback|closure|scope)\b/i,
|
|
44
|
-
/\b(loop|iteration|recursion|condition|exception|error handling|debugging|testing|optimization)\b/i,
|
|
45
|
-
|
|
46
|
-
// Code elements and syntax
|
|
47
|
-
/\b(import|export|require|include|package|dependency|api|endpoint|request|response)\b/i,
|
|
48
|
-
/\b(database|query|sql|nosql|schema|table|index|transaction|orm|migration)\b/i,
|
|
49
|
-
/\b(git|version control|commit|merge|branch|pull request|repository|deployment)\b/i,
|
|
50
|
-
|
|
51
|
-
// Technical implementations
|
|
52
|
-
/\b(implements?|extends?|inherits?|overrides?|polymorphism|encapsulation|abstraction)\b/i,
|
|
53
|
-
/\b(sort|search|filter|map|reduce|transform|parse|serialize|encrypt|decrypt)\b/i,
|
|
54
|
-
/\b(authentication|authorization|security|validation|sanitization|middleware)\b/i,
|
|
55
|
-
|
|
56
|
-
// Code blocks and technical syntax
|
|
57
|
-
/```[\s\S]*```/,
|
|
58
|
-
/`[^`]+`/,
|
|
59
|
-
|
|
60
|
-
// Package managers and build tools
|
|
61
|
-
/\b(npm|yarn|pnpm|pip|composer|cargo|go get|mvn|gradle|webpack|vite|rollup|tsup)\b/i,
|
|
62
|
-
|
|
63
|
-
// File and system operations
|
|
64
|
-
/\b(file|directory|path|config|environment|server|client|host|port|url|http|https|ssl|tls)\b/i,
|
|
65
|
-
/\b(dockerfile|docker|container|kubernetes|cloud|aws|azure|gcp|ci\/cd|pipeline)\b/i,
|
|
66
|
-
|
|
67
|
-
// Programming languages and technologies
|
|
68
|
-
/\b(javascript|typescript|python|java|c\+\+|c#|rust|go|php|ruby|swift|kotlin|scala)\b/i,
|
|
69
|
-
/\b(react|vue|angular|node|express|django|flask|spring|rails|laravel|fastapi|nextjs)\b/i,
|
|
70
|
-
/\b(html|css|scss|sass|tailwind|bootstrap)\b/i,
|
|
71
|
-
|
|
72
|
-
// Error messages and debugging
|
|
73
|
-
/\b(error|exception|traceback|stack trace|compilation|syntax error|runtime error|bug|fix)\b/i,
|
|
74
|
-
/(TypeError|ReferenceError|SyntaxError|RangeError|URIError|EvalError|AggregateError)/,
|
|
75
|
-
|
|
76
|
-
// Technical explanations and problem-solving
|
|
77
|
-
/\b(solution|approach|implementation|technique|strategy|pattern|best practice|optimization)\b/i,
|
|
78
|
-
/\b(performance|scalability|maintainability|refactoring|code review|documentation)\b/i,
|
|
79
|
-
|
|
80
|
-
// Decision and architecture keywords
|
|
81
|
-
/\b(decision|chose|选择|决定|architecture|设计|trade-?off|权衡|因为|because|reason|原因)\b/i,
|
|
82
|
-
|
|
83
|
-
// Chinese technical terms (no word boundary - Chinese doesn't use spaces)
|
|
84
|
-
/(函数|方法|类|接口|模块|框架|算法|数据结构|设计模式|变量|常量|参数|返回|异步|回调|闭包|作用域)/,
|
|
85
|
-
/(循环|迭代|递归|条件|异常|错误处理|调试|测试|优化|导入|导出|依赖|接口|端点|请求|响应)/,
|
|
86
|
-
/(数据库|查询|表|索引|事务|迁移|版本控制|提交|合并|分支|部署|实现|继承|重写|多态|封装|抽象)/,
|
|
87
|
-
];
|
|
88
|
-
|
|
89
|
-
// ─── Code-like Patterns ───
|
|
90
|
-
|
|
91
|
-
const CODE_PATTERNS: RegExp[] = [
|
|
92
|
-
/[{}[\]()]/, // Brackets and parentheses
|
|
93
|
-
/[=><!&|]{2}/, // Double operators (==, !=, &&, ||, etc.)
|
|
94
|
-
/\w+\.\w+\(/, // Method calls (obj.method()
|
|
95
|
-
/\w+\s*=\s*\w+/, // Assignment
|
|
96
|
-
/\/\*[\s\S]*?\*\/|\/\/.*$/m, // Comments
|
|
97
|
-
/\$[a-zA-Z_][a-zA-Z0-9_]*/, // Shell/PHP variables
|
|
98
|
-
/@\w+/, // Decorators/annotations
|
|
99
|
-
];
|
|
100
|
-
|
|
101
|
-
// ─── Technical Words (for density calculation) ───
|
|
102
|
-
|
|
103
|
-
const TECHNICAL_WORDS = new Set([
|
|
104
|
-
'api', 'sdk', 'cli', 'gui', 'ui', 'ux', 'ide', 'editor', 'compiler', 'interpreter',
|
|
105
|
-
'runtime', 'virtual', 'machine', 'container', 'image', 'build', 'deploy', 'release',
|
|
106
|
-
'version', 'update', 'patch', 'bug', 'feature', 'enhancement', 'issue', 'ticket',
|
|
107
|
-
'workflow', 'process', 'pipeline', 'automation', 'script', 'batch', 'cron', 'job',
|
|
108
|
-
'service', 'microservice', 'monolith', 'architecture', 'pattern', 'design', 'system',
|
|
109
|
-
'network', 'protocol', 'tcp', 'udp', 'http', 'https', 'ssl', 'tls', 'dns', 'cdn',
|
|
110
|
-
'cache', 'redis', 'memcached', 'session', 'cookie', 'token', 'jwt', 'oauth', 'auth',
|
|
111
|
-
'encrypt', 'decrypt', 'hash', 'salt', 'key', 'certificate', 'binary', 'buffer',
|
|
112
|
-
'json', 'xml', 'yaml', 'toml', 'csv', 'markdown', 'html', 'css', 'regex', 'parser',
|
|
113
|
-
'lexer', 'ast', 'ir', 'bytecode', 'jit', 'gc', 'heap', 'stack', 'memory', 'cpu',
|
|
114
|
-
'thread', 'process', 'async', 'sync', 'concurrent', 'parallel', 'mutex', 'lock',
|
|
115
|
-
'semaphore', 'deadlock', 'race', 'condition', 'atomic', 'volatile', 'immutable',
|
|
116
|
-
]);
|
|
117
|
-
|
|
118
|
-
// ─── Main Filter Function ───
|
|
119
|
-
|
|
120
|
-
export interface SignificanceResult {
|
|
121
|
-
/** Whether the content is significant enough to store */
|
|
122
|
-
isSignificant: boolean;
|
|
123
|
-
/** Reason for the decision (for debugging/logging) */
|
|
124
|
-
reason: string;
|
|
125
|
-
/** Confidence score 0-1 (higher = more confident in decision) */
|
|
126
|
-
confidence: number;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Determine if content is significant enough to be stored as memory.
|
|
131
|
-
*
|
|
132
|
-
* @param content - The text content to evaluate
|
|
133
|
-
* @returns SignificanceResult with decision, reason, and confidence
|
|
134
|
-
*/
|
|
135
|
-
export function isSignificantKnowledge(content: string): SignificanceResult {
|
|
136
|
-
if (!content || typeof content !== 'string') {
|
|
137
|
-
return { isSignificant: false, reason: 'empty_content', confidence: 1.0 };
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
const text = content.trim();
|
|
141
|
-
const textLower = text.toLowerCase();
|
|
142
|
-
|
|
143
|
-
// ─── Phase 1: Skip patterns (fast rejection) ───
|
|
144
|
-
for (const pattern of SKIP_PATTERNS) {
|
|
145
|
-
if (pattern.test(text)) {
|
|
146
|
-
return { isSignificant: false, reason: 'skip_pattern', confidence: 0.9 };
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// ─── Phase 2: Technical patterns (fast acceptance) ───
|
|
151
|
-
for (const pattern of TECHNICAL_PATTERNS) {
|
|
152
|
-
if (pattern.test(text)) {
|
|
153
|
-
return { isSignificant: true, reason: 'technical_pattern', confidence: 0.85 };
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// ─── Phase 3: Code-like patterns ───
|
|
158
|
-
let codePatternMatches = 0;
|
|
159
|
-
for (const pattern of CODE_PATTERNS) {
|
|
160
|
-
if (pattern.test(text)) {
|
|
161
|
-
codePatternMatches++;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
if (codePatternMatches >= 2) {
|
|
165
|
-
return { isSignificant: true, reason: 'code_patterns', confidence: 0.75 };
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// ─── Phase 4: Technical word density ───
|
|
169
|
-
const words = textLower.split(/\s+/).filter(w => w.length > 1);
|
|
170
|
-
if (words.length > 5) {
|
|
171
|
-
const technicalWordCount = words.filter(word =>
|
|
172
|
-
TECHNICAL_WORDS.has(word.replace(/[^\w]/g, ''))
|
|
173
|
-
).length;
|
|
174
|
-
const density = technicalWordCount / words.length;
|
|
175
|
-
|
|
176
|
-
if (density > 0.15) {
|
|
177
|
-
return { isSignificant: true, reason: 'high_technical_density', confidence: 0.7 };
|
|
178
|
-
}
|
|
179
|
-
if (density > 0.08 && words.length > 20) {
|
|
180
|
-
return { isSignificant: true, reason: 'moderate_technical_density', confidence: 0.6 };
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// ─── Phase 5: Length-based heuristic ───
|
|
185
|
-
// Longer content is more likely to be significant
|
|
186
|
-
if (text.length > 200) {
|
|
187
|
-
return { isSignificant: true, reason: 'substantial_length', confidence: 0.5 };
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
// ─── Default: not significant ───
|
|
191
|
-
return { isSignificant: false, reason: 'no_technical_indicators', confidence: 0.6 };
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* Check if content is a retrieved/search result that shouldn't be re-stored.
|
|
196
|
-
* Prevents memory pollution from search results being stored as new memories.
|
|
197
|
-
*/
|
|
198
|
-
export function isRetrievedResult(content: string): boolean {
|
|
199
|
-
if (!content || typeof content !== 'string') return false;
|
|
200
|
-
const text = content.toLowerCase();
|
|
201
|
-
|
|
202
|
-
const retrievedPatterns = [
|
|
203
|
-
/^(memorix_search|memorix_detail|memorix_timeline|search_nodes|read_graph):/i,
|
|
204
|
-
/^(retrieved|result|results|found|matches|nodes|edges|search completed):/i,
|
|
205
|
-
/^(observation #\d+|stored observation|memory #\d+)/i,
|
|
206
|
-
/^(id:|timestamp:|similarity:|source:|type:)/i,
|
|
207
|
-
/^(totalresults:|searchtime:|tokens:)/i,
|
|
208
|
-
];
|
|
209
|
-
|
|
210
|
-
for (const pattern of retrievedPatterns) {
|
|
211
|
-
if (pattern.test(text)) {
|
|
212
|
-
return true;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
return false;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Quick check for trivial commands that should never be stored.
|
|
221
|
-
* Faster than full isSignificantKnowledge for common cases.
|
|
222
|
-
*/
|
|
223
|
-
export function isTrivialCommand(command: string): boolean {
|
|
224
|
-
if (!command || typeof command !== 'string') return true;
|
|
225
|
-
|
|
226
|
-
const trivialPatterns = [
|
|
227
|
-
/^(ls|dir|cd|pwd|echo|cat|type|head|tail|wc|which|where|whoami)(\s|$)/i,
|
|
228
|
-
/^(Get-Content|Test-Path|Get-Item|Get-ChildItem|Set-Location|Write-Host)(\s|$)/i,
|
|
229
|
-
/^(git\s+(status|log|diff|show|branch|remote|stash\s+list))(\s|$)/i,
|
|
230
|
-
/^(npm\s+(list|ls|view|info|outdated))(\s|$)/i,
|
|
231
|
-
/^(pip\s+(list|show|freeze)|python\s+--?version|node\s+--?version)(\s|$)/i,
|
|
232
|
-
/^(env|printenv|set|export)(\s|$)/i,
|
|
233
|
-
/^(clear|cls|exit|quit)(\s|$)/i,
|
|
234
|
-
];
|
|
235
|
-
|
|
236
|
-
const cmd = command.trim();
|
|
237
|
-
|
|
238
|
-
for (const pattern of trivialPatterns) {
|
|
239
|
-
if (pattern.test(cmd)) {
|
|
240
|
-
return true;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
// Self-referential: inspecting memorix's own data files
|
|
245
|
-
if (/\.memorix[/\\]|observations\.json|memorix.*data/i.test(cmd)) {
|
|
246
|
-
return true;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
return false;
|
|
250
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Significance Filter
|
|
3
|
+
*
|
|
4
|
+
* Determines if content is significant enough to be stored as memory.
|
|
5
|
+
* Inspired by Cipher's isSignificantKnowledge() — filters out trivial content
|
|
6
|
+
* while preserving technical knowledge, decisions, and problem-solving.
|
|
7
|
+
*
|
|
8
|
+
* Performance: O(n) regex matching, ~0.1-0.5ms per call.
|
|
9
|
+
* No external dependencies, pure TypeScript.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
// ─── Skip Patterns (content that should NOT be stored) ───
|
|
13
|
+
|
|
14
|
+
const SKIP_PATTERNS: RegExp[] = [
|
|
15
|
+
// Personal information and identity (privacy)
|
|
16
|
+
/\b(my name|user['']?s? name|find my name|who am i|what['']?s my name)\b/i,
|
|
17
|
+
/\b(password|secret|api[_-]?key|access[_-]?token|private[_-]?key)\b/i,
|
|
18
|
+
|
|
19
|
+
// Simple greetings and social interactions
|
|
20
|
+
/^(user:|assistant:)?\s*(hello|hi|hey|good morning|good afternoon|good evening|thanks|thank you|please|sorry|excuse me|bye|goodbye|你好|谢谢|再见)\b/i,
|
|
21
|
+
|
|
22
|
+
// Generic status messages
|
|
23
|
+
/^(task completed|operation successful|processing|loading|waiting|done|finished|ready|完成|成功|处理中)\b/i,
|
|
24
|
+
|
|
25
|
+
// Simple yes/no or acknowledgment responses
|
|
26
|
+
/^(user:|assistant:)?\s*(yes|no|ok|okay|sure|fine|great|good|right|correct|wrong|true|false|是|否|好的|对|错)\s*[.!?]?\s*$/i,
|
|
27
|
+
|
|
28
|
+
// Tool results with no meaningful content
|
|
29
|
+
/^(memorix_search|memorix_store|memorix_detail):\s*(found|completed|no results|error|stored)/i,
|
|
30
|
+
|
|
31
|
+
// Empty or whitespace-only
|
|
32
|
+
/^\s*$/,
|
|
33
|
+
|
|
34
|
+
// Very short content (less than 10 chars after trimming)
|
|
35
|
+
/^.{0,9}$/,
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
// ─── Technical Patterns (content that SHOULD be stored) ───
|
|
39
|
+
|
|
40
|
+
const TECHNICAL_PATTERNS: RegExp[] = [
|
|
41
|
+
// Programming concepts and patterns
|
|
42
|
+
/\b(function|method|class|interface|module|library|framework|algorithm|data structure|design pattern)\b/i,
|
|
43
|
+
/\b(variable|constant|parameter|argument|return|async|await|promise|callback|closure|scope)\b/i,
|
|
44
|
+
/\b(loop|iteration|recursion|condition|exception|error handling|debugging|testing|optimization)\b/i,
|
|
45
|
+
|
|
46
|
+
// Code elements and syntax
|
|
47
|
+
/\b(import|export|require|include|package|dependency|api|endpoint|request|response)\b/i,
|
|
48
|
+
/\b(database|query|sql|nosql|schema|table|index|transaction|orm|migration)\b/i,
|
|
49
|
+
/\b(git|version control|commit|merge|branch|pull request|repository|deployment)\b/i,
|
|
50
|
+
|
|
51
|
+
// Technical implementations
|
|
52
|
+
/\b(implements?|extends?|inherits?|overrides?|polymorphism|encapsulation|abstraction)\b/i,
|
|
53
|
+
/\b(sort|search|filter|map|reduce|transform|parse|serialize|encrypt|decrypt)\b/i,
|
|
54
|
+
/\b(authentication|authorization|security|validation|sanitization|middleware)\b/i,
|
|
55
|
+
|
|
56
|
+
// Code blocks and technical syntax
|
|
57
|
+
/```[\s\S]*```/,
|
|
58
|
+
/`[^`]+`/,
|
|
59
|
+
|
|
60
|
+
// Package managers and build tools
|
|
61
|
+
/\b(npm|yarn|pnpm|pip|composer|cargo|go get|mvn|gradle|webpack|vite|rollup|tsup)\b/i,
|
|
62
|
+
|
|
63
|
+
// File and system operations
|
|
64
|
+
/\b(file|directory|path|config|environment|server|client|host|port|url|http|https|ssl|tls)\b/i,
|
|
65
|
+
/\b(dockerfile|docker|container|kubernetes|cloud|aws|azure|gcp|ci\/cd|pipeline)\b/i,
|
|
66
|
+
|
|
67
|
+
// Programming languages and technologies
|
|
68
|
+
/\b(javascript|typescript|python|java|c\+\+|c#|rust|go|php|ruby|swift|kotlin|scala)\b/i,
|
|
69
|
+
/\b(react|vue|angular|node|express|django|flask|spring|rails|laravel|fastapi|nextjs)\b/i,
|
|
70
|
+
/\b(html|css|scss|sass|tailwind|bootstrap)\b/i,
|
|
71
|
+
|
|
72
|
+
// Error messages and debugging
|
|
73
|
+
/\b(error|exception|traceback|stack trace|compilation|syntax error|runtime error|bug|fix)\b/i,
|
|
74
|
+
/(TypeError|ReferenceError|SyntaxError|RangeError|URIError|EvalError|AggregateError)/,
|
|
75
|
+
|
|
76
|
+
// Technical explanations and problem-solving
|
|
77
|
+
/\b(solution|approach|implementation|technique|strategy|pattern|best practice|optimization)\b/i,
|
|
78
|
+
/\b(performance|scalability|maintainability|refactoring|code review|documentation)\b/i,
|
|
79
|
+
|
|
80
|
+
// Decision and architecture keywords
|
|
81
|
+
/\b(decision|chose|选择|决定|architecture|设计|trade-?off|权衡|因为|because|reason|原因)\b/i,
|
|
82
|
+
|
|
83
|
+
// Chinese technical terms (no word boundary - Chinese doesn't use spaces)
|
|
84
|
+
/(函数|方法|类|接口|模块|框架|算法|数据结构|设计模式|变量|常量|参数|返回|异步|回调|闭包|作用域)/,
|
|
85
|
+
/(循环|迭代|递归|条件|异常|错误处理|调试|测试|优化|导入|导出|依赖|接口|端点|请求|响应)/,
|
|
86
|
+
/(数据库|查询|表|索引|事务|迁移|版本控制|提交|合并|分支|部署|实现|继承|重写|多态|封装|抽象)/,
|
|
87
|
+
];
|
|
88
|
+
|
|
89
|
+
// ─── Code-like Patterns ───
|
|
90
|
+
|
|
91
|
+
const CODE_PATTERNS: RegExp[] = [
|
|
92
|
+
/[{}[\]()]/, // Brackets and parentheses
|
|
93
|
+
/[=><!&|]{2}/, // Double operators (==, !=, &&, ||, etc.)
|
|
94
|
+
/\w+\.\w+\(/, // Method calls (obj.method()
|
|
95
|
+
/\w+\s*=\s*\w+/, // Assignment
|
|
96
|
+
/\/\*[\s\S]*?\*\/|\/\/.*$/m, // Comments
|
|
97
|
+
/\$[a-zA-Z_][a-zA-Z0-9_]*/, // Shell/PHP variables
|
|
98
|
+
/@\w+/, // Decorators/annotations
|
|
99
|
+
];
|
|
100
|
+
|
|
101
|
+
// ─── Technical Words (for density calculation) ───
|
|
102
|
+
|
|
103
|
+
const TECHNICAL_WORDS = new Set([
|
|
104
|
+
'api', 'sdk', 'cli', 'gui', 'ui', 'ux', 'ide', 'editor', 'compiler', 'interpreter',
|
|
105
|
+
'runtime', 'virtual', 'machine', 'container', 'image', 'build', 'deploy', 'release',
|
|
106
|
+
'version', 'update', 'patch', 'bug', 'feature', 'enhancement', 'issue', 'ticket',
|
|
107
|
+
'workflow', 'process', 'pipeline', 'automation', 'script', 'batch', 'cron', 'job',
|
|
108
|
+
'service', 'microservice', 'monolith', 'architecture', 'pattern', 'design', 'system',
|
|
109
|
+
'network', 'protocol', 'tcp', 'udp', 'http', 'https', 'ssl', 'tls', 'dns', 'cdn',
|
|
110
|
+
'cache', 'redis', 'memcached', 'session', 'cookie', 'token', 'jwt', 'oauth', 'auth',
|
|
111
|
+
'encrypt', 'decrypt', 'hash', 'salt', 'key', 'certificate', 'binary', 'buffer',
|
|
112
|
+
'json', 'xml', 'yaml', 'toml', 'csv', 'markdown', 'html', 'css', 'regex', 'parser',
|
|
113
|
+
'lexer', 'ast', 'ir', 'bytecode', 'jit', 'gc', 'heap', 'stack', 'memory', 'cpu',
|
|
114
|
+
'thread', 'process', 'async', 'sync', 'concurrent', 'parallel', 'mutex', 'lock',
|
|
115
|
+
'semaphore', 'deadlock', 'race', 'condition', 'atomic', 'volatile', 'immutable',
|
|
116
|
+
]);
|
|
117
|
+
|
|
118
|
+
// ─── Main Filter Function ───
|
|
119
|
+
|
|
120
|
+
export interface SignificanceResult {
|
|
121
|
+
/** Whether the content is significant enough to store */
|
|
122
|
+
isSignificant: boolean;
|
|
123
|
+
/** Reason for the decision (for debugging/logging) */
|
|
124
|
+
reason: string;
|
|
125
|
+
/** Confidence score 0-1 (higher = more confident in decision) */
|
|
126
|
+
confidence: number;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Determine if content is significant enough to be stored as memory.
|
|
131
|
+
*
|
|
132
|
+
* @param content - The text content to evaluate
|
|
133
|
+
* @returns SignificanceResult with decision, reason, and confidence
|
|
134
|
+
*/
|
|
135
|
+
export function isSignificantKnowledge(content: string): SignificanceResult {
|
|
136
|
+
if (!content || typeof content !== 'string') {
|
|
137
|
+
return { isSignificant: false, reason: 'empty_content', confidence: 1.0 };
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const text = content.trim();
|
|
141
|
+
const textLower = text.toLowerCase();
|
|
142
|
+
|
|
143
|
+
// ─── Phase 1: Skip patterns (fast rejection) ───
|
|
144
|
+
for (const pattern of SKIP_PATTERNS) {
|
|
145
|
+
if (pattern.test(text)) {
|
|
146
|
+
return { isSignificant: false, reason: 'skip_pattern', confidence: 0.9 };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// ─── Phase 2: Technical patterns (fast acceptance) ───
|
|
151
|
+
for (const pattern of TECHNICAL_PATTERNS) {
|
|
152
|
+
if (pattern.test(text)) {
|
|
153
|
+
return { isSignificant: true, reason: 'technical_pattern', confidence: 0.85 };
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// ─── Phase 3: Code-like patterns ───
|
|
158
|
+
let codePatternMatches = 0;
|
|
159
|
+
for (const pattern of CODE_PATTERNS) {
|
|
160
|
+
if (pattern.test(text)) {
|
|
161
|
+
codePatternMatches++;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (codePatternMatches >= 2) {
|
|
165
|
+
return { isSignificant: true, reason: 'code_patterns', confidence: 0.75 };
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// ─── Phase 4: Technical word density ───
|
|
169
|
+
const words = textLower.split(/\s+/).filter(w => w.length > 1);
|
|
170
|
+
if (words.length > 5) {
|
|
171
|
+
const technicalWordCount = words.filter(word =>
|
|
172
|
+
TECHNICAL_WORDS.has(word.replace(/[^\w]/g, ''))
|
|
173
|
+
).length;
|
|
174
|
+
const density = technicalWordCount / words.length;
|
|
175
|
+
|
|
176
|
+
if (density > 0.15) {
|
|
177
|
+
return { isSignificant: true, reason: 'high_technical_density', confidence: 0.7 };
|
|
178
|
+
}
|
|
179
|
+
if (density > 0.08 && words.length > 20) {
|
|
180
|
+
return { isSignificant: true, reason: 'moderate_technical_density', confidence: 0.6 };
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// ─── Phase 5: Length-based heuristic ───
|
|
185
|
+
// Longer content is more likely to be significant
|
|
186
|
+
if (text.length > 200) {
|
|
187
|
+
return { isSignificant: true, reason: 'substantial_length', confidence: 0.5 };
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// ─── Default: not significant ───
|
|
191
|
+
return { isSignificant: false, reason: 'no_technical_indicators', confidence: 0.6 };
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Check if content is a retrieved/search result that shouldn't be re-stored.
|
|
196
|
+
* Prevents memory pollution from search results being stored as new memories.
|
|
197
|
+
*/
|
|
198
|
+
export function isRetrievedResult(content: string): boolean {
|
|
199
|
+
if (!content || typeof content !== 'string') return false;
|
|
200
|
+
const text = content.toLowerCase();
|
|
201
|
+
|
|
202
|
+
const retrievedPatterns = [
|
|
203
|
+
/^(memorix_search|memorix_detail|memorix_timeline|search_nodes|read_graph):/i,
|
|
204
|
+
/^(retrieved|result|results|found|matches|nodes|edges|search completed):/i,
|
|
205
|
+
/^(observation #\d+|stored observation|memory #\d+)/i,
|
|
206
|
+
/^(id:|timestamp:|similarity:|source:|type:)/i,
|
|
207
|
+
/^(totalresults:|searchtime:|tokens:)/i,
|
|
208
|
+
];
|
|
209
|
+
|
|
210
|
+
for (const pattern of retrievedPatterns) {
|
|
211
|
+
if (pattern.test(text)) {
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Quick check for trivial commands that should never be stored.
|
|
221
|
+
* Faster than full isSignificantKnowledge for common cases.
|
|
222
|
+
*/
|
|
223
|
+
export function isTrivialCommand(command: string): boolean {
|
|
224
|
+
if (!command || typeof command !== 'string') return true;
|
|
225
|
+
|
|
226
|
+
const trivialPatterns = [
|
|
227
|
+
/^(ls|dir|cd|pwd|echo|cat|type|head|tail|wc|which|where|whoami)(\s|$)/i,
|
|
228
|
+
/^(Get-Content|Test-Path|Get-Item|Get-ChildItem|Set-Location|Write-Host)(\s|$)/i,
|
|
229
|
+
/^(git\s+(status|log|diff|show|branch|remote|stash\s+list))(\s|$)/i,
|
|
230
|
+
/^(npm\s+(list|ls|view|info|outdated))(\s|$)/i,
|
|
231
|
+
/^(pip\s+(list|show|freeze)|python\s+--?version|node\s+--?version)(\s|$)/i,
|
|
232
|
+
/^(env|printenv|set|export)(\s|$)/i,
|
|
233
|
+
/^(clear|cls|exit|quit)(\s|$)/i,
|
|
234
|
+
];
|
|
235
|
+
|
|
236
|
+
const cmd = command.trim();
|
|
237
|
+
|
|
238
|
+
for (const pattern of trivialPatterns) {
|
|
239
|
+
if (pattern.test(cmd)) {
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Self-referential: inspecting memorix's own data files
|
|
245
|
+
if (/\.memorix[/\\]|observations\.json|memorix.*data/i.test(cmd)) {
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return false;
|
|
250
|
+
}
|