agent-nuvira 3.3.11 → 3.3.13
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/README.md +32 -1
- package/dist/agents/agents/reasoner.d.ts.map +1 -1
- package/dist/agents/agents/reasoner.js +13 -0
- package/dist/agents/agents/reasoner.js.map +1 -1
- package/dist/agents/orchestrator.d.ts.map +1 -1
- package/dist/agents/orchestrator.js +56 -20
- package/dist/agents/orchestrator.js.map +1 -1
- package/dist/cli/chat.d.ts +36 -0
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +456 -43
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/cli-program.d.ts.map +1 -1
- package/dist/cli/cli-program.js +8 -0
- package/dist/cli/cli-program.js.map +1 -1
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +35 -4
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/execute.d.ts.map +1 -1
- package/dist/cli/execute.js +14 -0
- package/dist/cli/execute.js.map +1 -1
- package/dist/cli/knowledge.d.ts +23 -0
- package/dist/cli/knowledge.d.ts.map +1 -0
- package/dist/cli/knowledge.js +132 -0
- package/dist/cli/knowledge.js.map +1 -0
- package/dist/cli/loop-executor.d.ts.map +1 -1
- package/dist/cli/loop-executor.js +57 -13
- package/dist/cli/loop-executor.js.map +1 -1
- package/dist/cli/omniroute-control.d.ts +88 -0
- package/dist/cli/omniroute-control.d.ts.map +1 -0
- package/dist/cli/omniroute-control.js +179 -0
- package/dist/cli/omniroute-control.js.map +1 -0
- package/dist/cli/omniroute.d.ts +21 -0
- package/dist/cli/omniroute.d.ts.map +1 -0
- package/dist/cli/omniroute.js +67 -0
- package/dist/cli/omniroute.js.map +1 -0
- package/dist/cli/tool-install-prompt.d.ts +58 -0
- package/dist/cli/tool-install-prompt.d.ts.map +1 -1
- package/dist/cli/tool-install-prompt.js +137 -0
- package/dist/cli/tool-install-prompt.js.map +1 -1
- package/dist/cli/weak-model-prompt.d.ts +16 -7
- package/dist/cli/weak-model-prompt.d.ts.map +1 -1
- package/dist/cli/weak-model-prompt.js +24 -8
- package/dist/cli/weak-model-prompt.js.map +1 -1
- package/dist/config/types.d.ts +44 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/context/cache.d.ts +35 -1
- package/dist/context/cache.d.ts.map +1 -1
- package/dist/context/cache.js +31 -2
- package/dist/context/cache.js.map +1 -1
- package/dist/context/history.d.ts +21 -0
- package/dist/context/history.d.ts.map +1 -1
- package/dist/context/history.js +50 -0
- package/dist/context/history.js.map +1 -1
- package/dist/gateway/hook-contract.d.ts +173 -0
- package/dist/gateway/hook-contract.d.ts.map +1 -0
- package/dist/gateway/hook-contract.js +352 -0
- package/dist/gateway/hook-contract.js.map +1 -0
- package/dist/gateway/hooks.d.ts.map +1 -1
- package/dist/gateway/hooks.js +14 -0
- package/dist/gateway/hooks.js.map +1 -1
- package/dist/inference/interface.d.ts +17 -0
- package/dist/inference/interface.d.ts.map +1 -1
- package/dist/inference/model-catalog.d.ts +17 -0
- package/dist/inference/model-catalog.d.ts.map +1 -1
- package/dist/inference/model-catalog.js +42 -7
- package/dist/inference/model-catalog.js.map +1 -1
- package/dist/inference/model-id-validation.d.ts +57 -0
- package/dist/inference/model-id-validation.d.ts.map +1 -0
- package/dist/inference/model-id-validation.js +127 -0
- package/dist/inference/model-id-validation.js.map +1 -0
- package/dist/inference/openai-compat-adapter.d.ts.map +1 -1
- package/dist/inference/openai-compat-adapter.js +12 -1
- package/dist/inference/openai-compat-adapter.js.map +1 -1
- package/dist/inference/provider-catalog.d.ts +11 -0
- package/dist/inference/provider-catalog.d.ts.map +1 -1
- package/dist/inference/provider-catalog.js +80 -0
- package/dist/inference/provider-catalog.js.map +1 -1
- package/dist/inference/route-resolver.d.ts +2 -8
- package/dist/inference/route-resolver.d.ts.map +1 -1
- package/dist/inference/route-resolver.js +17 -0
- package/dist/inference/route-resolver.js.map +1 -1
- package/dist/inference/tool-call-utils.d.ts +4 -3
- package/dist/inference/tool-call-utils.d.ts.map +1 -1
- package/dist/inference/tool-call-utils.js +26 -12
- package/dist/inference/tool-call-utils.js.map +1 -1
- package/dist/inference/tools.d.ts +1 -0
- package/dist/inference/tools.d.ts.map +1 -1
- package/dist/inference/tools.js +20 -3
- package/dist/inference/tools.js.map +1 -1
- package/dist/learning/agentic-route-gate.d.ts +104 -0
- package/dist/learning/agentic-route-gate.d.ts.map +1 -0
- package/dist/learning/agentic-route-gate.js +125 -0
- package/dist/learning/agentic-route-gate.js.map +1 -0
- package/dist/learning/auto-router.d.ts +89 -0
- package/dist/learning/auto-router.d.ts.map +1 -1
- package/dist/learning/auto-router.js +188 -8
- package/dist/learning/auto-router.js.map +1 -1
- package/dist/learning/build-prerequisites.d.ts +68 -0
- package/dist/learning/build-prerequisites.d.ts.map +1 -0
- package/dist/learning/build-prerequisites.js +267 -0
- package/dist/learning/build-prerequisites.js.map +1 -0
- package/dist/learning/continuation-intent.d.ts +43 -0
- package/dist/learning/continuation-intent.d.ts.map +1 -0
- package/dist/learning/continuation-intent.js +82 -0
- package/dist/learning/continuation-intent.js.map +1 -0
- package/dist/learning/error-repair.d.ts +23 -1
- package/dist/learning/error-repair.d.ts.map +1 -1
- package/dist/learning/error-repair.js +58 -0
- package/dist/learning/error-repair.js.map +1 -1
- package/dist/learning/knowledge-base.d.ts +124 -0
- package/dist/learning/knowledge-base.d.ts.map +1 -0
- package/dist/learning/knowledge-base.js +337 -0
- package/dist/learning/knowledge-base.js.map +1 -0
- package/dist/learning/model-harness.d.ts +19 -0
- package/dist/learning/model-harness.d.ts.map +1 -1
- package/dist/learning/model-harness.js +27 -0
- package/dist/learning/model-harness.js.map +1 -1
- package/dist/learning/model-selection.d.ts +2 -1
- package/dist/learning/model-selection.d.ts.map +1 -1
- package/dist/learning/model-selection.js +35 -2
- package/dist/learning/model-selection.js.map +1 -1
- package/dist/learning/project-docs.d.ts +83 -0
- package/dist/learning/project-docs.d.ts.map +1 -0
- package/dist/learning/project-docs.js +132 -0
- package/dist/learning/project-docs.js.map +1 -0
- package/dist/learning/prompt-budget.d.ts +91 -0
- package/dist/learning/prompt-budget.d.ts.map +1 -0
- package/dist/learning/prompt-budget.js +99 -0
- package/dist/learning/prompt-budget.js.map +1 -0
- package/dist/learning/quota-ledger.d.ts +13 -0
- package/dist/learning/quota-ledger.d.ts.map +1 -1
- package/dist/learning/quota-ledger.js +28 -0
- package/dist/learning/quota-ledger.js.map +1 -1
- package/dist/learning/reasoning-trace.d.ts +55 -2
- package/dist/learning/reasoning-trace.d.ts.map +1 -1
- package/dist/learning/reasoning-trace.js +48 -0
- package/dist/learning/reasoning-trace.js.map +1 -1
- package/dist/learning/resilient-call.d.ts.map +1 -1
- package/dist/learning/resilient-call.js +16 -3
- package/dist/learning/resilient-call.js.map +1 -1
- package/dist/learning/routing-history.d.ts +13 -0
- package/dist/learning/routing-history.d.ts.map +1 -1
- package/dist/learning/routing-history.js.map +1 -1
- package/dist/learning/seeded-benchmark.d.ts +14 -0
- package/dist/learning/seeded-benchmark.d.ts.map +1 -1
- package/dist/learning/seeded-benchmark.js +43 -4
- package/dist/learning/seeded-benchmark.js.map +1 -1
- package/dist/learning/turn-report.d.ts +78 -0
- package/dist/learning/turn-report.d.ts.map +1 -0
- package/dist/learning/turn-report.js +140 -0
- package/dist/learning/turn-report.js.map +1 -0
- package/dist/security/secret-scan.d.ts +156 -0
- package/dist/security/secret-scan.d.ts.map +1 -0
- package/dist/security/secret-scan.js +525 -0
- package/dist/security/secret-scan.js.map +1 -0
- package/dist/tools/edit-verification.d.ts +2 -11
- package/dist/tools/edit-verification.d.ts.map +1 -1
- package/dist/tools/edit-verification.js +33 -1
- package/dist/tools/edit-verification.js.map +1 -1
- package/dist/tools/loop-skill-hint.d.ts +51 -0
- package/dist/tools/loop-skill-hint.d.ts.map +1 -1
- package/dist/tools/loop-skill-hint.js +87 -2
- package/dist/tools/loop-skill-hint.js.map +1 -1
- package/dist/tools/plan-store.d.ts +126 -3
- package/dist/tools/plan-store.d.ts.map +1 -1
- package/dist/tools/plan-store.js +290 -6
- package/dist/tools/plan-store.js.map +1 -1
- package/dist/tools/registry.d.ts +20 -1
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +165 -4
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/remediation-ladder.d.ts +91 -0
- package/dist/tools/remediation-ladder.d.ts.map +1 -0
- package/dist/tools/remediation-ladder.js +308 -0
- package/dist/tools/remediation-ladder.js.map +1 -0
- package/dist/tools/run-terminal.d.ts.map +1 -1
- package/dist/tools/run-terminal.js +60 -2
- package/dist/tools/run-terminal.js.map +1 -1
- package/dist/tools/skills-hub.d.ts +7 -0
- package/dist/tools/skills-hub.d.ts.map +1 -1
- package/dist/tools/skills-hub.js +11 -2
- package/dist/tools/skills-hub.js.map +1 -1
- package/dist/tools/step-artifact.d.ts +35 -0
- package/dist/tools/step-artifact.d.ts.map +1 -0
- package/dist/tools/step-artifact.js +154 -0
- package/dist/tools/step-artifact.js.map +1 -0
- package/dist/tools/tool-loop.d.ts +35 -0
- package/dist/tools/tool-loop.d.ts.map +1 -1
- package/dist/tools/tool-loop.js +284 -9
- package/dist/tools/tool-loop.js.map +1 -1
- package/dist/tools/toolsets.js +4 -4
- package/dist/tools/toolsets.js.map +1 -1
- package/dist/tools/worktree.d.ts +11 -2
- package/dist/tools/worktree.d.ts.map +1 -1
- package/dist/tools/worktree.js +11 -2
- package/dist/tools/worktree.js.map +1 -1
- package/dist/utils/effect-verification.js +1 -1
- package/dist/utils/effect-verification.js.map +1 -1
- package/dist/web-dashboard/chat-console.d.ts +21 -1
- package/dist/web-dashboard/chat-console.d.ts.map +1 -1
- package/dist/web-dashboard/chat-console.js +33 -5
- package/dist/web-dashboard/chat-console.js.map +1 -1
- package/dist/web-dashboard/server.d.ts +29 -0
- package/dist/web-dashboard/server.d.ts.map +1 -1
- package/dist/web-dashboard/server.js +410 -5
- package/dist/web-dashboard/server.js.map +1 -1
- package/dist/web-dashboard/src/types.d.ts +137 -0
- package/dist/web-dashboard/src/types.d.ts.map +1 -1
- package/dist/web-dashboard/workspace-guard.d.ts +7 -0
- package/dist/web-dashboard/workspace-guard.d.ts.map +1 -1
- package/dist/web-dashboard/workspace-guard.js +70 -0
- package/dist/web-dashboard/workspace-guard.js.map +1 -1
- package/package.json +4 -1
- package/src/web-dashboard/public/assets/index-DhiuR4S2.js +210 -0
- package/src/web-dashboard/public/assets/index-DhiuR4S2.js.map +1 -0
- package/src/web-dashboard/public/assets/index-tK8Y2qHB.css +1 -0
- package/src/web-dashboard/public/index.html +2 -2
- package/src/web-dashboard/public/assets/index-BdKf5Xw2.js +0 -207
- package/src/web-dashboard/public/assets/index-BdKf5Xw2.js.map +0 -1
- package/src/web-dashboard/public/assets/index-C9eBskc9.css +0 -1
|
@@ -68,9 +68,28 @@ export function hasCredentials(configManager, provider) {
|
|
|
68
68
|
* failed outright.
|
|
69
69
|
*/
|
|
70
70
|
export const MODEL_HEALTH_CEILING = 0.6;
|
|
71
|
+
/**
|
|
72
|
+
* How much a verification SOURCE is worth when ranking models of equal health.
|
|
73
|
+
* Lower = more trustworthy, so it sorts first.
|
|
74
|
+
*
|
|
75
|
+
* A `spot-check` is a single 1-token generation: it proves the model NAME
|
|
76
|
+
* exists and accepts a request — it does NOT prove the model can hold a task.
|
|
77
|
+
* `telemetry` is real traffic (hundreds of samples), so it is the strongest
|
|
78
|
+
* evidence we have. Ranking them as equals let a model with six probe samples
|
|
79
|
+
* (observed live: `deepseek-v4-pro`, 6 samples) sit at errorRate 0 beside a
|
|
80
|
+
* model with 290 real calls (`deepseek-flash`) — and whenever the configured
|
|
81
|
+
* pin was dead, the fallback walk could then hand a caller a model that had
|
|
82
|
+
* never actually done a task. Real evidence must win.
|
|
83
|
+
*/
|
|
84
|
+
const SOURCE_CONFIDENCE = {
|
|
85
|
+
telemetry: 0,
|
|
86
|
+
'spot-check': 1,
|
|
87
|
+
probe: 2,
|
|
88
|
+
};
|
|
71
89
|
/**
|
|
72
90
|
* Verified working models for a provider, ranked by learned health:
|
|
73
|
-
*
|
|
91
|
+
* strongest verification source first, then lowest error rate, then lowest
|
|
92
|
+
* latency, then most recently verified.
|
|
74
93
|
* Empty when nothing has been verified yet (cold start / no keys).
|
|
75
94
|
*
|
|
76
95
|
* MODELS AT/ABOVE `MODEL_HEALTH_CEILING` SORT AFTER THE HEALTHY ONES but are
|
|
@@ -96,6 +115,13 @@ export function preferredModelsFor(provider) {
|
|
|
96
115
|
.sort((a, b) => {
|
|
97
116
|
const ea = registry.getEntry(provider, a);
|
|
98
117
|
const eb = registry.getEntry(provider, b);
|
|
118
|
+
// 1. Evidence strength. A model proven by real traffic must outrank one
|
|
119
|
+
// that only ever answered a 1-token probe — they are NOT equivalent
|
|
120
|
+
// evidence, and treating them as such is how an unproven model won.
|
|
121
|
+
const sa = SOURCE_CONFIDENCE[ea?.source ?? 'probe'] ?? 2;
|
|
122
|
+
const sb = SOURCE_CONFIDENCE[eb?.source ?? 'probe'] ?? 2;
|
|
123
|
+
if (sa !== sb)
|
|
124
|
+
return sa - sb;
|
|
99
125
|
const ra = ea?.errorRate ?? 0;
|
|
100
126
|
const rb = eb?.errorRate ?? 0;
|
|
101
127
|
if (ra !== rb)
|
|
@@ -156,8 +182,10 @@ export function rankAvailableProviders(configManager) {
|
|
|
156
182
|
// providers join routing the moment they appear in config. Nothing is
|
|
157
183
|
// hardcoded to the 6 built-ins anymore.
|
|
158
184
|
let configuredIds = [];
|
|
185
|
+
let providerConfig = {};
|
|
159
186
|
try {
|
|
160
|
-
|
|
187
|
+
providerConfig = configManager.getAll?.()?.providers ?? {};
|
|
188
|
+
configuredIds = Object.keys(providerConfig);
|
|
161
189
|
}
|
|
162
190
|
catch {
|
|
163
191
|
// Best-effort.
|
|
@@ -165,6 +193,11 @@ export function rankAvailableProviders(configManager) {
|
|
|
165
193
|
const candidates = [...new Set([...CATALOG_PROVIDER_IDS, ...configuredIds])].filter((p) => {
|
|
166
194
|
if (blocked.has(p))
|
|
167
195
|
return false;
|
|
196
|
+
// The dashboard's per-provider On/Off switch. Off removes the provider from
|
|
197
|
+
// the AUTO pool only; credentials stay on disk, and an explicit `--provider`
|
|
198
|
+
// pin is a user decision the router does not second-guess.
|
|
199
|
+
if (providerConfig[p]?.enabled === false)
|
|
200
|
+
return false;
|
|
168
201
|
// Keyless runners BEYOND `local` (nuvira, lmstudio, vllm) only join when the
|
|
169
202
|
// registry has VERIFIED them or the user explicitly configured them — a
|
|
170
203
|
// not-running localhost endpoint must never out-rank running local on a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-selection.js","sourceRoot":"","sources":["../../src/learning/model-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"model-selection.js","sourceRoot":"","sources":["../../src/learning/model-selection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PROJECT DOCUMENTATION (software deliverables).
|
|
3
|
+
*
|
|
4
|
+
* The gap this closes: a software build produced CODE and stopped. The
|
|
5
|
+
* documents a real project ships — a README, a changelog that grows with each
|
|
6
|
+
* change, a short architecture note with a diagram, and (for a library/service)
|
|
7
|
+
* usage + API docs — were only produced when the user named them, which is
|
|
8
|
+
* exactly backwards: a user should not have to ask a "world-class developer" to
|
|
9
|
+
* write down what it built.
|
|
10
|
+
*
|
|
11
|
+
* Two rules keep this from becoming noise:
|
|
12
|
+
*
|
|
13
|
+
* 1. **Software only.** This module is consulted ONLY for a `code` deliverable
|
|
14
|
+
* that is not authored (`deliverable-class.ts` already separates a poem
|
|
15
|
+
* from a program). Nobody wants a README and an ARCHITECTURE.md for
|
|
16
|
+
* "write me a poem about rain" — the classifier decides, and this guidance
|
|
17
|
+
* is never appended to an authored ask.
|
|
18
|
+
* 2. **Proportionate.** A README and a CHANGELOG are expected of every
|
|
19
|
+
* software deliverable; the heavier documents (architecture, API reference,
|
|
20
|
+
* contributing guide) are asked for only when the shape warrants them —
|
|
21
|
+
* a multi-component or library/service build, or an explicit request for
|
|
22
|
+
* docs. A one-file script still gets a README; it is not asked to invent an
|
|
23
|
+
* architecture diagram.
|
|
24
|
+
*
|
|
25
|
+
* It also encodes the maintenance rule the user cares about: an EXISTING
|
|
26
|
+
* document is UPDATED in place (CHANGELOG gets a new entry at the top), never
|
|
27
|
+
* shadowed by a second file — a project with two changelogs is worse than one
|
|
28
|
+
* with none.
|
|
29
|
+
*
|
|
30
|
+
* Pure and side-effect free: every input is data, so it is unit-testable and can
|
|
31
|
+
* be appended to any prompt without touching the filesystem.
|
|
32
|
+
*/
|
|
33
|
+
/** The canonical documents a software project ships, in priority order. */
|
|
34
|
+
export interface ProjectDocArtifact {
|
|
35
|
+
/** Project-relative path the document lives at. */
|
|
36
|
+
path: string;
|
|
37
|
+
/** What it is FOR — handed to the model so the document has a job. */
|
|
38
|
+
purpose: string;
|
|
39
|
+
/** Required of every software deliverable (README, CHANGELOG). */
|
|
40
|
+
always: boolean;
|
|
41
|
+
}
|
|
42
|
+
export declare const PROJECT_DOC_ARTIFACTS: readonly ProjectDocArtifact[];
|
|
43
|
+
/** What we know about the deliverable, from the goal + project assessment. */
|
|
44
|
+
export interface ProjectDocShape {
|
|
45
|
+
/**
|
|
46
|
+
* True when the workspace has no project yet (a scaffold). A greenfield build
|
|
47
|
+
* gets the full proportionate set rather than only the always-on pair.
|
|
48
|
+
*/
|
|
49
|
+
greenfield?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* A library, package, SDK or service — a thing other code CONSUMES — rather
|
|
52
|
+
* than an end-user app. Its public surface must be documented.
|
|
53
|
+
*/
|
|
54
|
+
isLibraryOrService?: boolean;
|
|
55
|
+
/** The project already exposes tests (or the agent is expected to write them). */
|
|
56
|
+
hasTests?: boolean;
|
|
57
|
+
/** Names the user explicitly asked for docs ("with documentation", "API docs"). */
|
|
58
|
+
docsRequested?: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Documents that ALREADY exist in the workspace (project-relative paths).
|
|
61
|
+
* These are UPDATED in place, never duplicated.
|
|
62
|
+
*/
|
|
63
|
+
existingDocs?: readonly string[];
|
|
64
|
+
}
|
|
65
|
+
/** The always-on pair, plus the heavier docs a bigger build warrants. */
|
|
66
|
+
export declare function requiredProjectDocs(shape?: ProjectDocShape): string[];
|
|
67
|
+
/**
|
|
68
|
+
* Does the goal name something other code CONSUMES (a library, package, SDK,
|
|
69
|
+
* CLI, service, plugin) rather than an end-user app? A consumed surface has a
|
|
70
|
+
* public API worth documenting; an app does not need an API reference.
|
|
71
|
+
*/
|
|
72
|
+
export declare function looksLikeLibraryOrService(goal: string): boolean;
|
|
73
|
+
/** The required docs that do NOT yet exist on disk (the ones to CREATE). */
|
|
74
|
+
export declare function missingProjectDocs(shape?: ProjectDocShape): string[];
|
|
75
|
+
/** The required docs that already exist (the ones to UPDATE, not recreate). */
|
|
76
|
+
export declare function existingProjectDocs(shape?: ProjectDocShape): string[];
|
|
77
|
+
/**
|
|
78
|
+
* The instruction appended to the reasoner/planner prompt for a SOFTWARE
|
|
79
|
+
* deliverable. Returns `''` for a non-software (authored) ask, so callers can
|
|
80
|
+
* append it unconditionally without a poem ever being asked for a CHANGELOG.
|
|
81
|
+
*/
|
|
82
|
+
export declare function softwareProjectGuidance(verdictClass: string, authored: boolean, shape?: ProjectDocShape): string;
|
|
83
|
+
//# sourceMappingURL=project-docs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-docs.d.ts","sourceRoot":"","sources":["../../src/learning/project-docs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,2EAA2E;AAC3E,MAAM,WAAW,kBAAkB;IACjC,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,eAAO,MAAM,qBAAqB,EAAE,SAAS,kBAAkB,EAqC9D,CAAC;AAEF,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mFAAmF;IACnF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,KAAK,GAAE,eAAoB,GAAG,MAAM,EAAE,CAOzE;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAU/D;AAED,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAAC,KAAK,GAAE,eAAoB,GAAG,MAAM,EAAE,CAGxE;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,KAAK,GAAE,eAAoB,GAAG,MAAM,EAAE,CAGzE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,OAAO,EACjB,KAAK,GAAE,eAAoB,GAC1B,MAAM,CAmCR"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PROJECT DOCUMENTATION (software deliverables).
|
|
3
|
+
*
|
|
4
|
+
* The gap this closes: a software build produced CODE and stopped. The
|
|
5
|
+
* documents a real project ships — a README, a changelog that grows with each
|
|
6
|
+
* change, a short architecture note with a diagram, and (for a library/service)
|
|
7
|
+
* usage + API docs — were only produced when the user named them, which is
|
|
8
|
+
* exactly backwards: a user should not have to ask a "world-class developer" to
|
|
9
|
+
* write down what it built.
|
|
10
|
+
*
|
|
11
|
+
* Two rules keep this from becoming noise:
|
|
12
|
+
*
|
|
13
|
+
* 1. **Software only.** This module is consulted ONLY for a `code` deliverable
|
|
14
|
+
* that is not authored (`deliverable-class.ts` already separates a poem
|
|
15
|
+
* from a program). Nobody wants a README and an ARCHITECTURE.md for
|
|
16
|
+
* "write me a poem about rain" — the classifier decides, and this guidance
|
|
17
|
+
* is never appended to an authored ask.
|
|
18
|
+
* 2. **Proportionate.** A README and a CHANGELOG are expected of every
|
|
19
|
+
* software deliverable; the heavier documents (architecture, API reference,
|
|
20
|
+
* contributing guide) are asked for only when the shape warrants them —
|
|
21
|
+
* a multi-component or library/service build, or an explicit request for
|
|
22
|
+
* docs. A one-file script still gets a README; it is not asked to invent an
|
|
23
|
+
* architecture diagram.
|
|
24
|
+
*
|
|
25
|
+
* It also encodes the maintenance rule the user cares about: an EXISTING
|
|
26
|
+
* document is UPDATED in place (CHANGELOG gets a new entry at the top), never
|
|
27
|
+
* shadowed by a second file — a project with two changelogs is worse than one
|
|
28
|
+
* with none.
|
|
29
|
+
*
|
|
30
|
+
* Pure and side-effect free: every input is data, so it is unit-testable and can
|
|
31
|
+
* be appended to any prompt without touching the filesystem.
|
|
32
|
+
*/
|
|
33
|
+
export const PROJECT_DOC_ARTIFACTS = [
|
|
34
|
+
{
|
|
35
|
+
path: 'README.md',
|
|
36
|
+
purpose: 'what the project is, how to install it, and a copy-pasteable quick start — the FIRST thing a ' +
|
|
37
|
+
'newcomer reads',
|
|
38
|
+
always: true,
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
path: 'CHANGELOG.md',
|
|
42
|
+
purpose: 'Keep a Changelog format, newest section first (Added / Changed / Fixed / Removed) — every ' +
|
|
43
|
+
'meaningful change appends an entry here',
|
|
44
|
+
always: true,
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
path: 'ARCHITECTURE.md',
|
|
48
|
+
purpose: 'the components, how data flows between them, and a diagram (a Mermaid `flowchart` or ' +
|
|
49
|
+
'`sequenceDiagram` block renders on GitHub with no tooling)',
|
|
50
|
+
always: false,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
path: 'docs/usage.md',
|
|
54
|
+
purpose: 'task-oriented guides: "how do I do X", with working examples',
|
|
55
|
+
always: false,
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
path: 'docs/api.md',
|
|
59
|
+
purpose: 'the public API reference — every exported symbol, its signature and an example',
|
|
60
|
+
always: false,
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
path: 'CONTRIBUTING.md',
|
|
64
|
+
purpose: 'how to build, test and submit a change (the commands a contributor needs)',
|
|
65
|
+
always: false,
|
|
66
|
+
},
|
|
67
|
+
];
|
|
68
|
+
/** The always-on pair, plus the heavier docs a bigger build warrants. */
|
|
69
|
+
export function requiredProjectDocs(shape = {}) {
|
|
70
|
+
const paths = PROJECT_DOC_ARTIFACTS.filter((a) => a.always).map((a) => a.path);
|
|
71
|
+
if (shape.isLibraryOrService || shape.docsRequested)
|
|
72
|
+
paths.push('docs/api.md', 'docs/usage.md');
|
|
73
|
+
if (shape.greenfield || shape.isLibraryOrService || shape.docsRequested)
|
|
74
|
+
paths.push('ARCHITECTURE.md');
|
|
75
|
+
if (shape.hasTests)
|
|
76
|
+
paths.push('CONTRIBUTING.md');
|
|
77
|
+
// De-dupe while preserving priority order.
|
|
78
|
+
return [...new Set(paths)];
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Does the goal name something other code CONSUMES (a library, package, SDK,
|
|
82
|
+
* CLI, service, plugin) rather than an end-user app? A consumed surface has a
|
|
83
|
+
* public API worth documenting; an app does not need an API reference.
|
|
84
|
+
*/
|
|
85
|
+
export function looksLikeLibraryOrService(goal) {
|
|
86
|
+
const consumed = /\b(library|lib|package|npm\s+package|sdk|module|cli|command[- ]?line|api|service|server|daemon|plugin|extension|framework|toolkit)\b/i.test(goal);
|
|
87
|
+
const endUserApp = /\b(website|web\s?app|webapp|landing\s+page|game|mobile\s+app|desktop\s+app|swiftui|android\s+app|ios\s+app)\b/i.test(goal);
|
|
88
|
+
return consumed && !endUserApp;
|
|
89
|
+
}
|
|
90
|
+
/** The required docs that do NOT yet exist on disk (the ones to CREATE). */
|
|
91
|
+
export function missingProjectDocs(shape = {}) {
|
|
92
|
+
const existing = new Set((shape.existingDocs ?? []).map((p) => p.replace(/^\.\//, '')));
|
|
93
|
+
return requiredProjectDocs(shape).filter((p) => !existing.has(p));
|
|
94
|
+
}
|
|
95
|
+
/** The required docs that already exist (the ones to UPDATE, not recreate). */
|
|
96
|
+
export function existingProjectDocs(shape = {}) {
|
|
97
|
+
const existing = new Set((shape.existingDocs ?? []).map((p) => p.replace(/^\.\//, '')));
|
|
98
|
+
return requiredProjectDocs(shape).filter((p) => existing.has(p));
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* The instruction appended to the reasoner/planner prompt for a SOFTWARE
|
|
102
|
+
* deliverable. Returns `''` for a non-software (authored) ask, so callers can
|
|
103
|
+
* append it unconditionally without a poem ever being asked for a CHANGELOG.
|
|
104
|
+
*/
|
|
105
|
+
export function softwareProjectGuidance(verdictClass, authored, shape = {}) {
|
|
106
|
+
if (authored || verdictClass !== 'code')
|
|
107
|
+
return '';
|
|
108
|
+
const create = missingProjectDocs(shape);
|
|
109
|
+
const update = existingProjectDocs(shape);
|
|
110
|
+
if (create.length === 0 && update.length === 0)
|
|
111
|
+
return '';
|
|
112
|
+
const purposeOf = (path) => PROJECT_DOC_ARTIFACTS.find((a) => a.path === path)?.purpose ?? 'project documentation';
|
|
113
|
+
const lines = [
|
|
114
|
+
'',
|
|
115
|
+
'## ⚠️ PROJECT DOCUMENTATION (this is a SOFTWARE deliverable)',
|
|
116
|
+
'Code is not the whole deliverable. A project is not finished until the',
|
|
117
|
+
'documents below exist and are current — include them as REAL plan steps with',
|
|
118
|
+
'`expectedFiles`, not as an afterthought.',
|
|
119
|
+
'',
|
|
120
|
+
'Create:',
|
|
121
|
+
];
|
|
122
|
+
for (const path of create)
|
|
123
|
+
lines.push(`- \`${path}\` — ${purposeOf(path)}`);
|
|
124
|
+
if (update.length > 0) {
|
|
125
|
+
lines.push('', 'Update IN PLACE (do NOT create a second copy or a parallel file):');
|
|
126
|
+
for (const path of update)
|
|
127
|
+
lines.push(`- \`${path}\` — add the new state of the project (for a CHANGELOG, a new top section)`);
|
|
128
|
+
}
|
|
129
|
+
lines.push('', 'Rules:', '- Every document must reflect what was ACTUALLY built — never invent features,', ' flags or files that do not exist.', '- A document you cannot fill honestly gets a shorter honest version, not filler.', '- If the project already has these documents, UPDATING them is the task; a', ' duplicate CHANGELOG or a shadow architecture file is a defect.', '- Keep the CHANGELOG append-only going forward: each change adds an entry, and', ' old entries are never rewritten.');
|
|
130
|
+
return lines.join('\n');
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=project-docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-docs.js","sourceRoot":"","sources":["../../src/learning/project-docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PROMPT BUDGET (Workstream D1).
|
|
3
|
+
*
|
|
4
|
+
* Context is a finite resource with diminishing marginal returns ("context
|
|
5
|
+
* rot"): as the prompt grows, recall and long-range reasoning get worse, so the
|
|
6
|
+
* harness must manage what it SENDS, not just what it stores. Industry practice
|
|
7
|
+
* converges on: a stable cached prefix + just-in-time retrieval + per-source
|
|
8
|
+
* caps + measurement at assembly time + deterministic degradation. This module
|
|
9
|
+
* provides the measurement and the degradation PLAN; the caller applies it.
|
|
10
|
+
*
|
|
11
|
+
* It is deliberately dependency-light and pure, so it can be unit tested without
|
|
12
|
+
* a provider, a project, or a terminal.
|
|
13
|
+
*
|
|
14
|
+
* NOTE: this is distinct from `context-budget.ts`, which resolves a model's
|
|
15
|
+
* WINDOW and output-token budget. `MAX_SYSTEM_PROMPT_CHARS` in reasoning-trace.ts
|
|
16
|
+
* bounds what the TRACE stores. This module's thresholds bound what the MODEL is
|
|
17
|
+
* SENT — the previously ungated thing (the 3.3.11 bloat was 7.6K → 32.8K chars
|
|
18
|
+
* sent with no guard).
|
|
19
|
+
*/
|
|
20
|
+
/** Character budgets for the outbound context (estimates, not token counts). */
|
|
21
|
+
export interface PromptBudget {
|
|
22
|
+
/** Note once the whole thread exceeds this many chars. */
|
|
23
|
+
noteTotal: number;
|
|
24
|
+
/** Warn once the whole thread exceeds this many chars. */
|
|
25
|
+
warnTotal: number;
|
|
26
|
+
/** Hard ceiling: trim optional contributors until under this. */
|
|
27
|
+
maxTotal: number;
|
|
28
|
+
/** Note once the stable SYSTEM layer exceeds this. */
|
|
29
|
+
noteSystem: number;
|
|
30
|
+
/** Warn once the stable SYSTEM layer exceeds this. */
|
|
31
|
+
warnSystem: number;
|
|
32
|
+
}
|
|
33
|
+
export declare const DEFAULT_PROMPT_BUDGET: PromptBudget;
|
|
34
|
+
interface ConfigLike {
|
|
35
|
+
getAll?: () => {
|
|
36
|
+
routing?: {
|
|
37
|
+
promptBudget?: Partial<PromptBudget>;
|
|
38
|
+
};
|
|
39
|
+
} | undefined;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Resolve the budget: `routing.promptBudget` overrides the defaults per key.
|
|
43
|
+
* Unknown/invalid values fall through rather than throwing.
|
|
44
|
+
*/
|
|
45
|
+
export declare function resolvePromptBudget(configManager?: ConfigLike): PromptBudget;
|
|
46
|
+
/** How far over budget the outbound context is. */
|
|
47
|
+
export type PromptBudgetLevel = 'ok' | 'note' | 'warn' | 'over';
|
|
48
|
+
/** One contributor to the outbound context. */
|
|
49
|
+
export interface PromptContribution {
|
|
50
|
+
/** Stable name (`system:identity+tool-contract`, `skill-hint`, …). */
|
|
51
|
+
name: string;
|
|
52
|
+
/** Size in chars. */
|
|
53
|
+
chars: number;
|
|
54
|
+
/**
|
|
55
|
+
* Degradation order: lower drops FIRST. `undefined` = never dropped (the
|
|
56
|
+
* identity/tool contract and safety clauses must survive any trim).
|
|
57
|
+
*/
|
|
58
|
+
dropPriority?: number;
|
|
59
|
+
}
|
|
60
|
+
export interface PromptBudgetReport {
|
|
61
|
+
/** Total outbound chars across every contribution. */
|
|
62
|
+
totalChars: number;
|
|
63
|
+
/** The stable SYSTEM layer's chars. */
|
|
64
|
+
systemChars: number;
|
|
65
|
+
/** Budget band the total fell into. */
|
|
66
|
+
level: PromptBudgetLevel;
|
|
67
|
+
/** Contributions, largest first. */
|
|
68
|
+
contributions: PromptContribution[];
|
|
69
|
+
/** The single largest contributor (the one to attack first). */
|
|
70
|
+
biggest?: PromptContribution;
|
|
71
|
+
/**
|
|
72
|
+
* Names to drop, lowest value first, until the total fits under `maxTotal`.
|
|
73
|
+
* Empty when already under. Never includes a contribution without a
|
|
74
|
+
* `dropPriority`.
|
|
75
|
+
*/
|
|
76
|
+
trims: string[];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Measure the outbound context and decide, deterministically, what to trim.
|
|
80
|
+
*
|
|
81
|
+
* The `system:`-prefixed contributions (identity/tool-contract, channel policy)
|
|
82
|
+
* are treated as the stable layer for the system budget.
|
|
83
|
+
*/
|
|
84
|
+
export declare function measurePromptBudget(parts: PromptContribution[], opts?: {
|
|
85
|
+
budget?: PromptBudget;
|
|
86
|
+
systemName?: string;
|
|
87
|
+
}): PromptBudgetReport;
|
|
88
|
+
/** A compact one-line breakdown for the console / trace summary. */
|
|
89
|
+
export declare function formatPromptBudgetBreakdown(report: PromptBudgetReport): string;
|
|
90
|
+
export {};
|
|
91
|
+
//# sourceMappingURL=prompt-budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-budget.d.ts","sourceRoot":"","sources":["../../src/learning/prompt-budget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,gFAAgF;AAChF,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,qBAAqB,EAAE,YAMnC,CAAC;AAOF,UAAU,UAAU;IAClB,MAAM,CAAC,EAAE,MAAM;QAAE,OAAO,CAAC,EAAE;YAAE,YAAY,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;SAAE,CAAA;KAAE,GAAG,SAAS,CAAC;CACnF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,CAAC,EAAE,UAAU,GAAG,YAAY,CAe5E;AAED,mDAAmD;AACnD,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhE,+CAA+C;AAC/C,MAAM,WAAW,kBAAkB;IACjC,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,KAAK,EAAE,iBAAiB,CAAC;IACzB,oCAAoC;IACpC,aAAa,EAAE,kBAAkB,EAAE,CAAC;IACpC,gEAAgE;IAChE,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B;;;;OAIG;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAID;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,kBAAkB,EAAE,EAC3B,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,YAAY,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD,kBAAkB,CAsCpB;AAED,oEAAoE;AACpE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAG9E"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PROMPT BUDGET (Workstream D1).
|
|
3
|
+
*
|
|
4
|
+
* Context is a finite resource with diminishing marginal returns ("context
|
|
5
|
+
* rot"): as the prompt grows, recall and long-range reasoning get worse, so the
|
|
6
|
+
* harness must manage what it SENDS, not just what it stores. Industry practice
|
|
7
|
+
* converges on: a stable cached prefix + just-in-time retrieval + per-source
|
|
8
|
+
* caps + measurement at assembly time + deterministic degradation. This module
|
|
9
|
+
* provides the measurement and the degradation PLAN; the caller applies it.
|
|
10
|
+
*
|
|
11
|
+
* It is deliberately dependency-light and pure, so it can be unit tested without
|
|
12
|
+
* a provider, a project, or a terminal.
|
|
13
|
+
*
|
|
14
|
+
* NOTE: this is distinct from `context-budget.ts`, which resolves a model's
|
|
15
|
+
* WINDOW and output-token budget. `MAX_SYSTEM_PROMPT_CHARS` in reasoning-trace.ts
|
|
16
|
+
* bounds what the TRACE stores. This module's thresholds bound what the MODEL is
|
|
17
|
+
* SENT — the previously ungated thing (the 3.3.11 bloat was 7.6K → 32.8K chars
|
|
18
|
+
* sent with no guard).
|
|
19
|
+
*/
|
|
20
|
+
export const DEFAULT_PROMPT_BUDGET = {
|
|
21
|
+
noteTotal: 24_000,
|
|
22
|
+
warnTotal: 40_000,
|
|
23
|
+
maxTotal: 48_000,
|
|
24
|
+
noteSystem: 8_000,
|
|
25
|
+
warnSystem: 12_000,
|
|
26
|
+
};
|
|
27
|
+
function positiveInt(v, fallback) {
|
|
28
|
+
const n = Number(v);
|
|
29
|
+
return Number.isFinite(n) && n > 0 ? Math.round(n) : fallback;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Resolve the budget: `routing.promptBudget` overrides the defaults per key.
|
|
33
|
+
* Unknown/invalid values fall through rather than throwing.
|
|
34
|
+
*/
|
|
35
|
+
export function resolvePromptBudget(configManager) {
|
|
36
|
+
let overrides;
|
|
37
|
+
try {
|
|
38
|
+
overrides = configManager?.getAll?.()?.routing?.promptBudget;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
overrides = undefined;
|
|
42
|
+
}
|
|
43
|
+
const o = overrides ?? {};
|
|
44
|
+
return {
|
|
45
|
+
noteTotal: positiveInt(o.noteTotal, DEFAULT_PROMPT_BUDGET.noteTotal),
|
|
46
|
+
warnTotal: positiveInt(o.warnTotal, DEFAULT_PROMPT_BUDGET.warnTotal),
|
|
47
|
+
maxTotal: positiveInt(o.maxTotal, DEFAULT_PROMPT_BUDGET.maxTotal),
|
|
48
|
+
noteSystem: positiveInt(o.noteSystem, DEFAULT_PROMPT_BUDGET.noteSystem),
|
|
49
|
+
warnSystem: positiveInt(o.warnSystem, DEFAULT_PROMPT_BUDGET.warnSystem),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const SYSTEM_NAME_PREFIX = 'system:';
|
|
53
|
+
/**
|
|
54
|
+
* Measure the outbound context and decide, deterministically, what to trim.
|
|
55
|
+
*
|
|
56
|
+
* The `system:`-prefixed contributions (identity/tool-contract, channel policy)
|
|
57
|
+
* are treated as the stable layer for the system budget.
|
|
58
|
+
*/
|
|
59
|
+
export function measurePromptBudget(parts, opts) {
|
|
60
|
+
const budget = opts?.budget ?? DEFAULT_PROMPT_BUDGET;
|
|
61
|
+
const clean = parts
|
|
62
|
+
.filter((p) => Number.isFinite(p.chars) && p.chars > 0)
|
|
63
|
+
.map((p) => ({ ...p, chars: Math.round(p.chars) }));
|
|
64
|
+
const totalChars = clean.reduce((n, p) => n + p.chars, 0);
|
|
65
|
+
const systemChars = clean
|
|
66
|
+
.filter((p) => p.name.startsWith(SYSTEM_NAME_PREFIX) || p.name === opts?.systemName)
|
|
67
|
+
.reduce((n, p) => n + p.chars, 0);
|
|
68
|
+
const level = totalChars > budget.maxTotal
|
|
69
|
+
? 'over'
|
|
70
|
+
: totalChars > budget.warnTotal || systemChars > budget.warnSystem
|
|
71
|
+
? 'warn'
|
|
72
|
+
: totalChars > budget.noteTotal || systemChars > budget.noteSystem
|
|
73
|
+
? 'note'
|
|
74
|
+
: 'ok';
|
|
75
|
+
const contributions = [...clean].sort((a, b) => b.chars - a.chars);
|
|
76
|
+
const biggest = contributions[0];
|
|
77
|
+
// Deterministic ladder: drop optional contributors by ascending dropPriority
|
|
78
|
+
// (lowest value = least valuable = dropped first) until under the ceiling.
|
|
79
|
+
const trims = [];
|
|
80
|
+
if (totalChars > budget.maxTotal) {
|
|
81
|
+
const droppable = clean
|
|
82
|
+
.filter((p) => p.dropPriority !== undefined)
|
|
83
|
+
.sort((a, b) => (a.dropPriority ?? 0) - (b.dropPriority ?? 0));
|
|
84
|
+
let running = totalChars;
|
|
85
|
+
for (const p of droppable) {
|
|
86
|
+
if (running <= budget.maxTotal)
|
|
87
|
+
break;
|
|
88
|
+
trims.push(p.name);
|
|
89
|
+
running -= p.chars;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return { totalChars, systemChars, level, contributions, biggest, trims };
|
|
93
|
+
}
|
|
94
|
+
/** A compact one-line breakdown for the console / trace summary. */
|
|
95
|
+
export function formatPromptBudgetBreakdown(report) {
|
|
96
|
+
const top = report.contributions.slice(0, 5).map((c) => `${c.name} ${c.chars}`);
|
|
97
|
+
return `context ${report.totalChars} chars (${report.level}) — ${top.join(', ')}`;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=prompt-budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-budget.js","sourceRoot":"","sources":["../../src/learning/prompt-budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -215,6 +215,19 @@ export declare class QuotaLedger {
|
|
|
215
215
|
* Effective quota limits for a provider from config (`routing.quota`).
|
|
216
216
|
*/
|
|
217
217
|
private limitsFor;
|
|
218
|
+
/**
|
|
219
|
+
* ADMIN-BUDGET exhaustion ONLY: is this provider over the window budget the
|
|
220
|
+
* user DECLARED in `routing.quota.<provider>`?
|
|
221
|
+
*
|
|
222
|
+
* Deliberately ignores transient parks/cooldowns. A rate-limit park is a
|
|
223
|
+
* provider hiccup that may clear in seconds and says nothing about the user's
|
|
224
|
+
* plan; the admin budget is a control the user set, so the two must be
|
|
225
|
+
* separable. The pinned-run preflight reads THIS (a declared limit) — never
|
|
226
|
+
* the blended `getRouterQuotaStatus()` — so an explicit selection is refused
|
|
227
|
+
* only when it genuinely exceeds the budget the user configured, and is still
|
|
228
|
+
* given its shot after a transient 429.
|
|
229
|
+
*/
|
|
230
|
+
isOverConfiguredLimit(configManager: ConfigManager | undefined, provider: string): boolean;
|
|
218
231
|
/**
|
|
219
232
|
* Build the router's "parked providers" feed — providers that must sink
|
|
220
233
|
* below healthy candidates because they are exhausted or in cooldown.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota-ledger.d.ts","sourceRoot":"","sources":["../../src/learning/quota-ledger.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"quota-ledger.d.ts","sourceRoot":"","sources":["../../src/learning/quota-ledger.ts"],"names":[],"mappings":"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"}
|
|
@@ -437,6 +437,34 @@ export class QuotaLedger {
|
|
|
437
437
|
limitsFor(configManager, provider) {
|
|
438
438
|
return configManager?.getAll().routing?.quota?.[provider];
|
|
439
439
|
}
|
|
440
|
+
/**
|
|
441
|
+
* ADMIN-BUDGET exhaustion ONLY: is this provider over the window budget the
|
|
442
|
+
* user DECLARED in `routing.quota.<provider>`?
|
|
443
|
+
*
|
|
444
|
+
* Deliberately ignores transient parks/cooldowns. A rate-limit park is a
|
|
445
|
+
* provider hiccup that may clear in seconds and says nothing about the user's
|
|
446
|
+
* plan; the admin budget is a control the user set, so the two must be
|
|
447
|
+
* separable. The pinned-run preflight reads THIS (a declared limit) — never
|
|
448
|
+
* the blended `getRouterQuotaStatus()` — so an explicit selection is refused
|
|
449
|
+
* only when it genuinely exceeds the budget the user configured, and is still
|
|
450
|
+
* given its shot after a transient 429.
|
|
451
|
+
*/
|
|
452
|
+
isOverConfiguredLimit(configManager, provider) {
|
|
453
|
+
const limit = this.limitsFor(configManager, provider);
|
|
454
|
+
if (!limit)
|
|
455
|
+
return false;
|
|
456
|
+
let requests = 0;
|
|
457
|
+
let tokens = 0;
|
|
458
|
+
for (const entry of Object.values(this.state.entries)) {
|
|
459
|
+
if (entry.provider !== provider)
|
|
460
|
+
continue;
|
|
461
|
+
this.rotateWindow(entry);
|
|
462
|
+
requests += entry.requests;
|
|
463
|
+
tokens += entry.tokensConsumed;
|
|
464
|
+
}
|
|
465
|
+
return ((limit.requestsPerWindow !== undefined && requests >= limit.requestsPerWindow) ||
|
|
466
|
+
(limit.tokensPerWindow !== undefined && tokens >= limit.tokensPerWindow));
|
|
467
|
+
}
|
|
440
468
|
/**
|
|
441
469
|
* Build the router's "parked providers" feed — providers that must sink
|
|
442
470
|
* below healthy candidates because they are exhausted or in cooldown.
|