@evomap/evolver-proxy 2.0.0-beta.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 (82) hide show
  1. package/README.md +49 -0
  2. package/dist/bin/envFile.d.ts +10 -0
  3. package/dist/bin/envFile.js +68 -0
  4. package/dist/bin/evolver-llm-proxy.d.ts +2 -0
  5. package/dist/bin/evolver-llm-proxy.js +111 -0
  6. package/dist/bin/evolver-proxy.d.ts +83 -0
  7. package/dist/bin/evolver-proxy.js +511 -0
  8. package/dist/bin/proxySettings.d.ts +15 -0
  9. package/dist/bin/proxySettings.js +84 -0
  10. package/dist/bin/proxyStorePath.d.ts +1 -0
  11. package/dist/bin/proxyStorePath.js +16 -0
  12. package/dist/daemon/atpConsent.d.ts +13 -0
  13. package/dist/daemon/atpConsent.js +60 -0
  14. package/dist/daemon/ipcConfig.d.ts +1 -0
  15. package/dist/daemon/ipcConfig.js +13 -0
  16. package/dist/daemon/proxyDaemon.d.ts +191 -0
  17. package/dist/daemon/proxyDaemon.js +1015 -0
  18. package/dist/daemon/selectHub.d.ts +16 -0
  19. package/dist/daemon/selectHub.js +30 -0
  20. package/dist/index.d.ts +8 -0
  21. package/dist/index.js +8 -0
  22. package/dist/lifecycle/deployGuard.d.ts +46 -0
  23. package/dist/lifecycle/deployGuard.js +53 -0
  24. package/dist/lifecycle/legacyNodeId.d.ts +96 -0
  25. package/dist/lifecycle/legacyNodeId.js +163 -0
  26. package/dist/lifecycle/manager.d.ts +106 -0
  27. package/dist/lifecycle/manager.js +390 -0
  28. package/dist/llm/bodyCapture.d.ts +31 -0
  29. package/dist/llm/bodyCapture.js +293 -0
  30. package/dist/llm/index.d.ts +3 -0
  31. package/dist/llm/index.js +3 -0
  32. package/dist/llm/server.d.ts +35 -0
  33. package/dist/llm/server.js +359 -0
  34. package/dist/llm/traceBackfill.d.ts +53 -0
  35. package/dist/llm/traceBackfill.js +525 -0
  36. package/dist/llm/traceConfig.d.ts +7 -0
  37. package/dist/llm/traceConfig.js +44 -0
  38. package/dist/llm/traceControl.d.ts +16 -0
  39. package/dist/llm/traceControl.js +85 -0
  40. package/dist/llm/traceEnvelope.d.ts +75 -0
  41. package/dist/llm/traceEnvelope.js +286 -0
  42. package/dist/llm/traceSink.d.ts +61 -0
  43. package/dist/llm/traceSink.js +278 -0
  44. package/dist/llm/traceUploadPayload.d.ts +14 -0
  45. package/dist/llm/traceUploadPayload.js +27 -0
  46. package/dist/llm/upstream.d.ts +68 -0
  47. package/dist/llm/upstream.js +491 -0
  48. package/dist/private/adapterLoader.d.ts +46 -0
  49. package/dist/private/adapterLoader.js +62 -0
  50. package/dist/private/privateRuntimeSmokeOptions.d.ts +15 -0
  51. package/dist/private/privateRuntimeSmokeOptions.js +132 -0
  52. package/dist/router/cachePassthrough.d.ts +3 -0
  53. package/dist/router/cachePassthrough.js +13 -0
  54. package/dist/router/features.d.ts +9 -0
  55. package/dist/router/features.js +52 -0
  56. package/dist/router/index.d.ts +6 -0
  57. package/dist/router/index.js +6 -0
  58. package/dist/router/messagesRoute.d.ts +138 -0
  59. package/dist/router/messagesRoute.js +753 -0
  60. package/dist/router/modelRouter.d.ts +49 -0
  61. package/dist/router/modelRouter.js +66 -0
  62. package/dist/router/providerRoutes.d.ts +42 -0
  63. package/dist/router/providerRoutes.js +1579 -0
  64. package/dist/router/sseScan.d.ts +56 -0
  65. package/dist/router/sseScan.js +543 -0
  66. package/dist/selfUpdate/executor.d.ts +90 -0
  67. package/dist/selfUpdate/executor.js +179 -0
  68. package/dist/selfUpdate/failureCodes.d.ts +33 -0
  69. package/dist/selfUpdate/failureCodes.js +84 -0
  70. package/dist/selfUpdate/index.d.ts +5 -0
  71. package/dist/selfUpdate/index.js +5 -0
  72. package/dist/selfUpdate/lastUpdate.d.ts +43 -0
  73. package/dist/selfUpdate/lastUpdate.js +195 -0
  74. package/dist/selfUpdate/policy.d.ts +3 -0
  75. package/dist/selfUpdate/policy.js +9 -0
  76. package/dist/selfUpdate/releaseBinary.d.ts +56 -0
  77. package/dist/selfUpdate/releaseBinary.js +498 -0
  78. package/dist/selfUpdate/version.d.ts +2 -0
  79. package/dist/selfUpdate/version.js +14 -0
  80. package/dist/sync/engine.d.ts +65 -0
  81. package/dist/sync/engine.js +461 -0
  82. package/package.json +41 -0
@@ -0,0 +1,49 @@
1
+ export type Tier = 'cheap' | 'mid' | 'expensive';
2
+ export declare const REASONS: {
3
+ readonly ROUTER_DISABLED: "router_disabled";
4
+ readonly HARD_PINNED: "hard_pinned";
5
+ readonly GENE_HINT: "gene_hint";
6
+ readonly POST_TOOL_RESULT_SYNTHESIS: "post_tool_result_synthesis";
7
+ readonly USER_REQUESTED_PLANNING: "user_requested_planning";
8
+ readonly HIGH_TOOL_USE_DENSITY: "high_tool_use_density";
9
+ readonly TRIVIAL_LOOKUP: "trivial_lookup";
10
+ readonly DEFAULT_TIER: "default_tier";
11
+ readonly ESCALATED_FROM_HISTORY: "escalated_from_history";
12
+ };
13
+ export type Reason = (typeof REASONS)[keyof typeof REASONS];
14
+ export interface RouterFeatures {
15
+ last_assistant_tool_call_count: number;
16
+ last_assistant_had_tool_call: boolean;
17
+ last_user_is_tool_result_only: boolean;
18
+ user_requested_planning: boolean;
19
+ user_simple_lookup: boolean;
20
+ last_assistant_output_tokens: number;
21
+ last_assistant_stop_reason: 'ToolUse' | 'Stop' | null;
22
+ }
23
+ export interface RouterHistoryEntry {
24
+ tier: Tier;
25
+ output_tokens: number;
26
+ had_tool_call: boolean;
27
+ }
28
+ export interface RouterState {
29
+ history: readonly RouterHistoryEntry[];
30
+ pinned: Tier | null;
31
+ }
32
+ export interface RouterConfig {
33
+ default_tier: Tier;
34
+ disable: boolean;
35
+ hard_pin_after_plan: boolean;
36
+ }
37
+ export interface RouterInput {
38
+ features: RouterFeatures;
39
+ router_state: RouterState;
40
+ config: RouterConfig;
41
+ gene_hint?: Tier | null;
42
+ }
43
+ export interface RouterDecision {
44
+ tier: Tier;
45
+ reason: Reason;
46
+ escalated_from: Tier | null;
47
+ }
48
+ /** Pick a tier for one turn. Precedence: disabled → hard-pin → gene hint → classify (+ history escalation). */
49
+ export declare function pickForTurn(input: RouterInput): RouterDecision;
@@ -0,0 +1,66 @@
1
+ // Multi-tier model router (ported from v1 proxy/router/model_router.js, itself a port of the EvoX Rust
2
+ // model_router.rs). Given stateless per-turn features, it picks a cost tier (cheap/mid/expensive) for an
3
+ // Anthropic /v1/messages turn so cheap turns (summarising tool output, trivial lookups) don't burn the
4
+ // expensive model and planning / high-tool-density turns get it.
5
+ //
6
+ // Field names are snake_case ON PURPOSE: they mirror the Rust router + its JSON fixture, and branch order is
7
+ // a parity invariant (post_tool_result_synthesis must win over high_tool_use_density). Pure + deterministic.
8
+ export const REASONS = {
9
+ ROUTER_DISABLED: 'router_disabled',
10
+ HARD_PINNED: 'hard_pinned',
11
+ GENE_HINT: 'gene_hint',
12
+ POST_TOOL_RESULT_SYNTHESIS: 'post_tool_result_synthesis',
13
+ USER_REQUESTED_PLANNING: 'user_requested_planning',
14
+ HIGH_TOOL_USE_DENSITY: 'high_tool_use_density',
15
+ TRIVIAL_LOOKUP: 'trivial_lookup',
16
+ DEFAULT_TIER: 'default_tier',
17
+ ESCALATED_FROM_HISTORY: 'escalated_from_history',
18
+ };
19
+ const TIER_ORDER = { cheap: 0, mid: 1, expensive: 2 };
20
+ function tierStepUp(tier) {
21
+ if (tier === 'cheap')
22
+ return 'mid';
23
+ return 'expensive'; // mid → expensive; expensive → expensive (clamped)
24
+ }
25
+ /** Parity invariant with model_router.rs:340 — branch ORDER matters. */
26
+ function classify(features, config) {
27
+ // post_tool_result_synthesis must win over high_tool_use_density: a turn that only summarises tool output.
28
+ if (features.last_user_is_tool_result_only && features.last_assistant_stop_reason === 'ToolUse') {
29
+ return ['cheap', REASONS.POST_TOOL_RESULT_SYNTHESIS];
30
+ }
31
+ if (features.user_requested_planning)
32
+ return ['expensive', REASONS.USER_REQUESTED_PLANNING];
33
+ if (features.last_assistant_tool_call_count > 3)
34
+ return ['expensive', REASONS.HIGH_TOOL_USE_DENSITY];
35
+ if (features.user_simple_lookup)
36
+ return ['cheap', REASONS.TRIVIAL_LOOKUP];
37
+ return [config.default_tier, REASONS.DEFAULT_TIER];
38
+ }
39
+ /** Stalled-turn escalation (model_router.rs:373): last turn produced <50 output tokens with no tool call. */
40
+ function maybeEscalate(base, history) {
41
+ if (!history || history.length === 0)
42
+ return [base, null];
43
+ const last = history[history.length - 1];
44
+ const stalled = last.output_tokens < 50 && !last.had_tool_call;
45
+ if (!stalled || last.tier === 'expensive')
46
+ return [base, null];
47
+ const target = tierStepUp(last.tier);
48
+ if (TIER_ORDER[target] > TIER_ORDER[base])
49
+ return [target, last.tier];
50
+ return [base, null];
51
+ }
52
+ /** Pick a tier for one turn. Precedence: disabled → hard-pin → gene hint → classify (+ history escalation). */
53
+ export function pickForTurn(input) {
54
+ const { features, router_state, config } = input;
55
+ if (config.disable)
56
+ return { tier: config.default_tier, reason: REASONS.ROUTER_DISABLED, escalated_from: null };
57
+ if (config.hard_pin_after_plan && router_state?.pinned) {
58
+ return { tier: router_state.pinned, reason: REASONS.HARD_PINNED, escalated_from: null };
59
+ }
60
+ if (input.gene_hint)
61
+ return { tier: input.gene_hint, reason: REASONS.GENE_HINT, escalated_from: null };
62
+ const [baseTier, baseReason] = classify(features, config);
63
+ const [escalatedTier, escalatedFrom] = maybeEscalate(baseTier, router_state?.history ?? []);
64
+ const reason = escalatedFrom !== null ? REASONS.ESCALATED_FROM_HISTORY : baseReason;
65
+ return { tier: escalatedTier, reason, escalated_from: escalatedFrom };
66
+ }
@@ -0,0 +1,42 @@
1
+ import type { AnthropicProxy, MessagesResponse, RouterLogger, TraceSink } from './messagesRoute.js';
2
+ import { type Tier } from './modelRouter.js';
3
+ export interface ProviderRouteRequest {
4
+ body: Record<string, unknown>;
5
+ headers?: Record<string, string | undefined>;
6
+ params?: Record<string, string>;
7
+ query?: Record<string, string>;
8
+ }
9
+ export type ProviderRouteHandler = (req: ProviderRouteRequest) => Promise<MessagesResponse>;
10
+ export interface ProviderRouteOptions {
11
+ anthropicProxy: AnthropicProxy;
12
+ openAIProxy: AnthropicProxy;
13
+ geminiProxy: AnthropicProxy;
14
+ ollamaProxy: AnthropicProxy;
15
+ vertexProxy: AnthropicProxy;
16
+ logger?: RouterLogger;
17
+ onTrace?: TraceSink;
18
+ clock?: () => number;
19
+ env?: NodeJS.ProcessEnv;
20
+ }
21
+ export declare const OPENAI_RESPONSE_HEADER_ALLOWLIST: Set<string>;
22
+ export declare const GEMINI_RESPONSE_HEADER_ALLOWLIST: Set<string>;
23
+ type OpenAIRoute = '/v1/responses' | '/v1/chat/completions';
24
+ export declare function copyOpenAIResponseHeaders(headers?: Record<string, string | undefined>): Record<string, string>;
25
+ export declare function copyGeminiResponseHeaders(headers?: Record<string, string | undefined>): Record<string, string>;
26
+ export declare function resolveOpenAITierModels(env?: NodeJS.ProcessEnv, route?: OpenAIRoute): Partial<Record<Tier, string>>;
27
+ export declare function parseModelAction(modelAction: string): {
28
+ model: string;
29
+ action: string;
30
+ };
31
+ export declare function detectModelsProvider(headers?: Record<string, string | undefined>): 'anthropic' | 'openai';
32
+ export declare function vertexBaseUrl(location: string, env?: NodeJS.ProcessEnv): string;
33
+ export declare function buildOpenAIResponsesHandler(opts: Pick<ProviderRouteOptions, 'openAIProxy' | 'logger' | 'onTrace' | 'clock' | 'env'>): ProviderRouteHandler;
34
+ export declare function buildOpenAIChatCompletionsHandler(opts: Pick<ProviderRouteOptions, 'openAIProxy' | 'logger' | 'onTrace' | 'clock' | 'env'>): ProviderRouteHandler;
35
+ export declare function buildGeminiHandler(opts: Pick<ProviderRouteOptions, 'geminiProxy' | 'logger' | 'onTrace' | 'clock' | 'env'>): ProviderRouteHandler;
36
+ export declare function buildOllamaHandler(opts: Pick<ProviderRouteOptions, 'ollamaProxy' | 'logger' | 'onTrace' | 'clock' | 'env'> & {
37
+ apiPath: '/api/chat' | '/api/generate';
38
+ }): ProviderRouteHandler;
39
+ export declare function buildVertexHandler(opts: Pick<ProviderRouteOptions, 'vertexProxy' | 'logger' | 'onTrace' | 'clock' | 'env'>): ProviderRouteHandler;
40
+ export declare function buildModelsHandler(opts: Pick<ProviderRouteOptions, 'anthropicProxy' | 'openAIProxy' | 'logger'>): ProviderRouteHandler;
41
+ export declare function buildProviderRoutes(opts: ProviderRouteOptions): Record<string, ProviderRouteHandler>;
42
+ export {};