@rce-mcp/retrieval-core 0.1.0 → 0.1.2

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.
package/dist/index.d.ts CHANGED
@@ -1,13 +1,24 @@
1
- import type { EnhancePromptInput, EnhancePromptOutput, SearchContextInput, SearchContextOutput } from "@rce-mcp/contracts";
1
+ import type { EnhancePromptInput, EnhancePromptOutput, EnhancePromptStyle, SearchContextInput, SearchContextOutput } from "@rce-mcp/contracts";
2
2
  import { type CandidateScoreWeights, type IndexRepository, type QueryCache, type WorkspaceRecord } from "@rce-mcp/data-plane";
3
3
  import { type Observability } from "@rce-mcp/observability";
4
4
  import { type ChunkingStrategy } from "./chunking.js";
5
+ type ContextRef = EnhancePromptOutput["context_refs"][number];
5
6
  export declare const DEFAULT_OPENAI_COMPATIBLE_EMBEDDING_BASE_URL = "https://router.tumuer.me/v1";
6
7
  export declare const DEFAULT_OPENAI_COMPATIBLE_EMBEDDING_MODEL = "Qwen/Qwen3-Embedding-4B";
7
8
  export declare const DEFAULT_OPENAI_COMPATIBLE_EMBEDDING_DIMENSIONS = 2560;
8
9
  export declare const DEFAULT_OPENAI_COMPATIBLE_EMBEDDING_TIMEOUT_MS = 10000;
9
10
  export declare const DEFAULT_OPENAI_COMPATIBLE_EMBEDDING_BATCH_SIZE = 64;
10
11
  export declare const DEFAULT_OPENAI_COMPATIBLE_EMBEDDING_MAX_RETRIES = 2;
12
+ export declare const DEFAULT_OPENAI_COMPATIBLE_EMBEDDING_TRANSIENT_403_MAX_RETRIES = 4;
13
+ export declare const DEFAULT_OPENAI_COMPATIBLE_RERANKER_BASE_URL = "https://router.tumuer.me/v1";
14
+ export declare const DEFAULT_OPENAI_COMPATIBLE_RERANKER_MODEL = "Qwen/Qwen3-Reranker-4B";
15
+ export declare const DEFAULT_OPENAI_COMPATIBLE_RERANKER_TIMEOUT_MS = 2500;
16
+ export declare const DEFAULT_SEARCH_RERANKER_TOP_N = 30;
17
+ export declare const DEFAULT_PROVIDER_MAX_REQUESTS_PER_MINUTE = 90;
18
+ export declare const DEFAULT_PROVIDER_LIMIT_INDEX_MAX_WAIT_MS = 120000;
19
+ export declare const DEFAULT_PROVIDER_LIMIT_QUERY_MAX_WAIT_MS = 1000;
20
+ export declare const DEFAULT_PROVIDER_LIMIT_RERANK_MAX_WAIT_MS = 500;
21
+ export declare const DEFAULT_CLAUDE_ENHANCER_MODEL = "claude-3-5-sonnet-latest";
11
22
  export interface RetrievalPathBiasConfig {
12
23
  source_path_boost: number;
13
24
  low_priority_prefix_penalty: number;
@@ -36,6 +47,10 @@ export interface RetrievalPathBiasConfig {
36
47
  negation_avoid_tests_penalty: number;
37
48
  negation_avoid_examples_penalty: number;
38
49
  negation_avoid_archive_penalty: number;
50
+ security_trace_meta_penalty: number;
51
+ literal_path_boost: number;
52
+ literal_snippet_boost: number;
53
+ literal_max_boost: number;
39
54
  min_total_bias: number;
40
55
  max_total_bias: number;
41
56
  }
@@ -56,9 +71,18 @@ export interface RetrievalEnhancerConfig {
56
71
  max_candidates_pre_rerank: number;
57
72
  rerank_timeout_ms: number;
58
73
  }
74
+ export type EnhancerToolMode = "none" | "read_only";
75
+ export interface RetrievalEnhancerGenerationConfig {
76
+ timeout_ms: number;
77
+ max_retries: number;
78
+ tool_mode: EnhancerToolMode;
79
+ max_context_snippets: number;
80
+ }
59
81
  export interface RetrievalChunkingConfig {
60
82
  strategy: ChunkingStrategy;
61
83
  fallback_strategy: "sliding";
84
+ target_chunk_tokens: number;
85
+ chunk_overlap_tokens: number;
62
86
  parse_timeout_ms: number;
63
87
  enabled_languages: string[];
64
88
  }
@@ -68,15 +92,19 @@ export type RetrievalScoringConfigInput = Partial<{
68
92
  rerank: Partial<RetrievalRerankConfig>;
69
93
  }>;
70
94
  export type RetrievalEnhancerConfigInput = Partial<RetrievalEnhancerConfig>;
95
+ export type RetrievalEnhancerGenerationConfigInput = Partial<RetrievalEnhancerGenerationConfig>;
71
96
  export type RetrievalChunkingConfigInput = Partial<{
72
97
  strategy: ChunkingStrategy;
73
98
  fallback_strategy: "sliding";
99
+ target_chunk_tokens: number;
100
+ chunk_overlap_tokens: number;
74
101
  parse_timeout_ms: number;
75
102
  enabled_languages: string[];
76
103
  }>;
77
104
  export declare const BASELINE_RETRIEVAL_SCORING_CONFIG: RetrievalScoringConfig;
78
105
  export declare const CONSERVATIVE_RETRIEVAL_SCORING_CONFIG: RetrievalScoringConfig;
79
106
  export declare const DEFAULT_RETRIEVAL_ENHANCER_CONFIG: RetrievalEnhancerConfig;
107
+ export declare const DEFAULT_RETRIEVAL_ENHANCER_GENERATION_CONFIG: RetrievalEnhancerGenerationConfig;
80
108
  export declare const DEFAULT_RETRIEVAL_CHUNKING_CONFIG: RetrievalChunkingConfig;
81
109
  declare const BUILTIN_RETRIEVAL_SCORING_PROFILES: {
82
110
  readonly baseline: RetrievalScoringConfig;
@@ -89,12 +117,13 @@ export declare function resolveRetrievalScoringProfile(profile_id: string | unde
89
117
  };
90
118
  export declare function mergeRetrievalScoringConfig(base: RetrievalScoringConfig, overrides?: RetrievalScoringConfigInput): RetrievalScoringConfig;
91
119
  export declare function mergeRetrievalEnhancerConfig(base: RetrievalEnhancerConfig, overrides?: RetrievalEnhancerConfigInput): RetrievalEnhancerConfig;
120
+ export declare function mergeRetrievalEnhancerGenerationConfig(base: RetrievalEnhancerGenerationConfig, overrides?: RetrievalEnhancerGenerationConfigInput): RetrievalEnhancerGenerationConfig;
92
121
  export declare function mergeRetrievalChunkingConfig(base: RetrievalChunkingConfig, overrides?: RetrievalChunkingConfigInput): RetrievalChunkingConfig;
93
- declare const REASON_STRINGS: readonly ["semantic match", "exact symbol match", "path and token overlap", "recently modified relevant module"];
122
+ declare const REASON_STRINGS: readonly ["semantic match", "exact literal match", "path token overlap", "recently modified relevant module"];
94
123
  export type RetrievalReason = (typeof REASON_STRINGS)[number];
95
124
  export declare class RetrievalError extends Error {
96
- readonly code: "INVALID_ARGUMENT" | "NOT_FOUND" | "UPSTREAM_FAILURE";
97
- constructor(code: "INVALID_ARGUMENT" | "NOT_FOUND" | "UPSTREAM_FAILURE", message: string);
125
+ readonly code: "INVALID_ARGUMENT" | "NOT_FOUND" | "RATE_LIMITED" | "UPSTREAM_FAILURE";
126
+ constructor(code: "INVALID_ARGUMENT" | "NOT_FOUND" | "RATE_LIMITED" | "UPSTREAM_FAILURE", message: string);
98
127
  }
99
128
  export interface RawFile {
100
129
  path: string;
@@ -161,13 +190,18 @@ export interface IndexingReport {
161
190
  }
162
191
  export interface RetrievalCoreOptions {
163
192
  cacheTtlSeconds?: number;
193
+ internalCandidateDepth?: number;
164
194
  embeddingProvider?: EmbeddingProvider;
165
195
  embeddingDescriptor?: EmbeddingDescriptor;
196
+ rerankerProvider?: RerankerProvider;
197
+ rerankerTopN?: number;
198
+ enhancerProvider?: EnhancerGenerationProvider;
166
199
  observability?: Observability;
167
200
  scoringProfile?: BuiltinRetrievalScoringProfileId;
168
201
  scoringProfileId?: string;
169
202
  scoringConfig?: RetrievalScoringConfigInput;
170
203
  enhancerConfig?: RetrievalEnhancerConfigInput;
204
+ enhancerGenerationConfig?: RetrievalEnhancerGenerationConfigInput;
171
205
  chunkingConfig?: RetrievalChunkingConfigInput;
172
206
  enhancerDecisionTraceEnabled?: boolean;
173
207
  }
@@ -185,6 +219,62 @@ export interface EmbeddingProvider {
185
219
  }): Promise<number[][]>;
186
220
  describe?(): EmbeddingDescriptor;
187
221
  }
222
+ export interface RerankerDescriptor {
223
+ provider: string;
224
+ model?: string;
225
+ }
226
+ export interface RerankerResult {
227
+ index: number;
228
+ relevance_score: number;
229
+ }
230
+ export interface RerankerProvider {
231
+ rerank(input: {
232
+ query: string;
233
+ documents: string[];
234
+ top_n: number;
235
+ }): Promise<RerankerResult[]>;
236
+ describe?(): RerankerDescriptor;
237
+ }
238
+ export type EnhancerIntent = "bugfix" | "feature" | "refactor" | "docs" | "tests" | "unknown";
239
+ export type EnhancerOutputLanguage = "en" | "es" | "zh";
240
+ type ResolvedEnhancerPromptStyle = Exclude<EnhancePromptStyle, "auto">;
241
+ export interface EnhancerContextSnippet {
242
+ path: string;
243
+ start_line: number;
244
+ end_line: number;
245
+ reason: string;
246
+ snippet: string;
247
+ score: number;
248
+ }
249
+ export interface EnhancerGenerationRequest {
250
+ trace_id: string;
251
+ tenant_id: string;
252
+ workspace_id?: string;
253
+ request: EnhancePromptInput;
254
+ style_requested: EnhancePromptStyle;
255
+ style_resolved: ResolvedEnhancerPromptStyle;
256
+ intent: EnhancerIntent;
257
+ query_intent: "symbol-heavy" | "impl-focused" | "conceptual";
258
+ language: EnhancerOutputLanguage;
259
+ context_refs: ContextRef[];
260
+ context_snippets: EnhancerContextSnippet[];
261
+ warnings: string[];
262
+ questions: string[];
263
+ tool_mode: EnhancerToolMode;
264
+ abort_signal?: AbortSignal;
265
+ on_progress?: () => void;
266
+ }
267
+ export interface EnhancerGenerationResult {
268
+ enhanced_prompt: string;
269
+ }
270
+ export interface EnhancerProviderDescriptor {
271
+ provider: string;
272
+ model?: string;
273
+ }
274
+ export interface EnhancerGenerationProvider {
275
+ generate(input: EnhancerGenerationRequest): Promise<EnhancerGenerationResult>;
276
+ describe?(): EnhancerProviderDescriptor;
277
+ }
188
278
  export interface DeterministicEmbeddingProviderOptions {
189
279
  dimensions?: number;
190
280
  model?: string;
@@ -198,8 +288,82 @@ export interface OpenAICompatibleEmbeddingProviderOptions {
198
288
  timeout_ms?: number;
199
289
  batch_size?: number;
200
290
  max_retries?: number;
291
+ transient_forbidden_max_retries?: number;
292
+ request_limiter?: ProviderRequestLimiter;
293
+ request_limit_scope_id?: string;
294
+ max_requests_per_minute?: number;
295
+ index_max_wait_ms?: number;
296
+ query_max_wait_ms?: number;
297
+ observability?: Observability;
298
+ }
299
+ export interface OpenAICompatibleRerankerProviderOptions {
300
+ base_url: string;
301
+ api_key: string;
302
+ model?: string;
303
+ timeout_ms?: number;
304
+ request_limiter?: ProviderRequestLimiter;
305
+ request_limit_scope_id?: string;
306
+ max_requests_per_minute?: number;
307
+ rerank_max_wait_ms?: number;
201
308
  observability?: Observability;
202
309
  }
310
+ export interface ClaudeAgentEnhancerProviderOptions {
311
+ api_key: string;
312
+ model?: string;
313
+ base_url?: string;
314
+ max_tokens?: number;
315
+ path_to_claude_code_executable?: string;
316
+ permission_mode?: ClaudeCodePermissionMode;
317
+ }
318
+ export type ClaudeCodePermissionMode = "default" | "acceptEdits" | "bypassPermissions" | "plan";
319
+ export interface ProviderRateLimitAcquireInput {
320
+ scope: string;
321
+ max_requests_per_minute: number;
322
+ max_wait_ms: number;
323
+ }
324
+ export interface ProviderRateLimitAcquireResult {
325
+ wait_ms: number;
326
+ }
327
+ export interface ProviderRequestLimiter {
328
+ readonly mode?: "local" | "redis" | "custom";
329
+ acquire(input: ProviderRateLimitAcquireInput): Promise<ProviderRateLimitAcquireResult>;
330
+ }
331
+ export interface RedisProviderRequestLimiterClient {
332
+ eval(script: string, numKeys: number, ...args: Array<string | number>): Promise<unknown>;
333
+ }
334
+ export interface RedisProviderRequestLimiterOptions {
335
+ redis: RedisProviderRequestLimiterClient;
336
+ key_prefix?: string;
337
+ window_ms?: number;
338
+ now?: () => number;
339
+ sleeper?: (ms: number) => Promise<void>;
340
+ }
341
+ export declare class ProviderRateLimitExceededError extends Error {
342
+ readonly retry_after_ms: number;
343
+ constructor(message: string, retry_after_ms: number);
344
+ }
345
+ export declare class LocalProviderRequestLimiter implements ProviderRequestLimiter {
346
+ readonly mode: "local";
347
+ private readonly buckets;
348
+ private readonly now;
349
+ private readonly sleeper;
350
+ constructor(options?: {
351
+ now?: () => number;
352
+ sleeper?: (ms: number) => Promise<void>;
353
+ });
354
+ acquire(input: ProviderRateLimitAcquireInput): Promise<ProviderRateLimitAcquireResult>;
355
+ }
356
+ export declare class RedisProviderRequestLimiter implements ProviderRequestLimiter {
357
+ readonly mode: "redis";
358
+ private readonly redis;
359
+ private readonly keyPrefix;
360
+ private readonly windowMs;
361
+ private readonly now;
362
+ private readonly sleeper;
363
+ constructor(options: RedisProviderRequestLimiterOptions);
364
+ acquire(input: ProviderRateLimitAcquireInput): Promise<ProviderRateLimitAcquireResult>;
365
+ private reserveAttempt;
366
+ }
203
367
  export declare class DeterministicEmbeddingProvider implements EmbeddingProvider {
204
368
  private readonly dimensions;
205
369
  private readonly model;
@@ -220,6 +384,12 @@ export declare class OpenAICompatibleEmbeddingProvider implements EmbeddingProvi
220
384
  private readonly timeoutMs;
221
385
  private readonly batchSize;
222
386
  private readonly maxRetries;
387
+ private readonly transientForbiddenMaxRetries;
388
+ private readonly requestLimiter?;
389
+ private readonly requestLimitScope;
390
+ private readonly maxRequestsPerMinute;
391
+ private readonly indexMaxWaitMs;
392
+ private readonly queryMaxWaitMs;
223
393
  private readonly observability;
224
394
  constructor(options: OpenAICompatibleEmbeddingProviderOptions);
225
395
  describe(): EmbeddingDescriptor;
@@ -228,10 +398,43 @@ export declare class OpenAICompatibleEmbeddingProvider implements EmbeddingProvi
228
398
  purpose: EmbeddingPurpose;
229
399
  }): Promise<number[][]>;
230
400
  private embedBatchWithRetries;
401
+ private enforceRequestLimit;
231
402
  private embedBatchOnce;
403
+ private maxRetriesForReason;
232
404
  private retryDelayMs;
405
+ private isTransientForbidden;
233
406
  private toProviderFailure;
234
407
  }
408
+ export declare class OpenAICompatibleRerankerProvider implements RerankerProvider {
409
+ private readonly endpoint;
410
+ private readonly apiKey;
411
+ private readonly model;
412
+ private readonly timeoutMs;
413
+ private readonly requestLimiter?;
414
+ private readonly requestLimitScope;
415
+ private readonly maxRequestsPerMinute;
416
+ private readonly rerankMaxWaitMs;
417
+ private readonly observability;
418
+ constructor(options: OpenAICompatibleRerankerProviderOptions);
419
+ describe(): RerankerDescriptor;
420
+ rerank(input: {
421
+ query: string;
422
+ documents: string[];
423
+ top_n: number;
424
+ }): Promise<RerankerResult[]>;
425
+ private enforceRequestLimit;
426
+ }
427
+ export declare class ClaudeAgentEnhancerProvider implements EnhancerGenerationProvider {
428
+ private readonly apiKey;
429
+ private readonly model;
430
+ private readonly maxTokens;
431
+ private readonly baseUrl?;
432
+ private readonly pathToClaudeCodeExecutable?;
433
+ private readonly permissionMode;
434
+ constructor(options: ClaudeAgentEnhancerProviderOptions);
435
+ describe(): EnhancerProviderDescriptor;
436
+ generate(input: EnhancerGenerationRequest): Promise<EnhancerGenerationResult>;
437
+ }
235
438
  export declare class InMemoryIndexStore implements IndexRepository {
236
439
  private readonly workspaces;
237
440
  private readonly workspacesByPath;
@@ -350,13 +553,21 @@ export declare class RetrievalCore {
350
553
  private readonly store;
351
554
  private readonly cache;
352
555
  private readonly cacheTtlSeconds;
556
+ private readonly internalCandidateDepth;
353
557
  private readonly embeddingProvider;
354
558
  private readonly embeddingDescriptor;
559
+ private readonly rerankerProvider?;
560
+ private readonly rerankerDescriptor?;
561
+ private readonly rerankerTopN;
562
+ private readonly rerankerCacheVariant;
355
563
  private readonly observability;
356
564
  private readonly scoringConfig;
357
565
  private readonly scoringProfileId;
358
566
  private readonly scoringConfigChecksum;
567
+ private readonly enhancerProvider?;
568
+ private readonly enhancerProviderDescriptor?;
359
569
  private readonly enhancerConfig;
570
+ private readonly enhancerGenerationConfig;
360
571
  private readonly chunkingConfig;
361
572
  private readonly enhancerDecisionTraceEnabled;
362
573
  private cacheHits;
@@ -372,12 +583,16 @@ export declare class RetrievalCore {
372
583
  index_id: string;
373
584
  status: "indexing" | "ready" | "failed";
374
585
  } | undefined>;
586
+ private applyLearnedReranker;
375
587
  searchContext(input: {
376
588
  trace_id: string;
377
589
  tenant_id: string;
378
590
  workspace_id: string;
379
591
  request: SearchContextInput;
380
592
  }): Promise<SearchContextOutput>;
593
+ private enhancerProviderLabels;
594
+ private buildEnhancerContextSnippets;
595
+ private generateEnhancedPrompt;
381
596
  enhancePrompt(input: {
382
597
  trace_id: string;
383
598
  tenant_id: string;
@@ -388,3 +603,4 @@ export declare class RetrievalCore {
388
603
  export declare function createDefaultRetrievalCore(): RetrievalCore;
389
604
  export declare function seedWorkspaceIndex(core: RetrievalCore, artifact: IndexUploadArtifact): Promise<IndexingReport>;
390
605
  export * from "./remote-sync.js";
606
+ export * from "./indexing-ignore.js";