@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.
Files changed (45) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +406 -35
  3. package/dist/core/memo/file-fs.d.ts +4 -3
  4. package/dist/core/memo/file-fs.d.ts.map +1 -1
  5. package/dist/core/memo/file-fs.js +20 -3
  6. package/dist/core/memo/file-fs.js.map +1 -1
  7. package/dist/core/memo/mime.d.ts +4 -3
  8. package/dist/core/memo/mime.d.ts.map +1 -1
  9. package/dist/core/memo/mime.js +64 -4
  10. package/dist/core/memo/mime.js.map +1 -1
  11. package/dist/core/memo/types.d.ts +19 -5
  12. package/dist/core/memo/types.d.ts.map +1 -1
  13. package/dist/plugins/memory/index.d.ts +47 -0
  14. package/dist/plugins/memory/index.d.ts.map +1 -0
  15. package/dist/plugins/memory/index.js +133 -0
  16. package/dist/plugins/memory/index.js.map +1 -0
  17. package/dist/plugins/memory/types.d.ts +44 -0
  18. package/dist/plugins/memory/types.d.ts.map +1 -0
  19. package/dist/plugins/memory/types.js +2 -0
  20. package/dist/plugins/memory/types.js.map +1 -0
  21. package/dist/plugins/resource/fetchers/local.d.ts +11 -0
  22. package/dist/plugins/resource/fetchers/local.d.ts.map +1 -0
  23. package/dist/plugins/resource/fetchers/local.js +33 -0
  24. package/dist/plugins/resource/fetchers/local.js.map +1 -0
  25. package/dist/plugins/resource/fetchers/url.d.ts +10 -0
  26. package/dist/plugins/resource/fetchers/url.d.ts.map +1 -0
  27. package/dist/plugins/resource/fetchers/url.js +41 -0
  28. package/dist/plugins/resource/fetchers/url.js.map +1 -0
  29. package/dist/plugins/resource/index.d.ts +50 -0
  30. package/dist/plugins/resource/index.d.ts.map +1 -0
  31. package/dist/plugins/resource/index.js +123 -0
  32. package/dist/plugins/resource/index.js.map +1 -0
  33. package/dist/plugins/resource/types.d.ts +39 -0
  34. package/dist/plugins/resource/types.d.ts.map +1 -0
  35. package/dist/plugins/resource/types.js +2 -0
  36. package/dist/plugins/resource/types.js.map +1 -0
  37. package/dist/plugins/utils.d.ts +5 -0
  38. package/dist/plugins/utils.d.ts.map +1 -0
  39. package/dist/plugins/utils.js +20 -0
  40. package/dist/plugins/utils.js.map +1 -0
  41. package/package.json +11 -2
  42. package/dist/core/memo/memo.d.ts +0 -1
  43. package/dist/core/memo/memo.d.ts.map +0 -1
  44. package/dist/core/memo/memo.js +0 -3
  45. package/dist/core/memo/memo.js.map +0 -1
@@ -1,8 +1,9 @@
1
1
  import type { MimeDetector } from './types.js';
2
+ export declare const EXTENSION_MIME: Record<string, string>;
2
3
  /**
3
- * MIME type detector based on magic bytes (file-type).
4
- * More accurate than extension-based detection since it reads the file header.
5
- * Returns undefined for plain text files or unrecognised formats.
4
+ * MIME type detector using two-stage detection:
5
+ * 1. Magic bytes via file-type (accurate for binary formats)
6
+ * 2. Extension-based fallback (for text formats with no magic bytes)
6
7
  */
7
8
  export declare class MagicMimeDetector implements MimeDetector {
8
9
  detect(path: string): Promise<string | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"mime.d.ts","sourceRoot":"","sources":["../../../src/core/memo/mime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IAC9C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CAIxD"}
1
+ {"version":3,"file":"mime.d.ts","sourceRoot":"","sources":["../../../src/core/memo/mime.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAI9C,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAwDjD,CAAA;AAED;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IAC9C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CAOxD"}
@@ -1,13 +1,73 @@
1
1
  import { fileTypeFromFile } from 'file-type';
2
+ import { extname } from 'node:path';
3
+ // Fallback MIME types by file extension for text-based formats
4
+ // that have no magic bytes and cannot be detected by file-type.
5
+ export const EXTENSION_MIME = {
6
+ // Markup & docs
7
+ '.md': 'text/markdown',
8
+ '.mdx': 'text/markdown',
9
+ '.txt': 'text/plain',
10
+ '.rst': 'text/x-rst',
11
+ '.tex': 'text/x-tex',
12
+ '.html': 'text/html',
13
+ '.htm': 'text/html',
14
+ '.xml': 'application/xml',
15
+ '.svg': 'image/svg+xml',
16
+ // Data formats
17
+ '.json': 'application/json',
18
+ '.jsonl': 'application/x-ndjson',
19
+ '.ndjson': 'application/x-ndjson',
20
+ '.yaml': 'application/yaml',
21
+ '.yml': 'application/yaml',
22
+ '.toml': 'application/toml',
23
+ '.csv': 'text/csv',
24
+ '.tsv': 'text/tab-separated-values',
25
+ '.ini': 'text/plain',
26
+ '.env': 'text/plain',
27
+ // Code
28
+ '.ts': 'text/typescript',
29
+ '.tsx': 'text/typescript',
30
+ '.js': 'text/javascript',
31
+ '.jsx': 'text/javascript',
32
+ '.mjs': 'text/javascript',
33
+ '.cjs': 'text/javascript',
34
+ '.css': 'text/css',
35
+ '.scss': 'text/x-scss',
36
+ '.less': 'text/x-less',
37
+ '.py': 'text/x-python',
38
+ '.rb': 'text/x-ruby',
39
+ '.rs': 'text/x-rust',
40
+ '.go': 'text/x-go',
41
+ '.java': 'text/x-java',
42
+ '.c': 'text/x-c',
43
+ '.cpp': 'text/x-c++',
44
+ '.h': 'text/x-c',
45
+ '.cs': 'text/x-csharp',
46
+ '.php': 'text/x-php',
47
+ '.sh': 'text/x-sh',
48
+ '.bash': 'text/x-sh',
49
+ '.zsh': 'text/x-sh',
50
+ '.sql': 'text/x-sql',
51
+ '.r': 'text/x-r',
52
+ // Config & misc
53
+ '.graphql': 'application/graphql',
54
+ '.gql': 'application/graphql',
55
+ '.proto': 'text/plain',
56
+ '.tf': 'text/plain',
57
+ '.lock': 'text/plain',
58
+ };
2
59
  /**
3
- * MIME type detector based on magic bytes (file-type).
4
- * More accurate than extension-based detection since it reads the file header.
5
- * Returns undefined for plain text files or unrecognised formats.
60
+ * MIME type detector using two-stage detection:
61
+ * 1. Magic bytes via file-type (accurate for binary formats)
62
+ * 2. Extension-based fallback (for text formats with no magic bytes)
6
63
  */
7
64
  export class MagicMimeDetector {
8
65
  async detect(path) {
9
66
  const result = await fileTypeFromFile(path);
10
- return result?.mime;
67
+ if (result)
68
+ return result.mime;
69
+ const ext = extname(path).toLowerCase();
70
+ return EXTENSION_MIME[ext];
11
71
  }
12
72
  }
13
73
  //# sourceMappingURL=mime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mime.js","sourceRoot":"","sources":["../../../src/core/memo/mime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAG5C;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAC5B,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAA;QAC3C,OAAO,MAAM,EAAE,IAAI,CAAA;IACrB,CAAC;CACF"}
1
+ {"version":3,"file":"mime.js","sourceRoot":"","sources":["../../../src/core/memo/mime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,+DAA+D;AAC/D,gEAAgE;AAChE,MAAM,CAAC,MAAM,cAAc,GAA2B;IACpD,gBAAgB;IAChB,KAAK,EAAK,eAAe;IACzB,MAAM,EAAI,eAAe;IACzB,MAAM,EAAI,YAAY;IACtB,MAAM,EAAI,YAAY;IACtB,MAAM,EAAI,YAAY;IACtB,OAAO,EAAG,WAAW;IACrB,MAAM,EAAI,WAAW;IACrB,MAAM,EAAI,iBAAiB;IAC3B,MAAM,EAAI,eAAe;IAEzB,eAAe;IACf,OAAO,EAAG,kBAAkB;IAC5B,QAAQ,EAAE,sBAAsB;IAChC,SAAS,EAAC,sBAAsB;IAChC,OAAO,EAAG,kBAAkB;IAC5B,MAAM,EAAI,kBAAkB;IAC5B,OAAO,EAAG,kBAAkB;IAC5B,MAAM,EAAI,UAAU;IACpB,MAAM,EAAI,2BAA2B;IACrC,MAAM,EAAI,YAAY;IACtB,MAAM,EAAI,YAAY;IAEtB,OAAO;IACP,KAAK,EAAI,iBAAiB;IAC1B,MAAM,EAAG,iBAAiB;IAC1B,KAAK,EAAI,iBAAiB;IAC1B,MAAM,EAAG,iBAAiB;IAC1B,MAAM,EAAG,iBAAiB;IAC1B,MAAM,EAAG,iBAAiB;IAC1B,MAAM,EAAG,UAAU;IACnB,OAAO,EAAE,aAAa;IACtB,OAAO,EAAE,aAAa;IACtB,KAAK,EAAI,eAAe;IACxB,KAAK,EAAI,aAAa;IACtB,KAAK,EAAI,aAAa;IACtB,KAAK,EAAI,WAAW;IACpB,OAAO,EAAE,aAAa;IACtB,IAAI,EAAK,UAAU;IACnB,MAAM,EAAG,YAAY;IACrB,IAAI,EAAK,UAAU;IACnB,KAAK,EAAI,eAAe;IACxB,MAAM,EAAG,YAAY;IACrB,KAAK,EAAI,WAAW;IACpB,OAAO,EAAE,WAAW;IACpB,MAAM,EAAG,WAAW;IACpB,MAAM,EAAG,YAAY;IACrB,IAAI,EAAK,UAAU;IAEnB,gBAAgB;IAChB,UAAU,EAAE,qBAAqB;IACjC,MAAM,EAAM,qBAAqB;IACjC,QAAQ,EAAI,YAAY;IACxB,KAAK,EAAO,YAAY;IACxB,OAAO,EAAK,YAAY;CACzB,CAAA;AAED;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAC5B,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAA;QAC3C,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC,IAAI,CAAA;QAE9B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;QACvC,OAAO,cAAc,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC;CACF"}
@@ -77,13 +77,27 @@ export interface FileMemoOptions {
77
77
  watch?: boolean;
78
78
  }
79
79
  /**
80
- * Optional lifecycle interface for implementations that support filesystem
81
- * watching and direct path access. Separate from Memo so that consumers
82
- * can depend only on the storage primitives they need.
80
+ * Optional extension for implementations that support binary file I/O.
81
+ * Separate from Memo so text-only consumers are unaffected.
83
82
  */
84
- export interface MemoLifecycle extends AsyncDisposable {
85
- /** Convert a memo URI to an absolute filesystem path (for binary file access). */
83
+ export interface BinaryMemo {
84
+ readBinary(uri: MemoUri): Promise<Uint8Array | null>;
85
+ writeBinary(uri: MemoUri, content: Uint8Array): Promise<void>;
86
+ }
87
+ /**
88
+ * Implemented by backends that run on a local filesystem.
89
+ * Gives consumers direct access to the physical path for a URI —
90
+ * used by plugins (AgentMemory, AgentResource) and external tools.
91
+ */
92
+ export interface FilesystemAccess {
93
+ /** Convert a memo URI to an absolute filesystem path. */
86
94
  toPath(uri: MemoUri): string;
95
+ }
96
+ /**
97
+ * Manages the lifecycle of the filesystem watcher.
98
+ * Consumed by application code, not by plugins.
99
+ */
100
+ export interface MemoLifecycle extends AsyncDisposable {
87
101
  /** Start watching the workspace; hooks fire for all filesystem changes. */
88
102
  watch(): void;
89
103
  /** Stop watching and release resources. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/memo/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/memo/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { Memo, FilesystemAccess, MemoUri } from '../../core/memo/types.js';
2
+ import type { RememberOptions, MemorySearchOptions, MemoryListOptions, MemoryListItem, MemoryFrontmatter, MemoryEntry } from './types.js';
3
+ export type { RememberOptions, MemorySearchOptions, MemoryListOptions, MemoryListItem, MemoryFrontmatter, MemoryEntry };
4
+ export declare class AgentMemory {
5
+ private readonly memo;
6
+ constructor(memo: Memo & FilesystemAccess);
7
+ /**
8
+ * Get the physical filesystem path for a memory URI.
9
+ */
10
+ toPath(uri: MemoUri): string;
11
+ /**
12
+ * Write a memory with frontmatter.
13
+ * If the file already exists, createdAt is preserved and frontmatter is merged.
14
+ * Standard fields: createdAt, source, forgottenAt.
15
+ * Any extra fields in options are stored as custom extensions.
16
+ */
17
+ remember(uri: MemoUri, content: string, options?: RememberOptions): Promise<void>;
18
+ /**
19
+ * Read a single memory.
20
+ * Returns null if not found or if forgottenAt is set.
21
+ */
22
+ recall(uri: MemoUri): Promise<MemoryEntry | null>;
23
+ /**
24
+ * Soft-delete: set forgottenAt in frontmatter.
25
+ * File stays on disk but recall/search will exclude it by default.
26
+ */
27
+ forget(uri: MemoUri): Promise<void>;
28
+ /**
29
+ * Hard-delete: remove the file entirely.
30
+ * No metadata cleanup needed — everything is in the file.
31
+ */
32
+ purge(uri: MemoUri): Promise<void>;
33
+ /**
34
+ * List direct children of a directory.
35
+ * Defaults to the workspace root (memo://) if no URI is provided.
36
+ * For files: reads frontmatter to surface summary and forgottenAt (no body read).
37
+ * For directories: includes abstract from .abstract.md if present.
38
+ * Excludes forgotten memories by default.
39
+ */
40
+ list(uri?: MemoUri, options?: MemoryListOptions): Promise<MemoryListItem[]>;
41
+ /**
42
+ * Full-text search with frontmatter filtering.
43
+ * Excludes forgotten memories by default.
44
+ */
45
+ search(query: string, options?: MemorySearchOptions): Promise<MemoryEntry[]>;
46
+ }
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/memory/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAC/E,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,WAAW,EACZ,MAAM,YAAY,CAAA;AAEnB,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAA;AAevH,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,IAAI,GAAG,gBAAgB;IAE1D;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM;IAI5B;;;;;OAKG;IACG,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB3F;;;OAGG;IACG,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAUvD;;;OAGG;IACG,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzC;;;OAGG;IACG,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC;;;;;;OAMG;IACG,IAAI,CAAC,GAAG,GAAE,OAAmB,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA6BhG;;;OAGG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAyBvF"}
@@ -0,0 +1,133 @@
1
+ import matter from 'gray-matter';
2
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
3
+ function serialize(content, frontmatter) {
4
+ return matter.stringify(content, frontmatter);
5
+ }
6
+ function parse(raw) {
7
+ const { content, data } = matter(raw);
8
+ return { content: content.trim(), frontmatter: data };
9
+ }
10
+ // ─── AgentMemory ─────────────────────────────────────────────────────────────
11
+ export class AgentMemory {
12
+ memo;
13
+ constructor(memo) {
14
+ this.memo = memo;
15
+ }
16
+ /**
17
+ * Get the physical filesystem path for a memory URI.
18
+ */
19
+ toPath(uri) {
20
+ return this.memo.toPath(uri);
21
+ }
22
+ /**
23
+ * Write a memory with frontmatter.
24
+ * If the file already exists, createdAt is preserved and frontmatter is merged.
25
+ * Standard fields: createdAt, source, forgottenAt.
26
+ * Any extra fields in options are stored as custom extensions.
27
+ */
28
+ async remember(uri, content, options = {}) {
29
+ const { source, ...extensions } = options;
30
+ let createdAt = new Date().toISOString();
31
+ // Preserve createdAt if file already exists
32
+ const existing = await this.memo.read(uri);
33
+ if (existing !== null) {
34
+ const { frontmatter } = parse(existing);
35
+ if (frontmatter.createdAt)
36
+ createdAt = frontmatter.createdAt;
37
+ }
38
+ const frontmatter = {
39
+ createdAt,
40
+ ...(source !== undefined && { source }),
41
+ ...extensions,
42
+ };
43
+ await this.memo.write(uri, serialize(content, frontmatter));
44
+ }
45
+ /**
46
+ * Read a single memory.
47
+ * Returns null if not found or if forgottenAt is set.
48
+ */
49
+ async recall(uri) {
50
+ const raw = await this.memo.read(uri);
51
+ if (raw === null)
52
+ return null;
53
+ const { content, frontmatter } = parse(raw);
54
+ if (frontmatter.forgottenAt)
55
+ return null;
56
+ return { uri, content, frontmatter };
57
+ }
58
+ /**
59
+ * Soft-delete: set forgottenAt in frontmatter.
60
+ * File stays on disk but recall/search will exclude it by default.
61
+ */
62
+ async forget(uri) {
63
+ const raw = await this.memo.read(uri);
64
+ if (raw === null)
65
+ return;
66
+ const { content, frontmatter } = parse(raw);
67
+ await this.memo.write(uri, serialize(content, {
68
+ ...frontmatter,
69
+ forgottenAt: new Date().toISOString(),
70
+ }));
71
+ }
72
+ /**
73
+ * Hard-delete: remove the file entirely.
74
+ * No metadata cleanup needed — everything is in the file.
75
+ */
76
+ async purge(uri) {
77
+ await this.memo.delete(uri);
78
+ }
79
+ /**
80
+ * List direct children of a directory.
81
+ * Defaults to the workspace root (memo://) if no URI is provided.
82
+ * For files: reads frontmatter to surface summary and forgottenAt (no body read).
83
+ * For directories: includes abstract from .abstract.md if present.
84
+ * Excludes forgotten memories by default.
85
+ */
86
+ async list(uri = 'memo://', options = {}) {
87
+ const { includeForgotten = false } = options;
88
+ const nodes = await this.memo.ls(uri);
89
+ const items = [];
90
+ for (const node of nodes) {
91
+ if (node.isDir) {
92
+ items.push({ uri: node.uri, name: node.name, isDir: true, abstract: node.abstract });
93
+ continue;
94
+ }
95
+ const raw = await this.memo.read(node.uri);
96
+ if (raw === null)
97
+ continue;
98
+ const { frontmatter } = parse(raw);
99
+ if (!includeForgotten && frontmatter.forgottenAt)
100
+ continue;
101
+ items.push({
102
+ uri: node.uri,
103
+ name: node.name,
104
+ isDir: false,
105
+ summary: frontmatter.summary,
106
+ forgottenAt: frontmatter.forgottenAt,
107
+ });
108
+ }
109
+ return items;
110
+ }
111
+ /**
112
+ * Full-text search with frontmatter filtering.
113
+ * Excludes forgotten memories by default.
114
+ */
115
+ async search(query, options = {}) {
116
+ const { scope, limit, excludeForgotten = true, source, } = options;
117
+ const raw = await this.memo.search(query, { scope, limit });
118
+ const results = [];
119
+ for (const result of raw) {
120
+ const file = await this.memo.read(result.uri);
121
+ if (file === null)
122
+ continue;
123
+ const { content, frontmatter } = parse(file);
124
+ if (excludeForgotten && frontmatter.forgottenAt)
125
+ continue;
126
+ if (source !== undefined && frontmatter.source !== source)
127
+ continue;
128
+ results.push({ uri: result.uri, content, frontmatter });
129
+ }
130
+ return results;
131
+ }
132
+ }
133
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/memory/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { MemoUri } from '../../core/memo/types.js';
2
+ /** Standard fields managed by AgentMemory. */
3
+ export type MemoryStandardFields = {
4
+ createdAt: string;
5
+ source?: string;
6
+ forgottenAt?: string;
7
+ };
8
+ /** Full frontmatter = standard fields + caller-defined extensions. */
9
+ export type MemoryFrontmatter = MemoryStandardFields & Record<string, unknown>;
10
+ export type MemoryEntry = {
11
+ uri: MemoUri;
12
+ /** Body content without frontmatter. */
13
+ content: string;
14
+ frontmatter: MemoryFrontmatter;
15
+ };
16
+ export type MemoryListItem = {
17
+ uri: MemoUri;
18
+ name: string;
19
+ isDir: boolean;
20
+ /** Directories: content of .abstract.md (if present). */
21
+ abstract?: string;
22
+ /** Files: frontmatter.summary field (if set by caller). */
23
+ summary?: string;
24
+ /** Files: set if this memory has been forgotten. */
25
+ forgottenAt?: string;
26
+ };
27
+ export type MemoryListOptions = {
28
+ /** Include forgotten memories. Default: false. */
29
+ includeForgotten?: boolean;
30
+ };
31
+ export type RememberOptions = {
32
+ source?: string;
33
+ /** Any custom frontmatter fields. */
34
+ [key: string]: unknown;
35
+ };
36
+ export type MemorySearchOptions = {
37
+ scope?: MemoUri[];
38
+ limit?: number;
39
+ /** Exclude memories where forgottenAt is set. Default: true. */
40
+ excludeForgotten?: boolean;
41
+ /** Filter by frontmatter source field. */
42
+ source?: string;
43
+ };
44
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/plugins/memory/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAIvD,8CAA8C;AAC9C,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAK,MAAM,CAAA;IACpB,MAAM,CAAC,EAAO,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,sEAAsE;AACtE,MAAM,MAAM,iBAAiB,GAAG,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAI9E,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAU,OAAO,CAAA;IACpB,wCAAwC;IACxC,OAAO,EAAM,MAAM,CAAA;IACnB,WAAW,EAAE,iBAAiB,CAAA;CAC/B,CAAA;AAID,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAW,OAAO,CAAA;IACrB,IAAI,EAAU,MAAM,CAAA;IACpB,KAAK,EAAS,OAAO,CAAA;IACrB,yDAAyD;IACzD,QAAQ,CAAC,EAAK,MAAM,CAAA;IACpB,2DAA2D;IAC3D,OAAO,CAAC,EAAM,MAAM,CAAA;IACpB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,CAAA;AAID,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,CAAC,EAAa,OAAO,EAAE,CAAA;IAC5B,KAAK,CAAC,EAAa,MAAM,CAAA;IACzB,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,0CAA0C;IAC1C,MAAM,CAAC,EAAY,MAAM,CAAA;CAC1B,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/plugins/memory/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import type { ResourceFetcher, FetchMeta } from '../types.js';
2
+ /**
3
+ * Built-in fetcher for local filesystem paths.
4
+ * Copies the file into the memo workspace.
5
+ * Supports Unix and Windows paths (absolute and relative).
6
+ */
7
+ export declare class LocalFetcher implements ResourceFetcher {
8
+ canHandle(source: string): boolean;
9
+ fetch(source: string, destPath: string): Promise<FetchMeta>;
10
+ }
11
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/fetchers/local.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAK7D;;;;GAIG;AACH,qBAAa,YAAa,YAAW,eAAe;IAClD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAY5B,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;CAKlE"}
@@ -0,0 +1,33 @@
1
+ import { copyFile } from 'node:fs/promises';
2
+ import { extname } from 'node:path';
3
+ import { EXTENSION_MIME } from '../../../core/memo/mime.js';
4
+ // Matches Windows absolute paths: C:\... or C:/...
5
+ const WINDOWS_ABS_RE = /^[a-zA-Z]:[/\\]/;
6
+ /**
7
+ * Built-in fetcher for local filesystem paths.
8
+ * Copies the file into the memo workspace.
9
+ * Supports Unix and Windows paths (absolute and relative).
10
+ */
11
+ export class LocalFetcher {
12
+ canHandle(source) {
13
+ // Unix absolute
14
+ if (source.startsWith('/'))
15
+ return true;
16
+ // Unix relative
17
+ if (source.startsWith('./') || source.startsWith('../'))
18
+ return true;
19
+ // Windows absolute: C:\ or C:/
20
+ if (WINDOWS_ABS_RE.test(source))
21
+ return true;
22
+ // Windows relative: .\ or ..\
23
+ if (source.startsWith('.\\') || source.startsWith('..\\'))
24
+ return true;
25
+ return false;
26
+ }
27
+ async fetch(source, destPath) {
28
+ await copyFile(source, destPath);
29
+ const ext = extname(source).toLowerCase();
30
+ return { contentType: EXTENSION_MIME[ext] };
31
+ }
32
+ }
33
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../../../src/plugins/resource/fetchers/local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAG3D,mDAAmD;AACnD,MAAM,cAAc,GAAG,iBAAiB,CAAA;AAExC;;;;GAIG;AACH,MAAM,OAAO,YAAY;IACvB,SAAS,CAAC,MAAc;QACtB,gBAAgB;QAChB,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAA;QACvC,gBAAgB;QAChB,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACpE,+BAA+B;QAC/B,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAA;QAC5C,8BAA8B;QAC9B,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAA;QACtE,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAc,EAAE,QAAgB;QAC1C,MAAM,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAChC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;QACzC,OAAO,EAAE,WAAW,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,CAAA;IAC7C,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { ResourceFetcher, FetchMeta, FetchOptions } from '../types.js';
2
+ /**
3
+ * Built-in fetcher for HTTP/HTTPS URLs.
4
+ * Automatically handles binary vs text content based on Content-Type.
5
+ */
6
+ export declare class UrlFetcher implements ResourceFetcher {
7
+ canHandle(source: string): boolean;
8
+ fetch(source: string, destPath: string, options?: FetchOptions): Promise<FetchMeta>;
9
+ }
10
+ //# sourceMappingURL=url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/fetchers/url.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAgB3E;;;GAGG;AACH,qBAAa,UAAW,YAAW,eAAe;IAChD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI5B,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC;CAkB1F"}
@@ -0,0 +1,41 @@
1
+ import { writeFile } from 'node:fs/promises';
2
+ // Text-based application/* subtypes that should be saved as UTF-8 strings
3
+ const TEXT_APP_SUBTYPES = new Set([
4
+ 'json', 'yaml', 'xml', 'toml', 'graphql', 'x-ndjson',
5
+ 'x-www-form-urlencoded', 'javascript', 'typescript',
6
+ ]);
7
+ function isTextContentType(contentType) {
8
+ const [type] = contentType.split(';').map(s => s.trim());
9
+ const [main, sub] = type.split('/');
10
+ if (main === 'text')
11
+ return true;
12
+ if (main === 'application' && sub && TEXT_APP_SUBTYPES.has(sub))
13
+ return true;
14
+ return false;
15
+ }
16
+ /**
17
+ * Built-in fetcher for HTTP/HTTPS URLs.
18
+ * Automatically handles binary vs text content based on Content-Type.
19
+ */
20
+ export class UrlFetcher {
21
+ canHandle(source) {
22
+ return source.startsWith('http://') || source.startsWith('https://');
23
+ }
24
+ async fetch(source, destPath, options) {
25
+ const response = await globalThis.fetch(source, { headers: options?.headers });
26
+ if (!response.ok) {
27
+ throw new Error(`Failed to fetch "${source}": ${response.status} ${response.statusText}`);
28
+ }
29
+ const contentType = response.headers.get('content-type') ?? '';
30
+ if (isTextContentType(contentType)) {
31
+ const text = await response.text();
32
+ await writeFile(destPath, text, 'utf-8');
33
+ }
34
+ else {
35
+ const buffer = await response.arrayBuffer();
36
+ await writeFile(destPath, new Uint8Array(buffer));
37
+ }
38
+ return { contentType: contentType || undefined };
39
+ }
40
+ }
41
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../../../../src/plugins/resource/fetchers/url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAG5C,0EAA0E;AAC1E,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU;IACpD,uBAAuB,EAAE,YAAY,EAAE,YAAY;CACpD,CAAC,CAAA;AAEF,SAAS,iBAAiB,CAAC,WAAmB;IAC5C,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IACxD,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACnC,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IAChC,IAAI,IAAI,KAAK,aAAa,IAAI,GAAG,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IAC5E,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,UAAU;IACrB,SAAS,CAAC,MAAc;QACtB,OAAO,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;IACtE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAc,EAAE,QAAgB,EAAE,OAAsB;QAClE,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;QAC9E,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,MAAM,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;QAC3F,CAAC;QAED,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAA;QAE9D,IAAI,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YAClC,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;QAC1C,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAA;YAC3C,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;QACnD,CAAC;QAED,OAAO,EAAE,WAAW,EAAE,WAAW,IAAI,SAAS,EAAE,CAAA;IAClD,CAAC;CACF"}
@@ -0,0 +1,50 @@
1
+ import type { Memo, BinaryMemo, FilesystemAccess, MemoUri } from '../../core/memo/types.js';
2
+ import type { FetchOptions, ResourceMeta, ResourceEntry, BinaryResourceEntry, ResourceFetcher } from './types.js';
3
+ export type { FetchOptions, ResourceMeta, ResourceEntry, BinaryResourceEntry, ResourceFetcher };
4
+ export { UrlFetcher } from './fetchers/url.js';
5
+ export { LocalFetcher } from './fetchers/local.js';
6
+ type FullMemo = Memo & BinaryMemo & FilesystemAccess;
7
+ export declare class AgentResource {
8
+ private readonly memo;
9
+ private readonly fetchers;
10
+ constructor(memo: FullMemo, fetchers?: ResourceFetcher[]);
11
+ /**
12
+ * Fetch content from any source (URL, local path, or custom) and store at uri.
13
+ * The appropriate fetcher is selected via canHandle().
14
+ */
15
+ fetch(source: string, uri: MemoUri, options?: FetchOptions): Promise<void>;
16
+ /**
17
+ * Re-fetch a resource from its stored source.
18
+ * Throws if no metadata exists for the URI.
19
+ */
20
+ refresh(uri: MemoUri, options?: FetchOptions): Promise<void>;
21
+ /**
22
+ * Read cached text content. Returns null if not found or expired.
23
+ * For binary files, use toPath() to get the physical path instead.
24
+ */
25
+ read(uri: MemoUri): Promise<ResourceEntry | null>;
26
+ /**
27
+ * Read cached binary content. Returns null if not found or expired.
28
+ * Use this for images, PDFs, audio, and other binary formats.
29
+ */
30
+ readBinary(uri: MemoUri): Promise<BinaryResourceEntry | null>;
31
+ /**
32
+ * Get the physical filesystem path for direct binary file access.
33
+ * Useful for passing to external tools (PDF parsers, image processors, etc.).
34
+ */
35
+ toPath(uri: MemoUri): string;
36
+ /**
37
+ * Remove the resource file and its metadata entry.
38
+ */
39
+ delete(uri: MemoUri): Promise<void>;
40
+ /**
41
+ * Check whether a cached resource is missing or expired.
42
+ */
43
+ isStale(uri: MemoUri): Promise<boolean>;
44
+ /**
45
+ * Get metadata for a resource without reading its content.
46
+ */
47
+ getMeta(uri: MemoUri): Promise<ResourceMeta | null>;
48
+ private _writeMeta;
49
+ }
50
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/resource/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAC3F,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAIjH,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAA;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAQ,mBAAmB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAIlD,KAAK,QAAQ,GAAG,IAAI,GAAG,UAAU,GAAG,gBAAgB,CAAA;AAQpD,qBAAa,aAAa;IAItB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;gBAGzB,IAAI,EAAE,QAAQ,EAC/B,QAAQ,CAAC,EAAE,eAAe,EAAE;IAK9B;;;OAGG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBpF;;;OAGG;IACG,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtE;;;OAGG;IACG,IAAI,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAUvD;;;OAGG;IACG,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAUnE;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM;IAI5B;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzC;;OAEG;IACG,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAM7C;;OAEG;IACG,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;YAU3C,UAAU;CAQzB"}