moflo 4.0.2 → 4.0.4

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 (90) hide show
  1. package/package.json +114 -110
  2. package/v3/@claude-flow/cli/dist/src/commands/hooks.js +4 -1
  3. package/v3/@claude-flow/cli/dist/src/memory/memory-bridge.js +61 -5
  4. package/v3/@claude-flow/cli/dist/src/memory/memory-initializer.js +1892 -1841
  5. package/v3/@claude-flow/memory/README.md +587 -0
  6. package/v3/@claude-flow/memory/dist/agent-memory-scope.d.ts +131 -0
  7. package/v3/@claude-flow/memory/dist/agent-memory-scope.js +223 -0
  8. package/v3/@claude-flow/memory/dist/agent-memory-scope.test.d.ts +8 -0
  9. package/v3/@claude-flow/memory/dist/agent-memory-scope.test.js +463 -0
  10. package/v3/@claude-flow/memory/dist/agentdb-adapter.d.ts +165 -0
  11. package/v3/@claude-flow/memory/dist/agentdb-adapter.js +806 -0
  12. package/v3/@claude-flow/memory/dist/agentdb-backend.d.ts +214 -0
  13. package/v3/@claude-flow/memory/dist/agentdb-backend.js +844 -0
  14. package/v3/@claude-flow/memory/dist/agentdb-backend.test.d.ts +7 -0
  15. package/v3/@claude-flow/memory/dist/agentdb-backend.test.js +258 -0
  16. package/v3/@claude-flow/memory/dist/application/commands/delete-memory.command.d.ts +65 -0
  17. package/v3/@claude-flow/memory/dist/application/commands/delete-memory.command.js +129 -0
  18. package/v3/@claude-flow/memory/dist/application/commands/store-memory.command.d.ts +48 -0
  19. package/v3/@claude-flow/memory/dist/application/commands/store-memory.command.js +72 -0
  20. package/v3/@claude-flow/memory/dist/application/index.d.ts +12 -0
  21. package/v3/@claude-flow/memory/dist/application/index.js +15 -0
  22. package/v3/@claude-flow/memory/dist/application/queries/search-memory.query.d.ts +72 -0
  23. package/v3/@claude-flow/memory/dist/application/queries/search-memory.query.js +143 -0
  24. package/v3/@claude-flow/memory/dist/application/services/memory-application-service.d.ts +121 -0
  25. package/v3/@claude-flow/memory/dist/application/services/memory-application-service.js +190 -0
  26. package/v3/@claude-flow/memory/dist/auto-memory-bridge.d.ts +226 -0
  27. package/v3/@claude-flow/memory/dist/auto-memory-bridge.js +709 -0
  28. package/v3/@claude-flow/memory/dist/auto-memory-bridge.test.d.ts +8 -0
  29. package/v3/@claude-flow/memory/dist/auto-memory-bridge.test.js +754 -0
  30. package/v3/@claude-flow/memory/dist/benchmark.test.d.ts +2 -0
  31. package/v3/@claude-flow/memory/dist/benchmark.test.js +277 -0
  32. package/v3/@claude-flow/memory/dist/cache-manager.d.ts +134 -0
  33. package/v3/@claude-flow/memory/dist/cache-manager.js +407 -0
  34. package/v3/@claude-flow/memory/dist/controller-registry.d.ts +216 -0
  35. package/v3/@claude-flow/memory/dist/controller-registry.js +893 -0
  36. package/v3/@claude-flow/memory/dist/controller-registry.test.d.ts +14 -0
  37. package/v3/@claude-flow/memory/dist/controller-registry.test.js +636 -0
  38. package/v3/@claude-flow/memory/dist/database-provider.d.ts +87 -0
  39. package/v3/@claude-flow/memory/dist/database-provider.js +375 -0
  40. package/v3/@claude-flow/memory/dist/database-provider.test.d.ts +7 -0
  41. package/v3/@claude-flow/memory/dist/database-provider.test.js +285 -0
  42. package/v3/@claude-flow/memory/dist/domain/entities/memory-entry.d.ts +143 -0
  43. package/v3/@claude-flow/memory/dist/domain/entities/memory-entry.js +226 -0
  44. package/v3/@claude-flow/memory/dist/domain/index.d.ts +11 -0
  45. package/v3/@claude-flow/memory/dist/domain/index.js +12 -0
  46. package/v3/@claude-flow/memory/dist/domain/repositories/memory-repository.interface.d.ts +102 -0
  47. package/v3/@claude-flow/memory/dist/domain/repositories/memory-repository.interface.js +11 -0
  48. package/v3/@claude-flow/memory/dist/domain/services/memory-domain-service.d.ts +105 -0
  49. package/v3/@claude-flow/memory/dist/domain/services/memory-domain-service.js +297 -0
  50. package/v3/@claude-flow/memory/dist/hnsw-index.d.ts +111 -0
  51. package/v3/@claude-flow/memory/dist/hnsw-index.js +781 -0
  52. package/v3/@claude-flow/memory/dist/hnsw-lite.d.ts +23 -0
  53. package/v3/@claude-flow/memory/dist/hnsw-lite.js +168 -0
  54. package/v3/@claude-flow/memory/dist/hybrid-backend.d.ts +245 -0
  55. package/v3/@claude-flow/memory/dist/hybrid-backend.js +569 -0
  56. package/v3/@claude-flow/memory/dist/hybrid-backend.test.d.ts +8 -0
  57. package/v3/@claude-flow/memory/dist/hybrid-backend.test.js +320 -0
  58. package/v3/@claude-flow/memory/dist/index.d.ts +207 -0
  59. package/v3/@claude-flow/memory/dist/index.js +361 -0
  60. package/v3/@claude-flow/memory/dist/infrastructure/index.d.ts +17 -0
  61. package/v3/@claude-flow/memory/dist/infrastructure/index.js +16 -0
  62. package/v3/@claude-flow/memory/dist/infrastructure/repositories/hybrid-memory-repository.d.ts +66 -0
  63. package/v3/@claude-flow/memory/dist/infrastructure/repositories/hybrid-memory-repository.js +409 -0
  64. package/v3/@claude-flow/memory/dist/learning-bridge.d.ts +137 -0
  65. package/v3/@claude-flow/memory/dist/learning-bridge.js +335 -0
  66. package/v3/@claude-flow/memory/dist/learning-bridge.test.d.ts +8 -0
  67. package/v3/@claude-flow/memory/dist/learning-bridge.test.js +578 -0
  68. package/v3/@claude-flow/memory/dist/memory-graph.d.ts +100 -0
  69. package/v3/@claude-flow/memory/dist/memory-graph.js +333 -0
  70. package/v3/@claude-flow/memory/dist/memory-graph.test.d.ts +8 -0
  71. package/v3/@claude-flow/memory/dist/memory-graph.test.js +609 -0
  72. package/v3/@claude-flow/memory/dist/migration.d.ts +68 -0
  73. package/v3/@claude-flow/memory/dist/migration.js +513 -0
  74. package/v3/@claude-flow/memory/dist/persistent-sona.d.ts +144 -0
  75. package/v3/@claude-flow/memory/dist/persistent-sona.js +332 -0
  76. package/v3/@claude-flow/memory/dist/query-builder.d.ts +211 -0
  77. package/v3/@claude-flow/memory/dist/query-builder.js +438 -0
  78. package/v3/@claude-flow/memory/dist/rvf-backend.d.ts +51 -0
  79. package/v3/@claude-flow/memory/dist/rvf-backend.js +481 -0
  80. package/v3/@claude-flow/memory/dist/rvf-learning-store.d.ts +139 -0
  81. package/v3/@claude-flow/memory/dist/rvf-learning-store.js +295 -0
  82. package/v3/@claude-flow/memory/dist/rvf-migration.d.ts +45 -0
  83. package/v3/@claude-flow/memory/dist/rvf-migration.js +234 -0
  84. package/v3/@claude-flow/memory/dist/sqlite-backend.d.ts +121 -0
  85. package/v3/@claude-flow/memory/dist/sqlite-backend.js +572 -0
  86. package/v3/@claude-flow/memory/dist/sqljs-backend.d.ts +128 -0
  87. package/v3/@claude-flow/memory/dist/sqljs-backend.js +601 -0
  88. package/v3/@claude-flow/memory/dist/types.d.ts +484 -0
  89. package/v3/@claude-flow/memory/dist/types.js +58 -0
  90. package/v3/@claude-flow/memory/package.json +42 -0
package/package.json CHANGED
@@ -1,110 +1,114 @@
1
- {
2
- "name": "moflo",
3
- "version": "4.0.2",
4
- "description": "MoFlo — AI agent orchestration for Claude Code. Forked from ruflo/claude-flow with patches applied to source, plus feature-level orchestration.",
5
- "main": "dist/index.js",
6
- "type": "module",
7
- "bin": {
8
- "moflo": "./bin/cli.js",
9
- "moflo-setup": "./bin/setup-project.mjs",
10
- "claude-flow": "./bin/cli.js"
11
- },
12
- "homepage": "https://github.com/eric-cielo/moflo#readme",
13
- "bugs": {
14
- "url": "https://github.com/eric-cielo/moflo/issues"
15
- },
16
- "files": [
17
- "bin/**",
18
- "v3/@claude-flow/cli/bin/**",
19
- "v3/@claude-flow/cli/dist/**/*.js",
20
- "v3/@claude-flow/cli/dist/**/*.d.ts",
21
- "!v3/@claude-flow/cli/dist/**/*.map",
22
- "v3/@claude-flow/cli/package.json",
23
- "v3/@claude-flow/shared/dist/**/*.js",
24
- "v3/@claude-flow/shared/dist/**/*.d.ts",
25
- "!v3/@claude-flow/shared/dist/**/*.map",
26
- "v3/@claude-flow/shared/package.json",
27
- "v3/@claude-flow/guidance/dist/**/*.js",
28
- "v3/@claude-flow/guidance/dist/**/*.d.ts",
29
- "!v3/@claude-flow/guidance/dist/**/*.map",
30
- "v3/@claude-flow/guidance/package.json",
31
- ".claude-plugin/**",
32
- ".claude/**",
33
- "!.claude/**/*.db",
34
- "!.claude/**/*.map",
35
- "README.md",
36
- "LICENSE"
37
- ],
38
- "scripts": {
39
- "dev": "tsx watch src/index.ts",
40
- "build": "tsc",
41
- "build:ts": "cd v3/@claude-flow/cli && npm run build || true",
42
- "test": "vitest",
43
- "test:ui": "vitest --ui",
44
- "test:security": "vitest run v3/__tests__/security/",
45
- "lint": "cd v3/@claude-flow/cli && npm run lint || true",
46
- "security:audit": "npm audit --audit-level high",
47
- "security:fix": "npm audit fix",
48
- "security:test": "npm run test:security",
49
- "v3:domains": "npm run build:domains",
50
- "v3:swarm": "npm run start:swarm",
51
- "v3:security": "npm run security:audit && npm run security:test"
52
- },
53
- "dependencies": {
54
- "semver": "^7.6.0",
55
- "zod": "^3.22.4"
56
- },
57
- "optionalDependencies": {
58
- "@claude-flow/codex": "^3.0.0-alpha.8",
59
- "@claude-flow/plugin-gastown-bridge": "^0.1.3",
60
- "@ruvector/attention": "^0.1.3",
61
- "@ruvector/core": "^0.1.30",
62
- "@ruvector/router": "^0.1.27",
63
- "@ruvector/router-linux-x64-gnu": "^0.1.27",
64
- "@ruvector/sona": "^0.1.5",
65
- "agentdb": "^3.0.0-alpha.9",
66
- "agentic-flow": "^2.0.7"
67
- },
68
- "overrides": {
69
- "hono": ">=4.11.4"
70
- },
71
- "devDependencies": {
72
- "@openai/codex": "^0.98.0",
73
- "@types/bcrypt": "^5.0.2",
74
- "@types/node": "^20.0.0",
75
- "eslint": "^8.0.0",
76
- "tsx": "^4.21.0",
77
- "typescript": "^5.0.0",
78
- "vitest": "^1.0.0"
79
- },
80
- "engines": {
81
- "node": ">=20.0.0"
82
- },
83
- "repository": {
84
- "type": "git",
85
- "url": "https://github.com/eric-cielo/moflo.git"
86
- },
87
- "keywords": [
88
- "moflo",
89
- "claude",
90
- "claude-code",
91
- "anthropic",
92
- "ai-agents",
93
- "agent-orchestration",
94
- "mcp",
95
- "model-context-protocol",
96
- "cli",
97
- "developer-tools",
98
- "workflow",
99
- "orchestration"
100
- ],
101
- "author": {
102
- "name": "Eric Cielo",
103
- "url": "https://github.com/eric-cielo"
104
- },
105
- "license": "MIT",
106
- "publishConfig": {
107
- "access": "public",
108
- "tag": "latest"
109
- }
110
- }
1
+ {
2
+ "name": "moflo",
3
+ "version": "4.0.4",
4
+ "description": "MoFlo — AI agent orchestration for Claude Code. Forked from ruflo/claude-flow with patches applied to source, plus feature-level orchestration.",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "bin": {
8
+ "moflo": "bin/cli.js",
9
+ "moflo-setup": "bin/setup-project.mjs",
10
+ "claude-flow": "bin/cli.js"
11
+ },
12
+ "homepage": "https://github.com/eric-cielo/moflo#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/eric-cielo/moflo/issues"
15
+ },
16
+ "files": [
17
+ "bin/**",
18
+ "v3/@claude-flow/cli/bin/**",
19
+ "v3/@claude-flow/cli/dist/**/*.js",
20
+ "v3/@claude-flow/cli/dist/**/*.d.ts",
21
+ "!v3/@claude-flow/cli/dist/**/*.map",
22
+ "v3/@claude-flow/cli/package.json",
23
+ "v3/@claude-flow/shared/dist/**/*.js",
24
+ "v3/@claude-flow/shared/dist/**/*.d.ts",
25
+ "!v3/@claude-flow/shared/dist/**/*.map",
26
+ "v3/@claude-flow/shared/package.json",
27
+ "v3/@claude-flow/guidance/dist/**/*.js",
28
+ "v3/@claude-flow/guidance/dist/**/*.d.ts",
29
+ "!v3/@claude-flow/guidance/dist/**/*.map",
30
+ "v3/@claude-flow/guidance/package.json",
31
+ "v3/@claude-flow/memory/dist/**/*.js",
32
+ "v3/@claude-flow/memory/dist/**/*.d.ts",
33
+ "!v3/@claude-flow/memory/dist/**/*.map",
34
+ "v3/@claude-flow/memory/package.json",
35
+ ".claude-plugin/**",
36
+ ".claude/**",
37
+ "!.claude/**/*.db",
38
+ "!.claude/**/*.map",
39
+ "README.md",
40
+ "LICENSE"
41
+ ],
42
+ "scripts": {
43
+ "dev": "tsx watch src/index.ts",
44
+ "build": "tsc",
45
+ "build:ts": "cd v3/@claude-flow/cli && npm run build || true",
46
+ "test": "vitest",
47
+ "test:ui": "vitest --ui",
48
+ "test:security": "vitest run v3/__tests__/security/",
49
+ "lint": "cd v3/@claude-flow/cli && npm run lint || true",
50
+ "security:audit": "npm audit --audit-level high",
51
+ "security:fix": "npm audit fix",
52
+ "security:test": "npm run test:security",
53
+ "v3:domains": "npm run build:domains",
54
+ "v3:swarm": "npm run start:swarm",
55
+ "v3:security": "npm run security:audit && npm run security:test"
56
+ },
57
+ "dependencies": {
58
+ "semver": "^7.6.0",
59
+ "zod": "^3.22.4"
60
+ },
61
+ "optionalDependencies": {
62
+ "@claude-flow/codex": "^3.0.0-alpha.8",
63
+ "@claude-flow/plugin-gastown-bridge": "^0.1.3",
64
+ "@ruvector/attention": "^0.1.3",
65
+ "@ruvector/core": "^0.1.30",
66
+ "@ruvector/router": "^0.1.27",
67
+ "@ruvector/router-linux-x64-gnu": "^0.1.27",
68
+ "@ruvector/sona": "^0.1.5",
69
+ "agentdb": "^3.0.0-alpha.9",
70
+ "agentic-flow": "^2.0.7"
71
+ },
72
+ "overrides": {
73
+ "hono": ">=4.11.4"
74
+ },
75
+ "devDependencies": {
76
+ "@openai/codex": "^0.98.0",
77
+ "@types/bcrypt": "^5.0.2",
78
+ "@types/node": "^20.0.0",
79
+ "eslint": "^8.0.0",
80
+ "tsx": "^4.21.0",
81
+ "typescript": "^5.0.0",
82
+ "vitest": "^1.0.0"
83
+ },
84
+ "engines": {
85
+ "node": ">=20.0.0"
86
+ },
87
+ "repository": {
88
+ "type": "git",
89
+ "url": "git+https://github.com/eric-cielo/moflo.git"
90
+ },
91
+ "keywords": [
92
+ "moflo",
93
+ "claude",
94
+ "claude-code",
95
+ "anthropic",
96
+ "ai-agents",
97
+ "agent-orchestration",
98
+ "mcp",
99
+ "model-context-protocol",
100
+ "cli",
101
+ "developer-tools",
102
+ "workflow",
103
+ "orchestration"
104
+ ],
105
+ "author": {
106
+ "name": "Eric Cielo",
107
+ "url": "https://github.com/eric-cielo"
108
+ },
109
+ "license": "MIT",
110
+ "publishConfig": {
111
+ "access": "public",
112
+ "tag": "latest"
113
+ }
114
+ }
@@ -59,7 +59,8 @@ const preEditCommand = {
59
59
  output.printInfo(`Analyzing context for: ${output.highlight(filePath)}`);
60
60
  try {
61
61
  // Call MCP tool for pre-edit hook
62
- const result = await callMCPTool('hooks_pre-edit', {
62
+ // Wrap MCP call in timeout to prevent indefinite hang (#13)
63
+ const mcpPromise = callMCPTool('hooks_pre-edit', {
63
64
  filePath,
64
65
  operation,
65
66
  context: ctx.flags.context,
@@ -183,6 +184,8 @@ const postEditCommand = {
183
184
  metrics,
184
185
  timestamp: Date.now(),
185
186
  });
187
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('session-end timed out after 3s')), 3000));
188
+ const result = await Promise.race([mcpPromise, timeoutPromise]);
186
189
  if (ctx.flags.format === 'json') {
187
190
  output.printJson(result);
188
191
  return { success: true, data: result };
@@ -18,6 +18,63 @@
18
18
  */
19
19
  import * as path from 'path';
20
20
  import * as crypto from 'crypto';
21
+ // ===== Project root resolution =====
22
+ // When run via npx, CWD may be node_modules/moflo — walk up to find actual project
23
+ import * as fs from 'fs';
24
+ let _projectRoot;
25
+ function getProjectRoot() {
26
+ if (_projectRoot)
27
+ return _projectRoot;
28
+ if (process.env.CLAUDE_PROJECT_DIR) {
29
+ _projectRoot = process.env.CLAUDE_PROJECT_DIR;
30
+ return _projectRoot;
31
+ }
32
+ let dir = process.cwd();
33
+ const root = path.parse(dir).root;
34
+ while (dir !== root) {
35
+ if (fs.existsSync(path.join(dir, '.swarm', 'memory.db'))) {
36
+ _projectRoot = dir;
37
+ return _projectRoot;
38
+ }
39
+ if (fs.existsSync(path.join(dir, 'CLAUDE.md')) && fs.existsSync(path.join(dir, 'package.json'))) {
40
+ _projectRoot = dir;
41
+ return _projectRoot;
42
+ }
43
+ // Skip node_modules directories
44
+ if (path.basename(dir) === 'node_modules') {
45
+ dir = path.dirname(dir);
46
+ continue;
47
+ }
48
+ dir = path.dirname(dir);
49
+ }
50
+ _projectRoot = process.cwd();
51
+ return _projectRoot;
52
+ }
53
+ // ===== Transformers.js fallback embedder =====
54
+ let _tfEmbedder = null;
55
+ let _tfFailed = false;
56
+ async function getFallbackEmbedder() {
57
+ if (_tfFailed)
58
+ return null;
59
+ if (_tfEmbedder)
60
+ return _tfEmbedder;
61
+ try {
62
+ const { pipeline } = await import('@xenova/transformers');
63
+ _tfEmbedder = await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2');
64
+ return _tfEmbedder;
65
+ }
66
+ catch {
67
+ _tfFailed = true;
68
+ return null;
69
+ }
70
+ }
71
+ async function fallbackEmbed(text) {
72
+ const embedder = await getFallbackEmbedder();
73
+ if (!embedder)
74
+ return null;
75
+ const result = await embedder(text, { pooling: 'mean', normalize: true });
76
+ return Array.from(result.data);
77
+ }
21
78
  // ===== Lazy singleton =====
22
79
  let registryPromise = null;
23
80
  let registryInstance = null;
@@ -28,14 +85,14 @@ let bridgeAvailable = null;
28
85
  * or the special ':memory:' path.
29
86
  */
30
87
  function getDbPath(customPath) {
31
- const swarmDir = path.resolve(process.cwd(), '.swarm');
88
+ const swarmDir = path.resolve(getProjectRoot(), '.swarm');
32
89
  if (!customPath)
33
90
  return path.join(swarmDir, 'memory.db');
34
91
  if (customPath === ':memory:')
35
92
  return ':memory:';
36
93
  const resolved = path.resolve(customPath);
37
94
  // Ensure the path doesn't escape the working directory
38
- const cwd = process.cwd();
95
+ const cwd = getProjectRoot();
39
96
  if (!resolved.startsWith(cwd)) {
40
97
  return path.join(swarmDir, 'memory.db'); // fallback to safe default
41
98
  }
@@ -66,7 +123,6 @@ async function getRegistry(dbPath) {
66
123
  console.log = (...args) => {
67
124
  const msg = String(args[0] ?? '');
68
125
  if (msg.includes('Transformers.js') ||
69
- msg.includes('better-sqlite3') ||
70
126
  msg.includes('[AgentDB]') ||
71
127
  msg.includes('[HNSWLibBackend]') ||
72
128
  msg.includes('RuVector graph'))
@@ -311,7 +367,7 @@ export async function bridgeStoreEntry(options) {
311
367
  // Embedding failed — store without
312
368
  }
313
369
  }
314
- // better-sqlite3 uses synchronous .run() with positional params
370
+ // sql.js uses synchronous .run() with positional params
315
371
  const insertSql = options.upsert
316
372
  ? `INSERT OR REPLACE INTO memory_entries (
317
373
  id, key, namespace, content, type,
@@ -372,7 +428,7 @@ export async function bridgeSearchEntries(options) {
372
428
  catch {
373
429
  // Fall back to keyword search
374
430
  }
375
- // better-sqlite3: .prepare().all() returns array of objects
431
+ // Prepare/all returns array of objects
376
432
  const nsFilter = namespace !== 'all'
377
433
  ? `AND namespace = ?`
378
434
  : '';