@zooique/memora 1.0.1 → 2.0.3
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/README.en.md +272 -0
- package/README.md +150 -38
- package/dist/agent/agent.d.ts +257 -115
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +747 -400
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/assembler.d.ts +32 -16
- package/dist/agent/assembler.d.ts.map +1 -1
- package/dist/agent/assembler.js +83 -47
- package/dist/agent/assembler.js.map +1 -1
- package/dist/agent/builtinToolHandlers.d.ts +27 -2
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
- package/dist/agent/builtinToolHandlers.js +78 -5
- package/dist/agent/builtinToolHandlers.js.map +1 -1
- package/dist/agent/constants.d.ts +4 -0
- package/dist/agent/constants.d.ts.map +1 -1
- package/dist/agent/constants.js +4 -0
- package/dist/agent/constants.js.map +1 -1
- package/dist/agent/contextManager.d.ts +8 -0
- package/dist/agent/contextManager.d.ts.map +1 -1
- package/dist/agent/contextManager.js +7 -2
- package/dist/agent/contextManager.js.map +1 -1
- package/dist/agent/guardrail.d.ts +4 -2
- package/dist/agent/guardrail.d.ts.map +1 -1
- package/dist/agent/guardrail.js +13 -5
- package/dist/agent/guardrail.js.map +1 -1
- package/dist/agent/loop.d.ts +137 -15
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +449 -270
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/managers/archiveCoordinator.d.ts +126 -22
- package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
- package/dist/agent/managers/archiveCoordinator.js +239 -44
- package/dist/agent/managers/archiveCoordinator.js.map +1 -1
- package/dist/agent/managers/autoConfigRefiner.d.ts.map +1 -1
- package/dist/agent/managers/autoConfigRefiner.js +4 -8
- package/dist/agent/managers/autoConfigRefiner.js.map +1 -1
- package/dist/agent/managers/chatLockManager.d.ts +116 -0
- package/dist/agent/managers/chatLockManager.d.ts.map +1 -0
- package/dist/agent/managers/chatLockManager.js +191 -0
- package/dist/agent/managers/chatLockManager.js.map +1 -0
- package/dist/agent/managers/configManager.d.ts +87 -3
- package/dist/agent/managers/configManager.d.ts.map +1 -1
- package/dist/agent/managers/configManager.js +139 -2
- package/dist/agent/managers/configManager.js.map +1 -1
- package/dist/agent/managers/dedupManager.d.ts +169 -0
- package/dist/agent/managers/dedupManager.d.ts.map +1 -0
- package/dist/agent/managers/dedupManager.js +336 -0
- package/dist/agent/managers/dedupManager.js.map +1 -0
- package/dist/agent/managers/insightExtractor.d.ts +31 -3
- package/dist/agent/managers/insightExtractor.d.ts.map +1 -1
- package/dist/agent/managers/insightExtractor.js +130 -59
- package/dist/agent/managers/insightExtractor.js.map +1 -1
- package/dist/agent/managers/llmJudgeHelper.d.ts +38 -0
- package/dist/agent/managers/llmJudgeHelper.d.ts.map +1 -0
- package/dist/agent/managers/llmJudgeHelper.js +49 -0
- package/dist/agent/managers/llmJudgeHelper.js.map +1 -0
- package/dist/agent/managers/memoryAdvisor.d.ts +102 -2
- package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
- package/dist/agent/managers/memoryAdvisor.js +254 -10
- package/dist/agent/managers/memoryAdvisor.js.map +1 -1
- package/dist/agent/managers/memoryDecayScheduler.d.ts +127 -1
- package/dist/agent/managers/memoryDecayScheduler.d.ts.map +1 -1
- package/dist/agent/managers/memoryDecayScheduler.js +283 -4
- package/dist/agent/managers/memoryDecayScheduler.js.map +1 -1
- package/dist/agent/managers/memoryGovernance.d.ts +56 -0
- package/dist/agent/managers/memoryGovernance.d.ts.map +1 -0
- package/dist/agent/managers/memoryGovernance.js +63 -0
- package/dist/agent/managers/memoryGovernance.js.map +1 -0
- package/dist/agent/managers/memoryInspector.d.ts +113 -30
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
- package/dist/agent/managers/memoryInspector.js +165 -32
- package/dist/agent/managers/memoryInspector.js.map +1 -1
- package/dist/agent/managers/relationBuilder.d.ts +4 -4
- package/dist/agent/managers/relationBuilder.d.ts.map +1 -1
- package/dist/agent/managers/relationBuilder.js +5 -4
- package/dist/agent/managers/relationBuilder.js.map +1 -1
- package/dist/agent/managers/sessionArchiver.d.ts +12 -1
- package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
- package/dist/agent/managers/sessionArchiver.js +87 -30
- package/dist/agent/managers/sessionArchiver.js.map +1 -1
- package/dist/agent/managers/sessionManager.d.ts.map +1 -1
- package/dist/agent/managers/sessionManager.js +9 -17
- package/dist/agent/managers/sessionManager.js.map +1 -1
- package/dist/agent/managers/streamAccumulator.d.ts +45 -0
- package/dist/agent/managers/streamAccumulator.d.ts.map +1 -0
- package/dist/agent/managers/streamAccumulator.js +40 -0
- package/dist/agent/managers/streamAccumulator.js.map +1 -0
- package/dist/agent/managers/textPolishManager.d.ts +62 -0
- package/dist/agent/managers/textPolishManager.d.ts.map +1 -0
- package/dist/agent/managers/textPolishManager.js +96 -0
- package/dist/agent/managers/textPolishManager.js.map +1 -0
- package/dist/agent/managers/workProjection.d.ts +16 -1
- package/dist/agent/managers/workProjection.d.ts.map +1 -1
- package/dist/agent/managers/workProjection.js +48 -24
- package/dist/agent/managers/workProjection.js.map +1 -1
- package/dist/agent/personaMatcher.d.ts +29 -0
- package/dist/agent/personaMatcher.d.ts.map +1 -0
- package/dist/agent/personaMatcher.js +60 -0
- package/dist/agent/personaMatcher.js.map +1 -0
- package/dist/agent/toolExecutor.d.ts +24 -4
- package/dist/agent/toolExecutor.d.ts.map +1 -1
- package/dist/agent/toolExecutor.js +30 -4
- package/dist/agent/toolExecutor.js.map +1 -1
- package/dist/agent/tracer.d.ts +31 -0
- package/dist/agent/tracer.d.ts.map +1 -1
- package/dist/agent/tracer.js +31 -0
- package/dist/agent/tracer.js.map +1 -1
- package/dist/agent/types.d.ts +133 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +38 -0
- package/dist/agent/types.js.map +1 -1
- package/dist/agent/userFactExtractor.d.ts.map +1 -1
- package/dist/agent/userFactExtractor.js +7 -0
- package/dist/agent/userFactExtractor.js.map +1 -1
- package/dist/config/loader.d.ts +124 -236
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +296 -118
- package/dist/config/loader.js.map +1 -1
- package/dist/eval/evalRunner.d.ts +94 -0
- package/dist/eval/evalRunner.d.ts.map +1 -0
- package/dist/eval/evalRunner.js +141 -0
- package/dist/eval/evalRunner.js.map +1 -0
- package/dist/eval/evalTypes.d.ts +21 -0
- package/dist/eval/evalTypes.d.ts.map +1 -1
- package/dist/eval/evalTypes.js +15 -0
- package/dist/eval/evalTypes.js.map +1 -1
- package/dist/eval/scenarios.d.ts +33 -0
- package/dist/eval/scenarios.d.ts.map +1 -0
- package/dist/eval/scenarios.js +109 -0
- package/dist/eval/scenarios.js.map +1 -0
- package/dist/index.d.ts +45 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +45 -5
- package/dist/index.js.map +1 -1
- package/dist/llm/abortSignal.d.ts +27 -0
- package/dist/llm/abortSignal.d.ts.map +1 -0
- package/dist/llm/abortSignal.js +44 -0
- package/dist/llm/abortSignal.js.map +1 -0
- package/dist/llm/embedding.d.ts +13 -12
- package/dist/llm/embedding.d.ts.map +1 -1
- package/dist/llm/embedding.js +5 -17
- package/dist/llm/embedding.js.map +1 -1
- package/dist/llm/factory.d.ts +19 -5
- package/dist/llm/factory.d.ts.map +1 -1
- package/dist/llm/factory.js +19 -37
- package/dist/llm/factory.js.map +1 -1
- package/dist/llm/openaiCompatible.d.ts.map +1 -1
- package/dist/llm/openaiCompatible.js +17 -34
- package/dist/llm/openaiCompatible.js.map +1 -1
- package/dist/logging/logger.d.ts +3 -1
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +47 -50
- package/dist/logging/logger.js.map +1 -1
- package/dist/memory/governance.d.ts +50 -0
- package/dist/memory/governance.d.ts.map +1 -0
- package/dist/memory/governance.js +70 -0
- package/dist/memory/governance.js.map +1 -0
- package/dist/memory/hybridMerge.d.ts +0 -4
- package/dist/memory/hybridMerge.d.ts.map +1 -1
- package/dist/memory/hybridMerge.js +19 -4
- package/dist/memory/hybridMerge.js.map +1 -1
- package/dist/memory/inMemoryRelationStore.d.ts +7 -0
- package/dist/memory/inMemoryRelationStore.d.ts.map +1 -1
- package/dist/memory/inMemoryRelationStore.js +15 -0
- package/dist/memory/inMemoryRelationStore.js.map +1 -1
- package/dist/memory/inMemoryStorage.d.ts +36 -1
- package/dist/memory/inMemoryStorage.d.ts.map +1 -1
- package/dist/memory/inMemoryStorage.js +70 -19
- package/dist/memory/inMemoryStorage.js.map +1 -1
- package/dist/memory/loader.d.ts +2 -0
- package/dist/memory/loader.d.ts.map +1 -1
- package/dist/memory/loader.js +8 -1
- package/dist/memory/loader.js.map +1 -1
- package/dist/memory/lockManager.d.ts +7 -2
- package/dist/memory/lockManager.d.ts.map +1 -1
- package/dist/memory/lockManager.js +35 -17
- package/dist/memory/lockManager.js.map +1 -1
- package/dist/memory/projectManager.d.ts +8 -7
- package/dist/memory/projectManager.d.ts.map +1 -1
- package/dist/memory/projectManager.js +33 -15
- package/dist/memory/projectManager.js.map +1 -1
- package/dist/memory/projectRegistry.d.ts +34 -1
- package/dist/memory/projectRegistry.d.ts.map +1 -1
- package/dist/memory/projectRegistry.js +100 -31
- package/dist/memory/projectRegistry.js.map +1 -1
- package/dist/memory/recall.d.ts +16 -0
- package/dist/memory/recall.d.ts.map +1 -1
- package/dist/memory/recall.js +35 -20
- package/dist/memory/recall.js.map +1 -1
- package/dist/memory/relationStore.d.ts +20 -3
- package/dist/memory/relationStore.d.ts.map +1 -1
- package/dist/memory/sourceValidation.d.ts +17 -0
- package/dist/memory/sourceValidation.d.ts.map +1 -1
- package/dist/memory/sourceValidation.js +27 -3
- package/dist/memory/sourceValidation.js.map +1 -1
- package/dist/memory/storageInterface.d.ts +26 -1
- package/dist/memory/storageInterface.d.ts.map +1 -1
- package/dist/memory/store.d.ts +22 -1
- package/dist/memory/store.d.ts.map +1 -1
- package/dist/memory/store.js +58 -20
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/types.d.ts +44 -31
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +63 -24
- package/dist/memory/types.js.map +1 -1
- package/dist/memory/userProfile.d.ts +32 -8
- package/dist/memory/userProfile.d.ts.map +1 -1
- package/dist/memory/userProfile.js +105 -44
- package/dist/memory/userProfile.js.map +1 -1
- package/dist/memory/vectorStore.d.ts +16 -8
- package/dist/memory/vectorStore.d.ts.map +1 -1
- package/dist/memory/vectorStore.js +49 -22
- package/dist/memory/vectorStore.js.map +1 -1
- package/dist/persona/personaManager.d.ts +38 -63
- package/dist/persona/personaManager.d.ts.map +1 -1
- package/dist/persona/personaManager.js +136 -202
- package/dist/persona/personaManager.js.map +1 -1
- package/dist/skill/skillManager.d.ts +11 -57
- package/dist/skill/skillManager.d.ts.map +1 -1
- package/dist/skill/skillManager.js +46 -141
- package/dist/skill/skillManager.js.map +1 -1
- package/dist/skill/types.d.ts +2 -3
- package/dist/skill/types.d.ts.map +1 -1
- package/dist/utils/array.d.ts +24 -0
- package/dist/utils/array.d.ts.map +1 -0
- package/dist/utils/array.js +24 -0
- package/dist/utils/array.js.map +1 -0
- package/dist/utils/configResourceManager.d.ts +111 -0
- package/dist/utils/configResourceManager.d.ts.map +1 -0
- package/dist/utils/configResourceManager.js +148 -0
- package/dist/utils/configResourceManager.js.map +1 -0
- package/dist/utils/errors.d.ts +27 -8
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +31 -9
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/eventEmitter.d.ts +88 -4
- package/dist/utils/eventEmitter.d.ts.map +1 -1
- package/dist/utils/eventEmitter.js +23 -0
- package/dist/utils/eventEmitter.js.map +1 -1
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +4 -2
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/math.d.ts +11 -0
- package/dist/utils/math.d.ts.map +1 -1
- package/dist/utils/math.js +17 -0
- package/dist/utils/math.js.map +1 -1
- package/dist/utils/objects.d.ts +17 -0
- package/dist/utils/objects.d.ts.map +1 -0
- package/dist/utils/objects.js +19 -0
- package/dist/utils/objects.js.map +1 -0
- package/dist/utils/segmenter.d.ts +11 -10
- package/dist/utils/segmenter.d.ts.map +1 -1
- package/dist/utils/segmenter.js +23 -1
- package/dist/utils/segmenter.js.map +1 -1
- package/dist/utils/strings.d.ts +22 -1
- package/dist/utils/strings.d.ts.map +1 -1
- package/dist/utils/strings.js +29 -1
- package/dist/utils/strings.js.map +1 -1
- package/dist/utils/time.d.ts +18 -3
- package/dist/utils/time.d.ts.map +1 -1
- package/dist/utils/time.js +24 -8
- package/dist/utils/time.js.map +1 -1
- package/dist/utils/toError.d.ts +8 -4
- package/dist/utils/toError.d.ts.map +1 -1
- package/dist/utils/toError.js +25 -5
- package/dist/utils/toError.js.map +1 -1
- package/docs/memora-api-reference.md +1235 -0
- package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +808 -0
- package/package.json +49 -22
- package/dist/agent/managers/memoryMutator.d.ts +0 -92
- package/dist/agent/managers/memoryMutator.d.ts.map +0 -1
- package/dist/agent/managers/memoryMutator.js +0 -94
- package/dist/agent/managers/memoryMutator.js.map +0 -1
package/README.en.md
ADDED
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
# Memora
|
|
2
|
+
|
|
3
|
+
> Universal Agent Memory Kernel — Local-first, Private, Domain-agnostic. Everything is Memory.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@zooique/memora)
|
|
6
|
+
[](https://nodejs.org)
|
|
7
|
+
[](https://www.typescriptlang.org)
|
|
8
|
+
[](https://vitest.dev)
|
|
9
|
+
[](https://vitest.dev)
|
|
10
|
+
[](package.json)
|
|
11
|
+
[](LICENSE)
|
|
12
|
+
|
|
13
|
+
**中文** → [README.md](./README.md)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## What is this?
|
|
18
|
+
|
|
19
|
+
Memora is an **Agent memory infrastructure** — it gives your AI Agent persistent, cross-session long-term memory.
|
|
20
|
+
|
|
21
|
+
It solves one core problem: **LLMs are stateless, but user tasks are continuous.**
|
|
22
|
+
|
|
23
|
+
Memora builds continuous evolution on top of stateless inference: memory persistence, intelligent recall, natural decay, semantic deduplication, conflict detection — a complete memory lifecycle, all running locally. Your data never leaves your machine.
|
|
24
|
+
|
|
25
|
+
## Design Philosophy
|
|
26
|
+
|
|
27
|
+
> **Everything is Memory.**
|
|
28
|
+
>
|
|
29
|
+
> Persona is "I remember who I am." Rules are "I remember how to behave." Skills are "I remember how to do certain things." Conversation history is "I remember what we talked about."
|
|
30
|
+
|
|
31
|
+
Memora is a **brain kernel that cannot run standalone** — it has interfaces but no "form." A CLI, WebUI, desktop sprite, or novel generator can be its "host." The host gives it a body (UI), blood vessels (Provider), and neural circuits (event loops).
|
|
32
|
+
|
|
33
|
+
## Core Capabilities
|
|
34
|
+
|
|
35
|
+
| Capability | Description |
|
|
36
|
+
|-----------|-------------|
|
|
37
|
+
| **Long-term Memory** | Cross-session, cross-topic memory persistence with intelligent recall |
|
|
38
|
+
| **Dual-channel Recall** | Semantic vector search + keyword search, hybridMerge fusion ranking |
|
|
39
|
+
| **Memory Governance L1-L4** | L1 semantic dedup → L2 timeliness eval → L3 conflict detection → L4 scheduled decay |
|
|
40
|
+
| **Relation Graph** | contradicts / supports / follows / refines / caused — five relation types |
|
|
41
|
+
| **Agent-Persona Separation** | Agent is a pure memory engine; persona is a personality vessel. Switch personas without losing memories |
|
|
42
|
+
| **Unified Memory Model** | Everything is a "Memory" primitive, distinguished by open-string `source` — no closed enums |
|
|
43
|
+
| **Domain-agnostic** | Same architecture, different memory configs → different domains |
|
|
44
|
+
| **Zero-dependency Kernel** | No third-party runtime dependencies; persistence injected by host via interfaces |
|
|
45
|
+
| **Content Guardrails** | Regex rules + block/warn actions, bidirectional input/output checking |
|
|
46
|
+
| **Observability** | ITracer interface + structured spans, plug into any APM |
|
|
47
|
+
|
|
48
|
+
## Quick Start
|
|
49
|
+
|
|
50
|
+
### Install
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
npm install @zooique/memora
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Create an Agent
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import { Agent, createLlmProvider } from '@zooique/memora';
|
|
60
|
+
|
|
61
|
+
// Host responsibility: create an LLM Provider
|
|
62
|
+
// Works with any OpenAI Chat Completions-compatible service
|
|
63
|
+
const provider = createLlmProvider({
|
|
64
|
+
provider: 'openaiCompatible',
|
|
65
|
+
apiKey: process.env.LLM_API_KEY!,
|
|
66
|
+
baseUrl: 'https://api.deepseek.com/v1',
|
|
67
|
+
model: 'deepseek-chat',
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// Create Agent
|
|
71
|
+
const agent = new Agent({
|
|
72
|
+
projectPath: '/path/to/project',
|
|
73
|
+
provider,
|
|
74
|
+
configDir: '/path/to/agent-config', // personas / rules / skills
|
|
75
|
+
dataDir: '.memora', // memory data directory
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
await agent.init();
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Chat (Streaming)
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
for await (const chunk of agent.chat('Hi, remember that I love TypeScript')) {
|
|
85
|
+
if (chunk.type === 'text') {
|
|
86
|
+
process.stdout.write(chunk.content);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Next session — the agent automatically recalls "loves TypeScript"
|
|
91
|
+
const reply = await agent.chatSync('What language do I like?');
|
|
92
|
+
// → Answers based on recalled memory
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Memory Management
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
// Search memories (hybrid: semantic + keyword)
|
|
99
|
+
const hits = await agent.memory.searchHybrid('TypeScript preference', { limit: 5 });
|
|
100
|
+
|
|
101
|
+
// Governance: semantic deduplication
|
|
102
|
+
const report = await agent.deduplicateMemories();
|
|
103
|
+
console.log(`Deduplicated ${report.deduplicatedCount} memories`);
|
|
104
|
+
|
|
105
|
+
// Governance: timeliness evaluation
|
|
106
|
+
const timeliness = await agent.evaluateTimeliness();
|
|
107
|
+
|
|
108
|
+
// Governance: conflict detection
|
|
109
|
+
const conflicts = await agent.detectConflicts();
|
|
110
|
+
|
|
111
|
+
// Manual decay trigger
|
|
112
|
+
await agent.runMemoryDecayOnce();
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Cleanup
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
await agent.close();
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Architecture
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
┌────────────────────────────────────────────────────────────┐
|
|
125
|
+
│ Host Application (CLI / Desktop Sprite / WebUI / Game) │
|
|
126
|
+
│ ┌─────────────────┐ ┌──────────────────┐ │
|
|
127
|
+
│ │ LLM Provider │◄───│ API Key / baseUrl │ ← Host job │
|
|
128
|
+
│ └────────┬────────┘ └──────────────────┘ │
|
|
129
|
+
│ │ inject │
|
|
130
|
+
│ ▼ │
|
|
131
|
+
│ ┌──────────────────────────────────────────┐ │
|
|
132
|
+
│ │ Memora Kernel (Agent) │ │
|
|
133
|
+
│ │ - chat(input) → streaming response │ │
|
|
134
|
+
│ │ - Dual-channel recall (semantic+keyword)│ │
|
|
135
|
+
│ │ - Governance L1-L4 (dedup/age/conflict) │ │
|
|
136
|
+
│ │ - Persona matching / Skill matching │ │
|
|
137
|
+
│ │ - Tool registration / execution │ │
|
|
138
|
+
│ │ - Session archive / Insight extraction │ │
|
|
139
|
+
│ └──────────────────────────────────────────┘ │
|
|
140
|
+
└────────────────────────────────────────────────────────────┘
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Six Injectable Interfaces
|
|
144
|
+
|
|
145
|
+
The kernel interacts with the outside world through interfaces. Hosts inject implementations as needed:
|
|
146
|
+
|
|
147
|
+
| Interface | Responsibility | Built-in Implementation |
|
|
148
|
+
|-----------|---------------|------------------------|
|
|
149
|
+
| `IMemoryStorage` | Memory CRUD + search + decay | `InMemoryStorage` |
|
|
150
|
+
| `IVectorStore` | Semantic vector index | `JsonVectorStore` |
|
|
151
|
+
| `IMemoryRelationStore` | Memory relation graph | `InMemoryRelationStore` |
|
|
152
|
+
| `ISessionStore` | Session history persistence | None (host implements) |
|
|
153
|
+
| `ILogger` | Logging output | console fallback |
|
|
154
|
+
| `ITracer` | Observability spans | `NOOP_TRACER` |
|
|
155
|
+
|
|
156
|
+
## Project Structure
|
|
157
|
+
|
|
158
|
+
```
|
|
159
|
+
src/
|
|
160
|
+
├── index.ts # Library exports (pure types + interfaces, no CLI)
|
|
161
|
+
├── agent/ # Agent facade + AgentLoop execution engine
|
|
162
|
+
│ ├── agent.ts # Facade class (single entry point for hosts)
|
|
163
|
+
│ ├── loop.ts # Core loop (reason → tool call → reflection retry)
|
|
164
|
+
│ ├── assembler.ts # Component assembler (pure factory, stateless)
|
|
165
|
+
│ ├── toolExecutor.ts # Tool registration & execution
|
|
166
|
+
│ ├── contextManager.ts # Context window management (truncation + summary)
|
|
167
|
+
│ ├── guardrail.ts # Content guardrails (regex + block/warn)
|
|
168
|
+
│ └── managers/ # 15 specialized Managers
|
|
169
|
+
│ ├── archiveCoordinator.ts # Archive coordination
|
|
170
|
+
│ ├── memoryInspector.ts # Memory read/write (CRUD + search + stats)
|
|
171
|
+
│ ├── memoryGovernance.ts # Governance unified facade (L1-L4)
|
|
172
|
+
│ ├── dedupManager.ts # L1 semantic deduplication
|
|
173
|
+
│ ├── memoryDecayScheduler.ts # L4 scheduled decay + L2 timeliness
|
|
174
|
+
│ ├── memoryAdvisor.ts # L3 conflict detection + health diagnosis
|
|
175
|
+
│ ├── insightExtractor.ts # Conversation insight extraction
|
|
176
|
+
│ ├── relationBuilder.ts # Memory relation building (ADR-014)
|
|
177
|
+
│ ├── sessionManager.ts # Session management (fork/switch)
|
|
178
|
+
│ ├── sessionArchiver.ts # Session content archiving
|
|
179
|
+
│ ├── configManager.ts # Config management (hot-reload rules/skills)
|
|
180
|
+
│ ├── autoConfigRefiner.ts # Self-evolving config suggestions
|
|
181
|
+
│ ├── workProjection.ts # Work projection management
|
|
182
|
+
│ ├── textPolishManager.ts # Text polishing
|
|
183
|
+
│ └── chatLockManager.ts # Chat concurrency lock
|
|
184
|
+
├── memory/ # Memory engine
|
|
185
|
+
│ ├── types.ts # Memory primitive (8 fields) + relation types
|
|
186
|
+
│ ├── storageInterface.ts # IMemoryStorage interface (16 methods)
|
|
187
|
+
│ ├── recall.ts # Dual-channel recall (semantic + keyword)
|
|
188
|
+
│ ├── hybridMerge.ts # Fusion ranking algorithm
|
|
189
|
+
│ ├── vectorStore.ts # IVectorStore + JsonVectorStore
|
|
190
|
+
│ ├── relationStore.ts # IMemoryRelationStore interface
|
|
191
|
+
│ ├── governance.ts # Governance shared constants (decay/boost/ceiling)
|
|
192
|
+
│ ├── userProfile.ts # User profile management
|
|
193
|
+
│ └── projectManager.ts # Multi-project registry + lock management
|
|
194
|
+
├── llm/ # LLM adapter layer
|
|
195
|
+
│ ├── provider.ts # LlmProvider abstract class
|
|
196
|
+
│ ├── openaiCompatible.ts # OpenAI-compatible protocol implementation
|
|
197
|
+
│ ├── embedding.ts # EmbeddingProvider (/embeddings endpoint)
|
|
198
|
+
│ └── factory.ts # createLlmProvider factory
|
|
199
|
+
├── persona/ # Persona management (pure files + in-memory cache)
|
|
200
|
+
├── skill/ # Skill management (keyword matching + per-turn injection)
|
|
201
|
+
├── security/ # Security (two-level permissions + path whitelist + audit)
|
|
202
|
+
├── config/ # Config loading (JSON + env variable interpolation)
|
|
203
|
+
├── logging/ # Logging (ILogger interface + lazy initialization)
|
|
204
|
+
├── eval/ # Eval framework (EvalScenario + EvalRunner, for CI)
|
|
205
|
+
└── utils/ # Utilities (event emitter / segmenter / errors / timers)
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Tech Stack
|
|
209
|
+
|
|
210
|
+
| Category | Choice | Rationale |
|
|
211
|
+
|----------|--------|-----------|
|
|
212
|
+
| Runtime | Node.js ≥ 22 LTS + TypeScript 5 strict + ESM | ADR-001 |
|
|
213
|
+
| Data Layer | IMemoryStorage interface (host injects persistence) | ADR-002 |
|
|
214
|
+
| LLM Protocol | OpenAI Chat Completions compatible (streaming SSE + Tool Calling) | ADR-003 |
|
|
215
|
+
| Memory Model | Open-string source primitive ("Everything is Memory" v2) | ADR-004 |
|
|
216
|
+
| Vector Search | IVectorStore interface + built-in JsonVectorStore (pure JS cosine similarity) | ADR-002 |
|
|
217
|
+
| Relation Graph | IMemoryRelationStore sidecar model (non-invasive to Memory primitive) | ADR-014 |
|
|
218
|
+
| Form Factor | Pure logic library (zero native deps, CLI/UI provided by host) | ADR-002 |
|
|
219
|
+
| Security | Two-level permissions + path whitelist + audit log | ADR-006 |
|
|
220
|
+
| Testing | Vitest + MSW Mock LLM + InMemoryStorage | ADR-007 |
|
|
221
|
+
|
|
222
|
+
## Engineering Quality
|
|
223
|
+
|
|
224
|
+
| Metric | Value |
|
|
225
|
+
|--------|-------|
|
|
226
|
+
| Source | 82 files / 17,459 lines |
|
|
227
|
+
| Tests | 75 files / 23,042 lines (test code > production code) |
|
|
228
|
+
| Tests Passing | 1,715+ |
|
|
229
|
+
| Statement Coverage | 89.3% |
|
|
230
|
+
| Branch Coverage | 81.7% |
|
|
231
|
+
| Function Coverage | 91.7% |
|
|
232
|
+
| Runtime Dependencies | **0** |
|
|
233
|
+
| Architecture Decision Records | 25 ADRs |
|
|
234
|
+
|
|
235
|
+
## Development
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
npm test # Run tests
|
|
239
|
+
npm run test:cov # Run tests + coverage
|
|
240
|
+
npm run typecheck # TypeScript type checking
|
|
241
|
+
npm run lint # ESLint
|
|
242
|
+
npm run build # Compile to dist/
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## Documentation
|
|
246
|
+
|
|
247
|
+
- [Integration Guide](docs/memora-接入指南.md) — Complete host developer onboarding manual (Chinese)
|
|
248
|
+
- [API Reference](docs/memora-api-reference.md) — Public API quick reference (Chinese)
|
|
249
|
+
- [Config Example](config.example.json) — LLM / Embedding / Security config template
|
|
250
|
+
|
|
251
|
+
## Host Project
|
|
252
|
+
|
|
253
|
+
[memora-sprite](hosts/memora-sprite/) — An Electron-based desktop sprite host (v1.5.0), demonstrating a complete Memora integration: SQLite persistence, vector indexing, system tray, global shortcuts, and memory graph visualization.
|
|
254
|
+
|
|
255
|
+
## Why Memora?
|
|
256
|
+
|
|
257
|
+
| | Memora | Cloud memory services | Framework memory modules |
|
|
258
|
+
|---|---|---|---|
|
|
259
|
+
| Data privacy | ✅ 100% local | ❌ Cloud-dependent | ⚠️ Varies |
|
|
260
|
+
| Runtime deps | ✅ Zero | N/A (SaaS) | ❌ Heavy |
|
|
261
|
+
| Memory lifecycle | ✅ Full (dedup/decay/conflict) | ⚠️ Partial | ❌ CRUD only |
|
|
262
|
+
| Domain-agnostic | ✅ Open-string source | ⚠️ Opinionated | ⚠️ Framework-locked |
|
|
263
|
+
| Embeddable | ✅ Any Node.js host | ❌ API calls only | ⚠️ Framework-bound |
|
|
264
|
+
| Relation graph | ✅ Built-in sidecar | ❌ Rare | ❌ Rare |
|
|
265
|
+
|
|
266
|
+
## Contributing
|
|
267
|
+
|
|
268
|
+
This project follows the "Big Tree Model" engineering philosophy. Architecture Decision Records (ADRs) are in `.trae/decisions/`.
|
|
269
|
+
|
|
270
|
+
## License
|
|
271
|
+
|
|
272
|
+
[MIT](LICENSE)
|
package/README.md
CHANGED
|
@@ -1,27 +1,49 @@
|
|
|
1
1
|
# Memora
|
|
2
2
|
|
|
3
|
-
> 通用 Agent
|
|
3
|
+
> 通用 Agent 记忆内核 — 本地、私有、领域无关,万物皆记忆
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/@zooique/memora)
|
|
6
6
|
[](https://nodejs.org)
|
|
7
7
|
[](https://www.typescriptlang.org)
|
|
8
|
+
[](https://vitest.dev)
|
|
9
|
+
[](https://vitest.dev)
|
|
10
|
+
[](package.json)
|
|
8
11
|
[](LICENSE)
|
|
9
12
|
|
|
13
|
+
**English** → [README.en.md](./README.en.md)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 这是什么?
|
|
18
|
+
|
|
19
|
+
Memora 是一个 **Agent 记忆基础设施**——让你的 AI Agent 拥有跨会话、跨话题的长期记忆能力。
|
|
20
|
+
|
|
21
|
+
它解决一个核心问题:**LLM 是无状态的,但用户的任务是连续的。**
|
|
22
|
+
|
|
23
|
+
Memora 在无状态推理之上构建连续演化能力:记忆沉淀、智能召回、自然衰减、语义去重、冲突检测——完整的记忆生命周期管理,全部在本地完成,数据不出你的机器。
|
|
24
|
+
|
|
10
25
|
## 设计哲学
|
|
11
26
|
|
|
12
27
|
> **万物皆是记忆。**
|
|
13
28
|
>
|
|
14
|
-
>
|
|
29
|
+
> 人格是"我记得我是谁",规则是"我记得该怎么做事",技能是"我记得怎么做某类事",对话历史是"我记得之前聊过什么"。
|
|
15
30
|
|
|
16
31
|
Memora 是一个**无法独立运行**的智能大脑内核——它只有接口,没有"形态"。CLI、WebUI、桌面精灵、小说生成器都是它的"宿主",宿主负责给它身体(UI)、血管(Provider)、神经网络(事件回路)。
|
|
17
32
|
|
|
18
33
|
## 核心能力
|
|
19
34
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
-
|
|
35
|
+
| 能力 | 说明 |
|
|
36
|
+
|------|------|
|
|
37
|
+
| **长期记忆沉淀** | 跨会话、跨话题的记忆持久化与智能召回 |
|
|
38
|
+
| **双通道召回** | 语义向量搜索 + 关键词搜索,hybridMerge 融合排序 |
|
|
39
|
+
| **记忆治理 L1-L4** | L1 语义去重 → L2 时效评估 → L3 冲突检测 → L4 定时衰减 |
|
|
40
|
+
| **记忆关系图谱** | contradicts / supports / follows / refines / caused 五种关系类型 |
|
|
41
|
+
| **Agent 与角色分离** | Agent 是纯记忆引擎,角色是人格载体。换角色不丢记忆 |
|
|
42
|
+
| **统一记忆模型** | 一切统一为「记忆」,通过 `source` 开放字符串区分,无封闭枚举 |
|
|
43
|
+
| **领域可插拔** | 同一套架构,加载不同记忆配置即可适配不同领域 |
|
|
44
|
+
| **零依赖内核** | 核心层无任何第三方运行时依赖,持久化由宿主通过接口注入 |
|
|
45
|
+
| **内容护栏** | 正则规则 + block/warn 双动作,输入输出双向检查 |
|
|
46
|
+
| **可观测性** | ITracer 接口 + 结构化 span,宿主可接入任意 APM |
|
|
25
47
|
|
|
26
48
|
## 快速开始
|
|
27
49
|
|
|
@@ -36,7 +58,7 @@ npm install @zooique/memora
|
|
|
36
58
|
```typescript
|
|
37
59
|
import { Agent, createLlmProvider } from '@zooique/memora';
|
|
38
60
|
|
|
39
|
-
// 宿主职责:创建 LLM Provider
|
|
61
|
+
// 宿主职责:创建 LLM Provider(兼容所有 OpenAI Chat Completions 协议的服务)
|
|
40
62
|
const provider = createLlmProvider({
|
|
41
63
|
provider: 'openaiCompatible',
|
|
42
64
|
apiKey: process.env.LLM_API_KEY!,
|
|
@@ -49,25 +71,44 @@ const agent = new Agent({
|
|
|
49
71
|
projectPath: '/path/to/project',
|
|
50
72
|
provider,
|
|
51
73
|
configDir: '/path/to/agent-config', // personas / rules / skills
|
|
52
|
-
|
|
53
|
-
dataDir: '.memora',
|
|
74
|
+
dataDir: '.memora', // 记忆数据存储目录
|
|
54
75
|
});
|
|
55
76
|
|
|
56
77
|
await agent.init();
|
|
57
78
|
```
|
|
58
79
|
|
|
59
|
-
###
|
|
80
|
+
### 对话(流式)
|
|
60
81
|
|
|
61
82
|
```typescript
|
|
62
|
-
|
|
63
|
-
for await (const chunk of agent.chat('你好')) {
|
|
83
|
+
for await (const chunk of agent.chat('你好,记住我喜欢 TypeScript')) {
|
|
64
84
|
if (chunk.type === 'text') {
|
|
65
85
|
process.stdout.write(chunk.content);
|
|
66
86
|
}
|
|
67
87
|
}
|
|
68
88
|
|
|
69
|
-
//
|
|
70
|
-
const reply = await agent.chatSync('
|
|
89
|
+
// 下一次对话,Agent 会自动召回"喜欢 TypeScript"这条记忆
|
|
90
|
+
const reply = await agent.chatSync('我喜欢什么语言?');
|
|
91
|
+
// → 基于召回的记忆回答
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### 记忆管理
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
// 搜索记忆
|
|
98
|
+
const hits = await agent.memory.searchHybrid('TypeScript 偏好', { limit: 5 });
|
|
99
|
+
|
|
100
|
+
// 记忆治理:语义去重
|
|
101
|
+
const report = await agent.deduplicateMemories();
|
|
102
|
+
console.log(`去重 ${report.deduplicatedCount} 条`);
|
|
103
|
+
|
|
104
|
+
// 记忆治理:时效性评估
|
|
105
|
+
const timeliness = await agent.evaluateTimeliness();
|
|
106
|
+
|
|
107
|
+
// 记忆治理:冲突检测
|
|
108
|
+
const conflicts = await agent.detectConflicts();
|
|
109
|
+
|
|
110
|
+
// 手动触发衰减
|
|
111
|
+
await agent.runMemoryDecayOnce();
|
|
71
112
|
```
|
|
72
113
|
|
|
73
114
|
### 关闭
|
|
@@ -89,41 +130,107 @@ await agent.close();
|
|
|
89
130
|
│ ┌──────────────────────────────────────────┐ │
|
|
90
131
|
│ │ Memora 内核(Agent) │ │
|
|
91
132
|
│ │ - chat(input) → 流式响应 │ │
|
|
92
|
-
│ │ -
|
|
93
|
-
│ │ -
|
|
94
|
-
│ │ -
|
|
133
|
+
│ │ - 双通道记忆召回(语义 + 关键词) │ │
|
|
134
|
+
│ │ - 记忆治理 L1-L4(去重/时效/冲突/衰减) │ │
|
|
135
|
+
│ │ - 角色匹配 / 技能匹配 / 护栏检查 │ │
|
|
136
|
+
│ │ - 工具注册 / 工具执行 / 反思重试 │ │
|
|
137
|
+
│ │ - 会话归档 / 洞察提取 / 关系构建 │ │
|
|
95
138
|
│ └──────────────────────────────────────────┘ │
|
|
96
139
|
└────────────────────────────────────────────────────────────┘
|
|
97
140
|
```
|
|
98
141
|
|
|
142
|
+
### 六大注入接口
|
|
143
|
+
|
|
144
|
+
内核通过接口与外部世界交互,宿主按需注入:
|
|
145
|
+
|
|
146
|
+
| 接口 | 职责 | 内置实现 |
|
|
147
|
+
|------|------|----------|
|
|
148
|
+
| `IMemoryStorage` | 记忆 CRUD + 搜索 + 衰减 | `InMemoryStorage` |
|
|
149
|
+
| `IVectorStore` | 语义向量索引 | `JsonVectorStore` |
|
|
150
|
+
| `IMemoryRelationStore` | 记忆关系图谱 | `InMemoryRelationStore` |
|
|
151
|
+
| `ISessionStore` | 会话历史持久化 | 无(宿主实现) |
|
|
152
|
+
| `ILogger` | 日志输出 | console fallback |
|
|
153
|
+
| `ITracer` | 可观测性 span | `NOOP_TRACER` |
|
|
154
|
+
|
|
99
155
|
## 项目结构
|
|
100
156
|
|
|
101
157
|
```
|
|
102
158
|
src/
|
|
103
|
-
├── index.ts
|
|
104
|
-
├── agent/
|
|
105
|
-
├──
|
|
106
|
-
├──
|
|
107
|
-
├──
|
|
108
|
-
├──
|
|
109
|
-
├──
|
|
110
|
-
├──
|
|
111
|
-
|
|
112
|
-
├──
|
|
113
|
-
|
|
159
|
+
├── index.ts # 库导出入口(纯类型 + 接口导出,无 CLI)
|
|
160
|
+
├── agent/ # Agent 门面 + AgentLoop 执行引擎
|
|
161
|
+
│ ├── agent.ts # 门面类(宿主唯一入口)
|
|
162
|
+
│ ├── loop.ts # 核心循环(推理 → 工具调用 → 反思重试)
|
|
163
|
+
│ ├── assembler.ts # 组件组装器(纯工厂,不持有状态)
|
|
164
|
+
│ ├── toolExecutor.ts # 工具注册与执行
|
|
165
|
+
│ ├── contextManager.ts # 上下文窗口管理(截断 + 摘要)
|
|
166
|
+
│ ├── guardrail.ts # 内容护栏(正则 + block/warn)
|
|
167
|
+
│ └── managers/ # 15 个专职 Manager
|
|
168
|
+
│ ├── archiveCoordinator.ts # 归档协调(会话归档 + 洞察提取)
|
|
169
|
+
│ ├── memoryInspector.ts # 记忆读写(CRUD + 搜索 + 统计)
|
|
170
|
+
│ ├── memoryGovernance.ts # 治理统一门面(L1-L4)
|
|
171
|
+
│ ├── dedupManager.ts # L1 语义去重
|
|
172
|
+
│ ├── memoryDecayScheduler.ts # L4 定时衰减 + L2 时效评估
|
|
173
|
+
│ ├── memoryAdvisor.ts # L3 冲突检测 + 健康诊断
|
|
174
|
+
│ ├── insightExtractor.ts # 对话洞察提取
|
|
175
|
+
│ ├── relationBuilder.ts # 记忆关系构建(ADR-014)
|
|
176
|
+
│ ├── sessionManager.ts # 会话管理(分叉/切换)
|
|
177
|
+
│ ├── sessionArchiver.ts # 会话内容归档
|
|
178
|
+
│ ├── configManager.ts # 配置管理(规则/技能热加载)
|
|
179
|
+
│ ├── autoConfigRefiner.ts # 自进化配置建议
|
|
180
|
+
│ ├── workProjection.ts # 作品投影管理
|
|
181
|
+
│ ├── textPolishManager.ts # 文本润色
|
|
182
|
+
│ └── chatLockManager.ts # 对话并发锁
|
|
183
|
+
├── memory/ # 记忆引擎
|
|
184
|
+
│ ├── types.ts # Memory 基元(8 字段)+ 关系类型
|
|
185
|
+
│ ├── storageInterface.ts # IMemoryStorage 接口(16 方法)
|
|
186
|
+
│ ├── recall.ts # 双通道召回(语义 + 关键词)
|
|
187
|
+
│ ├── hybridMerge.ts # 融合排序算法
|
|
188
|
+
│ ├── vectorStore.ts # IVectorStore + JsonVectorStore
|
|
189
|
+
│ ├── relationStore.ts # IMemoryRelationStore 接口
|
|
190
|
+
│ ├── governance.ts # 治理共享常量(衰减/提升/上限)
|
|
191
|
+
│ ├── userProfile.ts # 用户画像管理
|
|
192
|
+
│ └── projectManager.ts # 多项目注册 + 锁管理
|
|
193
|
+
├── llm/ # LLM 适配层
|
|
194
|
+
│ ├── provider.ts # LlmProvider 抽象类
|
|
195
|
+
│ ├── openaiCompatible.ts # OpenAI 兼容协议实现
|
|
196
|
+
│ ├── embedding.ts # EmbeddingProvider(/embeddings 端点)
|
|
197
|
+
│ └── factory.ts # createLlmProvider 工厂
|
|
198
|
+
├── persona/ # 角色管理(纯文件 + 内存缓存)
|
|
199
|
+
├── skill/ # 技能管理(关键词匹配 + 当轮注入)
|
|
200
|
+
├── security/ # 安全策略(两级权限 + 路径白名单 + 审计)
|
|
201
|
+
├── config/ # 配置加载(JSON + 环境变量插值)
|
|
202
|
+
├── logging/ # 日志(ILogger 接口 + 懒初始化)
|
|
203
|
+
├── eval/ # 评估框架(EvalScenario + EvalRunner,CI 用)
|
|
204
|
+
└── utils/ # 工具函数(事件系统/分词/分片/错误/定时器)
|
|
114
205
|
```
|
|
115
206
|
|
|
116
207
|
## 技术栈
|
|
117
208
|
|
|
118
|
-
| 类别 | 选型 |
|
|
119
|
-
|
|
209
|
+
| 类别 | 选型 | 决策依据 |
|
|
210
|
+
|------|------|----------|
|
|
120
211
|
| 运行时 | Node.js ≥ 22 LTS + TypeScript 5 strict + ESM | ADR-001 |
|
|
121
212
|
| 数据层 | IMemoryStorage 接口(宿主注入持久化实现) | ADR-002 |
|
|
122
|
-
| LLM | OpenAI Chat Completions
|
|
123
|
-
|
|
|
124
|
-
|
|
|
213
|
+
| LLM 协议 | OpenAI Chat Completions 兼容(流式 SSE + Tool Calling) | ADR-003 |
|
|
214
|
+
| 记忆模型 | source 开放字符串基元驱动(万物皆记忆 v2) | ADR-004 |
|
|
215
|
+
| 向量检索 | IVectorStore 接口 + 内置 JsonVectorStore(纯 JS 余弦相似度) | ADR-002 |
|
|
216
|
+
| 关系图谱 | IMemoryRelationStore 侧车模型(不侵入 Memory 基元) | ADR-014 |
|
|
217
|
+
| 形态 | 纯逻辑库(零 native 依赖,CLI/UI 由宿主提供) | ADR-002 |
|
|
218
|
+
| 安全 | 两级权限 + 路径白名单 + 审计日志 | ADR-006 |
|
|
125
219
|
| 测试 | Vitest + MSW Mock LLM + InMemoryStorage | ADR-007 |
|
|
126
220
|
|
|
221
|
+
## 工程质量
|
|
222
|
+
|
|
223
|
+
| 指标 | 数值 |
|
|
224
|
+
|------|------|
|
|
225
|
+
| 源码 | 82 文件 / 19,060 行 |
|
|
226
|
+
| 测试 | 75 文件 / 23,748 行(测试代码量 > 生产代码量) |
|
|
227
|
+
| 测试通过 | 1,716+ |
|
|
228
|
+
| 语句覆盖 | 89.3% |
|
|
229
|
+
| 分支覆盖 | 81.7% |
|
|
230
|
+
| 函数覆盖 | 91.7% |
|
|
231
|
+
| 运行时依赖 | **0** |
|
|
232
|
+
| 架构决策记录 | 25 个 ADR |
|
|
233
|
+
|
|
127
234
|
## 开发命令
|
|
128
235
|
|
|
129
236
|
```bash
|
|
@@ -131,18 +238,23 @@ npm test # 运行测试
|
|
|
131
238
|
npm run test:cov # 运行测试 + 覆盖率
|
|
132
239
|
npm run typecheck # TypeScript 类型检查
|
|
133
240
|
npm run lint # ESLint 检查
|
|
241
|
+
npm run build # 编译到 dist/
|
|
134
242
|
```
|
|
135
243
|
|
|
136
244
|
## 文档
|
|
137
245
|
|
|
138
|
-
|
|
246
|
+
- [接入指南](docs/memora-接入指南.md) — 宿主项目开发者完整接入手册
|
|
247
|
+
- [API 参考](docs/memora-api-reference.md) — 公共 API 速查
|
|
248
|
+
- [配置示例](config.example.json) — LLM / Embedding / 安全配置模板
|
|
249
|
+
|
|
250
|
+
## 宿主项目
|
|
139
251
|
|
|
140
|
-
|
|
252
|
+
[memora-sprite](hosts/memora-sprite/) — 基于 Electron 的桌面精灵宿主(v1.5.0),展示 Memora 内核的完整接入方式:SQLite 持久化、向量索引、系统托盘、全局快捷键、记忆图谱可视化。
|
|
141
253
|
|
|
142
254
|
## 贡献
|
|
143
255
|
|
|
144
|
-
本项目遵循"大树模型"
|
|
256
|
+
本项目遵循"大树模型"工程哲学。技术决策记录(ADR)位于 `.trae/decisions/`。
|
|
145
257
|
|
|
146
258
|
## 许可证
|
|
147
259
|
|
|
148
|
-
MIT
|
|
260
|
+
[MIT](LICENSE)
|