@devxiyang/agent-memo 0.0.1 → 0.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/LICENSE +21 -0
- package/README.md +406 -35
- package/dist/core/memo/file-fs.d.ts +4 -3
- package/dist/core/memo/file-fs.d.ts.map +1 -1
- package/dist/core/memo/file-fs.js +20 -3
- package/dist/core/memo/file-fs.js.map +1 -1
- package/dist/core/memo/mime.d.ts +4 -3
- package/dist/core/memo/mime.d.ts.map +1 -1
- package/dist/core/memo/mime.js +64 -4
- package/dist/core/memo/mime.js.map +1 -1
- package/dist/core/memo/types.d.ts +19 -5
- package/dist/core/memo/types.d.ts.map +1 -1
- package/dist/plugins/memory/index.d.ts +47 -0
- package/dist/plugins/memory/index.d.ts.map +1 -0
- package/dist/plugins/memory/index.js +133 -0
- package/dist/plugins/memory/index.js.map +1 -0
- package/dist/plugins/memory/types.d.ts +44 -0
- package/dist/plugins/memory/types.d.ts.map +1 -0
- package/dist/plugins/memory/types.js +2 -0
- package/dist/plugins/memory/types.js.map +1 -0
- package/dist/plugins/resource/fetchers/local.d.ts +11 -0
- package/dist/plugins/resource/fetchers/local.d.ts.map +1 -0
- package/dist/plugins/resource/fetchers/local.js +33 -0
- package/dist/plugins/resource/fetchers/local.js.map +1 -0
- package/dist/plugins/resource/fetchers/url.d.ts +10 -0
- package/dist/plugins/resource/fetchers/url.d.ts.map +1 -0
- package/dist/plugins/resource/fetchers/url.js +41 -0
- package/dist/plugins/resource/fetchers/url.js.map +1 -0
- package/dist/plugins/resource/index.d.ts +50 -0
- package/dist/plugins/resource/index.d.ts.map +1 -0
- package/dist/plugins/resource/index.js +123 -0
- package/dist/plugins/resource/index.js.map +1 -0
- package/dist/plugins/resource/types.d.ts +39 -0
- package/dist/plugins/resource/types.d.ts.map +1 -0
- package/dist/plugins/resource/types.js +2 -0
- package/dist/plugins/resource/types.js.map +1 -0
- package/dist/plugins/utils.d.ts +5 -0
- package/dist/plugins/utils.d.ts.map +1 -0
- package/dist/plugins/utils.js +20 -0
- package/dist/plugins/utils.js.map +1 -0
- package/package.json +11 -2
- package/dist/core/memo/memo.d.ts +0 -1
- package/dist/core/memo/memo.d.ts.map +0 -1
- package/dist/core/memo/memo.js +0 -3
- package/dist/core/memo/memo.js.map +0 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 devxiyang
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,85 +1,214 @@
|
|
|
1
1
|
# agent.memo
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@devxiyang/agent-memo)
|
|
4
|
+
[](https://www.npmjs.com/package/@devxiyang/agent-memo)
|
|
5
|
+
[](./LICENSE)
|
|
6
|
+
|
|
3
7
|
Agent memory SDK based on a filesystem paradigm. Organizes memories, resources and skills as a hierarchical virtual filesystem with `memo://` URIs — inspired by [OpenViking](https://github.com/volcengine/OpenViking).
|
|
4
8
|
|
|
5
9
|
## Concepts
|
|
6
10
|
|
|
7
|
-
|
|
11
|
+
### Why a filesystem paradigm?
|
|
12
|
+
|
|
13
|
+
AI agents need persistent memory that is inspectable, portable, and tool-friendly. A local filesystem satisfies all three: you can open any file in your editor, grep across memories, back them up with git, and pass paths directly to external tools (PDF parsers, image processors, embedding pipelines). The SDK adds structure on top — a URI scheme, tiered summaries, relations, and search — without hiding the files from you.
|
|
14
|
+
|
|
15
|
+
### URI scheme
|
|
16
|
+
|
|
17
|
+
`memo://` URIs map 1:1 to physical paths:
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
memo://user/preferences/coding.md → {workspace}/user/preferences/coding.md
|
|
21
|
+
memo://resources/api-docs.md → {workspace}/resources/api-docs.md
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Directory meta files
|
|
25
|
+
|
|
26
|
+
Every directory can carry up to four meta files. Their content is always written by the **caller** (your agent or LLM) — the SDK only stores and retrieves them.
|
|
8
27
|
|
|
9
28
|
```
|
|
10
|
-
{workspace}/user/
|
|
11
|
-
├── .abstract.md # L0
|
|
12
|
-
├── .overview.md # L1 ~1-2k tokens
|
|
13
|
-
├── .relations.json # links to other nodes
|
|
14
|
-
├── .meta.json # arbitrary structured metadata
|
|
15
|
-
|
|
29
|
+
{workspace}/user/preferences/
|
|
30
|
+
├── .abstract.md # L0: one-sentence summary, ~100 tokens
|
|
31
|
+
├── .overview.md # L1: navigational overview, ~1-2k tokens
|
|
32
|
+
├── .relations.json # typed links to other nodes
|
|
33
|
+
├── .meta.json # arbitrary structured metadata (used internally by plugins)
|
|
34
|
+
├── coding.md # L2: actual content file
|
|
35
|
+
└── communication.md
|
|
16
36
|
```
|
|
17
37
|
|
|
18
|
-
|
|
38
|
+
### Tiered context loading
|
|
19
39
|
|
|
20
|
-
|
|
21
|
-
|------|--------|------|
|
|
22
|
-
| 0 | `.abstract.md` | cheap, always-on |
|
|
23
|
-
| 1 | `.overview.md` | medium |
|
|
24
|
-
| 2 | full file content | full |
|
|
40
|
+
Loading everything into every LLM call is wasteful. The tier system lets you control context budget:
|
|
25
41
|
|
|
26
|
-
|
|
42
|
+
| Tier | Source | Typical use |
|
|
43
|
+
|------|--------|-------------|
|
|
44
|
+
| 0 | `.abstract.md` | Always-on system prompt — "what the agent knows exists" |
|
|
45
|
+
| 1 | `.overview.md` | On-demand navigation — drill into a relevant area |
|
|
46
|
+
| 2 | Full file content | Final retrieval — read the actual memory or document |
|
|
47
|
+
|
|
48
|
+
A typical agent loop: load tier-0 summaries at startup → search to find relevant nodes → load tier-2 content for those nodes only.
|
|
27
49
|
|
|
28
50
|
## Installation
|
|
29
51
|
|
|
30
52
|
```bash
|
|
53
|
+
# npm
|
|
31
54
|
npm install @devxiyang/agent-memo
|
|
55
|
+
|
|
56
|
+
# pnpm
|
|
57
|
+
pnpm add @devxiyang/agent-memo
|
|
58
|
+
|
|
59
|
+
# yarn
|
|
60
|
+
yarn add @devxiyang/agent-memo
|
|
32
61
|
```
|
|
33
62
|
|
|
34
63
|
> `RipgrepSearchBackend` (default) uses a bundled `rg` binary via `@vscode/ripgrep` — no manual installation needed.
|
|
35
64
|
|
|
36
65
|
## Quick Start
|
|
37
66
|
|
|
67
|
+
The example below shows a **coding assistant** that remembers user preferences, caches reference documentation, and assembles focused context for each LLM call.
|
|
68
|
+
|
|
69
|
+
### 1. Initialize
|
|
70
|
+
|
|
38
71
|
```typescript
|
|
39
|
-
import { FileMemo
|
|
72
|
+
import { FileMemo } from '@devxiyang/agent-memo'
|
|
73
|
+
import { AgentMemory } from '@devxiyang/agent-memo/memory'
|
|
74
|
+
import { AgentResource, UrlFetcher, LocalFetcher } from '@devxiyang/agent-memo/resource'
|
|
40
75
|
|
|
76
|
+
// FileMemo is the filesystem backend.
|
|
77
|
+
// The onWritten hook fires after every file write — use it to keep
|
|
78
|
+
// directory summaries up to date so tier-0 context stays accurate.
|
|
41
79
|
await using memo = new FileMemo({
|
|
42
|
-
workspace: '
|
|
80
|
+
workspace: './agent-workspace',
|
|
43
81
|
hooks: {
|
|
44
82
|
onWritten: async (uri, parentDirs) => {
|
|
45
|
-
// Called after any file write or update (SDK or external tool)
|
|
46
|
-
// Regenerate .abstract.md for affected directories
|
|
47
83
|
for (const dir of parentDirs) {
|
|
48
|
-
const
|
|
49
|
-
await
|
|
84
|
+
const nodes = await memo.ls(dir)
|
|
85
|
+
const summary = await llm.summarize(nodes) // your LLM call
|
|
86
|
+
await memo.writeMeta(dir, { abstract: summary })
|
|
50
87
|
}
|
|
51
88
|
},
|
|
52
89
|
onError: (err, event) => console.error(`[memo:${event}]`, err),
|
|
53
90
|
},
|
|
54
91
|
})
|
|
55
92
|
|
|
56
|
-
|
|
57
|
-
|
|
93
|
+
const memory = new AgentMemory(memo)
|
|
94
|
+
const resource = new AgentResource(memo, [new UrlFetcher(), new LocalFetcher()])
|
|
95
|
+
```
|
|
58
96
|
|
|
59
|
-
|
|
60
|
-
const nodes = await memo.ls('memo://user/memories/')
|
|
97
|
+
### 2. Store user preferences
|
|
61
98
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
99
|
+
```typescript
|
|
100
|
+
// First conversation — learn about the user
|
|
101
|
+
await memory.remember('memo://user/preferences/coding.md',
|
|
102
|
+
'Prefers TypeScript with strict mode. Avoids classes, favors functional style. ' +
|
|
103
|
+
'Uses pnpm and Vitest for testing.',
|
|
104
|
+
{ source: 'onboarding' },
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
await memory.remember('memo://user/preferences/communication.md',
|
|
108
|
+
'Prefers concise answers. Dislikes excessive bullet points. ' +
|
|
109
|
+
'Wants code examples for every non-trivial suggestion.',
|
|
110
|
+
{ source: 'onboarding' },
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
// Later — update as you learn more (createdAt is preserved automatically)
|
|
114
|
+
await memory.remember('memo://user/preferences/coding.md',
|
|
115
|
+
'Prefers TypeScript with strict mode. Avoids classes, favors functional style. ' +
|
|
116
|
+
'Uses pnpm and Vitest. Recently adopted Zod for runtime validation.',
|
|
117
|
+
{ source: 'conversation-18' },
|
|
118
|
+
)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 3. Cache reference documentation
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
// Fetch and cache external docs with a TTL
|
|
125
|
+
await resource.fetch(
|
|
126
|
+
'https://zod.dev/README.md',
|
|
127
|
+
'memo://resources/zod-docs.md',
|
|
128
|
+
{ ttl: '7d' },
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
// Cache a local design doc
|
|
132
|
+
await resource.fetch(
|
|
133
|
+
'./docs/architecture.md',
|
|
134
|
+
'memo://resources/architecture.md',
|
|
135
|
+
)
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### 4. Assemble context for an LLM call
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
// --- System prompt (always cheap) ---
|
|
142
|
+
// Tier-0 loads .abstract.md for each directory — one-sentence summaries only.
|
|
143
|
+
// This tells the agent what it knows without burning context budget.
|
|
144
|
+
const systemContext = await memo.context(
|
|
145
|
+
['memo://user/preferences/', 'memo://resources/'],
|
|
146
|
+
0,
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
// --- Targeted retrieval (on demand) ---
|
|
150
|
+
// The user asks about Zod. Search memories for anything relevant.
|
|
151
|
+
const hits = await memory.search('zod validation', {
|
|
152
|
+
scope: ['memo://user/preferences/'],
|
|
153
|
+
limit: 5,
|
|
66
154
|
})
|
|
67
155
|
|
|
68
|
-
//
|
|
69
|
-
const
|
|
70
|
-
const
|
|
156
|
+
// Load full content for matched memories + the cached Zod docs
|
|
157
|
+
const detailUris = hits.map(h => h.uri)
|
|
158
|
+
const detailContext = await memo.context(detailUris, 2)
|
|
159
|
+
|
|
160
|
+
const zodEntry = await resource.read('memo://resources/zod-docs.md')
|
|
161
|
+
|
|
162
|
+
// Build the final prompt
|
|
163
|
+
const prompt = `
|
|
164
|
+
${systemContext}
|
|
165
|
+
|
|
166
|
+
--- Relevant memories ---
|
|
167
|
+
${detailContext}
|
|
168
|
+
|
|
169
|
+
--- Zod reference ---
|
|
170
|
+
${zodEntry?.content ?? '(not cached)'}
|
|
171
|
+
|
|
172
|
+
User: How should I validate an API response with Zod given my preferences?
|
|
173
|
+
`.trim()
|
|
174
|
+
|
|
175
|
+
const reply = await llm.chat(prompt)
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### 5. Soft-delete and hard-delete
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
// Soft-delete: sets forgottenAt in frontmatter, file kept on disk
|
|
182
|
+
// recall() and search() skip it by default
|
|
183
|
+
await memory.forget('memo://user/preferences/communication.md')
|
|
184
|
+
|
|
185
|
+
// Hard-delete: removes the file entirely
|
|
186
|
+
await memory.purge('memo://user/preferences/communication.md')
|
|
187
|
+
|
|
188
|
+
// Expired or re-fetched resources
|
|
189
|
+
await resource.refresh('memo://resources/zod-docs.md') // re-fetch from original URL
|
|
190
|
+
await resource.delete('memo://resources/architecture.md') // remove file + metadata
|
|
71
191
|
```
|
|
72
192
|
|
|
73
193
|
## Binary Files
|
|
74
194
|
|
|
75
|
-
|
|
195
|
+
`FileMemo` implements the `BinaryMemo` interface for direct binary I/O:
|
|
76
196
|
|
|
77
197
|
```typescript
|
|
78
|
-
|
|
198
|
+
// Write binary content
|
|
199
|
+
await memo.writeBinary('memo://media/avatar.jpg', imageBytes)
|
|
200
|
+
|
|
201
|
+
// Read binary content
|
|
202
|
+
const bytes = await memo.readBinary('memo://media/avatar.jpg')
|
|
203
|
+
|
|
204
|
+
// Or get the physical path to pass to external tools
|
|
205
|
+
const path = memo.toPath('memo://media/avatar.jpg')
|
|
79
206
|
await sharp(imageBuffer).toFile(path)
|
|
80
|
-
//
|
|
207
|
+
// onWritten hook fires automatically
|
|
81
208
|
```
|
|
82
209
|
|
|
210
|
+
For cached remote binary resources, use `AgentResource.readBinary()` — see the Plugins section.
|
|
211
|
+
|
|
83
212
|
## API
|
|
84
213
|
|
|
85
214
|
### `new FileMemo(options: FileMemoOptions)`
|
|
@@ -121,10 +250,28 @@ search(query, options?): Promise<SearchResult[]>
|
|
|
121
250
|
context(uris, tier: 0 | 1 | 2): Promise<string>
|
|
122
251
|
```
|
|
123
252
|
|
|
253
|
+
### `BinaryMemo` interface
|
|
254
|
+
|
|
255
|
+
For binary file I/O. `FileMemo` implements this; plugins that handle binary resources depend on it.
|
|
256
|
+
|
|
257
|
+
```typescript
|
|
258
|
+
readBinary(uri): Promise<Uint8Array | null>
|
|
259
|
+
writeBinary(uri, content: Uint8Array): Promise<void>
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### `FilesystemAccess` interface
|
|
263
|
+
|
|
264
|
+
Implemented by local filesystem backends. Consumed by plugins that need direct path access.
|
|
265
|
+
|
|
266
|
+
```typescript
|
|
267
|
+
toPath(uri): string // convert memo URI to absolute filesystem path
|
|
268
|
+
```
|
|
269
|
+
|
|
124
270
|
### `MemoLifecycle` interface
|
|
125
271
|
|
|
272
|
+
Manages the lifecycle of the filesystem watcher. Consumed by application code.
|
|
273
|
+
|
|
126
274
|
```typescript
|
|
127
|
-
toPath(uri): string // get physical path for binary access
|
|
128
275
|
watch(): void // start watcher
|
|
129
276
|
unwatch(): Promise<void> // stop watcher
|
|
130
277
|
[Symbol.asyncDispose]() // used by `await using`
|
|
@@ -166,6 +313,230 @@ class MyDetector implements MimeDetector {
|
|
|
166
313
|
}
|
|
167
314
|
```
|
|
168
315
|
|
|
316
|
+
## Plugins
|
|
317
|
+
|
|
318
|
+
### `AgentMemory` — semantic memory for agents
|
|
319
|
+
|
|
320
|
+
#### File format
|
|
321
|
+
|
|
322
|
+
Every memory is stored as a Markdown file with YAML frontmatter. The SDK manages three standard fields automatically; any extra fields you pass are persisted as custom frontmatter alongside the content.
|
|
323
|
+
|
|
324
|
+
```
|
|
325
|
+
---
|
|
326
|
+
createdAt: "2024-01-15T10:30:00.000Z" # set on first write, preserved on updates
|
|
327
|
+
source: "conversation-42" # optional: where this memory came from
|
|
328
|
+
forgottenAt: "2024-02-01T09:00:00.000Z" # set by forget(), absent until then
|
|
329
|
+
confidence: 0.9 # any custom fields you add
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
Prefers TypeScript strict mode with explicit return types.
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
#### Directory layout
|
|
336
|
+
|
|
337
|
+
Memories are plain files — you choose the structure that makes sense for your agent:
|
|
338
|
+
|
|
339
|
+
```
|
|
340
|
+
{workspace}/
|
|
341
|
+
├── agent/
|
|
342
|
+
│ ├── .abstract.md # L0 summary maintained by caller
|
|
343
|
+
│ ├── preferences/
|
|
344
|
+
│ │ ├── coding.md # memo://agent/preferences/coding.md
|
|
345
|
+
│ │ └── communication.md
|
|
346
|
+
│ ├── facts/
|
|
347
|
+
│ │ ├── user-name.md
|
|
348
|
+
│ │ └── timezone.md
|
|
349
|
+
│ └── episodes/
|
|
350
|
+
│ ├── 2024-01-15.md
|
|
351
|
+
│ └── 2024-01-16.md
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
#### API
|
|
355
|
+
|
|
356
|
+
```typescript
|
|
357
|
+
import { AgentMemory } from '@devxiyang/agent-memo/memory'
|
|
358
|
+
|
|
359
|
+
const memory = new AgentMemory(memo)
|
|
360
|
+
|
|
361
|
+
// Store a memory
|
|
362
|
+
// - createdAt is set automatically on first write, preserved on subsequent updates
|
|
363
|
+
// - extra fields in options are stored as custom frontmatter
|
|
364
|
+
await memory.remember('memo://agent/preferences/coding.md', 'Prefers TypeScript strict mode', {
|
|
365
|
+
source: 'conversation-42',
|
|
366
|
+
confidence: 0.9,
|
|
367
|
+
})
|
|
368
|
+
|
|
369
|
+
// Read a single memory
|
|
370
|
+
// Returns null if the file doesn't exist or forgottenAt is set
|
|
371
|
+
const entry = await memory.recall('memo://agent/preferences/coding.md')
|
|
372
|
+
// {
|
|
373
|
+
// uri: 'memo://agent/preferences/coding.md',
|
|
374
|
+
// content: 'Prefers TypeScript strict mode',
|
|
375
|
+
// frontmatter: { createdAt, source, confidence }
|
|
376
|
+
// }
|
|
377
|
+
|
|
378
|
+
// List direct children of a directory
|
|
379
|
+
// Defaults to workspace root (memo://) if no URI provided
|
|
380
|
+
// For files: reads frontmatter.summary, does NOT read body
|
|
381
|
+
// For directories: reads .abstract.md if present
|
|
382
|
+
// Excludes forgotten memories by default
|
|
383
|
+
const items = await memory.list('memo://agent/')
|
|
384
|
+
// [
|
|
385
|
+
// { uri, name, isDir: false, summary: 'TypeScript strict mode', forgottenAt?: string },
|
|
386
|
+
// { uri, name, isDir: true, abstract: 'Coding preferences' },
|
|
387
|
+
// ]
|
|
388
|
+
|
|
389
|
+
// With a summary stored at remember() time, list() is enough to navigate
|
|
390
|
+
// without reading every file's full content
|
|
391
|
+
await memory.remember('memo://agent/preferences/coding.md', fullContent, {
|
|
392
|
+
summary: 'TypeScript strict mode, functional style, pnpm + Vitest',
|
|
393
|
+
})
|
|
394
|
+
|
|
395
|
+
// Full-text search across memories
|
|
396
|
+
const hits = await memory.search('TypeScript', {
|
|
397
|
+
scope: ['memo://agent/preferences/'], // restrict to subtree (optional)
|
|
398
|
+
limit: 10,
|
|
399
|
+
excludeForgotten: true, // default: true
|
|
400
|
+
source: 'conversation-42', // filter by source field (optional)
|
|
401
|
+
})
|
|
402
|
+
// hits: MemoryEntry[]
|
|
403
|
+
|
|
404
|
+
// Soft-delete: sets forgottenAt in frontmatter, file stays on disk
|
|
405
|
+
// recall() and search() exclude it by default; can be recovered manually
|
|
406
|
+
await memory.forget('memo://agent/preferences/coding.md')
|
|
407
|
+
|
|
408
|
+
// Hard-delete: removes the file entirely, no recovery possible
|
|
409
|
+
await memory.purge('memo://agent/preferences/coding.md')
|
|
410
|
+
|
|
411
|
+
// Get the physical filesystem path (e.g. to pass to an indexing tool)
|
|
412
|
+
const path = memory.toPath('memo://agent/preferences/coding.md')
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
---
|
|
416
|
+
|
|
417
|
+
### `AgentResource` — external resource caching
|
|
418
|
+
|
|
419
|
+
#### File layout
|
|
420
|
+
|
|
421
|
+
Each resource is stored as a file at the URI path. Metadata (source URL, fetch time, TTL, content type) is stored in the parent directory's `.meta.json` under the `_resource` key — no separate sidecar files.
|
|
422
|
+
|
|
423
|
+
```
|
|
424
|
+
{workspace}/
|
|
425
|
+
└── resources/
|
|
426
|
+
├── .meta.json # stores metadata for all files in this dir
|
|
427
|
+
├── api-docs.md # memo://resources/api-docs.md (text)
|
|
428
|
+
├── report.pdf # memo://resources/report.pdf (binary)
|
|
429
|
+
└── avatars/
|
|
430
|
+
├── .meta.json
|
|
431
|
+
└── user.png # memo://resources/avatars/user.png
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
The `.meta.json` for the `resources/` directory looks like:
|
|
435
|
+
|
|
436
|
+
```json
|
|
437
|
+
{
|
|
438
|
+
"_resource": {
|
|
439
|
+
"api-docs.md": {
|
|
440
|
+
"source": "https://example.com/api.md",
|
|
441
|
+
"fetchedAt": "2024-01-15T10:00:00.000Z",
|
|
442
|
+
"expiresAt": "2024-01-16T10:00:00.000Z",
|
|
443
|
+
"contentType": "text/markdown"
|
|
444
|
+
},
|
|
445
|
+
"report.pdf": {
|
|
446
|
+
"source": "/local/reports/q4.pdf",
|
|
447
|
+
"fetchedAt": "2024-01-15T11:00:00.000Z",
|
|
448
|
+
"contentType": "application/pdf"
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
#### Built-in fetchers
|
|
455
|
+
|
|
456
|
+
| Fetcher | Handles | Notes |
|
|
457
|
+
|---------|---------|-------|
|
|
458
|
+
| `UrlFetcher` | `http://`, `https://` | Auto text/binary via Content-Type |
|
|
459
|
+
| `LocalFetcher` | `/abs`, `./rel`, `../rel`, `C:\win`, `C:/win` | Copies file, MIME from extension |
|
|
460
|
+
|
|
461
|
+
`UrlFetcher` treats `text/*` and common `application/*` subtypes (json, yaml, xml, toml, graphql, javascript, typescript…) as text (UTF-8). Everything else is stored as binary.
|
|
462
|
+
|
|
463
|
+
#### API
|
|
464
|
+
|
|
465
|
+
```typescript
|
|
466
|
+
import { AgentResource, UrlFetcher, LocalFetcher } from '@devxiyang/agent-memo/resource'
|
|
467
|
+
|
|
468
|
+
// Default: [new UrlFetcher()]. Pass custom list to extend or replace.
|
|
469
|
+
const resource = new AgentResource(memo, [new UrlFetcher(), new LocalFetcher()])
|
|
470
|
+
|
|
471
|
+
// Fetch and cache from any source the fetchers can handle
|
|
472
|
+
await resource.fetch('https://example.com/api.md', 'memo://resources/api-docs.md', { ttl: '1d' })
|
|
473
|
+
await resource.fetch('/local/reports/q4.pdf', 'memo://resources/report.pdf')
|
|
474
|
+
await resource.fetch('https://example.com/img.png', 'memo://resources/img.png', { ttl: '7d' })
|
|
475
|
+
|
|
476
|
+
// Read cached text content
|
|
477
|
+
// Returns null if the resource was never fetched, or the TTL has expired
|
|
478
|
+
const entry = await resource.read('memo://resources/api-docs.md')
|
|
479
|
+
// {
|
|
480
|
+
// uri: 'memo://resources/api-docs.md',
|
|
481
|
+
// content: '# API Docs ...',
|
|
482
|
+
// meta: { source, fetchedAt, expiresAt?, contentType? }
|
|
483
|
+
// }
|
|
484
|
+
|
|
485
|
+
// Read cached binary content (images, PDFs, audio, etc.)
|
|
486
|
+
const bin = await resource.readBinary('memo://resources/report.pdf')
|
|
487
|
+
// {
|
|
488
|
+
// uri: 'memo://resources/report.pdf',
|
|
489
|
+
// content: Uint8Array,
|
|
490
|
+
// meta: { source, fetchedAt, expiresAt?, contentType? }
|
|
491
|
+
// }
|
|
492
|
+
|
|
493
|
+
// Get the physical filesystem path — for external tools (PDF parsers, image processors…)
|
|
494
|
+
const path = resource.toPath('memo://resources/report.pdf')
|
|
495
|
+
|
|
496
|
+
// Re-fetch from the originally stored source (respects new options if provided)
|
|
497
|
+
await resource.refresh('memo://resources/api-docs.md')
|
|
498
|
+
await resource.refresh('memo://resources/api-docs.md', { ttl: '7d' }) // extend TTL
|
|
499
|
+
|
|
500
|
+
// Check if a resource is missing or its TTL has expired
|
|
501
|
+
const stale = await resource.isStale('memo://resources/api-docs.md')
|
|
502
|
+
|
|
503
|
+
// Read metadata without fetching the file content
|
|
504
|
+
const meta = await resource.getMeta('memo://resources/api-docs.md')
|
|
505
|
+
// { source, fetchedAt, expiresAt?, contentType? } or null
|
|
506
|
+
|
|
507
|
+
// Remove the file and its metadata entry
|
|
508
|
+
await resource.delete('memo://resources/api-docs.md')
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
TTL format: `30s` · `5m` · `1h` · `7d` · `1y`
|
|
512
|
+
|
|
513
|
+
#### Custom fetchers
|
|
514
|
+
|
|
515
|
+
Implement `ResourceFetcher` to support any source — S3, databases, internal APIs, etc. Fetchers are tried in order; the first one whose `canHandle()` returns `true` is used.
|
|
516
|
+
|
|
517
|
+
```typescript
|
|
518
|
+
import type { ResourceFetcher, FetchMeta } from '@devxiyang/agent-memo/resource'
|
|
519
|
+
import { writeFile } from 'node:fs/promises'
|
|
520
|
+
|
|
521
|
+
class S3Fetcher implements ResourceFetcher {
|
|
522
|
+
canHandle(source: string): boolean {
|
|
523
|
+
return source.startsWith('s3://')
|
|
524
|
+
}
|
|
525
|
+
async fetch(source: string, destPath: string): Promise<FetchMeta> {
|
|
526
|
+
const data = await downloadFromS3(source) // your S3 logic
|
|
527
|
+
await writeFile(destPath, data)
|
|
528
|
+
return { contentType: 'application/octet-stream' }
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
const resource = new AgentResource(memo, [new S3Fetcher(), new UrlFetcher()])
|
|
533
|
+
await resource.fetch('s3://my-bucket/model.bin', 'memo://models/model.bin')
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
Each plugin depends on interfaces, not the concrete `FileMemo` class:
|
|
537
|
+
- `AgentMemory` requires `Memo & FilesystemAccess`
|
|
538
|
+
- `AgentResource` requires `Memo & BinaryMemo & FilesystemAccess`
|
|
539
|
+
|
|
169
540
|
## Filesystem Structure
|
|
170
541
|
|
|
171
542
|
```
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Memo, MemoLifecycle, MemoUri, MemoNode, DirMeta, Relation, SearchOptions, SearchResult, FileMemoOptions } from './types.js';
|
|
2
|
-
export declare class FileMemo implements Memo, MemoLifecycle {
|
|
1
|
+
import type { Memo, BinaryMemo, FilesystemAccess, MemoLifecycle, MemoUri, MemoNode, DirMeta, Relation, SearchOptions, SearchResult, FileMemoOptions } from './types.js';
|
|
2
|
+
export declare class FileMemo implements Memo, BinaryMemo, FilesystemAccess, MemoLifecycle {
|
|
3
3
|
private readonly options;
|
|
4
4
|
private readonly hooks;
|
|
5
5
|
private readonly backend;
|
|
@@ -11,7 +11,6 @@ export declare class FileMemo implements Memo, MemoLifecycle {
|
|
|
11
11
|
private absToUri;
|
|
12
12
|
private fire;
|
|
13
13
|
private _indexFile;
|
|
14
|
-
/** Convert a memo URI to an absolute filesystem path (for binary file access). */
|
|
15
14
|
toPath(uri: MemoUri): string;
|
|
16
15
|
/**
|
|
17
16
|
* Start watching the workspace with chokidar.
|
|
@@ -25,6 +24,8 @@ export declare class FileMemo implements Memo, MemoLifecycle {
|
|
|
25
24
|
read(uri: MemoUri): Promise<string | null>;
|
|
26
25
|
write(uri: MemoUri, content: string): Promise<void>;
|
|
27
26
|
delete(uri: MemoUri): Promise<void>;
|
|
27
|
+
readBinary(uri: MemoUri): Promise<Uint8Array | null>;
|
|
28
|
+
writeBinary(uri: MemoUri, content: Uint8Array): Promise<void>;
|
|
28
29
|
ls(uri: MemoUri): Promise<MemoNode[]>;
|
|
29
30
|
mkdir(uri: MemoUri): Promise<void>;
|
|
30
31
|
rmdir(uri: MemoUri, recursive?: boolean): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-fs.d.ts","sourceRoot":"","sources":["../../../src/core/memo/file-fs.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,IAAI,EACJ,aAAa,EACb,OAAO,EACP,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,aAAa,EACb,YAAY,EAKZ,eAAe,EAChB,MAAM,YAAY,CAAA;AA+BnB,qBAAa,QAAS,YAAW,IAAI,EAAE,aAAa;
|
|
1
|
+
{"version":3,"file":"file-fs.d.ts","sourceRoot":"","sources":["../../../src/core/memo/file-fs.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,IAAI,EACJ,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,OAAO,EACP,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,aAAa,EACb,YAAY,EAKZ,eAAe,EAChB,MAAM,YAAY,CAAA;AA+BnB,qBAAa,QAAS,YAAW,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,aAAa;IAOpE,OAAO,CAAC,QAAQ,CAAC,OAAO;IANpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuC;IAC7D,OAAO,CAAC,OAAO,CAAkC;gBAEpB,OAAO,EAAE,eAAe;IAWrD,OAAO,KAAK,SAAS,GAAoC;IAEzD,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,IAAI;YAME,UAAU;IAUxB,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM;IAI5B;;;;;OAKG;IACH,KAAK,IAAI,IAAI;IAiDP,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAMxB,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtC,IAAI,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQ1C,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASnD,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnC,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAQpD,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAW7D,EAAE,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAiCrC,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrD,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAcxC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB9D,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAS5C,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBtE,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAepD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAMvE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CAqBjE"}
|
|
@@ -54,8 +54,7 @@ export class FileMemo {
|
|
|
54
54
|
]);
|
|
55
55
|
return { mimeType, size: s?.size ?? 0, modTime: s?.mtimeMs ?? 0 };
|
|
56
56
|
}
|
|
57
|
-
// ──
|
|
58
|
-
/** Convert a memo URI to an absolute filesystem path (for binary file access). */
|
|
57
|
+
// ── FilesystemAccess ─────────────────────────────────────────────────────
|
|
59
58
|
toPath(uri) {
|
|
60
59
|
return join(this.workspace, uriToRel(uri));
|
|
61
60
|
}
|
|
@@ -139,6 +138,22 @@ export class FileMemo {
|
|
|
139
138
|
this.fire(this.hooks.onDeleted?.(uri, parentDirs(uri)), 'delete');
|
|
140
139
|
}
|
|
141
140
|
}
|
|
141
|
+
async readBinary(uri) {
|
|
142
|
+
try {
|
|
143
|
+
return await readFile(this.toPath(uri));
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async writeBinary(uri, content) {
|
|
150
|
+
const p = this.toPath(uri);
|
|
151
|
+
await mkdir(dirname(p), { recursive: true });
|
|
152
|
+
await writeFile(p, content);
|
|
153
|
+
if (!this.watcher) {
|
|
154
|
+
this.fire(this.hooks.onWritten?.(uri, parentDirs(uri)), 'write');
|
|
155
|
+
}
|
|
156
|
+
}
|
|
142
157
|
// ── Directory ──────────────────────────────────────────────────────────────
|
|
143
158
|
async ls(uri) {
|
|
144
159
|
const p = this.toPath(uri);
|
|
@@ -230,7 +245,9 @@ export class FileMemo {
|
|
|
230
245
|
const existing = await this.relations(uri);
|
|
231
246
|
const filtered = existing.filter(r => !r.uris.includes(target));
|
|
232
247
|
await writeFile(join(this.toPath(uri), META_RELATIONS), JSON.stringify(filtered, null, 2), 'utf-8');
|
|
233
|
-
|
|
248
|
+
if (!this.watcher) {
|
|
249
|
+
this.fire(this.hooks.onUnlinked?.(uri, target), 'unlink');
|
|
250
|
+
}
|
|
234
251
|
}
|
|
235
252
|
// ── Search ─────────────────────────────────────────────────────────────────
|
|
236
253
|
async search(query, options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-fs.js","sourceRoot":"","sources":["../../../src/core/memo/file-fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAEhF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,QAA4B,MAAM,UAAU,CAAA;AAgBnD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AACpG,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAU7C,iFAAiF;AAEjF,SAAS,QAAQ,CAAC,GAAY;IAC5B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,GAAG,CAAC,CAAA;IAC7E,OAAO,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;AACpC,CAAC;AAED,SAAS,UAAU,CAAC,GAAY;IAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACtD,MAAM,IAAI,GAAc,EAAE,CAAA;IAC1B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,+EAA+E;AAE/E,MAAM,OAAO,QAAQ;IAOU;IANZ,KAAK,CAAa;IAClB,OAAO,CAAe;IACtB,IAAI,CAAiB;IACrB,KAAK,GAA8B,IAAI,GAAG,EAAE,CAAA;IACrD,OAAO,GAA8B,IAAI,CAAA;IAEjD,YAA6B,OAAwB;QAAxB,YAAO,GAAP,OAAO,CAAiB;QACnD,IAAI,CAAC,KAAK,GAAK,OAAO,CAAC,KAAK,IAAK,EAAE,CAAA;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,oBAAoB,EAAE,CAAA;QAC3D,IAAI,CAAC,IAAI,GAAM,OAAO,CAAC,IAAI,IAAM,IAAI,iBAAiB,EAAE,CAAA;QACxD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAEpC,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK;YAAE,IAAI,CAAC,KAAK,EAAE,CAAA;IAC3C,CAAC;IAED,8EAA8E;IAE9E,IAAY,SAAS,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAA,CAAC,CAAC;IAEjD,QAAQ,CAAC,OAAe;QAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;QACtE,OAAO,UAAU,GAAG,EAAE,CAAA;IACxB,CAAC;IAEO,IAAI,CAAC,MAA4B,EAAE,KAAgB;QACzD,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,OAAe;QACtC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;SACjD,CAAC,CAAA;QACF,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAA;IACnE,CAAC;IAED,4EAA4E;IAE5E,kFAAkF;IAClF,MAAM,CAAC,GAAY;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IAC5C,CAAC;IAED;;;;;OAKG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,OAAO;YAAE,OAAM;QAExB,IAAI,KAAK,GAAG,KAAK,CAAA;QAEjB,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE;YAC5C,aAAa,EAAE,KAAK;YACpB,OAAO,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;SACpD,CAAC,CAAA;QAEF,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE;YACzC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;YACtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;YACxB,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;gBAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;YAClE,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE;YAC5C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;YACtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;YACxB,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;gBAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;YAClE,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE;YACtC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YACpB,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;gBAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;YACnE,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAS,EAAE,EAAE;YACzC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBACpC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;oBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC/C,CAAC;YACD,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;gBAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;YACnE,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,CAAA,CAAC,CAAC,CAAC,CAAA;IAClD,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAA;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACnB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;QACzB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;IACtB,CAAC;IAED,8EAA8E;IAE9E,KAAK,CAAC,IAAI,CAAC,GAAY;QACrB,IAAI,CAAC;YACH,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAA;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAY,EAAE,OAAe;QACvC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC1B,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5C,MAAM,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QACpC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;QAClE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAY;QACvB,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;QACnE,CAAC;IACH,CAAC;IAED,8EAA8E;IAE9E,KAAK,CAAC,EAAE,CAAC,GAAY;QACnB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC1B,IAAI,OAAyB,CAAA;QAC7B,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAA;QACvE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAA;QACX,CAAC;QAED,OAAO,OAAO,CAAC,GAAG,CAChB,OAAO;aACJ,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aACpC,GAAG,CAAC,KAAK,EAAC,CAAC,EAAC,EAAE;YACb,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;YACjC,MAAM,KAAK,GAAO,CAAC,CAAC,WAAW,EAAE,CAAA;YACjC,MAAM,OAAO,GAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAChE,MAAM,CAAC,GAAW,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;YAE1E,OAAO;gBACL,GAAG,EAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAClC,IAAI,EAAM,CAAC,CAAC,IAAI;gBAChB,KAAK;gBACL,IAAI,EAAM,OAAO,EAAE,IAAI,IAAO,CAAC,EAAE,IAAI,IAAO,CAAC;gBAC7C,OAAO,EAAG,OAAO,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC;gBAC7C,QAAQ,EAAE,OAAO,EAAE,QAAQ;gBAC3B,QAAQ,EAAE,KAAK;oBACb,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;oBAChF,CAAC,CAAC,SAAS;aACK,CAAA;QACtB,CAAC,CAAC,CACL,CAAA;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAY;QACtB,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACpD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAY,EAAE,SAAS,GAAG,KAAK;QACzC,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACxD,CAAC;IAED,8EAA8E;IAE9E,KAAK,CAAC,QAAQ,CAAC,GAAY;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC1B,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACtD,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;YAChE,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;YAChE,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,EAAM,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;SACjE,CAAC,CAAA;QACF,OAAO;YACL,QAAQ;YACR,QAAQ;YACR,IAAI,EAAE,OAAO,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAA6B,CAAC,CAAC,CAAC,SAAS;SAC7E,CAAA;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAY,EAAE,IAAsB;QAClD,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC1B,MAAM,KAAK,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAEnC,MAAM,MAAM,GAAoB,EAAE,CAAA;QAClC,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAC7B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;QACxE,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAC7B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;QACxE,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YACzB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;QAEzF,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAC3B,CAAC;IAED,8EAA8E;IAE9E,KAAK,CAAC,SAAS,CAAC,GAAY;QAC1B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAA;YAC3E,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAA;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAY,EAAE,OAAkB,EAAE,MAAe;QAC1D,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC1B,MAAM,KAAK,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAEnC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;QAC1C,QAAQ,CAAC,IAAI,CAAC;YACZ,EAAE,EAAS,UAAU,EAAE;YACvB,IAAI,EAAO,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;YAC5B,MAAM;YACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAA;QACF,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;QACpF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAA;QACxD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAY,EAAE,MAAe;QACxC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;QAC1C,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;QAC/D,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC,EACtC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EACjC,OAAO,CACR,CAAA;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAA;IAC3D,CAAC;IAED,8EAA8E;IAE9E,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,OAAuB;QACjD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC5C,CAAC;IAED,8EAA8E;IAE9E,KAAK,CAAC,OAAO,CAAC,IAAe,EAAE,IAAe;QAC5C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAC,GAAG,EAAC,EAAE;YACnB,IAAI,IAAwB,CAAA;YAE5B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;gBAClC,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAA;YACnB,CAAC;iBAAM,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;gBAClC,IAAI,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAA;YACjC,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,SAAS,CAAA;YAC5C,CAAC;YAED,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;QAC7C,CAAC,CAAC,CACH,CAAA;QAED,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAClD,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"file-fs.js","sourceRoot":"","sources":["../../../src/core/memo/file-fs.ts"],"names":[],"mappings":"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"}
|