@ashlr/hub 2.2.0 → 3.0.1
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/CHANGELOG.md +73 -0
- package/README.md +95 -8
- package/dist/api/plugin.d.ts +1 -0
- package/dist/cli/backlog.js +2 -0
- package/dist/cli/backlog.js.map +1 -1
- package/dist/cli/digest.d.ts +6 -0
- package/dist/cli/digest.js +127 -2
- package/dist/cli/digest.js.map +1 -1
- package/dist/cli/eval-fixtures.d.ts +18 -0
- package/dist/cli/eval-fixtures.js +38 -0
- package/dist/cli/eval-fixtures.js.map +1 -0
- package/dist/cli/eval.d.ts +56 -0
- package/dist/cli/eval.js +283 -0
- package/dist/cli/eval.js.map +1 -0
- package/dist/cli/fleet.d.ts +27 -0
- package/dist/cli/fleet.js +222 -0
- package/dist/cli/fleet.js.map +1 -0
- package/dist/cli/goal.d.ts +15 -0
- package/dist/cli/goal.js +91 -0
- package/dist/cli/goal.js.map +1 -0
- package/dist/cli/help.js +10 -3
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/inbox.d.ts +6 -0
- package/dist/cli/inbox.js +183 -8
- package/dist/cli/inbox.js.map +1 -1
- package/dist/cli/index.js +50 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/loop.d.ts +16 -0
- package/dist/cli/loop.js +66 -0
- package/dist/cli/loop.js.map +1 -0
- package/dist/cli/mcp.d.ts +12 -0
- package/dist/cli/mcp.js +148 -0
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli/onboard.d.ts +16 -0
- package/dist/cli/onboard.js +71 -0
- package/dist/cli/onboard.js.map +1 -1
- package/dist/cli/plugins.js +9 -8
- package/dist/cli/plugins.js.map +1 -1
- package/dist/cli/pulse.d.ts +10 -0
- package/dist/cli/pulse.js +261 -0
- package/dist/cli/pulse.js.map +1 -1
- package/dist/cli/run.js +21 -3
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/stack.d.ts +34 -0
- package/dist/cli/stack.js +221 -0
- package/dist/cli/stack.js.map +1 -0
- package/dist/cli/update.js +12 -5
- package/dist/cli/update.js.map +1 -1
- package/dist/core/daemon/loop.d.ts +10 -5
- package/dist/core/daemon/loop.js +167 -37
- package/dist/core/daemon/loop.js.map +1 -1
- package/dist/core/env-bridge.js +3 -2
- package/dist/core/env-bridge.js.map +1 -1
- package/dist/core/fleet/automerge-pass.d.ts +33 -0
- package/dist/core/fleet/automerge-pass.js +61 -0
- package/dist/core/fleet/automerge-pass.js.map +1 -0
- package/dist/core/fleet/quota.d.ts +70 -0
- package/dist/core/fleet/quota.js +198 -0
- package/dist/core/fleet/quota.js.map +1 -0
- package/dist/core/fleet/router.d.ts +46 -0
- package/dist/core/fleet/router.js +121 -0
- package/dist/core/fleet/router.js.map +1 -0
- package/dist/core/fleet/self.d.ts +58 -0
- package/dist/core/fleet/self.js +187 -0
- package/dist/core/fleet/self.js.map +1 -0
- package/dist/core/fleet/status.d.ts +54 -0
- package/dist/core/fleet/status.js +157 -0
- package/dist/core/fleet/status.js.map +1 -0
- package/dist/core/foundry/provenance.d.ts +78 -0
- package/dist/core/foundry/provenance.js +172 -0
- package/dist/core/foundry/provenance.js.map +1 -0
- package/dist/core/git.d.ts +13 -0
- package/dist/core/git.js +26 -0
- package/dist/core/git.js.map +1 -1
- package/dist/core/inbox/merge.d.ts +151 -0
- package/dist/core/inbox/merge.js +858 -0
- package/dist/core/inbox/merge.js.map +1 -0
- package/dist/core/inbox/store.js +10 -1
- package/dist/core/inbox/store.js.map +1 -1
- package/dist/core/integrations/markdown.d.ts +66 -0
- package/dist/core/integrations/markdown.js +132 -0
- package/dist/core/integrations/markdown.js.map +1 -0
- package/dist/core/integrations/secrets.d.ts +37 -0
- package/dist/core/integrations/secrets.js +67 -0
- package/dist/core/integrations/secrets.js.map +1 -0
- package/dist/core/integrations/stack.d.ts +47 -0
- package/dist/core/integrations/stack.js +107 -0
- package/dist/core/integrations/stack.js.map +1 -0
- package/dist/core/mcp-native-engineer.d.ts +123 -0
- package/dist/core/mcp-native-engineer.js +936 -0
- package/dist/core/mcp-native-engineer.js.map +1 -0
- package/dist/core/mcp-native.js +20 -42
- package/dist/core/mcp-native.js.map +1 -1
- package/dist/core/mcp-registry.js +2 -0
- package/dist/core/mcp-registry.js.map +1 -1
- package/dist/core/observability/codex-source.d.ts +53 -0
- package/dist/core/observability/codex-source.js +390 -0
- package/dist/core/observability/codex-source.js.map +1 -0
- package/dist/core/observability/estimate.d.ts +12 -0
- package/dist/core/observability/estimate.js +26 -0
- package/dist/core/observability/estimate.js.map +1 -1
- package/dist/core/observability/limits.d.ts +52 -0
- package/dist/core/observability/limits.js +316 -0
- package/dist/core/observability/limits.js.map +1 -0
- package/dist/core/observability/usage-source.js +3 -1
- package/dist/core/observability/usage-source.js.map +1 -1
- package/dist/core/portfolio/scanners.d.ts +1 -0
- package/dist/core/portfolio/scanners.js +40 -1
- package/dist/core/portfolio/scanners.js.map +1 -1
- package/dist/core/providers.js +4 -0
- package/dist/core/providers.js.map +1 -1
- package/dist/core/quality/health.js +1 -0
- package/dist/core/quality/health.js.map +1 -1
- package/dist/core/run/agent-loop.d.ts +8 -0
- package/dist/core/run/agent-loop.js +24 -14
- package/dist/core/run/agent-loop.js.map +1 -1
- package/dist/core/run/engine-registry.d.ts +48 -0
- package/dist/core/run/engine-registry.js +190 -0
- package/dist/core/run/engine-registry.js.map +1 -0
- package/dist/core/run/engines.d.ts +17 -3
- package/dist/core/run/engines.js +63 -44
- package/dist/core/run/engines.js.map +1 -1
- package/dist/core/run/learned-router.d.ts +121 -0
- package/dist/core/run/learned-router.js +374 -0
- package/dist/core/run/learned-router.js.map +1 -0
- package/dist/core/run/model-manager.js +3 -3
- package/dist/core/run/model-manager.js.map +1 -1
- package/dist/core/run/model-profile.d.ts +67 -0
- package/dist/core/run/model-profile.js +132 -0
- package/dist/core/run/model-profile.js.map +1 -0
- package/dist/core/run/orchestrator.d.ts +1 -1
- package/dist/core/run/orchestrator.js +642 -510
- package/dist/core/run/orchestrator.js.map +1 -1
- package/dist/core/run/prompts/budget.d.ts +25 -0
- package/dist/core/run/prompts/budget.js +51 -0
- package/dist/core/run/prompts/budget.js.map +1 -0
- package/dist/core/run/prompts/index.d.ts +14 -0
- package/dist/core/run/prompts/index.js +59 -0
- package/dist/core/run/prompts/index.js.map +1 -0
- package/dist/core/run/prompts/layers.d.ts +26 -0
- package/dist/core/run/prompts/layers.js +73 -0
- package/dist/core/run/prompts/layers.js.map +1 -0
- package/dist/core/run/prompts/roles.d.ts +23 -0
- package/dist/core/run/prompts/roles.js +48 -0
- package/dist/core/run/prompts/roles.js.map +1 -0
- package/dist/core/run/prompts/types.d.ts +38 -0
- package/dist/core/run/prompts/types.js +5 -0
- package/dist/core/run/prompts/types.js.map +1 -0
- package/dist/core/run/provider-client.d.ts +6 -24
- package/dist/core/run/provider-client.js +125 -61
- package/dist/core/run/provider-client.js.map +1 -1
- package/dist/core/run/router.js +8 -0
- package/dist/core/run/router.js.map +1 -1
- package/dist/core/run/sandboxed-engine.d.ts +66 -0
- package/dist/core/run/sandboxed-engine.js +262 -0
- package/dist/core/run/sandboxed-engine.js.map +1 -0
- package/dist/core/run/verify-commands.d.ts +83 -0
- package/dist/core/run/verify-commands.js +234 -0
- package/dist/core/run/verify-commands.js.map +1 -0
- package/dist/core/run/verify.d.ts +31 -1
- package/dist/core/run/verify.js +48 -0
- package/dist/core/run/verify.js.map +1 -1
- package/dist/core/sandbox/audit.d.ts +27 -0
- package/dist/core/sandbox/audit.js +34 -0
- package/dist/core/sandbox/audit.js.map +1 -1
- package/dist/core/sandbox/confine.d.ts +134 -0
- package/dist/core/sandbox/confine.js +370 -0
- package/dist/core/sandbox/confine.js.map +1 -0
- package/dist/core/types.d.ts +227 -5
- package/dist/core/web/api.js +77 -28
- package/dist/core/web/api.js.map +1 -1
- package/dist/core/web/control.d.ts +116 -0
- package/dist/core/web/control.js +307 -0
- package/dist/core/web/control.js.map +1 -0
- package/dist/core/web/public/app.js +512 -6
- package/dist/core/web/public/styles.css +468 -0
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engines.js","sourceRoot":"","sources":["../../../src/core/run/engines.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"engines.js","sourceRoot":"","sources":["../../../src/core/run/engines.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* learned-router.ts — M53: Fleet intelligence layer over the M46 router.
|
|
3
|
+
*
|
|
4
|
+
* Exports:
|
|
5
|
+
* - `recommendRoute(item, cfg, opts)` — PURE over its inputs. Combines
|
|
6
|
+
* `routeBackend` with verified-outcome priors and an `estimateRun` cost
|
|
7
|
+
* estimate to recommend `{ backend, tier, reason, confidence }`. Priors
|
|
8
|
+
* nudge cost-heavy frontier tasks toward mid/local when frontier has a poor
|
|
9
|
+
* verified-success rate for their class. NEVER recommends a backend outside
|
|
10
|
+
* cfg.foundry.allowedBackends; NEVER escalates a bulk/local item to frontier.
|
|
11
|
+
*
|
|
12
|
+
* - `recoverWithinBudget(decision, cfg, spentUsd, forecast)` — PURE. When the
|
|
13
|
+
* projected daily budget would be breached, cascades the chosen backend:
|
|
14
|
+
* frontier → mid → local → pause. Returns the cascaded decision or a pause
|
|
15
|
+
* signal. NEVER throws.
|
|
16
|
+
*
|
|
17
|
+
* HARD SAFETY INVARIANTS (see CONTRACT-M53.md):
|
|
18
|
+
* - NO auto-apply, NO gate bypass. This file has NO import of any
|
|
19
|
+
* apply/merge/create-pr/push/deploy primitive. All outputs are tier choices
|
|
20
|
+
* or recommendation metadata — never outward actions.
|
|
21
|
+
* - recommendRoute's output is always within allowedBackends.
|
|
22
|
+
* - recoverWithinBudget cascade is strictly frontier→mid→local→pause; never
|
|
23
|
+
* escalates.
|
|
24
|
+
* - Flag-off: when cfg.foundry.intelligence is absent, recommendRoute defers
|
|
25
|
+
* entirely to routeBackend (byte-identical behavior).
|
|
26
|
+
*
|
|
27
|
+
* No new runtime deps; node builtins only. EngineTier locally defined here to
|
|
28
|
+
* avoid importing from merge.ts (daemon-no-primitive invariant).
|
|
29
|
+
*/
|
|
30
|
+
import type { AshlrConfig, EngineId, EngineTier, RunEstimate, WorkItem } from '../types.js';
|
|
31
|
+
import { type RouteDecision } from '../fleet/router.js';
|
|
32
|
+
import type { CostForecast } from '../types.js';
|
|
33
|
+
/** A recommendation from the learned router. */
|
|
34
|
+
export interface LearnedRoute {
|
|
35
|
+
/** Backend chosen (always within allowedBackends). */
|
|
36
|
+
backend: EngineId;
|
|
37
|
+
/** Engine tier of the chosen backend. */
|
|
38
|
+
tier: EngineTier;
|
|
39
|
+
/** Human-readable explanation of the routing decision. */
|
|
40
|
+
reason: string;
|
|
41
|
+
/**
|
|
42
|
+
* Confidence in the recommendation (0..1). Low when no priors exist;
|
|
43
|
+
* higher when there's enough history to trust the nudge.
|
|
44
|
+
*/
|
|
45
|
+
confidence: number;
|
|
46
|
+
}
|
|
47
|
+
/** The outcome of recoverWithinBudget — either a cascaded decision or a pause. */
|
|
48
|
+
export type BudgetRecovery = {
|
|
49
|
+
action: 'cascade';
|
|
50
|
+
decision: RouteDecision;
|
|
51
|
+
reason: string;
|
|
52
|
+
} | {
|
|
53
|
+
action: 'pause';
|
|
54
|
+
reason: string;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* M53: intelligence configuration block, expected under cfg.foundry.intelligence.
|
|
58
|
+
* Defined locally so we don't need to touch types.ts (owned by main thread).
|
|
59
|
+
*/
|
|
60
|
+
export interface FoundryIntelligenceCfg {
|
|
61
|
+
/**
|
|
62
|
+
* Anomaly threshold multiplier k: a run with cost > k × p50 triggers a hold.
|
|
63
|
+
* Default 4.
|
|
64
|
+
*/
|
|
65
|
+
anomalyK?: number;
|
|
66
|
+
/**
|
|
67
|
+
* Minimum verified-success rate below which a task class is nudged away from
|
|
68
|
+
* frontier (0..1, default 0.5).
|
|
69
|
+
*/
|
|
70
|
+
minFrontierSuccessRate?: number;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* A prior derived from run history for a task class (source label).
|
|
74
|
+
* Computed read-only from listRuns history; never throws.
|
|
75
|
+
*/
|
|
76
|
+
interface OutcomePrior {
|
|
77
|
+
/** Fraction of frontier runs that were verified-successful (0..1). */
|
|
78
|
+
frontierSuccessRate: number;
|
|
79
|
+
/** Number of frontier runs in history. */
|
|
80
|
+
frontierSampleSize: number;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Extract the p50 (median) cost estimate from a RunEstimate.
|
|
84
|
+
* Returns 0 when the estimate has no history (confidence 'low', sampleSize 0).
|
|
85
|
+
*/
|
|
86
|
+
export declare function p50Cost(estimate: RunEstimate): number;
|
|
87
|
+
/**
|
|
88
|
+
* Compute the anomaly ratio: actualCost / p50Cost. Returns Infinity when p50
|
|
89
|
+
* is 0 and actualCost > 0 (conservatively treated as an anomaly by callers).
|
|
90
|
+
* Returns 0 when actualCost is 0. Never throws.
|
|
91
|
+
*/
|
|
92
|
+
export declare function anomalyRatio(actualCostUsd: number, estimate: RunEstimate): number;
|
|
93
|
+
/**
|
|
94
|
+
* Recommend a backend route for a WorkItem, combining M46 routeBackend with
|
|
95
|
+
* verified-outcome priors and a cost estimate.
|
|
96
|
+
*
|
|
97
|
+
* PURE over its inputs (modulo async history reads). NEVER throws.
|
|
98
|
+
* Flag-off: when cfg.foundry.intelligence is absent, defers to routeBackend.
|
|
99
|
+
*
|
|
100
|
+
* @param item The work item to route.
|
|
101
|
+
* @param cfg Full AshlrConfig.
|
|
102
|
+
* @param opts Optional: a pre-computed RunEstimate and prior data.
|
|
103
|
+
*/
|
|
104
|
+
export declare function recommendRoute(item: WorkItem, cfg: AshlrConfig, opts?: {
|
|
105
|
+
estimate?: RunEstimate;
|
|
106
|
+
prior?: OutcomePrior;
|
|
107
|
+
}): Promise<LearnedRoute>;
|
|
108
|
+
/**
|
|
109
|
+
* Given a routing decision and current spend vs. forecast, cascade the backend
|
|
110
|
+
* tier to stay within budget: frontier → mid → local → pause.
|
|
111
|
+
*
|
|
112
|
+
* PURE + DETERMINISTIC. Never throws. Never escalates (a 'local' decision
|
|
113
|
+
* always stays 'local'). Returns { action: 'pause' } at the hard cap.
|
|
114
|
+
*
|
|
115
|
+
* @param decision The current RouteDecision (from routeBackend or recommendRoute).
|
|
116
|
+
* @param cfg Full AshlrConfig.
|
|
117
|
+
* @param spentUsd Total USD spent today so far.
|
|
118
|
+
* @param forecast The current cost forecast (projectedMonthlyUsd, etc.).
|
|
119
|
+
*/
|
|
120
|
+
export declare function recoverWithinBudget(decision: RouteDecision, cfg: AshlrConfig, spentUsd: number, forecast: CostForecast): BudgetRecovery;
|
|
121
|
+
export {};
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* learned-router.ts — M53: Fleet intelligence layer over the M46 router.
|
|
3
|
+
*
|
|
4
|
+
* Exports:
|
|
5
|
+
* - `recommendRoute(item, cfg, opts)` — PURE over its inputs. Combines
|
|
6
|
+
* `routeBackend` with verified-outcome priors and an `estimateRun` cost
|
|
7
|
+
* estimate to recommend `{ backend, tier, reason, confidence }`. Priors
|
|
8
|
+
* nudge cost-heavy frontier tasks toward mid/local when frontier has a poor
|
|
9
|
+
* verified-success rate for their class. NEVER recommends a backend outside
|
|
10
|
+
* cfg.foundry.allowedBackends; NEVER escalates a bulk/local item to frontier.
|
|
11
|
+
*
|
|
12
|
+
* - `recoverWithinBudget(decision, cfg, spentUsd, forecast)` — PURE. When the
|
|
13
|
+
* projected daily budget would be breached, cascades the chosen backend:
|
|
14
|
+
* frontier → mid → local → pause. Returns the cascaded decision or a pause
|
|
15
|
+
* signal. NEVER throws.
|
|
16
|
+
*
|
|
17
|
+
* HARD SAFETY INVARIANTS (see CONTRACT-M53.md):
|
|
18
|
+
* - NO auto-apply, NO gate bypass. This file has NO import of any
|
|
19
|
+
* apply/merge/create-pr/push/deploy primitive. All outputs are tier choices
|
|
20
|
+
* or recommendation metadata — never outward actions.
|
|
21
|
+
* - recommendRoute's output is always within allowedBackends.
|
|
22
|
+
* - recoverWithinBudget cascade is strictly frontier→mid→local→pause; never
|
|
23
|
+
* escalates.
|
|
24
|
+
* - Flag-off: when cfg.foundry.intelligence is absent, recommendRoute defers
|
|
25
|
+
* entirely to routeBackend (byte-identical behavior).
|
|
26
|
+
*
|
|
27
|
+
* No new runtime deps; node builtins only. EngineTier locally defined here to
|
|
28
|
+
* avoid importing from merge.ts (daemon-no-primitive invariant).
|
|
29
|
+
*/
|
|
30
|
+
import { routeBackend } from '../fleet/router.js';
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
// Local type definitions (avoid importing merge.ts)
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
/** The tier cascade order: frontier → mid → local → pause. */
|
|
35
|
+
const TIER_CASCADE = ['frontier', 'mid', 'local'];
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Helpers
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
/** Resolve intelligence config from cfg, returning defaults when absent. */
|
|
40
|
+
function resolveIntelCfg(cfg) {
|
|
41
|
+
// M59: cfg.foundry.intelligence is now a typed field. Returns null when
|
|
42
|
+
// entirely absent so the flag-off path is clean.
|
|
43
|
+
const raw = cfg.foundry?.intelligence;
|
|
44
|
+
if (raw === undefined || raw === null)
|
|
45
|
+
return null;
|
|
46
|
+
if (typeof raw !== 'object' || Array.isArray(raw))
|
|
47
|
+
return null;
|
|
48
|
+
return raw;
|
|
49
|
+
}
|
|
50
|
+
/** All backends in cfg.foundry.allowedBackends (always includes 'builtin'). */
|
|
51
|
+
function allowedBackends(cfg) {
|
|
52
|
+
const set = new Set(cfg.foundry?.allowedBackends ?? ['builtin']);
|
|
53
|
+
set.add('builtin');
|
|
54
|
+
return set;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Map a backend EngineId to its EngineTier. Mirrors engineTierOf semantics
|
|
58
|
+
* from sandboxed-engine.ts without importing it here (to avoid a chain that
|
|
59
|
+
* could pull in merge.ts). The set of frontier engines is stable and small.
|
|
60
|
+
*/
|
|
61
|
+
function tierOf(backend) {
|
|
62
|
+
// Any non-builtin backend is considered 'frontier' by default (the M46
|
|
63
|
+
// engineTierOf logic). With the M53 learned router, we don't yet have
|
|
64
|
+
// 'mid' backends in the registry (that's M51), so this mirrors M46's
|
|
65
|
+
// two-level world while leaving room for 'mid' in the cascade logic.
|
|
66
|
+
if (backend === 'builtin')
|
|
67
|
+
return 'local';
|
|
68
|
+
return 'frontier';
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Find the best backend within the allowed set that matches the given tier.
|
|
72
|
+
* Returns null when no allowed backend has that tier.
|
|
73
|
+
*/
|
|
74
|
+
function backendForTier(tier, allowed, preferredOrder) {
|
|
75
|
+
for (const e of preferredOrder) {
|
|
76
|
+
if (allowed.has(e) && tierOf(e) === tier)
|
|
77
|
+
return e;
|
|
78
|
+
}
|
|
79
|
+
// Fallback: scan the full allowed set.
|
|
80
|
+
for (const e of allowed) {
|
|
81
|
+
if (tierOf(e) === tier)
|
|
82
|
+
return e;
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
/** The preferred frontier backend ordering (mirrors FRONTIER_PREFERENCE in router.ts). */
|
|
87
|
+
const FRONTIER_PREFERENCE = ['claude', 'codex'];
|
|
88
|
+
const EMPTY_PRIOR = { frontierSuccessRate: 1, frontierSampleSize: 0 };
|
|
89
|
+
/**
|
|
90
|
+
* Compute a prior for the given task source class from run history.
|
|
91
|
+
* Read-only, never throws, returns EMPTY_PRIOR on any error or empty history.
|
|
92
|
+
*/
|
|
93
|
+
async function loadPrior(source) {
|
|
94
|
+
try {
|
|
95
|
+
const { listRuns } = await import('../run/orchestrator.js');
|
|
96
|
+
const runs = listRuns();
|
|
97
|
+
// A run is "frontier" if its engine is one of the known frontier backends.
|
|
98
|
+
// We derive this from the run metadata. Runs without engineTier skip.
|
|
99
|
+
const frontierRuns = runs.filter((r) => {
|
|
100
|
+
const tier = r['engineTier'];
|
|
101
|
+
return tier === 'frontier';
|
|
102
|
+
});
|
|
103
|
+
// Filter by source class via the goal keyword heuristic (best-effort).
|
|
104
|
+
const relevant = frontierRuns.filter((r) => r.goal.toLowerCase().includes(source.toLowerCase()));
|
|
105
|
+
if (relevant.length === 0)
|
|
106
|
+
return EMPTY_PRIOR;
|
|
107
|
+
const succeeded = relevant.filter((r) => r.status === 'done').length;
|
|
108
|
+
return {
|
|
109
|
+
frontierSuccessRate: succeeded / relevant.length,
|
|
110
|
+
frontierSampleSize: relevant.length,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return EMPTY_PRIOR;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
// p50 anomaly helper (exposed for daemon use)
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
/**
|
|
121
|
+
* Extract the p50 (median) cost estimate from a RunEstimate.
|
|
122
|
+
* Returns 0 when the estimate has no history (confidence 'low', sampleSize 0).
|
|
123
|
+
*/
|
|
124
|
+
export function p50Cost(estimate) {
|
|
125
|
+
return estimate.estCostUsd.median;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Compute the anomaly ratio: actualCost / p50Cost. Returns Infinity when p50
|
|
129
|
+
* is 0 and actualCost > 0 (conservatively treated as an anomaly by callers).
|
|
130
|
+
* Returns 0 when actualCost is 0. Never throws.
|
|
131
|
+
*/
|
|
132
|
+
export function anomalyRatio(actualCostUsd, estimate) {
|
|
133
|
+
if (actualCostUsd <= 0)
|
|
134
|
+
return 0;
|
|
135
|
+
const p50 = p50Cost(estimate);
|
|
136
|
+
if (p50 <= 0)
|
|
137
|
+
return Infinity;
|
|
138
|
+
return actualCostUsd / p50;
|
|
139
|
+
}
|
|
140
|
+
// ---------------------------------------------------------------------------
|
|
141
|
+
// recommendRoute
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
143
|
+
/**
|
|
144
|
+
* Recommend a backend route for a WorkItem, combining M46 routeBackend with
|
|
145
|
+
* verified-outcome priors and a cost estimate.
|
|
146
|
+
*
|
|
147
|
+
* PURE over its inputs (modulo async history reads). NEVER throws.
|
|
148
|
+
* Flag-off: when cfg.foundry.intelligence is absent, defers to routeBackend.
|
|
149
|
+
*
|
|
150
|
+
* @param item The work item to route.
|
|
151
|
+
* @param cfg Full AshlrConfig.
|
|
152
|
+
* @param opts Optional: a pre-computed RunEstimate and prior data.
|
|
153
|
+
*/
|
|
154
|
+
export async function recommendRoute(item, cfg, opts) {
|
|
155
|
+
// ── FLAG-OFF: absent intelligence config ⇒ defer to routeBackend exactly ──
|
|
156
|
+
const intel = resolveIntelCfg(cfg);
|
|
157
|
+
if (intel === null) {
|
|
158
|
+
const base = routeBackend(item, cfg);
|
|
159
|
+
return {
|
|
160
|
+
backend: base.backend,
|
|
161
|
+
tier: base.tier,
|
|
162
|
+
reason: base.reason,
|
|
163
|
+
confidence: 1.0,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
// ── Base decision from M46 routeBackend ────────────────────────────────────
|
|
167
|
+
const base = routeBackend(item, cfg);
|
|
168
|
+
const allowed = allowedBackends(cfg);
|
|
169
|
+
// ── Guard: never return a backend outside allowedBackends ─────────────────
|
|
170
|
+
// (routeBackend already honors this, but we double-check here)
|
|
171
|
+
if (!allowed.has(base.backend)) {
|
|
172
|
+
return {
|
|
173
|
+
backend: 'builtin',
|
|
174
|
+
tier: 'local',
|
|
175
|
+
reason: `learned-router: base backend ${base.backend} not in allowedBackends — fallback to builtin`,
|
|
176
|
+
confidence: 1.0,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
// ── Bulk/local items: NEVER escalate to frontier ───────────────────────────
|
|
180
|
+
if (base.tier === 'local') {
|
|
181
|
+
return {
|
|
182
|
+
backend: base.backend,
|
|
183
|
+
tier: base.tier,
|
|
184
|
+
reason: `learned-router: bulk/local item stays local (${base.reason})`,
|
|
185
|
+
confidence: 1.0,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
// ── Load priors (or use provided ones) ────────────────────────────────────
|
|
189
|
+
const prior = opts?.prior ?? (await loadPrior(item.source));
|
|
190
|
+
const minSuccessRate = intel.minFrontierSuccessRate ?? 0.5;
|
|
191
|
+
// ── Nudge away from frontier when success rate is poor ────────────────────
|
|
192
|
+
// Only applies when we have enough history to trust the prior (>= 3 samples).
|
|
193
|
+
const poorPrior = prior.frontierSampleSize >= 3 &&
|
|
194
|
+
prior.frontierSuccessRate < minSuccessRate;
|
|
195
|
+
if (poorPrior) {
|
|
196
|
+
// Try to find a mid-tier backend first, then fall back to local.
|
|
197
|
+
const midBackend = backendForTier('mid', allowed, FRONTIER_PREFERENCE);
|
|
198
|
+
if (midBackend !== null) {
|
|
199
|
+
return {
|
|
200
|
+
backend: midBackend,
|
|
201
|
+
tier: 'mid',
|
|
202
|
+
reason: `learned-router: frontier success rate ${(prior.frontierSuccessRate * 100).toFixed(0)}% ` +
|
|
203
|
+
`< threshold ${(minSuccessRate * 100).toFixed(0)}% for source '${item.source}' ` +
|
|
204
|
+
`(${prior.frontierSampleSize} samples) — nudged to mid ${midBackend}`,
|
|
205
|
+
confidence: Math.min(0.4 + (prior.frontierSampleSize / 20) * 0.4 + (1 - prior.frontierSuccessRate) * 0.2, 1),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
// No mid available — fall back to local.
|
|
209
|
+
return {
|
|
210
|
+
backend: 'builtin',
|
|
211
|
+
tier: 'local',
|
|
212
|
+
reason: `learned-router: frontier success rate poor for '${item.source}', no mid backend ` +
|
|
213
|
+
`available — fallback to builtin`,
|
|
214
|
+
confidence: 0.7,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
// ── Cost estimate check: if p50 is very high, nudge toward cheaper tier ───
|
|
218
|
+
const estimate = opts?.estimate;
|
|
219
|
+
if (estimate !== null && estimate !== undefined && estimate.sampleSize >= 3) {
|
|
220
|
+
// If the median cost estimate is greater than 10% of the daily budget, prefer
|
|
221
|
+
// a mid or local backend to conserve budget.
|
|
222
|
+
const dailyBudget = cfg.daemon?.dailyBudgetUsd ?? 1.0;
|
|
223
|
+
const costThreshold = dailyBudget * 0.1;
|
|
224
|
+
if (estimate.estCostUsd.median > costThreshold && base.tier === 'frontier') {
|
|
225
|
+
const midBackend = backendForTier('mid', allowed, FRONTIER_PREFERENCE);
|
|
226
|
+
if (midBackend !== null) {
|
|
227
|
+
return {
|
|
228
|
+
backend: midBackend,
|
|
229
|
+
tier: 'mid',
|
|
230
|
+
reason: `learned-router: p50 cost $${estimate.estCostUsd.median.toFixed(4)} exceeds ` +
|
|
231
|
+
`10% of daily budget ($${dailyBudget}) — nudged to mid ${midBackend}`,
|
|
232
|
+
confidence: 0.6,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// ── No nudge warranted — return the base decision ─────────────────────────
|
|
238
|
+
return {
|
|
239
|
+
backend: base.backend,
|
|
240
|
+
tier: base.tier,
|
|
241
|
+
reason: `learned-router: base decision confirmed (${base.reason})`,
|
|
242
|
+
confidence: prior.frontierSampleSize >= 10 ? 0.9 : prior.frontierSampleSize >= 3 ? 0.7 : 0.5,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
// ---------------------------------------------------------------------------
|
|
246
|
+
// recoverWithinBudget
|
|
247
|
+
// ---------------------------------------------------------------------------
|
|
248
|
+
/**
|
|
249
|
+
* Given a routing decision and current spend vs. forecast, cascade the backend
|
|
250
|
+
* tier to stay within budget: frontier → mid → local → pause.
|
|
251
|
+
*
|
|
252
|
+
* PURE + DETERMINISTIC. Never throws. Never escalates (a 'local' decision
|
|
253
|
+
* always stays 'local'). Returns { action: 'pause' } at the hard cap.
|
|
254
|
+
*
|
|
255
|
+
* @param decision The current RouteDecision (from routeBackend or recommendRoute).
|
|
256
|
+
* @param cfg Full AshlrConfig.
|
|
257
|
+
* @param spentUsd Total USD spent today so far.
|
|
258
|
+
* @param forecast The current cost forecast (projectedMonthlyUsd, etc.).
|
|
259
|
+
*/
|
|
260
|
+
export function recoverWithinBudget(decision, cfg, spentUsd, forecast) {
|
|
261
|
+
const dailyBudget = cfg.daemon?.dailyBudgetUsd ?? 1.0;
|
|
262
|
+
const remaining = dailyBudget - spentUsd;
|
|
263
|
+
const allowed = allowedBackends(cfg);
|
|
264
|
+
// ── Hard cap: budget exhausted ⇒ pause ────────────────────────────────────
|
|
265
|
+
if (remaining <= 0) {
|
|
266
|
+
return {
|
|
267
|
+
action: 'pause',
|
|
268
|
+
reason: `budget exhausted: spent $${spentUsd.toFixed(4)} >= cap $${dailyBudget.toFixed(4)}`,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
// ── Near-cap threshold: >90% of daily budget consumed ⇒ pause ─────────────
|
|
272
|
+
const usedFraction = spentUsd / dailyBudget;
|
|
273
|
+
if (usedFraction >= 1.0) {
|
|
274
|
+
return {
|
|
275
|
+
action: 'pause',
|
|
276
|
+
reason: `budget at hard cap (${(usedFraction * 100).toFixed(0)}% of $${dailyBudget.toFixed(4)})`,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
// ── Monthly projection warning: at 80%+ daily budget, cascade tiers ────────
|
|
280
|
+
// The forecast provides monthly projection; we use daily fraction as the
|
|
281
|
+
// primary signal (more immediate, same scaling).
|
|
282
|
+
const currentTier = decision.tier;
|
|
283
|
+
// ── No cascade needed when tier is already local ──────────────────────────
|
|
284
|
+
if (currentTier === 'local') {
|
|
285
|
+
// Can't cascade further — either proceed or pause at hard cap.
|
|
286
|
+
if (usedFraction >= 0.95) {
|
|
287
|
+
return {
|
|
288
|
+
action: 'pause',
|
|
289
|
+
reason: `budget near hard cap (${(usedFraction * 100).toFixed(0)}%) and backend already local`,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
return {
|
|
293
|
+
action: 'cascade',
|
|
294
|
+
decision,
|
|
295
|
+
reason: `budget ok (${(usedFraction * 100).toFixed(0)}% used), backend already local — no change`,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
// ── Cascade thresholds (frontier → mid → local → pause) ───────────────────
|
|
299
|
+
// >= 95% → pause
|
|
300
|
+
// >= 80% → cascade one step
|
|
301
|
+
// >= 60% and frontier → cascade to mid
|
|
302
|
+
// < 60% → keep current tier
|
|
303
|
+
const currentTierIdx = TIER_CASCADE.indexOf(currentTier);
|
|
304
|
+
// If tier not in cascade list (shouldn't happen) treat as local.
|
|
305
|
+
const effectiveIdx = currentTierIdx < 0 ? TIER_CASCADE.length - 1 : currentTierIdx;
|
|
306
|
+
let targetTierIdx;
|
|
307
|
+
if (usedFraction >= 0.95) {
|
|
308
|
+
// Near hard cap: pause regardless of tier.
|
|
309
|
+
return {
|
|
310
|
+
action: 'pause',
|
|
311
|
+
reason: `budget at ${(usedFraction * 100).toFixed(0)}% of daily cap — pausing to avoid overspend`,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
else if (usedFraction >= 0.80) {
|
|
315
|
+
// 80–95%: cascade two steps toward local.
|
|
316
|
+
targetTierIdx = Math.min(effectiveIdx + 2, TIER_CASCADE.length - 1);
|
|
317
|
+
}
|
|
318
|
+
else if (usedFraction >= 0.60 && currentTier === 'frontier') {
|
|
319
|
+
// 60–80% and frontier: cascade one step to mid.
|
|
320
|
+
targetTierIdx = effectiveIdx + 1;
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
// < 60% or already mid/local: no cascade.
|
|
324
|
+
targetTierIdx = effectiveIdx;
|
|
325
|
+
}
|
|
326
|
+
// Also consult projected monthly from forecast: if projectedMonthlyUsd > 30 ×
|
|
327
|
+
// daily budget (i.e., on track to spend >100% of budget every day this month),
|
|
328
|
+
// apply one additional cascade step.
|
|
329
|
+
const projectedDailyFromForecast = forecast.projectedMonthlyUsd > 0 ? forecast.projectedMonthlyUsd / 30 : 0;
|
|
330
|
+
if (projectedDailyFromForecast > dailyBudget && targetTierIdx < TIER_CASCADE.length - 1) {
|
|
331
|
+
targetTierIdx = Math.min(targetTierIdx + 1, TIER_CASCADE.length - 1);
|
|
332
|
+
}
|
|
333
|
+
const targetTier = TIER_CASCADE[targetTierIdx];
|
|
334
|
+
// No change needed.
|
|
335
|
+
if (targetTierIdx <= effectiveIdx || targetTier === currentTier) {
|
|
336
|
+
return {
|
|
337
|
+
action: 'cascade',
|
|
338
|
+
decision,
|
|
339
|
+
reason: `budget ${(usedFraction * 100).toFixed(0)}% used — no tier cascade needed for ${currentTier}`,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
// Find a backend at the target tier within allowed set.
|
|
343
|
+
const cascadedBackend = backendForTier(targetTier, allowed, FRONTIER_PREFERENCE);
|
|
344
|
+
if (cascadedBackend === null) {
|
|
345
|
+
// Target tier has no allowed backend — try next tier.
|
|
346
|
+
for (let i = targetTierIdx + 1; i < TIER_CASCADE.length; i++) {
|
|
347
|
+
const fallbackTier = TIER_CASCADE[i];
|
|
348
|
+
const fb = backendForTier(fallbackTier, allowed, FRONTIER_PREFERENCE);
|
|
349
|
+
if (fb !== null) {
|
|
350
|
+
return {
|
|
351
|
+
action: 'cascade',
|
|
352
|
+
decision: { backend: fb, tier: fallbackTier, reason: 'budget-cascade' },
|
|
353
|
+
reason: `budget cascade: ${currentTier}→${targetTier} has no allowed backend; ` +
|
|
354
|
+
`fell back to ${fallbackTier} (${fb})`,
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
// No backend at any lower tier — pause.
|
|
359
|
+
return {
|
|
360
|
+
action: 'pause',
|
|
361
|
+
reason: `budget cascade: no lower-tier backend available — pausing`,
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
return {
|
|
365
|
+
action: 'cascade',
|
|
366
|
+
decision: {
|
|
367
|
+
backend: cascadedBackend,
|
|
368
|
+
tier: targetTier,
|
|
369
|
+
reason: `budget-cascade (${currentTier}→${targetTier}, ${(usedFraction * 100).toFixed(0)}% used)`,
|
|
370
|
+
},
|
|
371
|
+
reason: `budget cascade: ${currentTier}→${targetTier} (${(usedFraction * 100).toFixed(0)}% of $${dailyBudget.toFixed(2)} used)`,
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
//# sourceMappingURL=learned-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learned-router.js","sourceRoot":"","sources":["../../../src/core/run/learned-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -178,9 +178,9 @@ function formatBytes(bytes) {
|
|
|
178
178
|
*/
|
|
179
179
|
export function ollamaInstalled() {
|
|
180
180
|
try {
|
|
181
|
-
//
|
|
182
|
-
//
|
|
183
|
-
execFileSync('which', ['ollama'], { stdio: 'pipe' });
|
|
181
|
+
// Cross-platform probe: `where` on Windows, `which` on POSIX.
|
|
182
|
+
// execFileSync throws when exit code != 0.
|
|
183
|
+
execFileSync(process.platform === 'win32' ? 'where' : 'which', ['ollama'], { stdio: 'pipe' });
|
|
184
184
|
return true;
|
|
185
185
|
}
|
|
186
186
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-manager.js","sourceRoot":"","sources":["../../../src/core/run/model-manager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"model-manager.js","sourceRoot":"","sources":["../../../src/core/run/model-manager.ts"],"names":[],"mappings":"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"}
|