mor 0.0.2 → 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 (64) hide show
  1. package/LICENSE +22 -21
  2. package/README.md +163 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +609 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/config.d.ts +3 -0
  7. package/dist/config.js +50 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/db.d.ts +38 -0
  10. package/dist/db.js +134 -0
  11. package/dist/db.js.map +1 -0
  12. package/dist/embeddings/azure-openai.d.ts +12 -0
  13. package/dist/embeddings/azure-openai.js +41 -0
  14. package/dist/embeddings/azure-openai.js.map +1 -0
  15. package/dist/embeddings/none.d.ts +6 -0
  16. package/dist/embeddings/none.js +8 -0
  17. package/dist/embeddings/none.js.map +1 -0
  18. package/dist/embeddings/ollama.d.ts +9 -0
  19. package/dist/embeddings/ollama.js +28 -0
  20. package/dist/embeddings/ollama.js.map +1 -0
  21. package/dist/embeddings/openai.d.ts +10 -0
  22. package/dist/embeddings/openai.js +33 -0
  23. package/dist/embeddings/openai.js.map +1 -0
  24. package/dist/embeddings/provider.d.ts +7 -0
  25. package/dist/embeddings/provider.js +18 -0
  26. package/dist/embeddings/provider.js.map +1 -0
  27. package/dist/filter.d.ts +11 -0
  28. package/dist/filter.js +47 -0
  29. package/dist/filter.js.map +1 -0
  30. package/dist/index.d.ts +10 -0
  31. package/dist/index.js +165 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/mcp.d.ts +4 -0
  34. package/dist/mcp.js +269 -0
  35. package/dist/mcp.js.map +1 -0
  36. package/dist/memory.d.ts +22 -0
  37. package/dist/memory.js +129 -0
  38. package/dist/memory.js.map +1 -0
  39. package/dist/operations.d.ts +65 -0
  40. package/dist/operations.js +127 -0
  41. package/dist/operations.js.map +1 -0
  42. package/dist/query.d.ts +3 -0
  43. package/dist/query.js +44 -0
  44. package/dist/query.js.map +1 -0
  45. package/dist/remote.d.ts +37 -0
  46. package/dist/remote.js +77 -0
  47. package/dist/remote.js.map +1 -0
  48. package/dist/server.d.ts +8 -0
  49. package/dist/server.js +341 -0
  50. package/dist/server.js.map +1 -0
  51. package/dist/types.d.ts +55 -0
  52. package/dist/types.js +10 -0
  53. package/dist/types.js.map +1 -0
  54. package/package.json +54 -18
  55. package/.dir-locals.el +0 -6
  56. package/.editorconfig +0 -15
  57. package/.eslintrc +0 -26
  58. package/.npmignore +0 -32
  59. package/alg/dfs.js +0 -36
  60. package/alg/revDfs.js +0 -36
  61. package/cli.js +0 -106
  62. package/mor-core.js +0 -60
  63. package/mor-link.js +0 -23
  64. package/mor-outdated.js +0 -26
package/dist/server.js ADDED
@@ -0,0 +1,341 @@
1
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
2
+ import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
3
+ import crypto from 'node:crypto';
4
+ import http from 'node:http';
5
+ import { createMcpServer } from './mcp.js';
6
+ import { LocalOperations } from './operations.js';
7
+ function log(msg) {
8
+ process.stderr.write(`[mor] ${msg}\n`);
9
+ }
10
+ async function readBody(req, maxBytes = 10 * 1024 * 1024) {
11
+ const chunks = [];
12
+ let total = 0;
13
+ for await (const chunk of req) {
14
+ total += chunk.byteLength;
15
+ if (total > maxBytes)
16
+ throw new Error('Request body too large');
17
+ chunks.push(chunk);
18
+ }
19
+ return Buffer.concat(chunks).toString('utf-8');
20
+ }
21
+ function json(res, status, data) {
22
+ if (res.headersSent)
23
+ return;
24
+ const body = JSON.stringify(data);
25
+ res.writeHead(status, { 'Content-Type': 'application/json' });
26
+ res.end(body);
27
+ }
28
+ function router(routes) {
29
+ const compiled = routes.map(([method, pattern, handler]) => {
30
+ const keys = [];
31
+ const re = new RegExp('^' +
32
+ pattern.replace(/:(\w+)/g, (_, k) => {
33
+ keys.push(k);
34
+ return '([^/]+)';
35
+ }) +
36
+ '$');
37
+ return { method, re, keys, handler };
38
+ });
39
+ return async (req, res) => {
40
+ const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
41
+ const method = req.method ?? 'GET';
42
+ for (const route of compiled) {
43
+ if (route.method !== method)
44
+ continue;
45
+ const match = url.pathname.match(route.re);
46
+ if (!match)
47
+ continue;
48
+ const params = {};
49
+ route.keys.forEach((k, i) => {
50
+ params[k] = decodeURIComponent(match[i + 1]);
51
+ });
52
+ await route.handler({ url, params, req, res });
53
+ return;
54
+ }
55
+ json(res, 404, { error: 'Not found' });
56
+ };
57
+ }
58
+ function isLoopbackHost(host) {
59
+ const hostname = host.split(':')[0];
60
+ return ['127.0.0.1', 'localhost', '::1', '[::1]'].includes(hostname);
61
+ }
62
+ export function startServer(config, opts) {
63
+ const ops = new LocalOperations(config);
64
+ const { token } = opts;
65
+ const mcpTransports = new Map();
66
+ const handle = router([
67
+ [
68
+ 'GET',
69
+ '/health',
70
+ async ({ res }) => {
71
+ json(res, 200, { ok: true });
72
+ },
73
+ ],
74
+ [
75
+ 'GET',
76
+ '/memories/search',
77
+ async ({ url, res }) => {
78
+ const q = url.searchParams.get('q');
79
+ if (!q) {
80
+ json(res, 400, { error: 'Missing query parameter: q' });
81
+ return;
82
+ }
83
+ const limitRaw = parseInt(url.searchParams.get('limit') ?? '20', 10);
84
+ const limit = Number.isNaN(limitRaw) || limitRaw < 1 ? 20 : limitRaw;
85
+ json(res, 200, { data: await ops.search(q, limit) });
86
+ },
87
+ ],
88
+ [
89
+ 'GET',
90
+ '/memories',
91
+ async ({ res }) => {
92
+ json(res, 200, { data: await ops.list() });
93
+ },
94
+ ],
95
+ [
96
+ 'POST',
97
+ '/memories',
98
+ async ({ req, res }) => {
99
+ let body;
100
+ try {
101
+ body = JSON.parse(await readBody(req));
102
+ }
103
+ catch {
104
+ json(res, 400, { error: 'Invalid JSON' });
105
+ return;
106
+ }
107
+ if (!body.title || !body.content) {
108
+ json(res, 400, { error: 'Missing required fields: title, content' });
109
+ return;
110
+ }
111
+ const { title, description, content, tags, type, repository } = body;
112
+ json(res, 201, {
113
+ data: await ops.add({
114
+ title,
115
+ description,
116
+ content,
117
+ tags,
118
+ type,
119
+ repository,
120
+ }),
121
+ });
122
+ },
123
+ ],
124
+ [
125
+ 'GET',
126
+ '/memories/grep',
127
+ async ({ url, res }) => {
128
+ const q = url.searchParams.get('q');
129
+ if (!q) {
130
+ json(res, 400, { error: 'Missing query parameter: q' });
131
+ return;
132
+ }
133
+ const limitRaw = parseInt(url.searchParams.get('limit') ?? '20', 10);
134
+ const limit = Number.isNaN(limitRaw) || limitRaw < 1 ? 20 : limitRaw;
135
+ const ignoreCase = url.searchParams.get('ignoreCase') === '1';
136
+ json(res, 200, { data: await ops.grep(q, limit, ignoreCase) });
137
+ },
138
+ ],
139
+ [
140
+ 'GET',
141
+ '/memories/:query',
142
+ async ({ params, res }) => {
143
+ const mem = await ops.read(params.query);
144
+ if (!mem) {
145
+ json(res, 404, { error: `Memory not found: ${params.query}` });
146
+ return;
147
+ }
148
+ json(res, 200, { data: mem });
149
+ },
150
+ ],
151
+ [
152
+ 'PUT',
153
+ '/memories/:query',
154
+ async ({ params, req, res }) => {
155
+ let body;
156
+ try {
157
+ body = JSON.parse(await readBody(req));
158
+ }
159
+ catch {
160
+ json(res, 400, { error: 'Invalid JSON' });
161
+ return;
162
+ }
163
+ try {
164
+ const { title, description, content, tags, type } = body;
165
+ json(res, 200, {
166
+ data: await ops.update(params.query, {
167
+ title,
168
+ description,
169
+ content,
170
+ tags,
171
+ type,
172
+ }),
173
+ });
174
+ }
175
+ catch (e) {
176
+ const msg = e instanceof Error ? e.message : String(e);
177
+ json(res, msg.includes('Memory not found') ? 404 : 500, {
178
+ error: msg,
179
+ });
180
+ }
181
+ },
182
+ ],
183
+ [
184
+ 'POST',
185
+ '/push',
186
+ async ({ res }) => {
187
+ try {
188
+ json(res, 200, { data: await ops.push() });
189
+ }
190
+ catch (e) {
191
+ const msg = e instanceof Error ? e.message : String(e);
192
+ json(res, 500, { error: msg });
193
+ }
194
+ },
195
+ ],
196
+ [
197
+ 'DELETE',
198
+ '/memories/:query',
199
+ async ({ params, res }) => {
200
+ try {
201
+ json(res, 200, { data: await ops.remove(params.query) });
202
+ }
203
+ catch (e) {
204
+ const msg = e instanceof Error ? e.message : String(e);
205
+ json(res, msg.includes('Memory not found') ? 404 : 500, {
206
+ error: msg,
207
+ });
208
+ }
209
+ },
210
+ ],
211
+ ]);
212
+ const server = http.createServer(async (req, res) => {
213
+ const start = Date.now();
214
+ try {
215
+ if (token) {
216
+ const expectedBuf = Buffer.from(`Bearer ${token}`);
217
+ const providedBuf = Buffer.from(req.headers.authorization ?? '');
218
+ if (expectedBuf.byteLength !== providedBuf.byteLength ||
219
+ !crypto.timingSafeEqual(providedBuf, expectedBuf)) {
220
+ json(res, 401, { error: 'Unauthorized' });
221
+ return;
222
+ }
223
+ }
224
+ // DNS rebinding protection for loopback-bound servers
225
+ if (isLoopbackHost(opts.host)) {
226
+ const reqHost = req.headers.host;
227
+ if (!reqHost || !isLoopbackHost(reqHost)) {
228
+ json(res, 403, { error: 'Forbidden: DNS rebinding protection' });
229
+ return;
230
+ }
231
+ }
232
+ // MCP HTTP transport at /mcp
233
+ const pathname = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`).pathname;
234
+ if (opts.mcp && pathname === '/mcp') {
235
+ const method = req.method ?? 'GET';
236
+ const sessionId = req.headers['mcp-session-id'];
237
+ if (method === 'POST') {
238
+ let body;
239
+ try {
240
+ body = JSON.parse(await readBody(req));
241
+ }
242
+ catch {
243
+ res.writeHead(400, { 'Content-Type': 'application/json' });
244
+ res.end(JSON.stringify({
245
+ jsonrpc: '2.0',
246
+ error: { code: -32700, message: 'Parse error' },
247
+ id: null,
248
+ }));
249
+ return;
250
+ }
251
+ if (sessionId && mcpTransports.has(sessionId)) {
252
+ await mcpTransports.get(sessionId).handleRequest(req, res, body);
253
+ }
254
+ else if (!sessionId && isInitializeRequest(body)) {
255
+ const transport = new StreamableHTTPServerTransport({
256
+ sessionIdGenerator: () => crypto.randomUUID(),
257
+ onsessioninitialized: (sid) => {
258
+ mcpTransports.set(sid, transport);
259
+ },
260
+ });
261
+ transport.onclose = () => {
262
+ if (transport.sessionId)
263
+ mcpTransports.delete(transport.sessionId);
264
+ };
265
+ const mcpServer = createMcpServer(new LocalOperations(config));
266
+ await mcpServer.connect(transport);
267
+ await transport.handleRequest(req, res, body);
268
+ }
269
+ else {
270
+ res.writeHead(400, { 'Content-Type': 'application/json' });
271
+ res.end(JSON.stringify({
272
+ jsonrpc: '2.0',
273
+ error: {
274
+ code: -32000,
275
+ message: 'Bad Request: invalid or missing session',
276
+ },
277
+ id: null,
278
+ }));
279
+ }
280
+ }
281
+ else if (method === 'GET' || method === 'DELETE') {
282
+ if (sessionId && mcpTransports.has(sessionId)) {
283
+ await mcpTransports.get(sessionId).handleRequest(req, res);
284
+ }
285
+ else {
286
+ res.writeHead(400, { 'Content-Type': 'application/json' });
287
+ res.end(JSON.stringify({
288
+ jsonrpc: '2.0',
289
+ error: {
290
+ code: -32000,
291
+ message: 'Invalid or missing session ID',
292
+ },
293
+ id: null,
294
+ }));
295
+ }
296
+ }
297
+ else {
298
+ res.writeHead(405).end();
299
+ }
300
+ return;
301
+ }
302
+ await handle(req, res);
303
+ }
304
+ catch (e) {
305
+ const msg = e instanceof Error ? e.message : String(e);
306
+ log(`Error: ${msg}`);
307
+ json(res, 500, { error: msg });
308
+ }
309
+ finally {
310
+ log(`${req.method} ${req.url} ${res.statusCode} ${Date.now() - start}ms`);
311
+ }
312
+ });
313
+ const shutdown = () => {
314
+ log('Shutting down...');
315
+ for (const transport of mcpTransports.values()) {
316
+ transport.close().catch(() => { });
317
+ }
318
+ mcpTransports.clear();
319
+ ops.close();
320
+ server.close();
321
+ };
322
+ process.on('SIGINT', () => {
323
+ shutdown();
324
+ process.exit(0);
325
+ });
326
+ process.on('SIGTERM', () => {
327
+ shutdown();
328
+ process.exit(0);
329
+ });
330
+ server.on('close', () => {
331
+ process.removeAllListeners('SIGINT');
332
+ process.removeAllListeners('SIGTERM');
333
+ });
334
+ server.listen(opts.port, opts.host, () => {
335
+ log(`Listening on http://${opts.host}:${opts.port}`);
336
+ if (opts.mcp)
337
+ log('MCP endpoint enabled at /mcp');
338
+ });
339
+ return server;
340
+ }
341
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ export interface ServerConfig {
2
+ url: string;
3
+ token?: string;
4
+ }
5
+ export interface ServeConfig {
6
+ port?: number;
7
+ host?: string;
8
+ token?: string;
9
+ mcp?: boolean;
10
+ }
11
+ export interface Config {
12
+ memoryDir: string;
13
+ dbPath: string;
14
+ embedding?: EmbeddingConfig;
15
+ server?: ServerConfig;
16
+ serve?: ServeConfig;
17
+ }
18
+ export interface EmbeddingConfig {
19
+ provider: 'none' | 'openai' | 'azure-openai' | 'ollama';
20
+ model: string;
21
+ baseUrl?: string;
22
+ dimensions: number;
23
+ apiKey?: string;
24
+ deployment?: string;
25
+ apiVersion?: string;
26
+ }
27
+ export declare const MEMORY_TYPES: readonly ["user", "feedback", "project", "reference", "knowledge", "snippet", "file"];
28
+ export type MemoryType = (typeof MEMORY_TYPES)[number];
29
+ export interface FrontMatter {
30
+ id: string;
31
+ title: string;
32
+ description?: string;
33
+ tags: string[];
34
+ type: MemoryType;
35
+ repository?: string;
36
+ created: string;
37
+ updated: string;
38
+ }
39
+ export interface Memory {
40
+ id: string;
41
+ title: string;
42
+ description?: string;
43
+ tags: string[];
44
+ type: MemoryType;
45
+ repository?: string;
46
+ created: string;
47
+ updated: string;
48
+ content: string;
49
+ filePath: string;
50
+ }
51
+ export interface SearchResult {
52
+ memory: Memory;
53
+ score: number;
54
+ matchType: 'uuid' | 'filename' | 'fts' | 'vector';
55
+ }
package/dist/types.js ADDED
@@ -0,0 +1,10 @@
1
+ export const MEMORY_TYPES = [
2
+ 'user',
3
+ 'feedback',
4
+ 'project',
5
+ 'reference',
6
+ 'knowledge',
7
+ 'snippet',
8
+ 'file',
9
+ ];
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA8BA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,MAAM;IACN,UAAU;IACV,SAAS;IACT,WAAW;IACX,WAAW;IACX,SAAS;IACT,MAAM;CACE,CAAC"}
package/package.json CHANGED
@@ -1,26 +1,62 @@
1
1
  {
2
2
  "name": "mor",
3
- "version": "0.0.2",
4
- "description": "Trollmor - a monolithic repository manager",
5
- "main": "index.js",
6
- "scripts": {
7
- "test": "eslint ."
3
+ "version": "0.2.0",
4
+ "description": "A shared memory store for humans and AI",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "Sigurd Fosseng <sigurd@fosseng.net>",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/laat/mor.git"
8
11
  },
9
- "repository": "https://github.com/laat/mor.git",
10
- "bin": "cli.js",
11
- "author": {
12
- "name": "Sigurd Fosseng",
13
- "emali": "sigurd@fosseng.net"
12
+ "homepage": "https://github.com/laat/mor",
13
+ "bugs": "https://github.com/laat/mor/issues",
14
+ "keywords": [
15
+ "memory",
16
+ "ai",
17
+ "mcp",
18
+ "knowledge-base",
19
+ "markdown",
20
+ "sqlite",
21
+ "fts5",
22
+ "embeddings",
23
+ "cli"
24
+ ],
25
+ "bin": {
26
+ "mor": "dist/cli.js"
27
+ },
28
+ "files": [
29
+ "dist"
30
+ ],
31
+ "engines": {
32
+ "node": ">=20"
14
33
  },
15
- "license": "MIT",
16
34
  "dependencies": {
17
- "docopt": "^0.6.2",
18
- "graphlib": "^1.0.7",
19
- "graphlib-dot": "^0.6.2",
20
- "semver": "^5.0.3",
21
- "shelljs": "^0.5.3"
35
+ "@modelcontextprotocol/sdk": "^1.28.0",
36
+ "better-sqlite3": "^12.8.0",
37
+ "commander": "^14.0.3",
38
+ "gray-matter": "^4.0.3",
39
+ "zod": "^4.3.6"
22
40
  },
23
41
  "devDependencies": {
24
- "eslint": "^1.8.0"
42
+ "@eslint/js": "^10.0.1",
43
+ "@types/better-sqlite3": "^7.6.13",
44
+ "@types/node": "^25.5.0",
45
+ "eslint": "^10.1.0",
46
+ "eslint-config-prettier": "^10.1.8",
47
+ "prettier": "^3.8.1",
48
+ "tsx": "^4.21.0",
49
+ "typescript": "^6.0.2",
50
+ "typescript-eslint": "^8.57.2",
51
+ "vitest": "^4.1.2"
52
+ },
53
+ "scripts": {
54
+ "build": "tsc",
55
+ "dev": "tsx src/cli.ts",
56
+ "test": "vitest run",
57
+ "test:watch": "vitest",
58
+ "lint": "eslint src/",
59
+ "format": "prettier --write src/",
60
+ "format:check": "prettier --check src/"
25
61
  }
26
- }
62
+ }
package/.dir-locals.el DELETED
@@ -1,6 +0,0 @@
1
- ;;; Directory Local Variables
2
- ;;; For more information see (info "(emacs) Directory Variables")
3
-
4
- ((js2-mode
5
- (flycheck-disabled-checkers .
6
- (javascript-jshint))))
package/.editorconfig DELETED
@@ -1,15 +0,0 @@
1
- root = true
2
-
3
- [*]
4
- indent_style = tab
5
- end_of_line = lf
6
- charset = utf-8
7
- trim_trailing_whitespace = true
8
- insert_final_newline = true
9
-
10
- [{package.json,*.yml}]
11
- indent_style = space
12
- indent_size = 2
13
-
14
- [*.md]
15
- trim_trailing_whitespace = false
package/.eslintrc DELETED
@@ -1,26 +0,0 @@
1
- {
2
- "rules": {
3
- "indent": [
4
- 2,
5
- "tab"
6
- ],
7
- "quotes": [
8
- 2,
9
- "single"
10
- ],
11
- "linebreak-style": [
12
- 2,
13
- "unix"
14
- ],
15
- "semi": [
16
- 2,
17
- "always"
18
- ],
19
- "no-console": 0
20
- },
21
- "env": {
22
- "es6": true,
23
- "node": true
24
- },
25
- "extends": "eslint:recommended"
26
- }
package/.npmignore DELETED
@@ -1,32 +0,0 @@
1
- # Created by https://www.gitignore.io/api/node
2
-
3
- ### Node ###
4
- # Logs
5
- logs
6
- *.log
7
- npm-debug.log*
8
-
9
- # Runtime data
10
- pids
11
- *.pid
12
- *.seed
13
-
14
- # Directory for instrumented libs generated by jscoverage/JSCover
15
- lib-cov
16
-
17
- # Coverage directory used by tools like istanbul
18
- coverage
19
-
20
- # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
21
- .grunt
22
-
23
- # node-waf configuration
24
- .lock-wscript
25
-
26
- # Compiled binary addons (http://nodejs.org/api/addons.html)
27
- build/Release
28
-
29
- # Dependency directory
30
- # https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git
31
- node_modules
32
-
package/alg/dfs.js DELETED
@@ -1,36 +0,0 @@
1
- var _ = require('lodash');
2
-
3
- module.exports = dfs;
4
-
5
- function dfs(g, vs, order) {
6
- if (!_.isArray(vs)) {
7
- vs = [vs];
8
- }
9
-
10
- var acc = [];
11
- var visited = {};
12
- _.each(vs, function (v) {
13
- if (!g.hasNode(v)) {
14
- throw new Error('Graph does not have node: ' + v);
15
- }
16
-
17
- doDfs(g, v, order === 'post', visited, acc);
18
- });
19
- return acc;
20
- }
21
-
22
- function doDfs(g, v, postorder, visited, acc) {
23
- if (!_.has(visited, v)) {
24
- visited[v] = true;
25
-
26
- if (!postorder) {
27
- acc.push(v);
28
- }
29
- _.each(g.successors(v), function (w) {
30
- doDfs(g, w, postorder, visited, acc);
31
- });
32
- if (postorder) {
33
- acc.push(v);
34
- }
35
- }
36
- }
package/alg/revDfs.js DELETED
@@ -1,36 +0,0 @@
1
- var _ = require('lodash');
2
-
3
- module.exports = dfs;
4
-
5
- function dfs(g, vs, order) {
6
- if (!_.isArray(vs)) {
7
- vs = [vs];
8
- }
9
-
10
- var acc = [];
11
- var visited = {};
12
- _.each(vs, function (v) {
13
- if (!g.hasNode(v)) {
14
- throw new Error('Graph does not have node: ' + v);
15
- }
16
-
17
- doDfs(g, v, order === 'post', visited, acc);
18
- });
19
- return acc;
20
- }
21
-
22
- function doDfs(g, v, postorder, visited, acc) {
23
- if (!_.has(visited, v)) {
24
- visited[v] = true;
25
-
26
- if (!postorder) {
27
- acc.push(v);
28
- }
29
- _.each(g.predecessors(v), function (w) {
30
- doDfs(g, w, postorder, visited, acc);
31
- });
32
- if (postorder) {
33
- acc.push(v);
34
- }
35
- }
36
- }