vectra 0.1.1 → 0.2.0

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 (78) hide show
  1. package/README.md +3 -3
  2. package/bin/vectra.js +3 -0
  3. package/lib/GPT3Tokenizer.d.ts +9 -0
  4. package/lib/GPT3Tokenizer.d.ts.map +1 -0
  5. package/lib/GPT3Tokenizer.js +17 -0
  6. package/lib/GPT3Tokenizer.js.map +1 -0
  7. package/lib/ItemSelector.d.ts +41 -0
  8. package/lib/ItemSelector.d.ts.map +1 -0
  9. package/lib/ItemSelector.js +156 -0
  10. package/lib/ItemSelector.js.map +1 -0
  11. package/lib/LocalDocument.d.ts +16 -0
  12. package/lib/LocalDocument.d.ts.map +1 -0
  13. package/lib/LocalDocument.js +99 -0
  14. package/lib/LocalDocument.js.map +1 -0
  15. package/lib/LocalDocumentIndex.d.ts +48 -0
  16. package/lib/LocalDocumentIndex.d.ts.map +1 -0
  17. package/lib/LocalDocumentIndex.js +367 -0
  18. package/lib/LocalDocumentIndex.js.map +1 -0
  19. package/lib/LocalDocumentResult.d.ts +12 -0
  20. package/lib/LocalDocumentResult.d.ts.map +1 -0
  21. package/lib/LocalDocumentResult.js +186 -0
  22. package/lib/LocalDocumentResult.js.map +1 -0
  23. package/lib/LocalIndex.d.ts +130 -0
  24. package/lib/LocalIndex.d.ts.map +1 -0
  25. package/lib/LocalIndex.js +405 -0
  26. package/lib/LocalIndex.js.map +1 -0
  27. package/lib/OpenAIEmbeddings.d.ts +98 -0
  28. package/lib/OpenAIEmbeddings.d.ts.map +1 -0
  29. package/lib/OpenAIEmbeddings.js +139 -0
  30. package/lib/OpenAIEmbeddings.js.map +1 -0
  31. package/lib/TextSplitter.d.ts +17 -0
  32. package/lib/TextSplitter.d.ts.map +1 -0
  33. package/lib/TextSplitter.js +460 -0
  34. package/lib/TextSplitter.js.map +1 -0
  35. package/lib/WebFetcher.d.ts +16 -0
  36. package/lib/WebFetcher.d.ts.map +1 -0
  37. package/lib/WebFetcher.js +144 -0
  38. package/lib/WebFetcher.js.map +1 -0
  39. package/lib/index.d.ts +11 -0
  40. package/lib/index.d.ts.map +1 -0
  41. package/lib/index.js +27 -0
  42. package/lib/index.js.map +1 -0
  43. package/lib/internals/Colorize.d.ts +14 -0
  44. package/lib/internals/Colorize.d.ts.map +1 -0
  45. package/lib/internals/Colorize.js +64 -0
  46. package/lib/internals/Colorize.js.map +1 -0
  47. package/lib/internals/index.d.ts +3 -0
  48. package/lib/internals/index.d.ts.map +1 -0
  49. package/lib/internals/index.js +19 -0
  50. package/lib/internals/index.js.map +1 -0
  51. package/lib/internals/types.d.ts +42 -0
  52. package/lib/internals/types.d.ts.map +1 -0
  53. package/lib/internals/types.js +3 -0
  54. package/lib/internals/types.js.map +1 -0
  55. package/lib/types.d.ts +133 -0
  56. package/lib/types.d.ts.map +1 -0
  57. package/lib/types.js +3 -0
  58. package/lib/types.js.map +1 -0
  59. package/lib/vectra-cli.d.ts +2 -0
  60. package/lib/vectra-cli.d.ts.map +1 -0
  61. package/lib/vectra-cli.js +276 -0
  62. package/lib/vectra-cli.js.map +1 -0
  63. package/package.json +21 -3
  64. package/src/GPT3Tokenizer.ts +15 -0
  65. package/src/ItemSelector.ts +9 -9
  66. package/src/LocalDocument.ts +70 -0
  67. package/src/LocalDocumentIndex.ts +355 -0
  68. package/src/LocalDocumentResult.ts +206 -0
  69. package/src/LocalIndex.ts +12 -78
  70. package/src/OpenAIEmbeddings.ts +205 -0
  71. package/src/TextSplitter.ts +480 -0
  72. package/src/WebFetcher.ts +128 -0
  73. package/src/index.ts +8 -0
  74. package/src/internals/Colorize.ts +64 -0
  75. package/src/internals/index.ts +2 -0
  76. package/src/internals/types.ts +46 -0
  77. package/src/types.ts +160 -0
  78. package/src/vectra-cli.ts +238 -0
@@ -0,0 +1,276 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.run = void 0;
39
+ const fs = __importStar(require("fs/promises"));
40
+ const yargs_1 = __importDefault(require("yargs/yargs"));
41
+ const helpers_1 = require("yargs/helpers");
42
+ const LocalDocumentIndex_1 = require("./LocalDocumentIndex");
43
+ const WebFetcher_1 = require("./WebFetcher");
44
+ const OpenAIEmbeddings_1 = require("./OpenAIEmbeddings");
45
+ const internals_1 = require("./internals");
46
+ function run() {
47
+ return __awaiter(this, void 0, void 0, function* () {
48
+ // prettier-ignore
49
+ const args = yield (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
50
+ .command('create <index>', `create a new local index`, {}, (args) => __awaiter(this, void 0, void 0, function* () {
51
+ const folderPath = args.index;
52
+ const index = new LocalDocumentIndex_1.LocalDocumentIndex({ folderPath });
53
+ console.log(internals_1.Colorize.output(`creating index at ${folderPath}`));
54
+ yield index.createIndex({ version: 1, deleteIfExists: true });
55
+ }))
56
+ .command('delete <index>', `delete an existing local index`, {}, (args) => __awaiter(this, void 0, void 0, function* () {
57
+ const folderPath = args.index;
58
+ console.log(internals_1.Colorize.output(`deleting index at ${folderPath}`));
59
+ const index = new LocalDocumentIndex_1.LocalDocumentIndex({ folderPath });
60
+ yield index.deleteIndex();
61
+ }))
62
+ .command('add-web <index>', `adds one or more web pages to an index`, (yargs) => {
63
+ return yargs
64
+ .option('keys', {
65
+ alias: 'k',
66
+ describe: 'path of a JSON file containing the model keys to use for generating embeddings',
67
+ type: 'string'
68
+ })
69
+ .option('uri', {
70
+ alias: 'u',
71
+ array: true,
72
+ describe: 'http/https link to a web page to add',
73
+ type: 'string'
74
+ })
75
+ .option('list', {
76
+ alias: 'l',
77
+ describe: 'path to a file containing a list of web pages to add',
78
+ type: 'string'
79
+ })
80
+ .option('chunk-size', {
81
+ alias: 'cs',
82
+ describe: 'size of the generated chunks in tokens (defaults to 512)',
83
+ type: 'number',
84
+ default: 512
85
+ })
86
+ .check((argv) => {
87
+ if (Array.isArray(argv.uri) && argv.uri.length > 0) {
88
+ return true;
89
+ }
90
+ else if (typeof argv.list == 'string' && argv.list.trim().length > 0) {
91
+ return true;
92
+ }
93
+ else {
94
+ throw new Error(`you must specify either one or more "--uri <link>" for the pages to add or a "--list <file path>" for a file containing the list of pages to add.`);
95
+ }
96
+ })
97
+ .demandOption(['keys']);
98
+ }, (args) => __awaiter(this, void 0, void 0, function* () {
99
+ console.log(internals_1.Colorize.title('Adding Web Pages to Index'));
100
+ // Create embeddings
101
+ const keys = JSON.parse(yield fs.readFile(args.keys, 'utf-8'));
102
+ const embeddings = new OpenAIEmbeddings_1.OpenAIEmbeddings(Object.assign({ model: 'text-embedding-ada-002' }, keys));
103
+ // Initialize index
104
+ const folderPath = args.index;
105
+ const index = new LocalDocumentIndex_1.LocalDocumentIndex({
106
+ folderPath,
107
+ embeddings,
108
+ chunkingConfig: {
109
+ chunkSize: args.chunkSize
110
+ }
111
+ });
112
+ // Get list of url's
113
+ const uris = yield getItemList(args.uri, args.list, 'web page');
114
+ // Fetch web pages
115
+ const fetcher = new WebFetcher_1.WebFetcher();
116
+ for (const uri of uris) {
117
+ try {
118
+ console.log(internals_1.Colorize.progress(`fetching ${uri}`));
119
+ const content = yield fetcher.fetch(uri);
120
+ console.log(internals_1.Colorize.replaceLine(internals_1.Colorize.progress(`indexing ${uri}`)));
121
+ yield index.upsertDocument(uri, content);
122
+ console.log(internals_1.Colorize.replaceLine(internals_1.Colorize.success(`added ${uri}`)));
123
+ }
124
+ catch (err) {
125
+ console.log(internals_1.Colorize.replaceLine(internals_1.Colorize.error(`Error adding: ${uri}\n${err.message}`)));
126
+ }
127
+ }
128
+ }))
129
+ .command('remove <index>', `removes one or more documents from an index`, (yargs) => {
130
+ return yargs
131
+ .option('uri', {
132
+ alias: 'u',
133
+ array: true,
134
+ describe: 'uri of a document to remove',
135
+ type: 'string'
136
+ })
137
+ .option('list', {
138
+ alias: 'l',
139
+ describe: 'path to a file containing a list of documents to remove',
140
+ type: 'string'
141
+ })
142
+ .check((argv) => {
143
+ if (Array.isArray(argv.uri) && argv.uri.length > 0) {
144
+ return true;
145
+ }
146
+ else if (typeof argv.list == 'string' && argv.list.trim().length > 0) {
147
+ return true;
148
+ }
149
+ else {
150
+ throw new Error(`you must specify either one or more "--uri <link>" for the pages to add or a "--list <file path>" for a file containing the list of pages to add.`);
151
+ }
152
+ });
153
+ }, (args) => __awaiter(this, void 0, void 0, function* () {
154
+ // Initialize index
155
+ const folderPath = args.index;
156
+ const index = new LocalDocumentIndex_1.LocalDocumentIndex({ folderPath });
157
+ // Get list of uri's
158
+ const uris = yield getItemList(args.uri, args.list, 'document');
159
+ // Remove documents
160
+ for (const uri of uris) {
161
+ console.log(`removing ${uri}`);
162
+ yield index.deleteDocument(uri);
163
+ }
164
+ }))
165
+ .command('stats <index>', `prints the stats for a local index`, {}, (args) => __awaiter(this, void 0, void 0, function* () {
166
+ const folderPath = args.index;
167
+ const index = new LocalDocumentIndex_1.LocalDocumentIndex({ folderPath });
168
+ const stats = yield index.getCatalogStats();
169
+ console.log(internals_1.Colorize.title('Index Stats'));
170
+ console.log(internals_1.Colorize.output(stats));
171
+ }))
172
+ .command('query <index> <query>', `queries a local index`, (yargs) => {
173
+ return yargs
174
+ .option('keys', {
175
+ alias: 'k',
176
+ describe: 'path of a JSON file containing the model keys to use for generating embeddings'
177
+ })
178
+ .option('document-count', {
179
+ alias: 'dc',
180
+ describe: 'max number of documents to return (defaults to 10)',
181
+ type: 'count',
182
+ default: 10
183
+ })
184
+ .option('chunk-count', {
185
+ alias: 'cc',
186
+ describe: 'max number of chunks to return (defaults to 50)',
187
+ type: 'count',
188
+ default: 50
189
+ })
190
+ .option('section-count', {
191
+ alias: 'sc',
192
+ describe: 'max number of document sections to render (defaults to 1)',
193
+ type: 'count',
194
+ default: 1
195
+ })
196
+ .option('tokens', {
197
+ alias: 't',
198
+ describe: 'max number of tokens to render for each document section (defaults to 2000)',
199
+ type: 'count',
200
+ default: 2000
201
+ })
202
+ .option('format', {
203
+ alias: 'f',
204
+ describe: `format of the rendered results. Defaults to 'sections'`,
205
+ choices: ['sections', 'stats', 'chunks'],
206
+ default: 'sections'
207
+ })
208
+ .demandOption(['keys']);
209
+ }, (args) => __awaiter(this, void 0, void 0, function* () {
210
+ console.log(internals_1.Colorize.title('Querying Index'));
211
+ // Create embeddings
212
+ const keys = JSON.parse(yield fs.readFile(args.keys, 'utf-8'));
213
+ const embeddings = new OpenAIEmbeddings_1.OpenAIEmbeddings(Object.assign({ model: 'text-embedding-ada-002' }, keys));
214
+ // Initialize index
215
+ const folderPath = args.index;
216
+ const index = new LocalDocumentIndex_1.LocalDocumentIndex({
217
+ folderPath,
218
+ embeddings
219
+ });
220
+ // Query index
221
+ const query = args.query;
222
+ const results = yield index.queryDocuments(query, {
223
+ maxDocuments: args.documentCount,
224
+ maxChunks: args.chunkCount,
225
+ });
226
+ // Render results
227
+ for (const result of results) {
228
+ console.log(internals_1.Colorize.output(result.uri));
229
+ console.log(internals_1.Colorize.value('score', result.score));
230
+ console.log(internals_1.Colorize.value('chunks', result.chunks.length));
231
+ if (args.format == 'sections') {
232
+ const sections = yield result.renderSections(args.tokens, args.sectionCount);
233
+ for (let i = 0; i < sections.length; i++) {
234
+ const section = sections[i];
235
+ console.log(internals_1.Colorize.title(args.sectionCount > 1 ? 'Section' : `Section ${1}`));
236
+ console.log(internals_1.Colorize.value('score', section.score));
237
+ console.log(internals_1.Colorize.value('tokens', section.tokenCount));
238
+ console.log(internals_1.Colorize.output(section.text));
239
+ }
240
+ }
241
+ else if (args.format == 'chunks') {
242
+ const text = yield result.loadText();
243
+ for (let i = 0; i < result.chunks.length; i++) {
244
+ const chunk = result.chunks[i];
245
+ const startPos = chunk.item.metadata.startPos;
246
+ const endPos = chunk.item.metadata.endPos;
247
+ console.log(internals_1.Colorize.title(`Chunk ${i + 1}`));
248
+ console.log(internals_1.Colorize.value('score', chunk.score));
249
+ console.log(internals_1.Colorize.value('startPos', startPos));
250
+ console.log(internals_1.Colorize.value('endPos', endPos));
251
+ console.log(internals_1.Colorize.output(text.substring(startPos, endPos + 1)));
252
+ }
253
+ }
254
+ }
255
+ }))
256
+ .help()
257
+ .demandCommand()
258
+ .parseAsync();
259
+ });
260
+ }
261
+ exports.run = run;
262
+ function getItemList(items, listFile, uriType) {
263
+ return __awaiter(this, void 0, void 0, function* () {
264
+ if (Array.isArray(items) && items.length > 0) {
265
+ return items;
266
+ }
267
+ else if (typeof listFile == 'string' && listFile.trim().length > 0) {
268
+ const list = yield fs.readFile(listFile, 'utf-8');
269
+ return list.split('\n').map((item) => item.trim()).filter((item) => item.length > 0);
270
+ }
271
+ else {
272
+ throw new Error(`you must specify either one or more "--uri <${uriType}>" for the items or a "--list <file path>" for a file containing the items.`);
273
+ }
274
+ });
275
+ }
276
+ //# sourceMappingURL=vectra-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vectra-cli.js","sourceRoot":"","sources":["../src/vectra-cli.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "vectra",
3
3
  "author": "Steven Ickman",
4
4
  "description": "A vector database that uses the local file system for storage.",
5
- "version": "0.1.1",
5
+ "version": "0.2.0",
6
6
  "license": "MIT",
7
7
  "keywords": [
8
8
  "gpt"
@@ -16,6 +16,9 @@
16
16
  },
17
17
  "main": "./lib/index.js",
18
18
  "types": "./lib/index.d.ts",
19
+ "bin": {
20
+ "vectra": "./bin/vectra.js"
21
+ },
19
22
  "typesVersions": {
20
23
  "<3.9": {
21
24
  "*": [
@@ -24,13 +27,28 @@
24
27
  }
25
28
  },
26
29
  "dependencies": {
27
- "uuid": "^8.3.2"
30
+ "axios": "^1.3.4",
31
+ "cheerio": "^1.0.0-rc.12",
32
+ "dotenv": "^8.2.0",
33
+ "gpt-3-encoder": "1.1.4",
34
+ "json-colorizer": "^2.2.2",
35
+ "openai": "^3.2.1",
36
+ "uuid": "^9.0.0",
37
+ "yargs": "^17.7.2"
28
38
  },
29
39
  "resolutions": {
30
40
  },
31
41
  "devDependencies": {
32
42
  "@types/node": "^14.14.31",
33
- "@types/uuid": "^8.3.0"
43
+ "@types/mocha": "^8.2.0",
44
+ "@types/assert": "^1.5.3",
45
+ "@types/uuid": "9.0.1",
46
+ "@types/yargs": "17.0.24",
47
+ "mocha": "10.2.0",
48
+ "nyc": "^15.1.0",
49
+ "shx": "^0.3.2",
50
+ "ts-mocha": "10.0.0",
51
+ "typescript": "^4.2.3"
34
52
  },
35
53
  "scripts": {
36
54
  "build": "tsc -b",
@@ -0,0 +1,15 @@
1
+ import { Tokenizer } from "./types";
2
+ import { encode, decode } from "gpt-3-encoder";
3
+
4
+ /**
5
+ * Tokenizer that uses GPT-3's encoder.
6
+ */
7
+ export class GPT3Tokenizer implements Tokenizer {
8
+ public decode(tokens: number[]): string {
9
+ return decode(tokens);
10
+ }
11
+
12
+ public encode(text: string): number[] {
13
+ return encode(text);
14
+ }
15
+ }
@@ -1,4 +1,4 @@
1
- import { MetadataFilter, MetadataTypes } from './LocalIndex';
1
+ import { MetadataFilter, MetadataTypes } from './types';
2
2
 
3
3
  export class ItemSelector {
4
4
  /**
@@ -62,12 +62,12 @@ export class ItemSelector {
62
62
  for (const key in filter) {
63
63
  switch (key) {
64
64
  case '$and':
65
- if (!filter[key].every((f) => this.select(metadata, f))) {
65
+ if (!filter[key]!.every((f: MetadataFilter) => this.select(metadata, f))) {
66
66
  return false;
67
67
  }
68
68
  break;
69
69
  case '$or':
70
- if (!filter[key].some((f) => this.select(metadata, f))) {
70
+ if (!filter[key]!.some((f: MetadataFilter) => this.select(metadata, f))) {
71
71
  return false;
72
72
  }
73
73
  break;
@@ -120,32 +120,32 @@ export class ItemSelector {
120
120
  }
121
121
  break;
122
122
  case '$gt':
123
- if (typeof value != 'number' || value <= filter[key]) {
123
+ if (typeof value != 'number' || value <= filter[key]!) {
124
124
  return false;
125
125
  }
126
126
  break;
127
127
  case '$gte':
128
- if (typeof value != 'number' || value < filter[key]) {
128
+ if (typeof value != 'number' || value < filter[key]!) {
129
129
  return false;
130
130
  }
131
131
  break;
132
132
  case '$lt':
133
- if (typeof value != 'number' || value >= filter[key]) {
133
+ if (typeof value != 'number' || value >= filter[key]!) {
134
134
  return false;
135
135
  }
136
136
  break;
137
137
  case '$lte':
138
- if (typeof value != 'number' || value > filter[key]) {
138
+ if (typeof value != 'number' || value > filter[key]!) {
139
139
  return false;
140
140
  }
141
141
  break;
142
142
  case '$in':
143
- if (typeof value == 'boolean' || !filter[key].includes(value)) {
143
+ if (typeof value == 'boolean' || !filter[key]!.includes(value)) {
144
144
  return false;
145
145
  }
146
146
  break;
147
147
  case '$nin':
148
- if (typeof value == 'boolean' || filter[key].includes(value)) {
148
+ if (typeof value == 'boolean' || filter[key]!.includes(value)) {
149
149
  return false;
150
150
  }
151
151
  break;
@@ -0,0 +1,70 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import { MetadataTypes } from './types';
4
+
5
+ export class LocalDocument {
6
+ private readonly _folderPath: string;
7
+ private readonly _id: string;
8
+ private readonly _uri: string;
9
+ private _metadata: Record<string,MetadataTypes>|undefined;
10
+ private _text: string|undefined;
11
+
12
+ public constructor(folderPath: string, id: string, uri: string) {
13
+ this._folderPath = folderPath;
14
+ this._id = id;
15
+ this._uri = uri;
16
+ }
17
+
18
+ public get folderPath(): string {
19
+ return this._folderPath;
20
+ }
21
+
22
+ public get id(): string {
23
+ return this._id;
24
+ }
25
+
26
+ public get uri(): string {
27
+ return this._uri;
28
+ }
29
+
30
+ public async hasMetadata(): Promise<boolean> {
31
+ try {
32
+ await fs.access(path.join(this.folderPath, `${this.id}.json`));
33
+ return true;
34
+ } catch (err: unknown) {
35
+ return false;
36
+ }
37
+ }
38
+
39
+ public async loadMetadata(): Promise<Record<string,MetadataTypes>> {
40
+ if (this._metadata == undefined) {
41
+ let json: string;
42
+ try {
43
+ json = (await fs.readFile(path.join(this.folderPath, `${this.id}.json`))).toString();
44
+ } catch (err: unknown) {
45
+ throw new Error(`Error reading metadata for document "${this.uri}": ${(err as any).toString()}`);
46
+ }
47
+
48
+ try {
49
+ this._metadata = JSON.parse(json);
50
+ } catch (err: unknown) {
51
+ throw new Error(`Error parsing metadata for document "${this.uri}": ${(err as any).toString()}`);
52
+ }
53
+ }
54
+
55
+ return this._metadata!;
56
+ }
57
+
58
+ public async loadText(): Promise<string> {
59
+ if (this._text == undefined) {
60
+ try {
61
+ this._text = (await fs.readFile(path.join(this.folderPath, `${this.id}.txt`))).toString();
62
+ } catch (err: unknown) {
63
+ throw new Error(`Error reading text file for document "${this.uri}": ${(err as any).toString()}`);
64
+ }
65
+ }
66
+
67
+ return this._text;
68
+ }
69
+
70
+ }