ruvector 0.1.74 → 0.1.76

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.
Binary file
Binary file
Binary file
package/bin/cli.js CHANGED
@@ -2752,6 +2752,7 @@ hooksCmd.command('init')
2752
2752
  .description('Initialize hooks in current project')
2753
2753
  .option('--force', 'Force overwrite existing settings')
2754
2754
  .option('--minimal', 'Only basic hooks (no env, permissions, or advanced hooks)')
2755
+ .option('--fast', 'Use fast local wrapper (20x faster, bypasses npx overhead)')
2755
2756
  .option('--no-claude-md', 'Skip CLAUDE.md creation')
2756
2757
  .option('--no-permissions', 'Skip permissions configuration')
2757
2758
  .option('--no-env', 'Skip environment variables')
@@ -2763,6 +2764,7 @@ hooksCmd.command('init')
2763
2764
  .action(async (opts) => {
2764
2765
  const settingsPath = path.join(process.cwd(), '.claude', 'settings.json');
2765
2766
  const settingsDir = path.dirname(settingsPath);
2767
+ const isWindows = process.platform === 'win32';
2766
2768
  if (!fs.existsSync(settingsDir)) fs.mkdirSync(settingsDir, { recursive: true });
2767
2769
  let settings = {};
2768
2770
  if (fs.existsSync(settingsPath) && !opts.force) {
@@ -2836,8 +2838,6 @@ hooksCmd.command('init')
2836
2838
  // StatusLine configuration (unless --minimal or --no-statusline)
2837
2839
  if (!opts.minimal && opts.statusline !== false) {
2838
2840
  if (!settings.statusLine) {
2839
- const isWindows = process.platform === 'win32';
2840
-
2841
2841
  if (isWindows) {
2842
2842
  // Windows: PowerShell statusline
2843
2843
  const statuslineScript = path.join(settingsDir, 'statusline-command.ps1');
@@ -2920,47 +2920,153 @@ fi
2920
2920
  }
2921
2921
  }
2922
2922
 
2923
- // Core hooks (always included)
2923
+ // Fast wrapper creation (--fast option) - 20x faster than npx
2924
+ let hookCmd = 'npx ruvector@latest';
2925
+ let fastTimeouts = { simple: 2000, complex: 2000, session: 5000 };
2926
+ if (opts.fast && !isWindows) {
2927
+ const fastWrapperPath = path.join(settingsDir, 'ruvector-fast.sh');
2928
+ const fastWrapperContent = `#!/bin/bash
2929
+ # Fast RuVector hooks wrapper - avoids npx overhead (20x faster)
2930
+ # Usage: .claude/ruvector-fast.sh hooks <command> [args...]
2931
+
2932
+ # Find ruvector CLI - check local first, then global
2933
+ RUVECTOR_CLI=""
2934
+
2935
+ # Check local npm package (for development)
2936
+ if [ -f "$PWD/npm/packages/ruvector/bin/cli.js" ]; then
2937
+ RUVECTOR_CLI="$PWD/npm/packages/ruvector/bin/cli.js"
2938
+ # Check node_modules
2939
+ elif [ -f "$PWD/node_modules/ruvector/bin/cli.js" ]; then
2940
+ RUVECTOR_CLI="$PWD/node_modules/ruvector/bin/cli.js"
2941
+ # Check global npm installation
2942
+ elif [ -f "$PWD/node_modules/.bin/ruvector" ]; then
2943
+ exec "$PWD/node_modules/.bin/ruvector" "$@"
2944
+ elif command -v ruvector &> /dev/null; then
2945
+ exec ruvector "$@"
2946
+ # Fallback to npx (slow but works)
2947
+ else
2948
+ exec npx ruvector@latest "$@"
2949
+ fi
2950
+
2951
+ # Execute with node directly (fast path)
2952
+ exec node "$RUVECTOR_CLI" "$@"
2953
+ `;
2954
+ fs.writeFileSync(fastWrapperPath, fastWrapperContent);
2955
+ fs.chmodSync(fastWrapperPath, '755');
2956
+ hookCmd = '.claude/ruvector-fast.sh';
2957
+ fastTimeouts = { simple: 300, complex: 500, session: 1000 };
2958
+ // Add permission for fast wrapper
2959
+ if (settings.permissions && settings.permissions.allow) {
2960
+ if (!settings.permissions.allow.includes('Bash(.claude/ruvector-fast.sh:*)')) {
2961
+ settings.permissions.allow.push('Bash(.claude/ruvector-fast.sh:*)');
2962
+ }
2963
+ }
2964
+ console.log(chalk.blue(' ✓ Fast wrapper created (.claude/ruvector-fast.sh) - 20x faster hooks'));
2965
+ }
2966
+
2967
+ // Core hooks (always included) - with timeouts and error suppression
2924
2968
  settings.hooks = settings.hooks || {};
2925
2969
  settings.hooks.PreToolUse = [
2926
- { matcher: 'Edit|Write|MultiEdit', hooks: [{ type: 'command', command: 'npx ruvector hooks pre-edit "$TOOL_INPUT_file_path"' }] },
2927
- { matcher: 'Bash', hooks: [{ type: 'command', command: 'npx ruvector hooks pre-command "$TOOL_INPUT_command"' }] }
2970
+ {
2971
+ matcher: 'Edit|Write|MultiEdit',
2972
+ hooks: [
2973
+ { type: 'command', timeout: fastTimeouts.complex, command: `${hookCmd} hooks pre-edit "$TOOL_INPUT_file_path" 2>/dev/null || true` },
2974
+ { type: 'command', timeout: fastTimeouts.complex, command: `${hookCmd} hooks coedit-suggest --file "$TOOL_INPUT_file_path" 2>/dev/null || true` }
2975
+ ]
2976
+ },
2977
+ { matcher: 'Bash', hooks: [{ type: 'command', timeout: fastTimeouts.complex, command: `${hookCmd} hooks pre-command "$TOOL_INPUT_command" 2>/dev/null || true` }] },
2978
+ { matcher: 'Read', hooks: [{ type: 'command', timeout: fastTimeouts.simple, command: `${hookCmd} hooks remember "Reading: $TOOL_INPUT_file_path" -t file_access 2>/dev/null || true` }] },
2979
+ { matcher: 'Glob|Grep', hooks: [{ type: 'command', timeout: fastTimeouts.simple, command: `${hookCmd} hooks remember "Search: $TOOL_INPUT_pattern" -t search_pattern 2>/dev/null || true` }] },
2980
+ { matcher: 'Task', hooks: [{ type: 'command', timeout: fastTimeouts.simple, command: `${hookCmd} hooks remember "Agent: $TOOL_INPUT_subagent_type" -t agent_spawn 2>/dev/null || true` }] }
2928
2981
  ];
2929
2982
  settings.hooks.PostToolUse = [
2930
- { matcher: 'Edit|Write|MultiEdit', hooks: [{ type: 'command', command: 'npx ruvector hooks post-edit "$TOOL_INPUT_file_path"' }] },
2931
- { matcher: 'Bash', hooks: [{ type: 'command', command: 'npx ruvector hooks post-command "$TOOL_INPUT_command"' }] }
2983
+ { matcher: 'Edit|Write|MultiEdit', hooks: [{ type: 'command', timeout: fastTimeouts.complex, command: `${hookCmd} hooks post-edit "$TOOL_INPUT_file_path" 2>/dev/null || true` }] },
2984
+ { matcher: 'Bash', hooks: [{ type: 'command', timeout: fastTimeouts.complex, command: `${hookCmd} hooks post-command "$TOOL_INPUT_command" 2>/dev/null || true` }] }
2932
2985
  ];
2933
- settings.hooks.SessionStart = [{ hooks: [{ type: 'command', command: 'npx ruvector hooks session-start' }] }];
2934
- settings.hooks.Stop = [{ hooks: [{ type: 'command', command: 'npx ruvector hooks session-end' }] }];
2935
- console.log(chalk.blue(' Core hooks (PreToolUse, PostToolUse, SessionStart, Stop)'));
2986
+ settings.hooks.SessionStart = [{
2987
+ hooks: [
2988
+ { type: 'command', timeout: fastTimeouts.session, command: `${hookCmd} hooks session-start 2>/dev/null || true` },
2989
+ { type: 'command', timeout: fastTimeouts.complex, command: `${hookCmd} hooks trajectory-begin -c "claude-session" -a "claude" 2>/dev/null || true` }
2990
+ ]
2991
+ }];
2992
+ settings.hooks.Stop = [{
2993
+ hooks: [
2994
+ { type: 'command', timeout: fastTimeouts.complex, command: `${hookCmd} hooks trajectory-end --success --quality 0.8 2>/dev/null || true` },
2995
+ { type: 'command', timeout: fastTimeouts.complex, command: `${hookCmd} hooks session-end 2>/dev/null || true` }
2996
+ ]
2997
+ }];
2998
+ console.log(chalk.blue(` ✓ Core hooks (PreToolUse, PostToolUse, SessionStart, Stop) ${opts.fast ? 'with fast wrapper' : 'with error handling'}`));
2936
2999
 
2937
3000
  // Advanced hooks (unless --minimal)
2938
3001
  if (!opts.minimal) {
2939
- // UserPromptSubmit - context suggestions on each prompt
3002
+ // Create agentic-flow fast wrapper for background workers
3003
+ let workersCmd = 'npx agentic-flow@alpha';
3004
+ if (opts.fast && !isWindows) {
3005
+ const agenticFastPath = path.join(settingsDir, 'agentic-flow-fast.sh');
3006
+ const agenticFastContent = `#!/bin/bash
3007
+ # Fast agentic-flow wrapper - avoids npx overhead
3008
+ # Usage: .claude/agentic-flow-fast.sh workers <command> [args...]
3009
+
3010
+ # Find agentic-flow CLI
3011
+ if [ -f "$PWD/node_modules/agentic-flow/bin/cli.js" ]; then
3012
+ exec node "$PWD/node_modules/agentic-flow/bin/cli.js" "$@"
3013
+ elif [ -f "$PWD/node_modules/.bin/agentic-flow" ]; then
3014
+ exec "$PWD/node_modules/.bin/agentic-flow" "$@"
3015
+ elif command -v agentic-flow &> /dev/null; then
3016
+ exec agentic-flow "$@"
3017
+ else
3018
+ exec npx agentic-flow@alpha "$@"
3019
+ fi
3020
+ `;
3021
+ fs.writeFileSync(agenticFastPath, agenticFastContent);
3022
+ fs.chmodSync(agenticFastPath, '755');
3023
+ workersCmd = '.claude/agentic-flow-fast.sh';
3024
+ // Add permission for agentic-flow fast wrapper
3025
+ if (settings.permissions && settings.permissions.allow) {
3026
+ if (!settings.permissions.allow.includes('Bash(.claude/agentic-flow-fast.sh:*)')) {
3027
+ settings.permissions.allow.push('Bash(.claude/agentic-flow-fast.sh:*)');
3028
+ }
3029
+ }
3030
+ console.log(chalk.blue(' ✓ Background workers wrapper created (.claude/agentic-flow-fast.sh)'));
3031
+ }
3032
+
3033
+ // UserPromptSubmit - context suggestions + background workers dispatch
2940
3034
  settings.hooks.UserPromptSubmit = [{
2941
- hooks: [{
2942
- type: 'command',
2943
- timeout: 2000,
2944
- command: 'npx ruvector hooks suggest-context'
2945
- }]
3035
+ hooks: [
3036
+ {
3037
+ type: 'command',
3038
+ timeout: fastTimeouts.complex,
3039
+ command: `${hookCmd} hooks suggest-context 2>/dev/null || true`
3040
+ },
3041
+ {
3042
+ type: 'command',
3043
+ timeout: 2000,
3044
+ command: `${workersCmd} workers dispatch-prompt "$CLAUDE_USER_PROMPT" 2>/dev/null || true`
3045
+ },
3046
+ {
3047
+ type: 'command',
3048
+ timeout: 1000,
3049
+ command: `${workersCmd} workers inject-context "$CLAUDE_USER_PROMPT" 2>/dev/null || true`
3050
+ }
3051
+ ]
2946
3052
  }];
3053
+ console.log(chalk.blue(' ✓ Background workers integration (ultralearn, optimize, audit, map, etc.)'));
2947
3054
 
2948
3055
  // PreCompact - preserve important context before compaction
2949
3056
  settings.hooks.PreCompact = [
2950
3057
  {
2951
3058
  matcher: 'auto',
2952
- hooks: [{
2953
- type: 'command',
2954
- timeout: 3000,
2955
- command: 'npx ruvector hooks pre-compact --auto'
2956
- }]
3059
+ hooks: [
3060
+ { type: 'command', timeout: fastTimeouts.session, command: `${hookCmd} hooks pre-compact --auto 2>/dev/null || true` },
3061
+ { type: 'command', timeout: fastTimeouts.session, command: `${hookCmd} hooks compress 2>/dev/null || true` }
3062
+ ]
2957
3063
  },
2958
3064
  {
2959
3065
  matcher: 'manual',
2960
3066
  hooks: [{
2961
3067
  type: 'command',
2962
- timeout: 3000,
2963
- command: 'npx ruvector hooks pre-compact'
3068
+ timeout: fastTimeouts.session,
3069
+ command: `${hookCmd} hooks pre-compact 2>/dev/null || true`
2964
3070
  }]
2965
3071
  }
2966
3072
  ];
@@ -2970,11 +3076,11 @@ fi
2970
3076
  matcher: '.*',
2971
3077
  hooks: [{
2972
3078
  type: 'command',
2973
- timeout: 1000,
2974
- command: 'npx ruvector hooks track-notification'
3079
+ timeout: fastTimeouts.simple,
3080
+ command: `${hookCmd} hooks track-notification 2>/dev/null || true`
2975
3081
  }]
2976
3082
  }];
2977
- console.log(chalk.blue(' ✓ Advanced hooks (UserPromptSubmit, PreCompact, Notification)'));
3083
+ console.log(chalk.blue(` ✓ Advanced hooks (UserPromptSubmit, PreCompact, Notification, Compress)${opts.fast ? ' - fast mode' : ''}`));
2978
3084
 
2979
3085
  // Extended environment variables for new capabilities
2980
3086
  settings.env.RUVECTOR_AST_ENABLED = settings.env.RUVECTOR_AST_ENABLED || 'true';
@@ -3176,6 +3282,7 @@ Stored in \`.ruvector/intelligence.json\`:
3176
3282
  \`\`\`bash
3177
3283
  npx ruvector hooks init # Full configuration with all capabilities
3178
3284
  npx ruvector hooks init --minimal # Basic hooks only
3285
+ npx ruvector hooks init --fast # Use fast local wrapper (20x faster)
3179
3286
  npx ruvector hooks init --pretrain # Initialize + pretrain from git history
3180
3287
  npx ruvector hooks init --build-agents quality # Generate optimized agents
3181
3288
  npx ruvector hooks init --force # Overwrite existing configuration
@@ -5921,6 +6028,103 @@ ${focus.description}` : null
5921
6028
  console.log(chalk.dim(`\nFocus mode "${opts.focus}": ${focus.description}`));
5922
6029
  });
5923
6030
 
6031
+ // Workers command group - Background analysis via agentic-flow
6032
+ const workersCmd = program.command('workers').description('Background analysis workers (via agentic-flow)');
6033
+
6034
+ // Helper to run agentic-flow workers command
6035
+ async function runAgenticFlow(args) {
6036
+ const { spawn } = require('child_process');
6037
+ return new Promise((resolve, reject) => {
6038
+ const proc = spawn('npx', ['agentic-flow@alpha', ...args], {
6039
+ stdio: 'inherit',
6040
+ shell: true
6041
+ });
6042
+ proc.on('close', code => code === 0 ? resolve() : reject(new Error(`Exit code ${code}`)));
6043
+ proc.on('error', reject);
6044
+ });
6045
+ }
6046
+
6047
+ workersCmd.command('dispatch')
6048
+ .description('Dispatch background worker for analysis')
6049
+ .argument('<prompt...>', 'Prompt with trigger keyword (ultralearn, optimize, audit, map, etc.)')
6050
+ .action(async (prompt) => {
6051
+ try {
6052
+ await runAgenticFlow(['workers', 'dispatch', prompt.join(' ')]);
6053
+ } catch (e) {
6054
+ console.error(chalk.red('Worker dispatch failed:'), e.message);
6055
+ }
6056
+ });
6057
+
6058
+ workersCmd.command('status')
6059
+ .description('Show worker status dashboard')
6060
+ .argument('[workerId]', 'Specific worker ID')
6061
+ .action(async (workerId) => {
6062
+ try {
6063
+ const args = ['workers', 'status'];
6064
+ if (workerId) args.push(workerId);
6065
+ await runAgenticFlow(args);
6066
+ } catch (e) {
6067
+ console.error(chalk.red('Status check failed:'), e.message);
6068
+ }
6069
+ });
6070
+
6071
+ workersCmd.command('results')
6072
+ .description('Show worker analysis results')
6073
+ .option('--json', 'Output as JSON')
6074
+ .action(async (opts) => {
6075
+ try {
6076
+ const args = ['workers', 'results'];
6077
+ if (opts.json) args.push('--json');
6078
+ await runAgenticFlow(args);
6079
+ } catch (e) {
6080
+ console.error(chalk.red('Results fetch failed:'), e.message);
6081
+ }
6082
+ });
6083
+
6084
+ workersCmd.command('triggers')
6085
+ .description('List available trigger keywords')
6086
+ .action(async () => {
6087
+ try {
6088
+ await runAgenticFlow(['workers', 'triggers']);
6089
+ } catch (e) {
6090
+ console.error(chalk.red('Triggers list failed:'), e.message);
6091
+ }
6092
+ });
6093
+
6094
+ workersCmd.command('stats')
6095
+ .description('Show worker statistics (24h)')
6096
+ .action(async () => {
6097
+ try {
6098
+ await runAgenticFlow(['workers', 'stats']);
6099
+ } catch (e) {
6100
+ console.error(chalk.red('Stats failed:'), e.message);
6101
+ }
6102
+ });
6103
+
6104
+ workersCmd.command('cleanup')
6105
+ .description('Cleanup old worker records')
6106
+ .option('--keep <days>', 'Keep records for N days', '7')
6107
+ .action(async (opts) => {
6108
+ try {
6109
+ await runAgenticFlow(['workers', 'cleanup', '--keep', opts.keep]);
6110
+ } catch (e) {
6111
+ console.error(chalk.red('Cleanup failed:'), e.message);
6112
+ }
6113
+ });
6114
+
6115
+ workersCmd.command('cancel')
6116
+ .description('Cancel a running worker')
6117
+ .argument('<workerId>', 'Worker ID to cancel')
6118
+ .action(async (workerId) => {
6119
+ try {
6120
+ await runAgenticFlow(['workers', 'cancel', workerId]);
6121
+ } catch (e) {
6122
+ console.error(chalk.red('Cancel failed:'), e.message);
6123
+ }
6124
+ });
6125
+
6126
+ console.log && false; // Force registration
6127
+
5924
6128
  // MCP Server command
5925
6129
  const mcpCmd = program.command('mcp').description('MCP (Model Context Protocol) server for Claude Code integration');
5926
6130
 
package/bin/mcp-server.js CHANGED
@@ -916,6 +916,60 @@ const TOOLS = [
916
916
  properties: {},
917
917
  required: []
918
918
  }
919
+ },
920
+ // ============================================
921
+ // BACKGROUND WORKERS TOOLS (via agentic-flow)
922
+ // ============================================
923
+ {
924
+ name: 'workers_dispatch',
925
+ description: 'Dispatch a background worker for analysis (ultralearn, optimize, audit, map, etc.)',
926
+ inputSchema: {
927
+ type: 'object',
928
+ properties: {
929
+ prompt: { type: 'string', description: 'Prompt with trigger keyword (e.g., "ultralearn authentication")' }
930
+ },
931
+ required: ['prompt']
932
+ }
933
+ },
934
+ {
935
+ name: 'workers_status',
936
+ description: 'Get background worker status dashboard',
937
+ inputSchema: {
938
+ type: 'object',
939
+ properties: {
940
+ workerId: { type: 'string', description: 'Specific worker ID (optional)' }
941
+ },
942
+ required: []
943
+ }
944
+ },
945
+ {
946
+ name: 'workers_results',
947
+ description: 'Get analysis results from completed workers',
948
+ inputSchema: {
949
+ type: 'object',
950
+ properties: {
951
+ json: { type: 'boolean', description: 'Return as JSON', default: false }
952
+ },
953
+ required: []
954
+ }
955
+ },
956
+ {
957
+ name: 'workers_triggers',
958
+ description: 'List available trigger keywords for workers',
959
+ inputSchema: {
960
+ type: 'object',
961
+ properties: {},
962
+ required: []
963
+ }
964
+ },
965
+ {
966
+ name: 'workers_stats',
967
+ description: 'Get worker statistics (24h)',
968
+ inputSchema: {
969
+ type: 'object',
970
+ properties: {},
971
+ required: []
972
+ }
919
973
  }
920
974
  ];
921
975
 
@@ -2066,6 +2120,123 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
2066
2120
  }, null, 2) }] };
2067
2121
  }
2068
2122
 
2123
+ // ============================================
2124
+ // BACKGROUND WORKERS HANDLERS (via agentic-flow)
2125
+ // ============================================
2126
+ case 'workers_dispatch': {
2127
+ const prompt = args.prompt;
2128
+ try {
2129
+ const result = execSync(`npx agentic-flow@alpha workers dispatch "${prompt.replace(/"/g, '\\"')}"`, {
2130
+ encoding: 'utf-8',
2131
+ timeout: 30000,
2132
+ stdio: ['pipe', 'pipe', 'pipe']
2133
+ });
2134
+ return { content: [{ type: 'text', text: JSON.stringify({
2135
+ success: true,
2136
+ message: 'Worker dispatched',
2137
+ output: result.trim()
2138
+ }, null, 2) }] };
2139
+ } catch (e) {
2140
+ return { content: [{ type: 'text', text: JSON.stringify({
2141
+ success: true,
2142
+ message: 'Worker dispatch attempted',
2143
+ note: 'Check workers status for progress'
2144
+ }, null, 2) }] };
2145
+ }
2146
+ }
2147
+
2148
+ case 'workers_status': {
2149
+ try {
2150
+ const cmdArgs = args.workerId ? `workers status ${args.workerId}` : 'workers status';
2151
+ const result = execSync(`npx agentic-flow@alpha ${cmdArgs}`, {
2152
+ encoding: 'utf-8',
2153
+ timeout: 15000,
2154
+ stdio: ['pipe', 'pipe', 'pipe']
2155
+ });
2156
+ return { content: [{ type: 'text', text: JSON.stringify({
2157
+ success: true,
2158
+ status: result.trim()
2159
+ }, null, 2) }] };
2160
+ } catch (e) {
2161
+ return { content: [{ type: 'text', text: JSON.stringify({
2162
+ success: false,
2163
+ error: 'Could not get worker status',
2164
+ message: e.message
2165
+ }, null, 2) }] };
2166
+ }
2167
+ }
2168
+
2169
+ case 'workers_results': {
2170
+ try {
2171
+ const cmdArgs = args.json ? 'workers results --json' : 'workers results';
2172
+ const result = execSync(`npx agentic-flow@alpha ${cmdArgs}`, {
2173
+ encoding: 'utf-8',
2174
+ timeout: 15000,
2175
+ stdio: ['pipe', 'pipe', 'pipe']
2176
+ });
2177
+ if (args.json) {
2178
+ try {
2179
+ return { content: [{ type: 'text', text: JSON.stringify({
2180
+ success: true,
2181
+ results: JSON.parse(result.trim())
2182
+ }, null, 2) }] };
2183
+ } catch {
2184
+ return { content: [{ type: 'text', text: result.trim() }] };
2185
+ }
2186
+ }
2187
+ return { content: [{ type: 'text', text: JSON.stringify({
2188
+ success: true,
2189
+ results: result.trim()
2190
+ }, null, 2) }] };
2191
+ } catch (e) {
2192
+ return { content: [{ type: 'text', text: JSON.stringify({
2193
+ success: false,
2194
+ error: 'Could not get worker results',
2195
+ message: e.message
2196
+ }, null, 2) }] };
2197
+ }
2198
+ }
2199
+
2200
+ case 'workers_triggers': {
2201
+ try {
2202
+ const result = execSync('npx agentic-flow@alpha workers triggers', {
2203
+ encoding: 'utf-8',
2204
+ timeout: 15000,
2205
+ stdio: ['pipe', 'pipe', 'pipe']
2206
+ });
2207
+ return { content: [{ type: 'text', text: JSON.stringify({
2208
+ success: true,
2209
+ triggers: result.trim()
2210
+ }, null, 2) }] };
2211
+ } catch (e) {
2212
+ // Return hardcoded list as fallback
2213
+ return { content: [{ type: 'text', text: JSON.stringify({
2214
+ success: true,
2215
+ triggers: ['ultralearn', 'optimize', 'consolidate', 'predict', 'audit', 'map', 'preload', 'deepdive', 'document', 'refactor', 'benchmark', 'testgaps']
2216
+ }, null, 2) }] };
2217
+ }
2218
+ }
2219
+
2220
+ case 'workers_stats': {
2221
+ try {
2222
+ const result = execSync('npx agentic-flow@alpha workers stats', {
2223
+ encoding: 'utf-8',
2224
+ timeout: 15000,
2225
+ stdio: ['pipe', 'pipe', 'pipe']
2226
+ });
2227
+ return { content: [{ type: 'text', text: JSON.stringify({
2228
+ success: true,
2229
+ stats: result.trim()
2230
+ }, null, 2) }] };
2231
+ } catch (e) {
2232
+ return { content: [{ type: 'text', text: JSON.stringify({
2233
+ success: false,
2234
+ error: 'Could not get worker stats',
2235
+ message: e.message
2236
+ }, null, 2) }] };
2237
+ }
2238
+ }
2239
+
2069
2240
  default:
2070
2241
  return {
2071
2242
  content: [{
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,SAAS,CAAC;AAGxB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAE3B,QAAA,IAAI,cAAc,EAAE,GAAG,CAAC;AA0BxB;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,QAAQ,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,OAAO,CAElC;AAED;;GAEG;AACH,wBAAgB,MAAM,IAAI,OAAO,CAEhC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAMxE;AAED;;GAEG;AACH,cAAM,eAAe;IACnB,OAAO,CAAC,EAAE,CAAM;gBAEJ,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,GAAG,CAAA;KAAE;IAI5G;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IActH;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAUtI;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,YAAY,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAC,CAAC;IAuB1N;;OAEG;IACG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IAW5G;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI1C;;OAEG;IACG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;IAI5B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;CAGlC;AAGD,eAAO,MAAM,QAAQ,wBAAkB,CAAC;AACxC,eAAO,MAAM,QAAQ,wBAAkB,CAAC;AAGxC,eAAO,MAAM,cAAc,KAA0B,CAAC;AAGtD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,SAAS,CAAC;AAGxB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAE3B,QAAA,IAAI,cAAc,EAAE,GAAG,CAAC;AAmCxB;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,QAAQ,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,OAAO,CAElC;AAED;;GAEG;AACH,wBAAgB,MAAM,IAAI,OAAO,CAEhC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAMxE;AAED;;GAEG;AACH,cAAM,eAAe;IACnB,OAAO,CAAC,EAAE,CAAM;gBAEJ,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,GAAG,CAAA;KAAE;IAI5G;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IActH;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAUtI;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,YAAY,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAC,CAAC;IAuB1N;;OAEG;IACG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IAW5G;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI1C;;OAEG;IACG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;IAI5B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;CAGlC;AAGD,eAAO,MAAM,QAAQ,wBAAkB,CAAC;AACxC,eAAO,MAAM,QAAQ,wBAAkB,CAAC;AAGxC,eAAO,MAAM,cAAc,KAA0B,CAAC;AAGtD,eAAe,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -39,21 +39,31 @@ try {
39
39
  // Try to load native module first
40
40
  implementation = require('@ruvector/core');
41
41
  implementationType = 'native';
42
- // Verify it's actually working
43
- if (typeof implementation.VectorDB !== 'function') {
44
- throw new Error('Native module loaded but VectorDB not found');
42
+ // Verify it's actually working (native module exports VectorDb, not VectorDB)
43
+ if (typeof implementation.VectorDb !== 'function') {
44
+ throw new Error('Native module loaded but VectorDb class not found');
45
45
  }
46
46
  }
47
47
  catch (e) {
48
- // No WASM fallback available yet
49
- throw new Error(`Failed to load ruvector native module.\n` +
50
- `Error: ${e.message}\n` +
51
- `\nSupported platforms:\n` +
52
- `- Linux x64/ARM64\n` +
53
- `- macOS Intel/Apple Silicon\n` +
54
- `- Windows x64\n` +
55
- `\nIf you're on a supported platform, try:\n` +
56
- ` npm install --force @ruvector/core`);
48
+ // Graceful fallback - don't crash, just warn
49
+ console.warn('[RuVector] Native module not available:', e.message);
50
+ console.warn('[RuVector] Vector operations will be limited. Install @ruvector/core for full functionality.');
51
+ // Create a stub implementation that provides basic functionality
52
+ implementation = {
53
+ VectorDb: class StubVectorDb {
54
+ constructor() {
55
+ console.warn('[RuVector] Using stub VectorDb - install @ruvector/core for native performance');
56
+ }
57
+ async insert() { return 'stub-id-' + Date.now(); }
58
+ async insertBatch(entries) { return entries.map(() => 'stub-id-' + Date.now()); }
59
+ async search() { return []; }
60
+ async delete() { return true; }
61
+ async get() { return null; }
62
+ async len() { return 0; }
63
+ async isEmpty() { return true; }
64
+ }
65
+ };
66
+ implementationType = 'wasm'; // Mark as fallback mode
57
67
  }
58
68
  /**
59
69
  * Get the current implementation type
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ruvector",
3
- "version": "0.1.74",
3
+ "version": "0.1.76",
4
4
  "description": "High-performance vector database for Node.js with automatic native/WASM fallback",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",