@framers/agentos 0.13.64 → 0.13.65

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 (46) hide show
  1. package/dist/cognition/memory/AgentMemory.d.ts +4 -2
  2. package/dist/cognition/memory/AgentMemory.d.ts.map +1 -1
  3. package/dist/cognition/memory/AgentMemory.js +3 -1
  4. package/dist/cognition/memory/AgentMemory.js.map +1 -1
  5. package/dist/cognition/memory/core/types.d.ts +1 -1
  6. package/dist/cognition/memory/core/types.d.ts.map +1 -1
  7. package/dist/cognition/memory/index.d.ts +1 -1
  8. package/dist/cognition/memory/index.d.ts.map +1 -1
  9. package/dist/cognition/memory/index.js.map +1 -1
  10. package/dist/cognition/memory/io/MarkdownExporter.d.ts +42 -8
  11. package/dist/cognition/memory/io/MarkdownExporter.d.ts.map +1 -1
  12. package/dist/cognition/memory/io/MarkdownExporter.js +196 -16
  13. package/dist/cognition/memory/io/MarkdownExporter.js.map +1 -1
  14. package/dist/cognition/memory/io/ObsidianExporter.d.ts +6 -4
  15. package/dist/cognition/memory/io/ObsidianExporter.d.ts.map +1 -1
  16. package/dist/cognition/memory/io/ObsidianExporter.js +5 -3
  17. package/dist/cognition/memory/io/ObsidianExporter.js.map +1 -1
  18. package/dist/cognition/memory/io/facade/Memory.d.ts +14 -3
  19. package/dist/cognition/memory/io/facade/Memory.d.ts.map +1 -1
  20. package/dist/cognition/memory/io/facade/Memory.js +19 -8
  21. package/dist/cognition/memory/io/facade/Memory.js.map +1 -1
  22. package/dist/cognition/memory/io/facade/index.d.ts +1 -1
  23. package/dist/cognition/memory/io/facade/index.d.ts.map +1 -1
  24. package/dist/cognition/memory/io/facade/types.d.ts +37 -0
  25. package/dist/cognition/memory/io/facade/types.d.ts.map +1 -1
  26. package/dist/cognition/memory/io/tools/MemoryAddTool.d.ts +4 -0
  27. package/dist/cognition/memory/io/tools/MemoryAddTool.d.ts.map +1 -1
  28. package/dist/cognition/memory/io/tools/MemoryAddTool.js +18 -4
  29. package/dist/cognition/memory/io/tools/MemoryAddTool.js.map +1 -1
  30. package/dist/cognition/substrate/memory/wiki/WikiCompiler.d.ts +5 -1
  31. package/dist/cognition/substrate/memory/wiki/WikiCompiler.d.ts.map +1 -1
  32. package/dist/cognition/substrate/memory/wiki/WikiCompiler.js +35 -10
  33. package/dist/cognition/substrate/memory/wiki/WikiCompiler.js.map +1 -1
  34. package/dist/cognition/substrate/memory/wiki/WikiMemoryStore.d.ts +23 -4
  35. package/dist/cognition/substrate/memory/wiki/WikiMemoryStore.d.ts.map +1 -1
  36. package/dist/cognition/substrate/memory/wiki/WikiMemoryStore.js +66 -35
  37. package/dist/cognition/substrate/memory/wiki/WikiMemoryStore.js.map +1 -1
  38. package/dist/cognition/substrate/memory/wiki/WikiPageId.d.ts +9 -7
  39. package/dist/cognition/substrate/memory/wiki/WikiPageId.d.ts.map +1 -1
  40. package/dist/cognition/substrate/memory/wiki/WikiPageId.js +19 -23
  41. package/dist/cognition/substrate/memory/wiki/WikiPageId.js.map +1 -1
  42. package/dist/core/utils/pathName.d.ts +59 -0
  43. package/dist/core/utils/pathName.d.ts.map +1 -0
  44. package/dist/core/utils/pathName.js +78 -0
  45. package/dist/core/utils/pathName.js.map +1 -0
  46. package/package.json +1 -1
@@ -4,6 +4,61 @@ import * as path from 'node:path';
4
4
  import { createHash } from 'node:crypto';
5
5
  import { parsePage, serializePage, renderCatalog } from './WikiPageCodec.js';
6
6
  import { isWikiPageId, resolveWikiPagePath } from './WikiPageId.js';
7
+ /**
8
+ * List the page ids under `memoryDir`: each `.md` file's path under the folder without `.md`, with `/` between
9
+ * folders on every platform, the form the compiler writes and `readPage` takes. Every file or folder whose name
10
+ * starts with a dot (`.meta/` among them) is skipped, and so is every file whose path makes no valid page id,
11
+ * `index.md` among them, so every id listed is one `readPage` accepts.
12
+ *
13
+ * @param memoryDir - The wiki's folder.
14
+ * @param readDir - Lists one folder, given its path. A folder it cannot list is skipped.
15
+ * @param paths - The path functions that build a folder's path from `memoryDir` and its names: the platform's by
16
+ * default.
17
+ * @returns The ids, sorted.
18
+ */
19
+ export async function listWikiPageIds(memoryDir, readDir, paths = path) {
20
+ const out = [];
21
+ const walk = async (names) => {
22
+ let entries;
23
+ try {
24
+ entries = await readDir(paths.join(memoryDir, ...names));
25
+ }
26
+ catch {
27
+ return;
28
+ }
29
+ for (const e of entries) {
30
+ if (e.name.startsWith('.'))
31
+ continue;
32
+ if (e.isDirectory()) {
33
+ await walk([...names, e.name]);
34
+ }
35
+ else if (e.name.endsWith('.md')) {
36
+ // Ids join folders with `/` on every platform, never with the platform's separator.
37
+ const id = [...names, e.name.slice(0, -3)].join('/');
38
+ if (isWikiPageId(id))
39
+ out.push(id);
40
+ }
41
+ }
42
+ };
43
+ await walk([]);
44
+ return out.sort();
45
+ }
46
+ /**
47
+ * The page entries of `.meta/index.json` in an object with no prototype, so a page id that names a member every
48
+ * object has (`constructor`, `toString`, `__proto__`) finds only its own entry. An entry with no list of trace ids
49
+ * is dropped, and its page is indexed again.
50
+ */
51
+ function pageEntries(pages) {
52
+ const entries = Object.create(null);
53
+ if (pages === null || typeof pages !== 'object' || Array.isArray(pages))
54
+ return entries;
55
+ for (const [id, entry] of Object.entries(pages)) {
56
+ if (entry !== null && typeof entry === 'object' && Array.isArray(entry.traceIds)) {
57
+ entries[id] = entry;
58
+ }
59
+ }
60
+ return entries;
61
+ }
7
62
  export class WikiMemoryStore {
8
63
  constructor(opts) {
9
64
  this.memoryDir = opts.memoryDir;
@@ -68,48 +123,24 @@ export class WikiMemoryStore {
68
123
  const pages = await this.load();
69
124
  await fs.writeFile(path.join(this.memoryDir, 'index.md'), renderCatalog(pages));
70
125
  }
71
- /**
72
- * Recursively list page ids (the path under memory/ with `/` between folders, no extension), skipping
73
- * index.md and every file or folder whose name starts with a dot (`.meta/` among them). A file whose path
74
- * does not make a valid page id is not a page, so every id listed is one `readPage` accepts.
75
- */
126
+ /** The page ids under memory/ (see `listWikiPageIds`). */
76
127
  async listPageIds() {
77
- const out = [];
78
- const walk = async (relDir) => {
79
- const abs = path.join(this.memoryDir, relDir);
80
- let entries;
81
- try {
82
- entries = await fs.readdir(abs, { withFileTypes: true });
83
- }
84
- catch {
85
- return;
86
- }
87
- for (const e of entries) {
88
- if (e.name.startsWith('.'))
89
- continue;
90
- // Ids join folders with `/` on every platform, the form the compiler writes and readPage takes.
91
- const rel = relDir ? `${relDir}/${e.name}` : e.name;
92
- if (e.isDirectory()) {
93
- await walk(rel);
94
- }
95
- else if (e.name.endsWith('.md') && rel !== 'index.md') {
96
- const id = rel.slice(0, -3);
97
- if (isWikiPageId(id))
98
- out.push(id);
99
- }
100
- }
101
- };
102
- await walk('');
103
- return out.sort();
128
+ return listWikiPageIds(this.memoryDir, (dir) => fs.readdir(dir, { withFileTypes: true }));
104
129
  }
130
+ /**
131
+ * Read `.meta/index.json`, or an empty index when it is missing or unreadable. Its page entries are held in an
132
+ * object with no prototype (see `pageEntries`), so any page id is safe to look up.
133
+ */
105
134
  async readMeta() {
135
+ let parsed = null;
106
136
  try {
107
- const raw = await fs.readFile(path.join(this.memoryDir, '.meta', 'index.json'), 'utf8');
108
- return JSON.parse(raw);
137
+ parsed = JSON.parse(await fs.readFile(path.join(this.memoryDir, '.meta', 'index.json'), 'utf8'));
109
138
  }
110
139
  catch {
111
- return { lastCompiledAt: null, pages: {} };
140
+ // No index yet, or one that does not parse: start from an empty one.
112
141
  }
142
+ const meta = parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {};
143
+ return { ...meta, lastCompiledAt: meta.lastCompiledAt ?? null, pages: pageEntries(meta.pages) };
113
144
  }
114
145
  async writeMeta(meta) {
115
146
  const metaDir = path.join(this.memoryDir, '.meta');
@@ -1 +1 @@
1
- {"version":3,"file":"WikiMemoryStore.js","sourceRoot":"","sources":["../../../../../src/cognition/substrate/memory/wiki/WikiMemoryStore.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAgBpE,MAAM,OAAO,eAAe;IAK1B,YAAY,IAA4B;QACtC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED;;;;;OAKG;IACK,QAAQ,CAAC,EAAU;QACzB,OAAO,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,qHAAqH;IACrH,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,KAAK,GAAe,EAAE,CAAC;QAC7B,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACrC,IAAI,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC5C,OAAO,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAS,CAAC,IAAc;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9C,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,kBAAkB,CAAC;QAC5B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAClF,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,WAAW;QACvB,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE;YACnD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC9C,IAAI,OAAmC,CAAC;YACxC,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;YACT,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,SAAS;gBACrC,gGAAgG;gBAChG,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACpD,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;oBACpB,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;gBAClB,CAAC;qBAAM,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;oBACxD,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC5B,IAAI,YAAY,CAAC,EAAE,CAAC;wBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QACF,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IAES,KAAK,CAAC,QAAQ;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;YACxF,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAC7C,CAAC;IACH,CAAC;IAES,KAAK,CAAC,SAAS,CAAC,IAAe;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACtF,CAAC;IAED,qFAAqF;IACrF,KAAK,CAAC,KAAK,CAAC,IAA0B;QACpC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,MAAM,GAAgB,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAEtE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAClE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBACjD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC7B,SAAS;YACX,CAAC;YACD,yDAAyD;YACzD,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;oBAChC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAC5B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YACD,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE;oBAClD,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU;oBACnD,KAAK,EAAE,SAAS;oBAChB,OAAO,EAAE,IAAI,CAAC,QAAQ;oBACtB,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,IAAI,CAAC,EAAE,EAAE,CAAC;oBACjC,QAAQ,EAAE,IAAI,CAAC,KAAK;iBACrB,CAAC,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1B,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YACzC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;QAED,uCAAuC;QACvC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACrB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;oBACxC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBAC3B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACzB,CAAC;gBACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ;gBAAE,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,iBAAiB;QACrB,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,cAAc,CAAC;IAChD,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,kBAAkB,CAAC,GAAW;QAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;QAC1B,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,IAAc,QAAQ;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IACD,IAAc,KAAK;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF"}
1
+ {"version":3,"file":"WikiMemoryStore.js","sourceRoot":"","sources":["../../../../../src/cognition/substrate/memory/wiki/WikiMemoryStore.ts"],"names":[],"mappings":"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"}
@@ -6,9 +6,11 @@ export declare const MAX_WIKI_PAGE_ID_LENGTH = 512;
6
6
  * Why a wiki page id was refused:
7
7
  * - `'type'`: the id is not a string.
8
8
  * - `'empty'`: the id is an empty string.
9
- * - `'length'`: the id is longer than {@link MAX_WIKI_PAGE_ID_LENGTH} characters.
10
- * - `'character'`: the id holds a backslash, a colon or a control character (U+0000 to U+001F, or U+007F), a NUL
11
- * byte among them. On Windows a backslash separates folders and a colon names a drive or a file's stream.
9
+ * - `'length'`: the id is longer than {@link MAX_WIKI_PAGE_ID_LENGTH} characters, or a name in it holds more than
10
+ * 200 bytes in UTF-8, the most a name built from data may hold (`MAX_PATH_NAME_BYTES` in `core/utils/pathName`).
11
+ * - `'character'`: the id holds a backslash, a colon, one of `"`, `*`, `<`, `>`, `?` and `|`, or a control
12
+ * character (U+0000 to U+001F, or U+007F), a NUL byte among them. On Windows a backslash separates folders, a
13
+ * colon names a drive or a file's stream, and the other six are refused in a name.
12
14
  * - `'segment'`: a name between slashes is empty: the id starts or ends with `/`, or holds `//`.
13
15
  * - `'dot'`: a name starts with a dot, `.` and `..` among them.
14
16
  * - `'edge'`: a name starts or ends with a space, or ends with a dot. Windows drops those from a name, so the
@@ -33,10 +35,10 @@ export declare class InvalidWikiPageIdError extends Error {
33
35
  * True when `id` has the wiki's id form: the page's path under `memory/` without `.md`, one or more names
34
36
  * joined by `/` (`entities/johnny` is `memory/entities/johnny.md`). No name is empty or starts with a dot,
35
37
  * so `.` and `..` are never names, and no name starts or ends with a space or ends with a dot, which
36
- * Windows drops from a name; the id holds no backslash, no colon and no control character, a NUL
37
- * byte among them; it is at most {@link MAX_WIKI_PAGE_ID_LENGTH} characters; and it is not `index` in any
38
- * case, the catalog's own id. Every id the store lists, and every id the default clusterer of
39
- * `attachMemoryWiki` makes, has this form.
38
+ * Windows drops from a name; the id holds no backslash, no colon, none of `"`, `*`, `<`, `>`, `?` and `|`,
39
+ * and no control character, a NUL byte among them; it is at most {@link MAX_WIKI_PAGE_ID_LENGTH} characters,
40
+ * and each name in it at most 200 bytes in UTF-8; and it is not `index` in any case, the catalog's own id.
41
+ * Every id the store lists, and every id the default clusterer of `attachMemoryWiki` makes, has this form.
40
42
  */
41
43
  export declare function isWikiPageId(id: unknown): id is string;
42
44
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"WikiPageId.d.ts","sourceRoot":"","sources":["../../../../../src/cognition/substrate/memory/wiki/WikiPageId.ts"],"names":[],"mappings":"AAAA,uHAAuH;AACvH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,mDAAmD;AACnD,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAW3C;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,OAAO,GACP,QAAQ,GACR,WAAW,GACX,SAAS,GACT,KAAK,GACL,MAAM,GACN,UAAU,GACV,SAAS,CAAC;AAwBd,4FAA4F;AAC5F,qBAAa,sBAAuB,SAAQ,KAAK;IAS7C,QAAQ,CAAC,OAAO,EAAE,iBAAiB;IARrC,oEAAoE;IACpE,QAAQ,CAAC,IAAI,0BAA0B;IAEvC;;;OAGG;gBAEQ,OAAO,EAAE,iBAAiB,EACnC,EAAE,EAAE,OAAO;CAKd;AAmBD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI,MAAM,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,EAAE,IAAI,MAAM,CAGlE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,OAAO,EACX,KAAK,GAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,KAAK,CAAQ,GACvD,MAAM,CAOR"}
1
+ {"version":3,"file":"WikiPageId.d.ts","sourceRoot":"","sources":["../../../../../src/cognition/substrate/memory/wiki/WikiPageId.ts"],"names":[],"mappings":"AAAA,uHAAuH;AACvH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAQlC,mDAAmD;AACnD,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAK3C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,OAAO,GACP,QAAQ,GACR,WAAW,GACX,SAAS,GACT,KAAK,GACL,MAAM,GACN,UAAU,GACV,SAAS,CAAC;AA0Bd,4FAA4F;AAC5F,qBAAa,sBAAuB,SAAQ,KAAK;IAS7C,QAAQ,CAAC,OAAO,EAAE,iBAAiB;IARrC,oEAAoE;IACpE,QAAQ,CAAC,IAAI,0BAA0B;IAEvC;;;OAGG;gBAEQ,OAAO,EAAE,iBAAiB,EACnC,EAAE,EAAE,OAAO;CAKd;AAqBD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI,MAAM,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,EAAE,IAAI,MAAM,CAGlE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,OAAO,EACX,KAAK,GAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,KAAK,CAAQ,GACvD,MAAM,CAKR"}
@@ -1,19 +1,17 @@
1
1
  /** @fileoverview The id rule for wiki pages: an id names a file inside memory/, checked before any file is touched. */
2
2
  import * as path from 'node:path';
3
+ import { MAX_PATH_NAME_BYTES, isRefusedPathCharacter, pathNameProblem, resolveInsideFolder, } from '../../../../core/utils/pathName.js';
3
4
  /** The most characters a wiki page id may hold. */
4
5
  export const MAX_WIKI_PAGE_ID_LENGTH = 512;
5
6
  /** The id of the catalog file, `index.md`, which the store writes itself and never lists as a page. */
6
7
  const CATALOG_ID = 'index';
7
- /** The backslash's code: a folder separator on Windows. */
8
- const BACKSLASH = 0x5c;
9
- /** The colon's code: on Windows it names a drive (`C:page`) or a file's stream (`page:stream`). */
10
- const COLON = 0x3a;
11
8
  /** The part of the rule each problem breaks, as the error message words it. */
12
9
  const RULE_BROKEN = {
13
10
  type: 'a page id is a string',
14
11
  empty: 'a page id is not empty',
15
- length: `a page id is at most ${MAX_WIKI_PAGE_ID_LENGTH} characters`,
16
- character: 'a page id holds no backslash, no colon and no control character',
12
+ length: `a page id is at most ${MAX_WIKI_PAGE_ID_LENGTH} characters, ` +
13
+ `and each name in it at most ${MAX_PATH_NAME_BYTES} bytes in UTF-8`,
14
+ character: 'a page id holds no backslash, no colon, none of " * < > ? | and no control character',
17
15
  segment: 'a page id is names joined by single slashes, with no slash at its start or end',
18
16
  dot: 'no name in a page id starts with a dot',
19
17
  edge: 'no name in a page id starts or ends with a space or ends with a dot',
@@ -42,7 +40,10 @@ export class InvalidWikiPageIdError extends Error {
42
40
  this.name = 'InvalidWikiPageIdError';
43
41
  }
44
42
  }
45
- /** The part of the id rule `id` breaks, or null when the rule accepts it. */
43
+ /**
44
+ * The part of the id rule `id` breaks, or null when the rule accepts it. Each name between slashes is held to the
45
+ * rule every name built from data is held to (`pathNameProblem`), after the whole id is checked.
46
+ */
46
47
  function problemOf(id) {
47
48
  if (typeof id !== 'string')
48
49
  return 'type';
@@ -51,17 +52,14 @@ function problemOf(id) {
51
52
  if (id.length > MAX_WIKI_PAGE_ID_LENGTH)
52
53
  return 'length';
53
54
  for (let i = 0; i < id.length; i++) {
54
- const code = id.charCodeAt(i);
55
- if (code <= 0x1f || code === 0x7f || code === BACKSLASH || code === COLON)
55
+ if (isRefusedPathCharacter(id.charCodeAt(i)))
56
56
  return 'character';
57
57
  }
58
58
  for (const name of id.split('/')) {
59
- if (name.length === 0)
60
- return 'segment';
61
- if (name.startsWith('.'))
62
- return 'dot';
63
- if (name.startsWith(' ') || name.endsWith(' ') || name.endsWith('.'))
64
- return 'edge';
59
+ const problem = pathNameProblem(name);
60
+ // An empty name sits between two slashes, or at the id's start or end.
61
+ if (problem)
62
+ return problem === 'empty' ? 'segment' : problem;
65
63
  }
66
64
  return id.toLowerCase() === CATALOG_ID ? 'reserved' : null;
67
65
  }
@@ -69,10 +67,10 @@ function problemOf(id) {
69
67
  * True when `id` has the wiki's id form: the page's path under `memory/` without `.md`, one or more names
70
68
  * joined by `/` (`entities/johnny` is `memory/entities/johnny.md`). No name is empty or starts with a dot,
71
69
  * so `.` and `..` are never names, and no name starts or ends with a space or ends with a dot, which
72
- * Windows drops from a name; the id holds no backslash, no colon and no control character, a NUL
73
- * byte among them; it is at most {@link MAX_WIKI_PAGE_ID_LENGTH} characters; and it is not `index` in any
74
- * case, the catalog's own id. Every id the store lists, and every id the default clusterer of
75
- * `attachMemoryWiki` makes, has this form.
70
+ * Windows drops from a name; the id holds no backslash, no colon, none of `"`, `*`, `<`, `>`, `?` and `|`,
71
+ * and no control character, a NUL byte among them; it is at most {@link MAX_WIKI_PAGE_ID_LENGTH} characters,
72
+ * and each name in it at most 200 bytes in UTF-8; and it is not `index` in any case, the catalog's own id.
73
+ * Every id the store lists, and every id the default clusterer of `attachMemoryWiki` makes, has this form.
76
74
  */
77
75
  export function isWikiPageId(id) {
78
76
  return problemOf(id) === null;
@@ -101,10 +99,8 @@ export function assertWikiPageId(id) {
101
99
  */
102
100
  export function resolveWikiPagePath(memoryDir, id, paths = path) {
103
101
  assertWikiPageId(id);
104
- const root = paths.resolve(memoryDir);
105
- const file = paths.resolve(root, `${id}.md`);
106
- const inside = root.endsWith(paths.sep) ? root : root + paths.sep;
107
- if (!file.startsWith(inside))
102
+ const file = resolveInsideFolder(memoryDir, [`${id}.md`], paths);
103
+ if (file === null)
108
104
  throw new InvalidWikiPageIdError('outside', id);
109
105
  return file;
110
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WikiPageId.js","sourceRoot":"","sources":["../../../../../src/cognition/substrate/memory/wiki/WikiPageId.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WikiPageId.js","sourceRoot":"","sources":["../../../../../src/cognition/substrate/memory/wiki/WikiPageId.ts"],"names":[],"mappings":"AAAA,uHAAuH;AACvH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,mBAAmB,GACpB,MAAM,oCAAoC,CAAC;AAE5C,mDAAmD;AACnD,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C,uGAAuG;AACvG,MAAM,UAAU,GAAG,OAAO,CAAC;AA8B3B,+EAA+E;AAC/E,MAAM,WAAW,GAAsC;IACrD,IAAI,EAAE,uBAAuB;IAC7B,KAAK,EAAE,wBAAwB;IAC/B,MAAM,EACJ,wBAAwB,uBAAuB,eAAe;QAC9D,+BAA+B,mBAAmB,iBAAiB;IACrE,SAAS,EAAE,sFAAsF;IACjG,OAAO,EAAE,gFAAgF;IACzF,GAAG,EAAE,wCAAwC;IAC7C,IAAI,EAAE,qEAAqE;IAC3E,QAAQ,EAAE,6EAA6E;IACvF,OAAO,EAAE,oDAAoD;CAC9D,CAAC;AAEF,wEAAwE;AACxE,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B,+FAA+F;AAC/F,SAAS,UAAU,CAAC,EAAW;IAC7B,IAAI,OAAO,EAAE,KAAK,QAAQ;QAAE,OAAO,WAAW,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;IACjF,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,GAAG,mBAAmB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACzG,CAAC;AAED,4FAA4F;AAC5F,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAI/C;;;OAGG;IACH,YACW,OAA0B,EACnC,EAAW;QAEX,KAAK,CAAC,gBAAgB,UAAU,CAAC,EAAE,CAAC,aAAa,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAHhE,YAAO,GAAP,OAAO,CAAmB;QARrC,oEAAoE;QAC3D,SAAI,GAAG,sBAAsB,CAAC;QAWrC,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,EAAW;IAC5B,IAAI,OAAO,EAAE,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC1C,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACpC,IAAI,EAAE,CAAC,MAAM,GAAG,uBAAuB;QAAE,OAAO,QAAQ,CAAC;IACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,sBAAsB,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,WAAW,CAAC;IACnE,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACtC,uEAAuE;QACvE,IAAI,OAAO;YAAE,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,EAAW;IACtC,OAAO,SAAS,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC;AAChC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAW;IAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC9B,IAAI,OAAO;QAAE,MAAM,IAAI,sBAAsB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAAiB,EACjB,EAAW,EACX,QAAoD,IAAI;IAExD,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,mBAAmB,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IACjE,IAAI,IAAI,KAAK,IAAI;QAAE,MAAM,IAAI,sBAAsB,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACnE,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * @fileoverview The rule for a file or folder name built from data, and the check that a path built from such
3
+ * names lies inside its folder.
4
+ *
5
+ * The memory wiki builds a page's path from its id, and the Markdown and Obsidian memory exporters build a
6
+ * trace's path from its scope, type and id. Those values come from files, imports and models, so every name
7
+ * taken from them is checked against one rule here, and every path built from them is checked to lie inside the
8
+ * folder it is written to.
9
+ *
10
+ * @module agentos/core/utils/pathName
11
+ */
12
+ import * as path from 'node:path';
13
+ /**
14
+ * The most bytes, in UTF-8, one name may hold. Linux allows 255 bytes in a name, and Windows usually 255 UTF-16
15
+ * code units; a name never holds more code units than bytes, so 200 fits both and leaves room for the extension a
16
+ * caller adds, such as `.md`.
17
+ */
18
+ export declare const MAX_PATH_NAME_BYTES = 200;
19
+ /**
20
+ * Why a name was refused:
21
+ * - `'empty'`: the name is empty.
22
+ * - `'character'`: it holds a slash, a backslash, a colon, one of `"`, `*`, `<`, `>`, `?` and `|`, or a control
23
+ * character (U+0000 to U+001F, or U+007F), a NUL byte among them. A slash or a backslash separates folders; on
24
+ * Windows a colon names a drive (`C:name`) or a file's stream (`name:stream`), and Windows refuses the other six
25
+ * in a name.
26
+ * - `'dot'`: it starts with a dot, so it is `.`, `..` or a hidden name.
27
+ * - `'edge'`: it starts or ends with a space, or ends with a dot. Windows drops those from a name, so the name
28
+ * would be another's (`notes.` is `notes` there).
29
+ * - `'length'`: it holds more than {@link MAX_PATH_NAME_BYTES} bytes in UTF-8.
30
+ */
31
+ export type PathNameProblem = 'empty' | 'character' | 'dot' | 'edge' | 'length';
32
+ /**
33
+ * True when the character whose UTF-16 code is `code` may appear neither in a name nor anywhere in a path whose
34
+ * names are joined with `/`: a backslash, a colon, one of `"`, `*`, `<`, `>`, `?` and `|`, or a control character
35
+ * (U+0000 to U+001F, or U+007F).
36
+ */
37
+ export declare function isRefusedPathCharacter(code: number): boolean;
38
+ /**
39
+ * The part of the name rule `name` breaks, or null when `name` may name one file or folder. A name the rule
40
+ * accepts holds no separator, is never `.` or `..`, and names no drive or file stream, so a path built from such
41
+ * names stays under the folder it starts from.
42
+ *
43
+ * @param name - The name to check.
44
+ */
45
+ export declare function pathNameProblem(name: string): PathNameProblem | null;
46
+ /**
47
+ * The path that `relative` names under the folder `root`, resolved, or null when that path is not inside `root`.
48
+ * The paths are compared resolved, with the separator after the folder's own path, so a sibling folder whose name
49
+ * starts with the folder's (`/srv/memory-old` beside `/srv/memory`) is not inside it, and neither is the folder
50
+ * itself. The check is on the path as written: a link inside the folder is not followed.
51
+ *
52
+ * @param root - The folder.
53
+ * @param relative - The parts of the path under `root`, in order, as `path.resolve` takes them.
54
+ * @param paths - The path functions to resolve with: the platform's by default, `path.win32` or `path.posix` to
55
+ * pick one.
56
+ * @returns The absolute path, or null when it is outside `root`.
57
+ */
58
+ export declare function resolveInsideFolder(root: string, relative: readonly string[], paths?: Pick<path.PlatformPath, 'resolve' | 'sep'>): string | null;
59
+ //# sourceMappingURL=pathName.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathName.d.ts","sourceRoot":"","sources":["../../../src/core/utils/pathName.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;AAgBhF;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAWpE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,KAAK,GAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,KAAK,CAAQ,GACvD,MAAM,GAAG,IAAI,CAKf"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @fileoverview The rule for a file or folder name built from data, and the check that a path built from such
3
+ * names lies inside its folder.
4
+ *
5
+ * The memory wiki builds a page's path from its id, and the Markdown and Obsidian memory exporters build a
6
+ * trace's path from its scope, type and id. Those values come from files, imports and models, so every name
7
+ * taken from them is checked against one rule here, and every path built from them is checked to lie inside the
8
+ * folder it is written to.
9
+ *
10
+ * @module agentos/core/utils/pathName
11
+ */
12
+ import * as path from 'node:path';
13
+ /**
14
+ * The most bytes, in UTF-8, one name may hold. Linux allows 255 bytes in a name, and Windows usually 255 UTF-16
15
+ * code units; a name never holds more code units than bytes, so 200 fits both and leaves room for the extension a
16
+ * caller adds, such as `.md`.
17
+ */
18
+ export const MAX_PATH_NAME_BYTES = 200;
19
+ /** The slash's code: the folder separator everywhere. */
20
+ const SLASH = 0x2f;
21
+ /** The backslash's code: a folder separator on Windows. */
22
+ const BACKSLASH = 0x5c;
23
+ /** The colon's code: on Windows it names a drive (`C:name`) or a file's stream (`name:stream`). */
24
+ const COLON = 0x3a;
25
+ /** The codes of `"`, `*`, `<`, `>`, `?` and `|`, which Windows refuses in a name. */
26
+ const WINDOWS_RESERVED = new Set([0x22, 0x2a, 0x3c, 0x3e, 0x3f, 0x7c]);
27
+ const utf8 = new TextEncoder();
28
+ /**
29
+ * True when the character whose UTF-16 code is `code` may appear neither in a name nor anywhere in a path whose
30
+ * names are joined with `/`: a backslash, a colon, one of `"`, `*`, `<`, `>`, `?` and `|`, or a control character
31
+ * (U+0000 to U+001F, or U+007F).
32
+ */
33
+ export function isRefusedPathCharacter(code) {
34
+ return code <= 0x1f || code === 0x7f || code === BACKSLASH || code === COLON || WINDOWS_RESERVED.has(code);
35
+ }
36
+ /**
37
+ * The part of the name rule `name` breaks, or null when `name` may name one file or folder. A name the rule
38
+ * accepts holds no separator, is never `.` or `..`, and names no drive or file stream, so a path built from such
39
+ * names stays under the folder it starts from.
40
+ *
41
+ * @param name - The name to check.
42
+ */
43
+ export function pathNameProblem(name) {
44
+ if (name.length === 0)
45
+ return 'empty';
46
+ for (let i = 0; i < name.length; i++) {
47
+ const code = name.charCodeAt(i);
48
+ if (code === SLASH || isRefusedPathCharacter(code))
49
+ return 'character';
50
+ }
51
+ if (name.startsWith('.'))
52
+ return 'dot';
53
+ if (name.startsWith(' ') || name.endsWith(' ') || name.endsWith('.'))
54
+ return 'edge';
55
+ // A string never has more UTF-16 code units than UTF-8 bytes, so a long one is refused before it is encoded.
56
+ if (name.length > MAX_PATH_NAME_BYTES || utf8.encode(name).byteLength > MAX_PATH_NAME_BYTES)
57
+ return 'length';
58
+ return null;
59
+ }
60
+ /**
61
+ * The path that `relative` names under the folder `root`, resolved, or null when that path is not inside `root`.
62
+ * The paths are compared resolved, with the separator after the folder's own path, so a sibling folder whose name
63
+ * starts with the folder's (`/srv/memory-old` beside `/srv/memory`) is not inside it, and neither is the folder
64
+ * itself. The check is on the path as written: a link inside the folder is not followed.
65
+ *
66
+ * @param root - The folder.
67
+ * @param relative - The parts of the path under `root`, in order, as `path.resolve` takes them.
68
+ * @param paths - The path functions to resolve with: the platform's by default, `path.win32` or `path.posix` to
69
+ * pick one.
70
+ * @returns The absolute path, or null when it is outside `root`.
71
+ */
72
+ export function resolveInsideFolder(root, relative, paths = path) {
73
+ const folder = paths.resolve(root);
74
+ const file = paths.resolve(folder, ...relative);
75
+ const inside = folder.endsWith(paths.sep) ? folder : folder + paths.sep;
76
+ return file.startsWith(inside) ? file : null;
77
+ }
78
+ //# sourceMappingURL=pathName.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathName.js","sourceRoot":"","sources":["../../../src/core/utils/pathName.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAgBvC,yDAAyD;AACzD,MAAM,KAAK,GAAG,IAAI,CAAC;AAEnB,2DAA2D;AAC3D,MAAM,SAAS,GAAG,IAAI,CAAC;AAEvB,mGAAmG;AACnG,MAAM,KAAK,GAAG,IAAI,CAAC;AAEnB,qFAAqF;AACrF,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAEvE,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;AAE/B;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,OAAO,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC7G,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,IAAI,KAAK,KAAK,IAAI,sBAAsB,CAAC,IAAI,CAAC;YAAE,OAAO,WAAW,CAAC;IACzE,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IACpF,6GAA6G;IAC7G,IAAI,IAAI,CAAC,MAAM,GAAG,mBAAmB,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,mBAAmB;QAAE,OAAO,QAAQ,CAAC;IAC7G,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,QAA2B,EAC3B,QAAoD,IAAI;IAExD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC;IACxE,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@framers/agentos",
3
- "version": "0.13.64",
3
+ "version": "0.13.65",
4
4
  "description": "AgentOS: open-source TypeScript framework for autonomous AI agents. Unified graph orchestration, cognitive memory, runtime tool forging, multi-tier guardrails, voice pipeline, and 11 LLM providers.",
5
5
  "homepage": "https://agentos.sh",
6
6
  "repository": {