@wrongstack/core 0.73.1 → 0.82.6
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/{agent-bridge-C0Ze7Ldm.d.ts → agent-bridge-C9P_HPez.d.ts} +2 -2
- package/dist/{agent-subagent-runner-BmITbs1Q.d.ts → agent-subagent-runner-2Aq0jOSj.d.ts} +107 -102
- package/dist/{compactor-D_ExJajC.d.ts → compactor-CJq7LQev.d.ts} +3 -3
- package/dist/{config-Dy0CK_o6.d.ts → config-_DZ7dN-T.d.ts} +77 -75
- package/dist/{context-y87Jc5ei.d.ts → context-ToHAp4-U.d.ts} +119 -90
- package/dist/coordination/index.d.ts +16 -16
- package/dist/coordination/index.js +382 -43
- package/dist/coordination/index.js.map +1 -1
- package/dist/defaults/index.d.ts +31 -31
- package/dist/defaults/index.js +524 -110
- package/dist/defaults/index.js.map +1 -1
- package/dist/{director-state-BmYi3DGA.d.ts → director-state-CgIc30qi.d.ts} +19 -19
- package/dist/{events-BBAlxBuw.d.ts → events-DnRqXaZ3.d.ts} +77 -39
- package/dist/execution/index.d.ts +53 -53
- package/dist/execution/index.js +67 -23
- package/dist/execution/index.js.map +1 -1
- package/dist/extension/index.d.ts +9 -9
- package/dist/extension/index.js +8 -1
- package/dist/extension/index.js.map +1 -1
- package/dist/{goal-store-C7jcumEh.d.ts → goal-store-DvWLNu52.d.ts} +4 -4
- package/dist/{index-yQbZ2NQx.d.ts → index-BNOLadHw.d.ts} +28 -28
- package/dist/{index-BN6i2Nfg.d.ts → index-N0_c4bHQ.d.ts} +45 -45
- package/dist/index.d.ts +233 -160
- package/dist/index.js +825 -160
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/index.d.ts +9 -9
- package/dist/infrastructure/index.js +29 -7
- package/dist/infrastructure/index.js.map +1 -1
- package/dist/kernel/index.d.ts +14 -14
- package/dist/kernel/index.js +7 -0
- package/dist/kernel/index.js.map +1 -1
- package/dist/logger-B72yyPc6.d.ts +12 -0
- package/dist/{logger-bOzkF5LL.d.ts → logger-C_27pj9i.d.ts} +12 -4
- package/dist/{mcp-servers-T0O6UN_w.d.ts → mcp-servers-Dck3T85_.d.ts} +20 -20
- package/dist/{mode-BO4SEUIv.d.ts → mode-CHo2XtHs.d.ts} +4 -4
- package/dist/models/index.d.ts +10 -10
- package/dist/models/index.js +8 -2
- package/dist/models/index.js.map +1 -1
- package/dist/{models-registry-BcYJDKLm.d.ts → models-registry-Be3osGt5.d.ts} +28 -28
- package/dist/{models-registry-Cuq1C8V9.d.ts → models-registry-Boz639EI.d.ts} +12 -12
- package/dist/{multi-agent-coordinator-BSBbZt0e.d.ts → multi-agent-coordinator-DllpCVkF.d.ts} +12 -12
- package/dist/{null-fleet-bus-BCIRT_nV.d.ts → null-fleet-bus-BY0AN-sr.d.ts} +129 -120
- package/dist/observability/index.d.ts +41 -41
- package/dist/observability/index.js.map +1 -1
- package/dist/{observability-BhnVLBLS.d.ts → observability-CoSNZdhX.d.ts} +4 -4
- package/dist/{parallel-eternal-engine-CjAYGaCw.d.ts → parallel-eternal-engine-D402RASp.d.ts} +49 -49
- package/dist/{path-resolver-BnqXa9Ze.d.ts → path-resolver-UPFTsDyD.d.ts} +6 -6
- package/dist/{permission-V5BLOrY6.d.ts → permission-14CChMmO.d.ts} +10 -8
- package/dist/{permission-policy-CBVx-d-8.d.ts → permission-policy-gW5htOo1.d.ts} +7 -7
- package/dist/{plan-templates-DBgrTGPu.d.ts → plan-templates-DRvPgkfZ.d.ts} +70 -32
- package/dist/{provider-runner-n3KkHT_w.d.ts → provider-runner-COAJM8tC.d.ts} +6 -6
- package/dist/{retry-policy-CG3qvH_e.d.ts → retry-policy-DSu6O6rD.d.ts} +4 -4
- package/dist/sdd/index.d.ts +47 -47
- package/dist/sdd/index.js +47 -22
- package/dist/sdd/index.js.map +1 -1
- package/dist/security/index.d.ts +6 -6
- package/dist/security/index.js +7 -1
- package/dist/security/index.js.map +1 -1
- package/dist/{selector-RvBR_YRW.d.ts → selector-11-fm95U.d.ts} +2 -2
- package/dist/{session-event-bridge-CDHxcmQU.d.ts → session-event-bridge-D0u-x576.d.ts} +7 -7
- package/dist/{session-reader-BIpwM60D.d.ts → session-reader-BQU-toaN.d.ts} +23 -23
- package/dist/{skill-CxuWrsKK.d.ts → skill-BJeF2DwY.d.ts} +1 -1
- package/dist/skills/index.d.ts +9 -9
- package/dist/skills/index.js +15 -3
- package/dist/skills/index.js.map +1 -1
- package/dist/storage/index.d.ts +15 -15
- package/dist/storage/index.js +398 -80
- package/dist/storage/index.js.map +1 -1
- package/dist/{system-prompt-CA11g6Jo.d.ts → system-prompt-C0rLCeyn.d.ts} +16 -11
- package/dist/{task-graph-D1YQbpxF.d.ts → task-graph-CikNdRTG.d.ts} +22 -22
- package/dist/types/index.d.ts +25 -25
- package/dist/types/index.js +61 -12
- package/dist/types/index.js.map +1 -1
- package/dist/utils/index.d.ts +46 -45
- package/dist/utils/index.js +64 -13
- package/dist/utils/index.js.map +1 -1
- package/dist/{wstack-paths-eMXnY1_X.d.ts → wstack-paths-BQMvEllz.d.ts} +10 -3
- package/package.json +1 -1
- package/dist/logger-DDd5C--Z.d.ts +0 -12
package/dist/models/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { D as DefaultModelsRegistry, a as DefaultModelsRegistryOptions, c as classifyFamily } from '../models-registry-
|
|
2
|
-
import { c as ModeStore, a as ModeConfig, M as Mode } from '../mode-
|
|
3
|
-
import { m as Provider, M as Message } from '../context-
|
|
4
|
-
import { M as MessageSelector, S as SelectorResult } from '../selector-
|
|
5
|
-
import '../models-registry-
|
|
1
|
+
export { D as DefaultModelsRegistry, a as DefaultModelsRegistryOptions, c as classifyFamily } from '../models-registry-Boz639EI.js';
|
|
2
|
+
import { c as ModeStore, a as ModeConfig, M as Mode } from '../mode-CHo2XtHs.js';
|
|
3
|
+
import { m as Provider, M as Message } from '../context-ToHAp4-U.js';
|
|
4
|
+
import { M as MessageSelector, S as SelectorResult } from '../selector-11-fm95U.js';
|
|
5
|
+
import '../models-registry-Be3osGt5.js';
|
|
6
6
|
|
|
7
7
|
declare class DefaultModeStore implements ModeStore {
|
|
8
8
|
private activeModeId;
|
|
@@ -19,8 +19,8 @@ declare class DefaultModeStore implements ModeStore {
|
|
|
19
19
|
private saveActiveMode;
|
|
20
20
|
}
|
|
21
21
|
interface ModeLoaderOptions {
|
|
22
|
-
projectModesDir?: string;
|
|
23
|
-
userModesDir?: string;
|
|
22
|
+
projectModesDir?: string | undefined;
|
|
23
|
+
userModesDir?: string | undefined;
|
|
24
24
|
}
|
|
25
25
|
declare function loadProjectModes(modesDir: string): Promise<Mode[]>;
|
|
26
26
|
declare function loadUserModes(modesDir: string): Promise<Mode[]>;
|
|
@@ -29,17 +29,17 @@ interface LLMSelectorOptions {
|
|
|
29
29
|
/** Provider used for the selector LLM call. Required. */
|
|
30
30
|
provider: Provider;
|
|
31
31
|
/** Model for the selector. Defaults to the provider's default model. */
|
|
32
|
-
model?: string;
|
|
32
|
+
model?: string | undefined;
|
|
33
33
|
/**
|
|
34
34
|
* Maximum tokens to keep in context (target budget).
|
|
35
35
|
* Selector will aim to keep total content below this.
|
|
36
36
|
*/
|
|
37
|
-
maxContextTokens?: number;
|
|
37
|
+
maxContextTokens?: number | undefined;
|
|
38
38
|
/**
|
|
39
39
|
* Prompt instructing the selector how to behave.
|
|
40
40
|
* Should guide the LLM on importance tiers and output format.
|
|
41
41
|
*/
|
|
42
|
-
systemPrompt?: string;
|
|
42
|
+
systemPrompt?: string | undefined;
|
|
43
43
|
}
|
|
44
44
|
/**
|
|
45
45
|
* LLM-powered message selector. Calls a sub-LLM to analyze the
|
package/dist/models/index.js
CHANGED
|
@@ -754,6 +754,12 @@ function isTextBlock(b) {
|
|
|
754
754
|
}
|
|
755
755
|
|
|
756
756
|
// src/models/llm-selector.ts
|
|
757
|
+
function expectDefined(value) {
|
|
758
|
+
if (value === null || value === void 0) {
|
|
759
|
+
throw new Error("Expected value to be defined");
|
|
760
|
+
}
|
|
761
|
+
return value;
|
|
762
|
+
}
|
|
757
763
|
var DEFAULT_SYSTEM_PROMPT = `You are a context pruning assistant. Given a conversation history and a token budget, decide which message ranges are worth keeping verbatim and which should be collapsed into summaries.
|
|
758
764
|
|
|
759
765
|
Output a JSON object with this structure:
|
|
@@ -794,7 +800,7 @@ function formatMessages(messages, maxChars = 8e3) {
|
|
|
794
800
|
const lines = [];
|
|
795
801
|
let used = 0;
|
|
796
802
|
for (let i = 0; i < messages.length; i++) {
|
|
797
|
-
const m = messages[i];
|
|
803
|
+
const m = expectDefined(messages[i]);
|
|
798
804
|
const role = m.role.padEnd(10, " ");
|
|
799
805
|
let text;
|
|
800
806
|
if (typeof m.content === "string") {
|
|
@@ -859,7 +865,7 @@ IMPORTANT: Total conversation (${totalTokens} tokens) exceeds budget (${effectiv
|
|
|
859
865
|
let tokenCount = 0;
|
|
860
866
|
let startIdx = 0;
|
|
861
867
|
for (let i = messages.length - 1; i >= 0; i--) {
|
|
862
|
-
const m = messages[i];
|
|
868
|
+
const m = expectDefined(messages[i]);
|
|
863
869
|
const cost = typeof m.content === "string" ? Math.ceil(m.content.length / 4) : m.content.reduce(
|
|
864
870
|
(acc, b) => acc + (b.type === "text" ? Math.ceil(b.text.length / 4) : Math.ceil(JSON.stringify(b).length / 4)),
|
|
865
871
|
0
|
package/dist/models/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/atomic-write.ts","../../src/utils/merge-models-payload.ts","../../src/models/models-registry.ts","../../src/types/mode.ts","../../src/models/mode-store.ts","../../src/types/blocks.ts","../../src/models/llm-selector.ts"],"names":["path","stat","resolve","path2","fs2","fs3"],"mappings":"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","file":"index.js","sourcesContent":["import { randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface AtomicWriteOptions {\n mode?: number;\n encoding?: BufferEncoding;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array,\n opts: AtomicWriteOptions = {},\n): Promise<void> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = path.join(dir, `.${path.basename(targetPath)}.${randomBytes(6).toString('hex')}.tmp`);\n\n // Write content to tmp first; 'wx' ensures exclusive creation (fails if\n // tmp already exists — extremely unlikely with 6-byte random suffix).\n try {\n if (typeof content === 'string') {\n await fs.writeFile(tmp, content, { flag: 'wx', encoding: opts.encoding ?? 'utf8' });\n } else {\n await fs.writeFile(tmp, content, { flag: 'wx' });\n }\n try {\n const fh = await fs.open(tmp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync best-effort\n }\n // Now safely read mode from target (if it exists) and apply to tmp before rename.\n // Prefer opts.mode for new files; for existing files preserve their mode.\n let mode: number | undefined;\n try {\n const stat = await fs.stat(targetPath);\n mode = stat.mode & 0o777;\n } catch {\n mode = opts.mode;\n }\n if (mode !== undefined) {\n await fs.chmod(tmp, mode);\n }\n await renameWithRetry(tmp, targetPath);\n } catch (err) {\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore cleanup error\n }\n throw err;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\n// On Windows, fs.rename over an existing file can fail with EPERM/EBUSY/EACCES\n// when antivirus, file indexers, editor file watchers, or a concurrent writer\n// briefly hold a handle on the destination. These are transient — retry with a\n// short backoff before giving up. POSIX renames are atomic and won't hit this.\nconst TRANSIENT_RENAME_CODES = new Set(['EPERM', 'EBUSY', 'EACCES', 'ENOTEMPTY']);\n\nasync function renameWithRetry(from: string, to: string): Promise<void> {\n if (process.platform !== 'win32') {\n await fs.rename(from, to);\n return;\n }\n const delays = [10, 25, 60, 120, 250];\n let lastErr: unknown;\n for (let i = 0; i <= delays.length; i++) {\n try {\n await fs.rename(from, to);\n return;\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException)?.code;\n if (!code || !TRANSIENT_RENAME_CODES.has(code) || i === delays.length) {\n throw err;\n }\n await new Promise((resolve) => setTimeout(resolve, delays[i]));\n }\n }\n throw lastErr;\n}\n","import type {\n ModelsDevModel,\n ModelsDevProvider,\n ModelsDevPayload,\n} from '../types/models-registry.js';\n\n/**\n * Deep-merge a curated `overlay` payload on top of a `base` payload (both in\n * the models.dev `api.json` shape). The overlay always wins: it can add\n * providers/models the base lacks and override fields the base gets wrong.\n *\n * Precedence rules:\n * - Provider present in both → scalar fields (`name`, `npm`, `api`, `env`,\n * `doc`) come from the overlay when set; `models` maps merge by model id.\n * - Provider only in the overlay → added wholesale.\n * - Model present in both → overlay model fields override base model fields\n * (`{ ...base, ...overlay }`), with the nested `limit` / `cost` /\n * `modalities` objects merged one level deeper so an overlay can fix just\n * `limit.context` without restating the rest of the model.\n * - Model only in the overlay → added.\n *\n * Pure: never mutates its inputs.\n */\nexport function mergeModelsPayload(\n base: ModelsDevPayload,\n overlay: ModelsDevPayload,\n): ModelsDevPayload {\n const out: ModelsDevPayload = {};\n for (const [id, provider] of Object.entries(base)) {\n out[id] = cloneProvider(provider);\n }\n for (const [id, ovProvider] of Object.entries(overlay)) {\n const existing = out[id];\n out[id] = existing ? mergeProvider(existing, ovProvider) : cloneProvider(ovProvider);\n }\n return out;\n}\n\nfunction mergeProvider(base: ModelsDevProvider, overlay: ModelsDevProvider): ModelsDevProvider {\n const models: Record<string, ModelsDevModel> = {};\n for (const [mid, m] of Object.entries(base.models ?? {})) {\n models[mid] = { ...m };\n }\n for (const [mid, ovModel] of Object.entries(overlay.models ?? {})) {\n const existing = models[mid];\n models[mid] = existing ? mergeModel(existing, ovModel) : { ...ovModel };\n }\n return {\n ...base,\n // Overlay scalar fields win when explicitly provided; otherwise keep base.\n ...stripUndefined({\n id: overlay.id,\n name: overlay.name,\n npm: overlay.npm,\n api: overlay.api,\n env: overlay.env,\n doc: overlay.doc,\n }),\n models,\n };\n}\n\nfunction mergeModel(base: ModelsDevModel, overlay: ModelsDevModel): ModelsDevModel {\n const merged: ModelsDevModel = { ...base, ...overlay };\n // One level deeper for the structured fields so a partial overlay (e.g. only\n // `limit.context`) doesn't blow away the base's other sub-fields.\n if (base.limit || overlay.limit) {\n merged.limit = { ...base.limit, ...overlay.limit };\n }\n if (base.cost || overlay.cost) {\n merged.cost = { ...base.cost, ...overlay.cost };\n }\n if (base.modalities || overlay.modalities) {\n merged.modalities = { ...base.modalities, ...overlay.modalities };\n }\n return merged;\n}\n\nfunction cloneProvider(p: ModelsDevProvider): ModelsDevProvider {\n const models: Record<string, ModelsDevModel> = {};\n for (const [mid, m] of Object.entries(p.models ?? {})) {\n models[mid] = { ...m };\n }\n return { ...p, models };\n}\n\n/** Drop keys whose value is `undefined` so they don't clobber base fields. */\nfunction stripUndefined<T extends Record<string, unknown>>(obj: T): Partial<T> {\n const out: Partial<T> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (v !== undefined) out[k as keyof T] = v as T[keyof T];\n }\n return out;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n ModelsDevPayload,\n ModelsDevProvider,\n ModelsRegistry,\n ResolvedModel,\n ResolvedProvider,\n WireFamily,\n} from '../types/models-registry.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\nimport { mergeModelsPayload } from '../utils/merge-models-payload.js';\n\nconst DEFAULT_URL = 'https://models.dev/api.json';\nconst DEFAULT_TTL_SECONDS = 24 * 3600;\nconst DEFAULT_REFRESH_TIMEOUT_MS = 15_000;\n\ninterface CacheEnvelope {\n fetchedAt: string;\n url: string;\n payload: ModelsDevPayload;\n}\n\nexport interface DefaultModelsRegistryOptions {\n cacheFile: string;\n url?: string;\n ttlSeconds?: number;\n fetchImpl?: typeof fetch;\n /** Pre-seeded payload — useful for offline scenarios and tests. */\n seed?: ModelsDevPayload;\n /**\n * Maximum age in seconds for stale cache fallback when network fails.\n * Defaults to 7 days. Set to `Infinity` for full offline resilience\n * (risk: deprecated models, wrong pricing). Set to `0` to disable\n * stale fallback entirely.\n */\n maxStaleAgeSeconds?: number;\n /**\n * Timeout in milliseconds for the models.dev network fetch. When exceeded,\n * the fetch is aborted and cache/stale fallback is used instead.\n * Defaults to 15 seconds. Set to `0` to disable (infinite wait).\n */\n refreshTimeoutMs?: number;\n /**\n * Curated override payload deep-merged ON TOP of the models.dev base via\n * `mergeModelsPayload` — adds providers/models the base lacks and overrides\n * fields it gets wrong. Resolution order (first non-empty wins): this\n * in-memory `overlay` → `overlayUrl` (fetched, cached) → `overlayFile`\n * (bundled, read from disk). A missing/broken overlay degrades to `{}` and\n * never throws, so the base alone still works.\n */\n overlay?: ModelsDevPayload;\n /** GitHub-raw (or any) URL serving the curated overlay `providers.json`. */\n overlayUrl?: string;\n /** Path to the bundled overlay `providers.json` (offline floor). */\n overlayFile?: string;\n /** Cache file for the fetched `overlayUrl`. Defaults next to `cacheFile`. */\n overlayCacheFile?: string;\n}\n\n/**\n * The npm package each models.dev provider declares determines which wire\n * family WrongStack speaks. Anything not listed falls into `unsupported` and\n * can be enabled by registering a custom provider factory via a plugin.\n */\nconst FAMILY_BY_NPM: Record<string, WireFamily> = {\n '@ai-sdk/anthropic': 'anthropic',\n '@ai-sdk/google-vertex/anthropic': 'anthropic',\n '@ai-sdk/openai': 'openai',\n '@ai-sdk/openai-compatible': 'openai-compatible',\n '@ai-sdk/groq': 'openai-compatible',\n '@ai-sdk/xai': 'openai-compatible',\n '@ai-sdk/cerebras': 'openai-compatible',\n '@ai-sdk/togetherai': 'openai-compatible',\n '@ai-sdk/mistral': 'openai-compatible',\n '@ai-sdk/perplexity': 'openai-compatible',\n '@ai-sdk/deepinfra': 'openai-compatible',\n '@openrouter/ai-sdk-provider': 'openai-compatible',\n 'ai-gateway-provider': 'openai-compatible',\n '@ai-sdk/vercel': 'openai-compatible',\n '@ai-sdk/gateway': 'openai-compatible',\n '@aihubmix/ai-sdk-provider': 'openai-compatible',\n 'venice-ai-sdk-provider': 'openai-compatible',\n '@ai-sdk/google': 'google',\n};\n\nexport function classifyFamily(npm: string | undefined): WireFamily {\n if (!npm) return 'unsupported';\n return FAMILY_BY_NPM[npm] ?? 'unsupported';\n}\n\nexport class DefaultModelsRegistry implements ModelsRegistry {\n /** Merged (base + overlay) payload — what every reader sees. */\n private payload?: ModelsDevPayload;\n /** Memoised overlay payload (in-memory / fetched / file). */\n private overlayPayload?: ModelsDevPayload;\n private fetchedAt?: Date;\n private readonly cacheFile: string;\n private readonly url: string;\n private readonly ttlMs: number;\n private readonly fetchImpl: typeof fetch;\n private readonly seed?: ModelsDevPayload;\n private readonly maxStaleAgeMs: number;\n private readonly refreshTimeoutMs: number;\n private readonly overlay?: ModelsDevPayload;\n private readonly overlayUrl?: string;\n private readonly overlayFile?: string;\n private readonly overlayCacheFile?: string;\n\n constructor(opts: DefaultModelsRegistryOptions) {\n this.cacheFile = opts.cacheFile;\n this.url = opts.url ?? DEFAULT_URL;\n this.ttlMs = (opts.ttlSeconds ?? DEFAULT_TTL_SECONDS) * 1000;\n this.fetchImpl = opts.fetchImpl ?? fetch;\n this.seed = opts.seed;\n // Default max stale age: 7 days\n const maxStaleSeconds = opts.maxStaleAgeSeconds ?? 7 * 24 * 3600;\n this.maxStaleAgeMs = maxStaleSeconds * 1000;\n this.refreshTimeoutMs = opts.refreshTimeoutMs ?? DEFAULT_REFRESH_TIMEOUT_MS;\n this.overlay = opts.overlay;\n this.overlayUrl = opts.overlayUrl;\n this.overlayFile = opts.overlayFile;\n this.overlayCacheFile =\n opts.overlayCacheFile ??\n (opts.overlayUrl\n ? path.join(path.dirname(opts.cacheFile), 'models-overlay-cache.json')\n : undefined);\n }\n\n async load(opts: { force?: boolean } = {}): Promise<ModelsDevPayload> {\n if (this.payload && !opts.force) return this.payload;\n // A `seed` is treated as the complete, final payload — used for offline\n // scenarios and tests. It bypasses both the base fetch and the overlay.\n if (this.seed) {\n this.payload = this.seed;\n this.fetchedAt = new Date();\n return this.payload;\n }\n // Load the overlay first so base degradation can tell whether there is\n // actually curated data to serve when models.dev is unreachable.\n const overlay = await this.loadOverlay(opts);\n const base = await this.loadBase(opts, Object.keys(overlay).length > 0);\n this.payload = mergeModelsPayload(base, overlay);\n return this.payload;\n }\n\n /**\n * Load the models.dev base payload: fresh cache → network → stale cache.\n * On total failure, degrade to `{}` (so a non-empty overlay still drives\n * the catalog) rather than throwing — unless there's no curated overlay to\n * fall back on, in which case the original error propagates so pure-\n * models.dev setups still surface the problem.\n */\n private async loadBase(\n opts: { force?: boolean } = {},\n overlayAvailable = false,\n ): Promise<ModelsDevPayload> {\n if (!opts.force) {\n const cached = await this.readCacheAt(this.cacheFile);\n if (cached && this.isFresh(cached.fetchedAt)) {\n this.fetchedAt = new Date(cached.fetchedAt);\n return cached.payload;\n }\n }\n try {\n return await this.refreshBase();\n } catch (err) {\n // Network failed — fall back to stale cache if within maxStaleAgeMs.\n const cached = await this.readCacheAt(this.cacheFile);\n if (cached && this.isWithinMaxStaleAge(cached.fetchedAt)) {\n this.fetchedAt = new Date(cached.fetchedAt);\n return cached.payload;\n }\n if (overlayAvailable) {\n // eslint-disable-next-line no-console -- one-line operator warning\n console.warn(\n `ModelsRegistry: models.dev unavailable (${\n err instanceof Error ? err.message : String(err)\n }); serving curated overlay only.`,\n );\n return {};\n }\n throw err;\n }\n }\n\n /** Fetch + cache the models.dev base. Throws on failure (used by `refresh`). */\n private async refreshBase(): Promise<ModelsDevPayload> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.refreshTimeoutMs);\n try {\n const res = await this.fetchImpl(this.url, {\n method: 'GET',\n headers: { accept: 'application/json' },\n signal: controller.signal,\n });\n clearTimeout(timeout);\n if (!res.ok) {\n throw new Error(`ModelsRegistry: HTTP ${res.status} fetching ${this.url}`);\n }\n const json = (await res.json()) as ModelsDevPayload;\n this.fetchedAt = new Date();\n const envelope: CacheEnvelope = {\n fetchedAt: this.fetchedAt.toISOString(),\n url: this.url,\n payload: json,\n };\n await atomicWrite(this.cacheFile, JSON.stringify(envelope));\n return json;\n } catch (err) {\n clearTimeout(timeout);\n if (err instanceof Error && err.name === 'AbortError') {\n throw new Error(`ModelsRegistry: fetch timed out after ${this.refreshTimeoutMs}ms`);\n }\n throw err;\n }\n }\n\n /**\n * Resolve the curated overlay, memoised. Order: in-memory `overlay` →\n * fetched `overlayUrl` (cached, same TTL/stale rules) → `overlayFile` on\n * disk. Never throws — a missing/broken overlay yields `{}`.\n */\n private async loadOverlay(opts: { force?: boolean } = {}): Promise<ModelsDevPayload> {\n if (this.overlayPayload && !opts.force) return this.overlayPayload;\n if (hasEntries(this.overlay)) {\n this.overlayPayload = this.overlay;\n return this.overlayPayload;\n }\n const fetched = await this.loadOverlayFromUrl(opts);\n if (hasEntries(fetched)) {\n this.overlayPayload = fetched;\n return fetched;\n }\n const fromFile = await this.readOverlayFile();\n this.overlayPayload = fromFile ?? {};\n return this.overlayPayload;\n }\n\n private async loadOverlayFromUrl(opts: { force?: boolean }): Promise<\n ModelsDevPayload | undefined\n > {\n if (!this.overlayUrl || !this.overlayCacheFile) return undefined;\n if (!opts.force) {\n const cached = await this.readCacheAt(this.overlayCacheFile);\n if (cached && this.isFresh(cached.fetchedAt)) return cached.payload;\n }\n try {\n const res = await this.fetchImpl(this.overlayUrl, {\n method: 'GET',\n headers: { accept: 'application/json' },\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const json = (await res.json()) as ModelsDevPayload;\n const envelope: CacheEnvelope = {\n fetchedAt: new Date().toISOString(),\n url: this.overlayUrl,\n payload: json,\n };\n await atomicWrite(this.overlayCacheFile, JSON.stringify(envelope)).catch(() => {});\n return json;\n } catch {\n // Network/parse failure — fall back to stale overlay cache, then the\n // bundled file (handled by the caller).\n const cached = await this.readCacheAt(this.overlayCacheFile);\n if (cached && this.isWithinMaxStaleAge(cached.fetchedAt)) return cached.payload;\n return undefined;\n }\n }\n\n private async readOverlayFile(): Promise<ModelsDevPayload | undefined> {\n if (!this.overlayFile) return undefined;\n try {\n const raw = await fs.readFile(this.overlayFile, 'utf8');\n return JSON.parse(raw) as ModelsDevPayload;\n } catch {\n return undefined;\n }\n }\n\n async refresh(): Promise<ModelsDevPayload> {\n // Refresh the models.dev base (throws on failure so `wstack models refresh`\n // can report it), then recompute the merged payload with a fresh overlay.\n const base = await this.refreshBase();\n const overlay = await this.loadOverlay({ force: true });\n this.payload = mergeModelsPayload(base, overlay);\n return this.payload;\n }\n\n async listProviders(): Promise<ResolvedProvider[]> {\n const payload = await this.load();\n return Object.values(payload).map((p) => this.resolveProvider(p));\n }\n\n async getProvider(id: string): Promise<ResolvedProvider | undefined> {\n const payload = await this.load();\n const p = payload[id];\n return p ? this.resolveProvider(p) : undefined;\n }\n\n async getModel(providerId: string, modelId: string): Promise<ResolvedModel | undefined> {\n const provider = await this.getProvider(providerId);\n if (!provider) return undefined;\n const model = provider.models.find((m) => m.id === modelId);\n if (!model) return undefined;\n return {\n providerId,\n modelId,\n capabilities: {\n tools: model.tool_call ?? false,\n vision: Boolean(model.modalities?.input?.includes('image')),\n reasoning: model.reasoning ?? false,\n maxContext: model.limit?.context ?? 0,\n maxOutput: model.limit?.output,\n knowledge: model.knowledge,\n },\n cost: model.cost,\n };\n }\n\n async suggestModel(providerId: string): Promise<string | undefined> {\n const provider = await this.getProvider(providerId);\n if (!provider || provider.models.length === 0) return undefined;\n const ranked = [...provider.models].sort((a, b) => {\n const at = a.release_date ?? a.last_updated ?? '';\n const bt = b.release_date ?? b.last_updated ?? '';\n return bt.localeCompare(at);\n });\n return ranked[0]?.id;\n }\n\n async ageSeconds(): Promise<number> {\n if (!this.fetchedAt) {\n const cached = await this.readCacheAt(this.cacheFile);\n if (!cached) return Number.POSITIVE_INFINITY;\n return (Date.now() - new Date(cached.fetchedAt).getTime()) / 1000;\n }\n return (Date.now() - this.fetchedAt.getTime()) / 1000;\n }\n\n private resolveProvider(p: ModelsDevProvider): ResolvedProvider {\n return {\n id: p.id,\n name: p.name,\n family: classifyFamily(p.npm),\n apiBase: p.api,\n envVars: p.env ?? [],\n doc: p.doc,\n models: Object.values(p.models ?? {}),\n npm: p.npm,\n };\n }\n\n private isFresh(fetchedAtIso: string): boolean {\n return Date.now() - new Date(fetchedAtIso).getTime() < this.ttlMs;\n }\n\n private isWithinMaxStaleAge(fetchedAtIso: string): boolean {\n return Date.now() - new Date(fetchedAtIso).getTime() < this.maxStaleAgeMs;\n }\n\n private async readCacheAt(file: string): Promise<CacheEnvelope | undefined> {\n try {\n const raw = await fs.readFile(file, 'utf8');\n return JSON.parse(raw) as CacheEnvelope;\n } catch {\n return undefined;\n }\n }\n\n /** Used by `wstack models refresh` to expose where the cache lives. */\n cacheLocation(): string {\n return path.resolve(this.cacheFile);\n }\n}\n\nfunction hasEntries(payload: ModelsDevPayload | undefined): payload is ModelsDevPayload {\n return payload !== undefined && Object.keys(payload).length > 0;\n}\n","export interface Mode {\n id: string;\n name: string;\n description: string;\n /** Additional prompt text injected into system prompt when mode is active */\n prompt: string;\n /** Tags for tool_search filtering */\n tags?: string[];\n /** Tools that should be prioritized/highlighted when this mode is active */\n toolPreferences?: string[];\n /**\n * Skill names that are particularly relevant to this mode. The system\n * prompt builder appends a \"Suggested skills\" note so the model knows\n * which domain knowledge to leverage first. Skill must exist in the\n * loaded skill set to appear.\n */\n suggestedSkills?: string[];\n}\n\nexport interface ModeManifest {\n modes: Mode[];\n defaultMode?: string;\n}\n\nexport interface ModeStore {\n getActiveMode(): Promise<Mode | null>;\n setActiveMode(modeId: string | null): Promise<void>;\n listModes(): Promise<Mode[]>;\n getMode(modeId: string): Promise<Mode | null>;\n}\n\nexport interface ModeConfig {\n directory: string;\n}\n\nexport const DEFAULT_MODES: Mode[] = [\n {\n id: 'default',\n name: 'Default',\n description: 'General-purpose coding assistant',\n prompt: '',\n tags: ['general'],\n },\n {\n id: 'code-reviewer',\n name: 'Code Reviewer',\n description: 'Focus on code quality, best practices, and potential bugs',\n prompt: `## Code Reviewer Mode\n\nWhen reviewing code:\n- Look for potential bugs, race conditions, and edge cases\n- Check for security vulnerabilities (SQL injection, XSS, CSRF, etc.)\n- Evaluate error handling completeness\n- Assess code readability and maintainability\n- Check for performance anti-patterns\n- Verify test coverage for critical paths\n- Ensure naming conventions are followed`,\n tags: ['review', 'quality', 'security'],\n toolPreferences: ['read', 'grep', 'git', 'diff', 'test'],\n suggestedSkills: ['bug-hunter', 'security-scanner', 'typescript-strict', 'testing'],\n },\n {\n id: 'code-auditor',\n name: 'Code Auditor',\n description: 'Security-focused code analysis',\n prompt: `## Code Auditor Mode\n\nWhen auditing code for security:\n- Identify injection vulnerabilities (SQL, Command, XSS, LDAP)\n- Check authentication and authorization patterns\n- Look for sensitive data exposure (secrets, PII in logs)\n- Verify cryptographic implementations\n- Check for insecure dependencies or configurations\n- Assess input validation and output encoding\n- Look for timing attacks and information leakage`,\n tags: ['security', 'audit', 'compliance'],\n toolPreferences: ['grep', 'read', 'audit', 'bash'],\n suggestedSkills: ['security-scanner', 'bug-hunter', 'audit-log'],\n },\n {\n id: 'architect',\n name: 'Software Architect',\n description: 'Design patterns, scalability, and system design',\n prompt: `## Architect Mode\n\nWhen designing or reviewing architecture:\n- Evaluate scalability and future growth\n- Check for appropriate design patterns\n- Assess coupling and cohesion\n- Look for SOLID principle violations\n- Evaluate data modeling decisions\n- Check for eventual consistency issues\n- Assess API design and contract stability\n- Consider operational aspects (monitoring, logging, deployment)`,\n tags: ['architecture', 'design', 'scalability'],\n toolPreferences: ['read', 'glob', 'tree', 'diff'],\n suggestedSkills: ['api-design', 'refactor-planner', 'node-modern', 'docker-deploy'],\n },\n {\n id: 'debugger',\n name: 'Debugger',\n description: 'Root cause analysis and error investigation',\n prompt: `## Debugger Mode\n\nWhen investigating bugs:\n- Reproduce the issue with minimal steps\n- Check error messages and stack traces thoroughly\n- Look for related logs and historical context\n- Verify assumptions about data flow\n- Check for race conditions in async code\n- Validate environment and configuration\n- Use binary search to isolate the root cause\n- Verify fixes with tests before considering done`,\n tags: ['debug', 'investigation', 'error-resolution'],\n toolPreferences: ['read', 'grep', 'bash', 'logs', 'test'],\n suggestedSkills: ['bug-hunter', 'audit-log', 'observability'],\n },\n {\n id: 'tester',\n name: 'QA Engineer',\n description: 'Test coverage, edge cases, and quality assurance',\n prompt: `## Tester Mode\n\nWhen testing or writing tests:\n- Cover happy path and error paths equally\n- Think about edge cases and boundary conditions\n- Check for missing null/undefined handling tests\n- Verify error messages are tested\n- Look for race condition tests in async code\n- Assess mutation testing opportunities\n- Check for integration test gaps\n- Verify test isolation and cleanup`,\n tags: ['testing', 'qa', 'quality'],\n toolPreferences: ['read', 'grep', 'test', 'bash'],\n suggestedSkills: ['testing', 'bug-hunter', 'typescript-strict'],\n },\n {\n id: 'devops',\n name: 'DevOps Engineer',\n description: 'Infrastructure, deployment, and operations',\n prompt: `## DevOps Mode\n\nWhen working on infrastructure:\n- Check for containerization and deployment readiness\n- Verify CI/CD pipeline configurations\n- Assess monitoring and alerting setup\n- Look for health check endpoints\n- Check for graceful shutdown handling\n- Verify backup and disaster recovery plans\n- Assess secrets management\n- Check for resource limits and quotas`,\n tags: ['devops', 'infrastructure', 'operations'],\n toolPreferences: ['read', 'bash', 'grep', 'logs', 'git'],\n suggestedSkills: ['docker-deploy', 'observability', 'security-scanner'],\n },\n {\n id: 'refactorer',\n name: 'Refactorer',\n description: 'Code improvement and modernization',\n prompt: `## Refactorer Mode\n\nWhen refactoring code:\n- Maintain existing behavior — tests must pass before and after\n- Make one change at a time, verify after each\n- Prefer small, focused commits\n- Preserve API contracts unless explicitly changing\n- Remove dead code and comments\n- Improve naming as you go\n- Don't mix formatting changes with logic changes\n- Keep performance in mind — don't regress`,\n tags: ['refactor', 'modernization', 'improvement'],\n toolPreferences: ['read', 'edit', 'test', 'git', 'grep'],\n suggestedSkills: ['refactor-planner', 'typescript-strict', 'node-modern', 'testing'],\n },\n {\n id: 'brief',\n name: 'Brief',\n description: 'Fast, no-nonsense — get to the point',\n prompt: `## Brief Mode\n\nYou are WrongStack, a fast, no-nonsense AI coding agent.\nGet to the point — read files, run commands, make changes.\n\n### Operating rules\n1. **Read first.** Inspect relevant files before touching anything.\n2. **Edit surgically.** Use edit tool for existing files, write only for new ones.\n3. **One sentence before action.** State what you're doing, then do it.\n4. **Say what happened.** After tool calls, one line: success, failure, or what's next.\n5. **Be honest.** Admit when you don't know or something failed. No filler.\n6. **Keep moving.** Task done? Stop. More work needed? State it and continue.\n\n### Decision rules\n- **Ambiguous task?** Ask. One question, get clarity, proceed.\n- **Clear task, unknown approach?** Pick one reasonable path, execute, report.\n- **Tool fails?** Retry once with adjusted params, then report.\n\n### Output style\n- Prose paragraphs (no bullet points unless unavoidable)\n- Code blocks for code, backticks for paths/commands\n- One-liner sufficient? One liner.\n- Max 3 sentences per paragraph.`,\n tags: ['fast', 'concise', 'direct'],\n toolPreferences: ['read', 'edit', 'bash'],\n suggestedSkills: [],\n },\n {\n id: 'teach',\n name: 'Teach',\n description: 'Mentor mode — explains why, not just what',\n prompt: `## Teach Mode\n\nYou are WrongStack, an expert AI coding mentor.\n\nYou operate inside the user's terminal with full access to their codebase. You help developers learn and understand — not just execute tasks, but build mental models.\n\n### Teaching philosophy\n\n1. **Explain the why.** When you make a change, explain why it works that way — not just what you did.\n2. **Build mental models.** Use analogies, highlight patterns, connect new concepts to things the user already knows.\n3. **Read before teaching.** Always inspect relevant files so your explanations are accurate and specific to the actual code.\n4. **Surgical edits with context.** When editing code, explain the approach before doing it, and what trade-offs were considered.\n5. **Be thorough but not verbose.** A 2-paragraph explanation beats a 5-paragraph one. Depth without padding.\n6. **Admit knowledge gaps.** If you're unsure, say so. Speculating teaches bad patterns.\n\n### Teaching style\n\n- **Before action:** Briefly explain what you're going to do and why.\n- **After action:** Summarize what happened and what the user should take away from this.\n- **With code:** Show concrete examples, explain syntax choices, point out gotchas.\n- **With errors:** Explain why the error occurred, what it's actually complaining about, and how to avoid it in the future.\n- **General principles:** Offer them when the user's question suggests a deeper concept they'd benefit from understanding.\n\n### Decision heuristics\n\n- **Task is ambiguous?** Ask — but frame the question as \"what would you like to learn from this?\"\n- **Task is clear, approach is unknown?** Execute, then teach the approach as you go.\n- **Tool fails?** Explain what failed, why it failed, and how to avoid the failure.\n- **User asks \"how do I...?\"** Don't just give the answer — explain the underlying mechanism.\n- **Context window filling up?** Compact, but summarize what was lost so the teaching continuity isn't broken.\n\n### Output format\n\n- Use headings to structure multi-concept explanations.\n- Code blocks with brief annotations for code examples.\n- **Bold** key terms and concepts worth remembering.\n- Callouts like \"Key takeaway:\" or \"Pattern:\" to anchor learning.\n- Max 3 sentences per paragraph — readability over completeness.\n\n### Don'ts\n\n- Don't lecture condescendingly — the user is a developer, not a beginner.\n- Don't pad explanations with obvious things.\n- Don't skip the \"why\" — even quick tasks deserve one sentence of context.\n- Don't just say \"do X\" — say \"do X because Y.\"\n- Don't leave the user hanging after a complex operation — explain what just happened.\n\n### Core principles\n\nYou follow these principles, but always with explanation:\n- Read before write\n- Surgical edits over rewrites\n- Show your work (explain your reasoning, not just mechanical steps)\n- Be honest about limits\n- Format for scanability\n- Recover explicitly from failures\n\nRemember: your job is to make the user a better developer, not just to complete tasks faster.`,\n tags: ['teaching', 'mentor', 'learning'],\n toolPreferences: ['read', 'edit', 'explain'],\n suggestedSkills: ['prompt-engineering', 'skill-creator', 'node-modern', 'typescript-strict'],\n },\n];\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { atomicWrite } from '../utils/atomic-write.js';\nimport type { Mode, ModeConfig, ModeManifest, ModeStore } from '../types/mode.js';\nimport { DEFAULT_MODES } from '../types/mode.js';\n\nexport class DefaultModeStore implements ModeStore {\n private activeModeId: string | null = null;\n private modes: Mode[];\n private configDir: string;\n\n constructor(config: ModeConfig) {\n this.configDir = config.directory;\n this.modes = [...DEFAULT_MODES];\n }\n\n async getActiveMode(): Promise<Mode | null> {\n if (!this.activeModeId) {\n await this.loadActiveMode();\n }\n if (!this.activeModeId) return null;\n return this.modes.find((m) => m.id === this.activeModeId) ?? null;\n }\n\n async setActiveMode(modeId: string | null): Promise<void> {\n this.activeModeId = modeId;\n await this.saveActiveMode();\n }\n\n async listModes(): Promise<Mode[]> {\n return [...this.modes];\n }\n\n async getMode(modeId: string): Promise<Mode | null> {\n return this.modes.find((m) => m.id === modeId) ?? null;\n }\n\n async addMode(mode: Mode): Promise<void> {\n const idx = this.modes.findIndex((m) => m.id === mode.id);\n if (idx >= 0) {\n this.modes[idx] = mode;\n } else {\n this.modes.push(mode);\n }\n }\n\n async removeMode(modeId: string): Promise<void> {\n const builtIn = DEFAULT_MODES.find((m) => m.id === modeId);\n if (builtIn) {\n throw new Error(`Cannot remove built-in mode \"${modeId}\"`);\n }\n this.modes = this.modes.filter((m) => m.id !== modeId);\n if (this.activeModeId === modeId) {\n this.activeModeId = null;\n await this.saveActiveMode();\n }\n }\n\n private async loadActiveMode(): Promise<void> {\n try {\n const configPath = path.join(this.configDir, 'mode.json');\n const content = await fs.readFile(configPath, 'utf8');\n const data = JSON.parse(content);\n this.activeModeId = data.activeMode ?? null;\n } catch {\n this.activeModeId = 'default';\n }\n }\n\n private async saveActiveMode(): Promise<void> {\n try {\n await fs.mkdir(this.configDir, { recursive: true });\n const configPath = path.join(this.configDir, 'mode.json');\n // atomicWrite: torn write would leave mode.json malformed and the\n // next load would silently reset to \"default\".\n await atomicWrite(\n configPath,\n JSON.stringify({ activeMode: this.activeModeId }, null, 2),\n );\n } catch {\n // ignore save errors\n }\n }\n}\n\nexport interface ModeLoaderOptions {\n projectModesDir?: string;\n userModesDir?: string;\n}\n\nexport async function loadProjectModes(modesDir: string): Promise<Mode[]> {\n const modes: Mode[] = [];\n try {\n const entries = await fs.readdir(modesDir);\n for (const entry of entries) {\n if (!entry.endsWith('.md') && !entry.endsWith('.txt')) continue;\n const filePath = path.join(modesDir, entry);\n const stat = await fs.stat(filePath);\n if (!stat.isFile()) continue;\n const content = await fs.readFile(filePath, 'utf8');\n const id = path.basename(entry, path.extname(entry));\n modes.push({\n id,\n name: id.replace(/[-_]/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase()),\n description: content.split('\\n')[0] ?? id,\n prompt: content,\n tags: ['project'],\n });\n }\n } catch {\n // no project modes\n }\n return modes;\n}\n\nexport async function loadUserModes(modesDir: string): Promise<Mode[]> {\n const modes: Mode[] = [];\n try {\n const manifestPath = path.join(modesDir, 'modes.json');\n const content = await fs.readFile(manifestPath, 'utf8');\n const manifest: ModeManifest = JSON.parse(content);\n for (const mode of manifest.modes) {\n modes.push(mode);\n }\n } catch {\n // no user modes\n }\n return modes;\n}\n","export interface TextBlock {\n type: 'text';\n text: string;\n cache_control?: { type: 'ephemeral' };\n}\n\nexport interface ToolUseBlock {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n /**\n * Provider-specific opaque metadata captured from the wire response.\n * Echoed back verbatim in the next request so providers that bind\n * extra state to function calls keep working. Example: Gemini's\n * `thoughtSignature` — required for tool-use turns with thinking\n * models, otherwise the next request fails with 400 \"Function call\n * is missing a thought_signature in functionCall parts\".\n *\n * Keys are namespaced by intent so multiple wires can coexist:\n * - `google.thoughtSignature` — Gemini signed-thought blob\n * Other providers can add their own keys without colliding.\n */\n providerMeta?: Record<string, unknown>;\n}\n\nexport interface ToolResultBlock {\n type: 'tool_result';\n tool_use_id: string;\n /**\n * The original tool name. Useful for providers like Google Gemini that\n * need the tool name in `functionResponse.name` — the tool_use_id is\n * only a session-local identifier and is not stable across replays.\n * Always set by ToolExecutor; may be absent on manually-constructed blocks.\n */\n name?: string;\n content: string;\n is_error?: boolean;\n}\n\nexport interface ImageBlock {\n type: 'image';\n source: {\n type: 'base64' | 'url';\n media_type?: string;\n data?: string;\n url?: string;\n };\n}\n\n/**\n * Chain-of-thought / extended-thinking content emitted by the model.\n *\n * Both Anthropic extended thinking (`{type:'thinking', thinking, signature}`)\n * and DeepSeek reasoning mode (top-level `reasoning_content` on the assistant\n * message) require this content to be echoed back verbatim on the next\n * request, otherwise the provider returns 400:\n * - Anthropic: \"The `content[].thinking` in the thinking mode must be passed back\"\n * - DeepSeek: \"The `reasoning_content` in the thinking mode must be passed back\"\n *\n * `signature` is Anthropic-specific (an opaque integrity blob). DeepSeek\n * doesn't issue a signature — the field is absent for that provider.\n *\n * Per Anthropic, thinking blocks MUST appear before any text/tool_use blocks\n * in an assistant message. Stream builders preserve that order.\n */\nexport interface ThinkingBlock {\n type: 'thinking';\n thinking: string;\n signature?: string;\n providerMeta?: Record<string, unknown>;\n}\n\nexport type ContentBlock = TextBlock | ToolUseBlock | ToolResultBlock | ImageBlock | ThinkingBlock;\n\nexport function isTextBlock(b: ContentBlock): b is TextBlock {\n return b.type === 'text';\n}\nexport function isToolUseBlock(b: ContentBlock): b is ToolUseBlock {\n return b.type === 'tool_use';\n}\nexport function isToolResultBlock(b: ContentBlock): b is ToolResultBlock {\n return b.type === 'tool_result';\n}\nexport function isImageBlock(b: ContentBlock): b is ImageBlock {\n return b.type === 'image';\n}\nexport function isThinkingBlock(b: ContentBlock): b is ThinkingBlock {\n return b.type === 'thinking';\n}\n","import { isTextBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nimport type { Provider, Request } from '../types/provider.js';\nimport type { MessageSelector, SelectorResult } from '../types/selector.js';\n\nexport interface LLMSelectorOptions {\n /** Provider used for the selector LLM call. Required. */\n provider: Provider;\n /** Model for the selector. Defaults to the provider's default model. */\n model?: string;\n /**\n * Maximum tokens to keep in context (target budget).\n * Selector will aim to keep total content below this.\n */\n maxContextTokens?: number;\n /**\n * Prompt instructing the selector how to behave.\n * Should guide the LLM on importance tiers and output format.\n */\n systemPrompt?: string;\n}\n\nconst DEFAULT_SYSTEM_PROMPT = `You are a context pruning assistant. Given a conversation history and a token budget, decide which message ranges are worth keeping verbatim and which should be collapsed into summaries.\n\nOutput a JSON object with this structure:\n{\n \"kept\": [{\"from\": 0, \"to\": 5, \"importance\": \"critical\"}],\n \"collapsed\": [{\"from\": 6, \"to\": 20, \"summary\": \"optional summary\"}],\n \"reasoning\": \"brief explanation of decisions\"\n}\n\nImportance tiers:\n- \"critical\": decisions, file edits, tool results that affect state, final answers\n- \"high\": substantive tool use, complex reasoning, non-obvious observations\n- \"medium\": routine exchanges, confirmations, straightforward Q&A\n\nRules:\n- Always keep the most recent K pairs (preserve recency)\n- Never collapse the final 2 user/assistant pairs (working memory)\n- Preserve tool results that modified files or had external effects\n- Collapse old, low-information exchanges (greetings, acknowledgements, etc.)\n- If unsure, keep rather than collapse (errors are more costly than waste)\n\nReturn ONLY the JSON object, no markdown, no explanation outside the JSON.`;\n\n/** Rough token estimation for a message array */\nfunction estimateTokens(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += Math.ceil(m.content.length / 4);\n } else if (Array.isArray(m.content)) {\n for (const b of m.content) {\n if (b.type === 'text') total += Math.ceil(b.text.length / 4);\n else total += Math.ceil(JSON.stringify(b).length / 4);\n }\n }\n }\n return total;\n}\n\n/** Format messages as a compact text dump for the selector LLM */\nfunction formatMessages(messages: Message[], maxChars = 8000): string {\n const lines: string[] = [];\n let used = 0;\n for (let i = 0; i < messages.length; i++) {\n const m = messages[i]!;\n const role = m.role.padEnd(10, ' ');\n let text: string;\n if (typeof m.content === 'string') {\n text = m.content.slice(0, 500);\n } else {\n const content = m.content as import('../types/blocks.js').ContentBlock[];\n text = content\n .filter(isTextBlock)\n .map((b) => b.text)\n .join(' ');\n // Also capture tool names for context\n const toolUses = content.filter((b) => b.type === 'tool_use');\n if (toolUses.length > 0) {\n text += ` [tools: ${toolUses.map((b) => (b as { name: string }).name).join(', ')}]`;\n }\n }\n const line = `[${i}][${role}]: ${text}`;\n if (used + line.length > maxChars) break;\n lines.push(line);\n used += line.length;\n }\n return lines.join('\\n');\n}\n\n/**\n * LLM-powered message selector. Calls a sub-LLM to analyze the\n * message history and produce a keep/collapse plan — more surgical\n * than fixed-window rules.\n */\nexport class LLMSelector implements MessageSelector {\n private readonly provider: Provider;\n private readonly model: string;\n private readonly maxContextTokens: number;\n private readonly systemPrompt: string;\n\n constructor(opts: LLMSelectorOptions) {\n this.provider = opts.provider;\n this.model = opts.model ?? 'unknown';\n this.maxContextTokens = opts.maxContextTokens ?? 40_000;\n this.systemPrompt = opts.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\n }\n\n async select(messages: Message[], maxToKeep: number): Promise<SelectorResult> {\n const effectiveBudget = Math.min(maxToKeep, this.maxContextTokens);\n\n // Build a concise representation of the conversation\n const historyText = formatMessages(messages);\n const totalTokens = estimateTokens(messages);\n const systemText = `${this.systemPrompt}\\n\\nConversation (${messages.length} messages, ~${totalTokens} tokens, budget: ${effectiveBudget}):\\n`;\n\n // Add instruction to stay within budget\n const budgetInstruction =\n totalTokens > effectiveBudget\n ? `\\n\\nIMPORTANT: Total conversation (${totalTokens} tokens) exceeds budget (${effectiveBudget}). You MUST collapse enough to fit. Prefer collapsing older/lower-importance ranges.`\n : '';\n\n const req: Request = {\n model: this.model,\n system: [{ type: 'text', text: systemText + budgetInstruction }],\n messages: [{ role: 'user', content: historyText }],\n maxTokens: 1024,\n };\n\n let raw: string;\n try {\n // Wire the AbortController to the provider call so cancellation actually\n // fires — the original code passed a fresh signal that is never connected\n // to anything, leaking the controller on every selector call.\n const ac = new AbortController();\n const res = await this.provider.complete(req, { signal: ac.signal });\n const textBlocks = res.content.filter(isTextBlock);\n raw = textBlocks\n .map((b) => b.text)\n .join('\\n')\n .trim();\n } catch (_err) {\n // Fallback: use simple recency-based selection\n return this.fallbackSelect(messages, effectiveBudget);\n }\n\n return this.parseSelectorOutput(raw, messages.length);\n }\n\n private fallbackSelect(messages: Message[], budget: number): SelectorResult {\n // Simple fallback: keep from the end until we hit budget\n const toKeep: SelectorResult['kept'] = [];\n const toCollapse: SelectorResult['collapsed'] = [];\n\n let tokenCount = 0;\n let startIdx = 0;\n\n // Scan from the end backwards\n for (let i = messages.length - 1; i >= 0; i--) {\n const m = messages[i]!;\n const cost =\n typeof m.content === 'string'\n ? Math.ceil(m.content.length / 4)\n : m.content.reduce(\n (acc, b) =>\n acc +\n (b.type === 'text'\n ? Math.ceil(b.text.length / 4)\n : Math.ceil(JSON.stringify(b).length / 4)),\n 0,\n );\n\n if (tokenCount + cost <= budget) {\n tokenCount += cost;\n } else {\n startIdx = i + 1;\n break;\n }\n }\n\n if (startIdx > 0) {\n toCollapse.push({ from: 0, to: startIdx - 1 });\n }\n toKeep.push({ from: startIdx, to: messages.length - 1, importance: 'high' });\n\n return {\n kept: toKeep,\n collapsed: toCollapse,\n reasoning: `Fallback: kept last ${messages.length - startIdx} messages within ${budget} token budget`,\n };\n }\n\n private parseSelectorOutput(raw: string, messageCount: number): SelectorResult {\n // Try to extract JSON from the response\n const jsonStart = raw.indexOf('{');\n const jsonEnd = raw.lastIndexOf('}');\n if (jsonStart === -1 || jsonEnd === -1) {\n // Can't parse — use fallback\n return this.fallbackSelect(\n Array.from({ length: messageCount }, () => ({ role: 'user', content: '' }) as Message),\n this.maxContextTokens,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw.slice(jsonStart, jsonEnd + 1));\n } catch {\n return this.fallbackSelect(\n Array.from({ length: messageCount }, () => ({ role: 'user', content: '' }) as Message),\n this.maxContextTokens,\n );\n }\n\n const obj = parsed as Record<string, unknown>;\n const kept =\n (obj.kept as Array<{ from: number; to: number; importance: string }> | undefined) ?? [];\n const collapsed =\n (obj.collapsed as Array<{ from: number; to: number; summary?: string }> | undefined) ?? [];\n\n return {\n kept: kept.map((k) => ({\n from: k.from,\n to: k.to,\n importance: (k.importance ?? 'medium') as 'critical' | 'high' | 'medium',\n })),\n collapsed: collapsed.map((c) => ({ from: c.from, to: c.to, summary: c.summary })),\n reasoning: typeof obj.reasoning === 'string' ? obj.reasoning : '',\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/atomic-write.ts","../../src/utils/merge-models-payload.ts","../../src/models/models-registry.ts","../../src/types/mode.ts","../../src/models/mode-store.ts","../../src/types/blocks.ts","../../src/models/llm-selector.ts"],"names":["path","stat","resolve","path2","fs2","fs3"],"mappings":"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","file":"index.js","sourcesContent":["import { randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface AtomicWriteOptions {\n mode?: number | undefined;\n encoding?: BufferEncoding | undefined;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array,\n opts: AtomicWriteOptions = {},\n): Promise<void> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = path.join(dir, `.${path.basename(targetPath)}.${randomBytes(6).toString('hex')}.tmp`);\n\n // Write content to tmp first; 'wx' ensures exclusive creation (fails if\n // tmp already exists — extremely unlikely with 6-byte random suffix).\n try {\n if (typeof content === 'string') {\n await fs.writeFile(tmp, content, { flag: 'wx', encoding: opts.encoding ?? 'utf8' });\n } else {\n await fs.writeFile(tmp, content, { flag: 'wx' });\n }\n try {\n const fh = await fs.open(tmp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync best-effort\n }\n // Now safely read mode from target (if it exists) and apply to tmp before rename.\n // Prefer opts.mode for new files; for existing files preserve their mode.\n let mode: number | undefined;\n try {\n const stat = await fs.stat(targetPath);\n mode = stat.mode & 0o777;\n } catch {\n mode = opts.mode;\n }\n if (mode !== undefined) {\n await fs.chmod(tmp, mode);\n }\n await renameWithRetry(tmp, targetPath);\n } catch (err) {\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore cleanup error\n }\n throw err;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\n// On Windows, fs.rename over an existing file can fail with EPERM/EBUSY/EACCES\n// when antivirus, file indexers, editor file watchers, or a concurrent writer\n// briefly hold a handle on the destination. These are transient — retry with a\n// short backoff before giving up. POSIX renames are atomic and won't hit this.\nconst TRANSIENT_RENAME_CODES = new Set(['EPERM', 'EBUSY', 'EACCES', 'ENOTEMPTY']);\n\nasync function renameWithRetry(from: string, to: string): Promise<void> {\n if (process.platform !== 'win32') {\n await fs.rename(from, to);\n return;\n }\n const delays = [10, 25, 60, 120, 250];\n let lastErr: unknown;\n for (let i = 0; i <= delays.length; i++) {\n try {\n await fs.rename(from, to);\n return;\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException)?.code;\n if (!code || !TRANSIENT_RENAME_CODES.has(code) || i === delays.length) {\n throw err;\n }\n await new Promise((resolve) => setTimeout(resolve, delays[i]));\n }\n }\n throw lastErr;\n}\n","import type {\n ModelsDevModel,\n ModelsDevProvider,\n ModelsDevPayload,\n} from '../types/models-registry.js';\n\n/**\n * Deep-merge a curated `overlay` payload on top of a `base` payload (both in\n * the models.dev `api.json` shape). The overlay always wins: it can add\n * providers/models the base lacks and override fields the base gets wrong.\n *\n * Precedence rules:\n * - Provider present in both → scalar fields (`name`, `npm`, `api`, `env`,\n * `doc`) come from the overlay when set; `models` maps merge by model id.\n * - Provider only in the overlay → added wholesale.\n * - Model present in both → overlay model fields override base model fields\n * (`{ ...base, ...overlay }`), with the nested `limit` / `cost` /\n * `modalities` objects merged one level deeper so an overlay can fix just\n * `limit.context` without restating the rest of the model.\n * - Model only in the overlay → added.\n *\n * Pure: never mutates its inputs.\n */\nexport function mergeModelsPayload(\n base: ModelsDevPayload,\n overlay: ModelsDevPayload,\n): ModelsDevPayload {\n const out: ModelsDevPayload = {};\n for (const [id, provider] of Object.entries(base)) {\n out[id] = cloneProvider(provider);\n }\n for (const [id, ovProvider] of Object.entries(overlay)) {\n const existing = out[id];\n out[id] = existing ? mergeProvider(existing, ovProvider) : cloneProvider(ovProvider);\n }\n return out;\n}\n\nfunction mergeProvider(base: ModelsDevProvider, overlay: ModelsDevProvider): ModelsDevProvider {\n const models: Record<string, ModelsDevModel> = {};\n for (const [mid, m] of Object.entries(base.models ?? {})) {\n models[mid] = { ...m };\n }\n for (const [mid, ovModel] of Object.entries(overlay.models ?? {})) {\n const existing = models[mid];\n models[mid] = existing ? mergeModel(existing, ovModel) : { ...ovModel };\n }\n return {\n ...base,\n // Overlay scalar fields win when explicitly provided; otherwise keep base.\n ...stripUndefined({\n id: overlay.id,\n name: overlay.name,\n npm: overlay.npm,\n api: overlay.api,\n env: overlay.env,\n doc: overlay.doc,\n }),\n models,\n };\n}\n\nfunction mergeModel(base: ModelsDevModel, overlay: ModelsDevModel): ModelsDevModel {\n const merged: ModelsDevModel = { ...base, ...overlay };\n // One level deeper for the structured fields so a partial overlay (e.g. only\n // `limit.context`) doesn't blow away the base's other sub-fields.\n if (base.limit || overlay.limit) {\n merged.limit = { ...base.limit, ...overlay.limit };\n }\n if (base.cost || overlay.cost) {\n merged.cost = { ...base.cost, ...overlay.cost };\n }\n if (base.modalities || overlay.modalities) {\n merged.modalities = { ...base.modalities, ...overlay.modalities };\n }\n return merged;\n}\n\nfunction cloneProvider(p: ModelsDevProvider): ModelsDevProvider {\n const models: Record<string, ModelsDevModel> = {};\n for (const [mid, m] of Object.entries(p.models ?? {})) {\n models[mid] = { ...m };\n }\n return { ...p, models };\n}\n\n/** Drop keys whose value is `undefined` so they don't clobber base fields. */\nfunction stripUndefined<T extends Record<string, unknown>>(obj: T): Partial<T> {\n const out: Partial<T> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (v !== undefined) out[k as keyof T] = v as T[keyof T];\n }\n return out;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n ModelsDevPayload,\n ModelsDevProvider,\n ModelsRegistry,\n ResolvedModel,\n ResolvedProvider,\n WireFamily,\n} from '../types/models-registry.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\nimport { mergeModelsPayload } from '../utils/merge-models-payload.js';\n\nconst DEFAULT_URL = 'https://models.dev/api.json';\nconst DEFAULT_TTL_SECONDS = 24 * 3600;\nconst DEFAULT_REFRESH_TIMEOUT_MS = 15_000;\n\ninterface CacheEnvelope {\n fetchedAt: string;\n url: string;\n payload: ModelsDevPayload;\n}\n\nexport interface DefaultModelsRegistryOptions {\n cacheFile: string;\n url?: string | undefined;\n ttlSeconds?: number | undefined;\n fetchImpl?: typeof fetch | undefined;\n /** Pre-seeded payload — useful for offline scenarios and tests. */\n seed?: ModelsDevPayload | undefined;\n /**\n * Maximum age in seconds for stale cache fallback when network fails.\n * Defaults to 7 days. Set to `Infinity` for full offline resilience\n * (risk: deprecated models, wrong pricing). Set to `0` to disable\n * stale fallback entirely.\n */\n maxStaleAgeSeconds?: number | undefined;\n /**\n * Timeout in milliseconds for the models.dev network fetch. When exceeded,\n * the fetch is aborted and cache/stale fallback is used instead.\n * Defaults to 15 seconds. Set to `0` to disable (infinite wait).\n */\n refreshTimeoutMs?: number | undefined;\n /**\n * Curated override payload deep-merged ON TOP of the models.dev base via\n * `mergeModelsPayload` — adds providers/models the base lacks and overrides\n * fields it gets wrong. Resolution order (first non-empty wins): this\n * in-memory `overlay` → `overlayUrl` (fetched, cached) → `overlayFile`\n * (bundled, read from disk). A missing/broken overlay degrades to `{}` and\n * never throws, so the base alone still works.\n */\n overlay?: ModelsDevPayload | undefined;\n /** GitHub-raw (or any) URL serving the curated overlay `providers.json`. */\n overlayUrl?: string | undefined;\n /** Path to the bundled overlay `providers.json` (offline floor). */\n overlayFile?: string | undefined;\n /** Cache file for the fetched `overlayUrl`. Defaults next to `cacheFile`. */\n overlayCacheFile?: string | undefined;\n}\n\n/**\n * The npm package each models.dev provider declares determines which wire\n * family WrongStack speaks. Anything not listed falls into `unsupported` and\n * can be enabled by registering a custom provider factory via a plugin.\n */\nconst FAMILY_BY_NPM: Record<string, WireFamily> = {\n '@ai-sdk/anthropic': 'anthropic',\n '@ai-sdk/google-vertex/anthropic': 'anthropic',\n '@ai-sdk/openai': 'openai',\n '@ai-sdk/openai-compatible': 'openai-compatible',\n '@ai-sdk/groq': 'openai-compatible',\n '@ai-sdk/xai': 'openai-compatible',\n '@ai-sdk/cerebras': 'openai-compatible',\n '@ai-sdk/togetherai': 'openai-compatible',\n '@ai-sdk/mistral': 'openai-compatible',\n '@ai-sdk/perplexity': 'openai-compatible',\n '@ai-sdk/deepinfra': 'openai-compatible',\n '@openrouter/ai-sdk-provider': 'openai-compatible',\n 'ai-gateway-provider': 'openai-compatible',\n '@ai-sdk/vercel': 'openai-compatible',\n '@ai-sdk/gateway': 'openai-compatible',\n '@aihubmix/ai-sdk-provider': 'openai-compatible',\n 'venice-ai-sdk-provider': 'openai-compatible',\n '@ai-sdk/google': 'google',\n};\n\nexport function classifyFamily(npm: string | undefined): WireFamily {\n if (!npm) return 'unsupported';\n return FAMILY_BY_NPM[npm] ?? 'unsupported';\n}\n\nexport class DefaultModelsRegistry implements ModelsRegistry {\n /** Merged (base + overlay) payload — what every reader sees. */\n private payload?: ModelsDevPayload | undefined;\n /** Memoised overlay payload (in-memory / fetched / file). */\n private overlayPayload?: ModelsDevPayload | undefined;\n private fetchedAt?: Date | undefined;\n private readonly cacheFile: string;\n private readonly url: string;\n private readonly ttlMs: number;\n private readonly fetchImpl: typeof fetch;\n private readonly seed?: ModelsDevPayload | undefined;\n private readonly maxStaleAgeMs: number;\n private readonly refreshTimeoutMs: number;\n private readonly overlay?: ModelsDevPayload | undefined;\n private readonly overlayUrl?: string | undefined;\n private readonly overlayFile?: string | undefined;\n private readonly overlayCacheFile?: string | undefined;\n\n constructor(opts: DefaultModelsRegistryOptions) {\n this.cacheFile = opts.cacheFile;\n this.url = opts.url ?? DEFAULT_URL;\n this.ttlMs = (opts.ttlSeconds ?? DEFAULT_TTL_SECONDS) * 1000;\n this.fetchImpl = opts.fetchImpl ?? fetch;\n this.seed = opts.seed;\n // Default max stale age: 7 days\n const maxStaleSeconds = opts.maxStaleAgeSeconds ?? 7 * 24 * 3600;\n this.maxStaleAgeMs = maxStaleSeconds * 1000;\n this.refreshTimeoutMs = opts.refreshTimeoutMs ?? DEFAULT_REFRESH_TIMEOUT_MS;\n this.overlay = opts.overlay;\n this.overlayUrl = opts.overlayUrl;\n this.overlayFile = opts.overlayFile;\n this.overlayCacheFile =\n opts.overlayCacheFile ??\n (opts.overlayUrl\n ? path.join(path.dirname(opts.cacheFile), 'models-overlay-cache.json')\n : undefined);\n }\n\n async load(opts: { force?: boolean | undefined } = {}): Promise<ModelsDevPayload> {\n if (this.payload && !opts.force) return this.payload;\n // A `seed` is treated as the complete, final payload — used for offline\n // scenarios and tests. It bypasses both the base fetch and the overlay.\n if (this.seed) {\n this.payload = this.seed;\n this.fetchedAt = new Date();\n return this.payload;\n }\n // Load the overlay first so base degradation can tell whether there is\n // actually curated data to serve when models.dev is unreachable.\n const overlay = await this.loadOverlay(opts);\n const base = await this.loadBase(opts, Object.keys(overlay).length > 0);\n this.payload = mergeModelsPayload(base, overlay);\n return this.payload;\n }\n\n /**\n * Load the models.dev base payload: fresh cache → network → stale cache.\n * On total failure, degrade to `{}` (so a non-empty overlay still drives\n * the catalog) rather than throwing — unless there's no curated overlay to\n * fall back on, in which case the original error propagates so pure-\n * models.dev setups still surface the problem.\n */\n private async loadBase(\n opts: { force?: boolean | undefined } = {},\n overlayAvailable = false,\n ): Promise<ModelsDevPayload> {\n if (!opts.force) {\n const cached = await this.readCacheAt(this.cacheFile);\n if (cached && this.isFresh(cached.fetchedAt)) {\n this.fetchedAt = new Date(cached.fetchedAt);\n return cached.payload;\n }\n }\n try {\n return await this.refreshBase();\n } catch (err) {\n // Network failed — fall back to stale cache if within maxStaleAgeMs.\n const cached = await this.readCacheAt(this.cacheFile);\n if (cached && this.isWithinMaxStaleAge(cached.fetchedAt)) {\n this.fetchedAt = new Date(cached.fetchedAt);\n return cached.payload;\n }\n if (overlayAvailable) {\n // eslint-disable-next-line no-console -- one-line operator warning\n console.warn(\n `ModelsRegistry: models.dev unavailable (${\n err instanceof Error ? err.message : String(err)\n }); serving curated overlay only.`,\n );\n return {};\n }\n throw err;\n }\n }\n\n /** Fetch + cache the models.dev base. Throws on failure (used by `refresh`). */\n private async refreshBase(): Promise<ModelsDevPayload> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.refreshTimeoutMs);\n try {\n const res = await this.fetchImpl(this.url, {\n method: 'GET',\n headers: { accept: 'application/json' },\n signal: controller.signal,\n });\n clearTimeout(timeout);\n if (!res.ok) {\n throw new Error(`ModelsRegistry: HTTP ${res.status} fetching ${this.url}`);\n }\n const json = (await res.json()) as ModelsDevPayload;\n this.fetchedAt = new Date();\n const envelope: CacheEnvelope = {\n fetchedAt: this.fetchedAt.toISOString(),\n url: this.url,\n payload: json,\n };\n await atomicWrite(this.cacheFile, JSON.stringify(envelope));\n return json;\n } catch (err) {\n clearTimeout(timeout);\n if (err instanceof Error && err.name === 'AbortError') {\n throw new Error(`ModelsRegistry: fetch timed out after ${this.refreshTimeoutMs}ms`);\n }\n throw err;\n }\n }\n\n /**\n * Resolve the curated overlay, memoised. Order: in-memory `overlay` →\n * fetched `overlayUrl` (cached, same TTL/stale rules) → `overlayFile` on\n * disk. Never throws — a missing/broken overlay yields `{}`.\n */\n private async loadOverlay(opts: { force?: boolean | undefined } = {}): Promise<ModelsDevPayload> {\n if (this.overlayPayload && !opts.force) return this.overlayPayload;\n if (hasEntries(this.overlay)) {\n this.overlayPayload = this.overlay;\n return this.overlayPayload;\n }\n const fetched = await this.loadOverlayFromUrl(opts);\n if (hasEntries(fetched)) {\n this.overlayPayload = fetched;\n return fetched;\n }\n const fromFile = await this.readOverlayFile();\n this.overlayPayload = fromFile ?? {};\n return this.overlayPayload;\n }\n\n private async loadOverlayFromUrl(opts: { force?: boolean | undefined }): Promise<\n ModelsDevPayload | undefined\n > {\n if (!this.overlayUrl || !this.overlayCacheFile) return undefined;\n if (!opts.force) {\n const cached = await this.readCacheAt(this.overlayCacheFile);\n if (cached && this.isFresh(cached.fetchedAt)) return cached.payload;\n }\n try {\n const res = await this.fetchImpl(this.overlayUrl, {\n method: 'GET',\n headers: { accept: 'application/json' },\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const json = (await res.json()) as ModelsDevPayload;\n const envelope: CacheEnvelope = {\n fetchedAt: new Date().toISOString(),\n url: this.overlayUrl,\n payload: json,\n };\n await atomicWrite(this.overlayCacheFile, JSON.stringify(envelope)).catch(() => {});\n return json;\n } catch {\n // Network/parse failure — fall back to stale overlay cache, then the\n // bundled file (handled by the caller).\n const cached = await this.readCacheAt(this.overlayCacheFile);\n if (cached && this.isWithinMaxStaleAge(cached.fetchedAt)) return cached.payload;\n return undefined;\n }\n }\n\n private async readOverlayFile(): Promise<ModelsDevPayload | undefined> {\n if (!this.overlayFile) return undefined;\n try {\n const raw = await fs.readFile(this.overlayFile, 'utf8');\n return JSON.parse(raw) as ModelsDevPayload;\n } catch {\n return undefined;\n }\n }\n\n async refresh(): Promise<ModelsDevPayload> {\n // Refresh the models.dev base (throws on failure so `wstack models refresh`\n // can report it), then recompute the merged payload with a fresh overlay.\n const base = await this.refreshBase();\n const overlay = await this.loadOverlay({ force: true });\n this.payload = mergeModelsPayload(base, overlay);\n return this.payload;\n }\n\n async listProviders(): Promise<ResolvedProvider[]> {\n const payload = await this.load();\n return Object.values(payload).map((p) => this.resolveProvider(p));\n }\n\n async getProvider(id: string): Promise<ResolvedProvider | undefined> {\n const payload = await this.load();\n const p = payload[id];\n return p ? this.resolveProvider(p) : undefined;\n }\n\n async getModel(providerId: string, modelId: string): Promise<ResolvedModel | undefined> {\n const provider = await this.getProvider(providerId);\n if (!provider) return undefined;\n const model = provider.models.find((m) => m.id === modelId);\n if (!model) return undefined;\n return {\n providerId,\n modelId,\n capabilities: {\n tools: model.tool_call ?? false,\n vision: Boolean(model.modalities?.input?.includes('image')),\n reasoning: model.reasoning ?? false,\n maxContext: model.limit?.context ?? 0,\n maxOutput: model.limit?.output,\n knowledge: model.knowledge,\n },\n cost: model.cost,\n };\n }\n\n async suggestModel(providerId: string): Promise<string | undefined> {\n const provider = await this.getProvider(providerId);\n if (!provider || provider.models.length === 0) return undefined;\n const ranked = [...provider.models].sort((a, b) => {\n const at = a.release_date ?? a.last_updated ?? '';\n const bt = b.release_date ?? b.last_updated ?? '';\n return bt.localeCompare(at);\n });\n return ranked[0]?.id;\n }\n\n async ageSeconds(): Promise<number> {\n if (!this.fetchedAt) {\n const cached = await this.readCacheAt(this.cacheFile);\n if (!cached) return Number.POSITIVE_INFINITY;\n return (Date.now() - new Date(cached.fetchedAt).getTime()) / 1000;\n }\n return (Date.now() - this.fetchedAt.getTime()) / 1000;\n }\n\n private resolveProvider(p: ModelsDevProvider): ResolvedProvider {\n return {\n id: p.id,\n name: p.name,\n family: classifyFamily(p.npm),\n apiBase: p.api,\n envVars: p.env ?? [],\n doc: p.doc,\n models: Object.values(p.models ?? {}),\n npm: p.npm,\n };\n }\n\n private isFresh(fetchedAtIso: string): boolean {\n return Date.now() - new Date(fetchedAtIso).getTime() < this.ttlMs;\n }\n\n private isWithinMaxStaleAge(fetchedAtIso: string): boolean {\n return Date.now() - new Date(fetchedAtIso).getTime() < this.maxStaleAgeMs;\n }\n\n private async readCacheAt(file: string): Promise<CacheEnvelope | undefined> {\n try {\n const raw = await fs.readFile(file, 'utf8');\n return JSON.parse(raw) as CacheEnvelope;\n } catch {\n return undefined;\n }\n }\n\n /** Used by `wstack models refresh` to expose where the cache lives. */\n cacheLocation(): string {\n return path.resolve(this.cacheFile);\n }\n}\n\nfunction hasEntries(payload: ModelsDevPayload | undefined): payload is ModelsDevPayload {\n return payload !== undefined && Object.keys(payload).length > 0;\n}\n","export interface Mode {\n id: string;\n name: string;\n description: string;\n /** Additional prompt text injected into system prompt when mode is active */\n prompt: string;\n /** Tags for tool_search filtering */\n tags?: string[] | undefined;\n /** Tools that should be prioritized/highlighted when this mode is active */\n toolPreferences?: string[] | undefined;\n /**\n * Skill names that are particularly relevant to this mode. The system\n * prompt builder appends a \"Suggested skills\" note so the model knows\n * which domain knowledge to leverage first. Skill must exist in the\n * loaded skill set to appear.\n */\n suggestedSkills?: string[] | undefined;\n}\n\nexport interface ModeManifest {\n modes: Mode[];\n defaultMode?: string | undefined;\n}\n\nexport interface ModeStore {\n getActiveMode(): Promise<Mode | null>;\n setActiveMode(modeId: string | null): Promise<void>;\n listModes(): Promise<Mode[]>;\n getMode(modeId: string): Promise<Mode | null>;\n}\n\nexport interface ModeConfig {\n directory: string;\n}\n\nexport const DEFAULT_MODES: Mode[] = [\n {\n id: 'default',\n name: 'Default',\n description: 'General-purpose coding assistant',\n prompt: '',\n tags: ['general'],\n },\n {\n id: 'code-reviewer',\n name: 'Code Reviewer',\n description: 'Focus on code quality, best practices, and potential bugs',\n prompt: `## Code Reviewer Mode\n\nWhen reviewing code:\n- Look for potential bugs, race conditions, and edge cases\n- Check for security vulnerabilities (SQL injection, XSS, CSRF, etc.)\n- Evaluate error handling completeness\n- Assess code readability and maintainability\n- Check for performance anti-patterns\n- Verify test coverage for critical paths\n- Ensure naming conventions are followed`,\n tags: ['review', 'quality', 'security'],\n toolPreferences: ['read', 'grep', 'git', 'diff', 'test'],\n suggestedSkills: ['bug-hunter', 'security-scanner', 'typescript-strict', 'testing'],\n },\n {\n id: 'code-auditor',\n name: 'Code Auditor',\n description: 'Security-focused code analysis',\n prompt: `## Code Auditor Mode\n\nWhen auditing code for security:\n- Identify injection vulnerabilities (SQL, Command, XSS, LDAP)\n- Check authentication and authorization patterns\n- Look for sensitive data exposure (secrets, PII in logs)\n- Verify cryptographic implementations\n- Check for insecure dependencies or configurations\n- Assess input validation and output encoding\n- Look for timing attacks and information leakage`,\n tags: ['security', 'audit', 'compliance'],\n toolPreferences: ['grep', 'read', 'audit', 'bash'],\n suggestedSkills: ['security-scanner', 'bug-hunter', 'audit-log'],\n },\n {\n id: 'architect',\n name: 'Software Architect',\n description: 'Design patterns, scalability, and system design',\n prompt: `## Architect Mode\n\nWhen designing or reviewing architecture:\n- Evaluate scalability and future growth\n- Check for appropriate design patterns\n- Assess coupling and cohesion\n- Look for SOLID principle violations\n- Evaluate data modeling decisions\n- Check for eventual consistency issues\n- Assess API design and contract stability\n- Consider operational aspects (monitoring, logging, deployment)`,\n tags: ['architecture', 'design', 'scalability'],\n toolPreferences: ['read', 'glob', 'tree', 'diff'],\n suggestedSkills: ['api-design', 'refactor-planner', 'node-modern', 'docker-deploy'],\n },\n {\n id: 'debugger',\n name: 'Debugger',\n description: 'Root cause analysis and error investigation',\n prompt: `## Debugger Mode\n\nWhen investigating bugs:\n- Reproduce the issue with minimal steps\n- Check error messages and stack traces thoroughly\n- Look for related logs and historical context\n- Verify assumptions about data flow\n- Check for race conditions in async code\n- Validate environment and configuration\n- Use binary search to isolate the root cause\n- Verify fixes with tests before considering done`,\n tags: ['debug', 'investigation', 'error-resolution'],\n toolPreferences: ['read', 'grep', 'bash', 'logs', 'test'],\n suggestedSkills: ['bug-hunter', 'audit-log', 'observability'],\n },\n {\n id: 'tester',\n name: 'QA Engineer',\n description: 'Test coverage, edge cases, and quality assurance',\n prompt: `## Tester Mode\n\nWhen testing or writing tests:\n- Cover happy path and error paths equally\n- Think about edge cases and boundary conditions\n- Check for missing null/undefined handling tests\n- Verify error messages are tested\n- Look for race condition tests in async code\n- Assess mutation testing opportunities\n- Check for integration test gaps\n- Verify test isolation and cleanup`,\n tags: ['testing', 'qa', 'quality'],\n toolPreferences: ['read', 'grep', 'test', 'bash'],\n suggestedSkills: ['testing', 'bug-hunter', 'typescript-strict'],\n },\n {\n id: 'devops',\n name: 'DevOps Engineer',\n description: 'Infrastructure, deployment, and operations',\n prompt: `## DevOps Mode\n\nWhen working on infrastructure:\n- Check for containerization and deployment readiness\n- Verify CI/CD pipeline configurations\n- Assess monitoring and alerting setup\n- Look for health check endpoints\n- Check for graceful shutdown handling\n- Verify backup and disaster recovery plans\n- Assess secrets management\n- Check for resource limits and quotas`,\n tags: ['devops', 'infrastructure', 'operations'],\n toolPreferences: ['read', 'bash', 'grep', 'logs', 'git'],\n suggestedSkills: ['docker-deploy', 'observability', 'security-scanner'],\n },\n {\n id: 'refactorer',\n name: 'Refactorer',\n description: 'Code improvement and modernization',\n prompt: `## Refactorer Mode\n\nWhen refactoring code:\n- Maintain existing behavior — tests must pass before and after\n- Make one change at a time, verify after each\n- Prefer small, focused commits\n- Preserve API contracts unless explicitly changing\n- Remove dead code and comments\n- Improve naming as you go\n- Don't mix formatting changes with logic changes\n- Keep performance in mind — don't regress`,\n tags: ['refactor', 'modernization', 'improvement'],\n toolPreferences: ['read', 'edit', 'test', 'git', 'grep'],\n suggestedSkills: ['refactor-planner', 'typescript-strict', 'node-modern', 'testing'],\n },\n {\n id: 'brief',\n name: 'Brief',\n description: 'Fast, no-nonsense — get to the point',\n prompt: `## Brief Mode\n\nYou are WrongStack, a fast, no-nonsense AI coding agent.\nGet to the point — read files, run commands, make changes.\n\n### Operating rules\n1. **Read first.** Inspect relevant files before touching anything.\n2. **Edit surgically.** Use edit tool for existing files, write only for new ones.\n3. **One sentence before action.** State what you're doing, then do it.\n4. **Say what happened.** After tool calls, one line: success, failure, or what's next.\n5. **Be honest.** Admit when you don't know or something failed. No filler.\n6. **Keep moving.** Task done? Stop. More work needed? State it and continue.\n\n### Decision rules\n- **Ambiguous task?** Ask. One question, get clarity, proceed.\n- **Clear task, unknown approach?** Pick one reasonable path, execute, report.\n- **Tool fails?** Retry once with adjusted params, then report.\n\n### Output style\n- Prose paragraphs (no bullet points unless unavoidable)\n- Code blocks for code, backticks for paths/commands\n- One-liner sufficient? One liner.\n- Max 3 sentences per paragraph.`,\n tags: ['fast', 'concise', 'direct'],\n toolPreferences: ['read', 'edit', 'bash'],\n suggestedSkills: [],\n },\n {\n id: 'teach',\n name: 'Teach',\n description: 'Mentor mode — explains why, not just what',\n prompt: `## Teach Mode\n\nYou are WrongStack, an expert AI coding mentor.\n\nYou operate inside the user's terminal with full access to their codebase. You help developers learn and understand — not just execute tasks, but build mental models.\n\n### Teaching philosophy\n\n1. **Explain the why.** When you make a change, explain why it works that way — not just what you did.\n2. **Build mental models.** Use analogies, highlight patterns, connect new concepts to things the user already knows.\n3. **Read before teaching.** Always inspect relevant files so your explanations are accurate and specific to the actual code.\n4. **Surgical edits with context.** When editing code, explain the approach before doing it, and what trade-offs were considered.\n5. **Be thorough but not verbose.** A 2-paragraph explanation beats a 5-paragraph one. Depth without padding.\n6. **Admit knowledge gaps.** If you're unsure, say so. Speculating teaches bad patterns.\n\n### Teaching style\n\n- **Before action:** Briefly explain what you're going to do and why.\n- **After action:** Summarize what happened and what the user should take away from this.\n- **With code:** Show concrete examples, explain syntax choices, point out gotchas.\n- **With errors:** Explain why the error occurred, what it's actually complaining about, and how to avoid it in the future.\n- **General principles:** Offer them when the user's question suggests a deeper concept they'd benefit from understanding.\n\n### Decision heuristics\n\n- **Task is ambiguous?** Ask — but frame the question as \"what would you like to learn from this?\"\n- **Task is clear, approach is unknown?** Execute, then teach the approach as you go.\n- **Tool fails?** Explain what failed, why it failed, and how to avoid the failure.\n- **User asks \"how do I...?\"** Don't just give the answer — explain the underlying mechanism.\n- **Context window filling up?** Compact, but summarize what was lost so the teaching continuity isn't broken.\n\n### Output format\n\n- Use headings to structure multi-concept explanations.\n- Code blocks with brief annotations for code examples.\n- **Bold** key terms and concepts worth remembering.\n- Callouts like \"Key takeaway:\" or \"Pattern:\" to anchor learning.\n- Max 3 sentences per paragraph — readability over completeness.\n\n### Don'ts\n\n- Don't lecture condescendingly — the user is a developer, not a beginner.\n- Don't pad explanations with obvious things.\n- Don't skip the \"why\" — even quick tasks deserve one sentence of context.\n- Don't just say \"do X\" — say \"do X because Y.\"\n- Don't leave the user hanging after a complex operation — explain what just happened.\n\n### Core principles\n\nYou follow these principles, but always with explanation:\n- Read before write\n- Surgical edits over rewrites\n- Show your work (explain your reasoning, not just mechanical steps)\n- Be honest about limits\n- Format for scanability\n- Recover explicitly from failures\n\nRemember: your job is to make the user a better developer, not just to complete tasks faster.`,\n tags: ['teaching', 'mentor', 'learning'],\n toolPreferences: ['read', 'edit', 'explain'],\n suggestedSkills: ['prompt-engineering', 'skill-creator', 'node-modern', 'typescript-strict'],\n },\n];\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { atomicWrite } from '../utils/atomic-write.js';\nimport type { Mode, ModeConfig, ModeManifest, ModeStore } from '../types/mode.js';\nimport { DEFAULT_MODES } from '../types/mode.js';\n\nexport class DefaultModeStore implements ModeStore {\n private activeModeId: string | null = null;\n private modes: Mode[];\n private configDir: string;\n\n constructor(config: ModeConfig) {\n this.configDir = config.directory;\n this.modes = [...DEFAULT_MODES];\n }\n\n async getActiveMode(): Promise<Mode | null> {\n if (!this.activeModeId) {\n await this.loadActiveMode();\n }\n if (!this.activeModeId) return null;\n return this.modes.find((m) => m.id === this.activeModeId) ?? null;\n }\n\n async setActiveMode(modeId: string | null): Promise<void> {\n this.activeModeId = modeId;\n await this.saveActiveMode();\n }\n\n async listModes(): Promise<Mode[]> {\n return [...this.modes];\n }\n\n async getMode(modeId: string): Promise<Mode | null> {\n return this.modes.find((m) => m.id === modeId) ?? null;\n }\n\n async addMode(mode: Mode): Promise<void> {\n const idx = this.modes.findIndex((m) => m.id === mode.id);\n if (idx >= 0) {\n this.modes[idx] = mode;\n } else {\n this.modes.push(mode);\n }\n }\n\n async removeMode(modeId: string): Promise<void> {\n const builtIn = DEFAULT_MODES.find((m) => m.id === modeId);\n if (builtIn) {\n throw new Error(`Cannot remove built-in mode \"${modeId}\"`);\n }\n this.modes = this.modes.filter((m) => m.id !== modeId);\n if (this.activeModeId === modeId) {\n this.activeModeId = null;\n await this.saveActiveMode();\n }\n }\n\n private async loadActiveMode(): Promise<void> {\n try {\n const configPath = path.join(this.configDir, 'mode.json');\n const content = await fs.readFile(configPath, 'utf8');\n const data = JSON.parse(content);\n this.activeModeId = data.activeMode ?? null;\n } catch {\n this.activeModeId = 'default';\n }\n }\n\n private async saveActiveMode(): Promise<void> {\n try {\n await fs.mkdir(this.configDir, { recursive: true });\n const configPath = path.join(this.configDir, 'mode.json');\n // atomicWrite: torn write would leave mode.json malformed and the\n // next load would silently reset to \"default\".\n await atomicWrite(\n configPath,\n JSON.stringify({ activeMode: this.activeModeId }, null, 2),\n );\n } catch {\n // ignore save errors\n }\n }\n}\n\nexport interface ModeLoaderOptions {\n projectModesDir?: string | undefined;\n userModesDir?: string | undefined;\n}\n\nexport async function loadProjectModes(modesDir: string): Promise<Mode[]> {\n const modes: Mode[] = [];\n try {\n const entries = await fs.readdir(modesDir);\n for (const entry of entries) {\n if (!entry.endsWith('.md') && !entry.endsWith('.txt')) continue;\n const filePath = path.join(modesDir, entry);\n const stat = await fs.stat(filePath);\n if (!stat.isFile()) continue;\n const content = await fs.readFile(filePath, 'utf8');\n const id = path.basename(entry, path.extname(entry));\n modes.push({\n id,\n name: id.replace(/[-_]/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase()),\n description: content.split('\\n')[0] ?? id,\n prompt: content,\n tags: ['project'],\n });\n }\n } catch {\n // no project modes\n }\n return modes;\n}\n\nexport async function loadUserModes(modesDir: string): Promise<Mode[]> {\n const modes: Mode[] = [];\n try {\n const manifestPath = path.join(modesDir, 'modes.json');\n const content = await fs.readFile(manifestPath, 'utf8');\n const manifest: ModeManifest = JSON.parse(content);\n for (const mode of manifest.modes) {\n modes.push(mode);\n }\n } catch {\n // no user modes\n }\n return modes;\n}\n","export interface TextBlock {\n type: 'text';\n text: string;\n cache_control?: { type: 'ephemeral' | undefined };\n}\n\nexport interface ToolUseBlock {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n /**\n * Provider-specific opaque metadata captured from the wire response.\n * Echoed back verbatim in the next request so providers that bind\n * extra state to function calls keep working. Example: Gemini's\n * `thoughtSignature` — required for tool-use turns with thinking\n * models, otherwise the next request fails with 400 \"Function call\n * is missing a thought_signature in functionCall parts\".\n *\n * Keys are namespaced by intent so multiple wires can coexist:\n * - `google.thoughtSignature` — Gemini signed-thought blob\n * Other providers can add their own keys without colliding.\n */\n providerMeta?: Record<string, unknown>;\n}\n\nexport interface ToolResultBlock {\n type: 'tool_result';\n tool_use_id: string;\n /**\n * The original tool name. Useful for providers like Google Gemini that\n * need the tool name in `functionResponse.name` — the tool_use_id is\n * only a session-local identifier and is not stable across replays.\n * Always set by ToolExecutor; may be absent on manually-constructed blocks.\n */\n name?: string | undefined;\n content: string;\n is_error?: boolean | undefined;\n}\n\nexport interface ImageBlock {\n type: 'image';\n source: {\n type: 'base64' | 'url';\n media_type?: string | undefined;\n data?: string | undefined;\n url?: string | undefined;\n };\n}\n\n/**\n * Chain-of-thought / extended-thinking content emitted by the model.\n *\n * Both Anthropic extended thinking (`{type:'thinking', thinking, signature}`)\n * and DeepSeek reasoning mode (top-level `reasoning_content` on the assistant\n * message) require this content to be echoed back verbatim on the next\n * request, otherwise the provider returns 400:\n * - Anthropic: \"The `content[].thinking` in the thinking mode must be passed back\"\n * - DeepSeek: \"The `reasoning_content` in the thinking mode must be passed back\"\n *\n * `signature` is Anthropic-specific (an opaque integrity blob). DeepSeek\n * doesn't issue a signature — the field is absent for that provider.\n *\n * Per Anthropic, thinking blocks MUST appear before any text/tool_use blocks\n * in an assistant message. Stream builders preserve that order.\n */\nexport interface ThinkingBlock {\n type: 'thinking';\n thinking: string;\n signature?: string | undefined;\n providerMeta?: Record<string, unknown>;\n}\n\nexport type ContentBlock = TextBlock | ToolUseBlock | ToolResultBlock | ImageBlock | ThinkingBlock;\n\nexport function isTextBlock(b: ContentBlock): b is TextBlock {\n return b.type === 'text';\n}\nexport function isToolUseBlock(b: ContentBlock): b is ToolUseBlock {\n return b.type === 'tool_use';\n}\nexport function isToolResultBlock(b: ContentBlock): b is ToolResultBlock {\n return b.type === 'tool_result';\n}\nexport function isImageBlock(b: ContentBlock): b is ImageBlock {\n return b.type === 'image';\n}\nexport function isThinkingBlock(b: ContentBlock): b is ThinkingBlock {\n return b.type === 'thinking';\n}\n","import { isTextBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nimport type { Provider, Request } from '../types/provider.js';\nimport type { MessageSelector, SelectorResult } from '../types/selector.js';\n\n\n\nfunction expectDefined<T>(value: T | null | undefined): T {\n if (value === null || value === undefined) {\n throw new Error('Expected value to be defined');\n }\n return value;\n}\n\nexport interface LLMSelectorOptions {\n /** Provider used for the selector LLM call. Required. */\n provider: Provider;\n /** Model for the selector. Defaults to the provider's default model. */\n model?: string | undefined;\n /**\n * Maximum tokens to keep in context (target budget).\n * Selector will aim to keep total content below this.\n */\n maxContextTokens?: number | undefined;\n /**\n * Prompt instructing the selector how to behave.\n * Should guide the LLM on importance tiers and output format.\n */\n systemPrompt?: string | undefined;\n}\n\nconst DEFAULT_SYSTEM_PROMPT = `You are a context pruning assistant. Given a conversation history and a token budget, decide which message ranges are worth keeping verbatim and which should be collapsed into summaries.\n\nOutput a JSON object with this structure:\n{\n \"kept\": [{\"from\": 0, \"to\": 5, \"importance\": \"critical\"}],\n \"collapsed\": [{\"from\": 6, \"to\": 20, \"summary\": \"optional summary\"}],\n \"reasoning\": \"brief explanation of decisions\"\n}\n\nImportance tiers:\n- \"critical\": decisions, file edits, tool results that affect state, final answers\n- \"high\": substantive tool use, complex reasoning, non-obvious observations\n- \"medium\": routine exchanges, confirmations, straightforward Q&A\n\nRules:\n- Always keep the most recent K pairs (preserve recency)\n- Never collapse the final 2 user/assistant pairs (working memory)\n- Preserve tool results that modified files or had external effects\n- Collapse old, low-information exchanges (greetings, acknowledgements, etc.)\n- If unsure, keep rather than collapse (errors are more costly than waste)\n\nReturn ONLY the JSON object, no markdown, no explanation outside the JSON.`;\n\n/** Rough token estimation for a message array */\nfunction estimateTokens(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += Math.ceil(m.content.length / 4);\n } else if (Array.isArray(m.content)) {\n for (const b of m.content) {\n if (b.type === 'text') total += Math.ceil(b.text.length / 4);\n else total += Math.ceil(JSON.stringify(b).length / 4);\n }\n }\n }\n return total;\n}\n\n/** Format messages as a compact text dump for the selector LLM */\nfunction formatMessages(messages: Message[], maxChars = 8000): string {\n const lines: string[] = [];\n let used = 0;\n for (let i = 0; i < messages.length; i++) {\n const m = expectDefined(messages[i]);\n const role = m.role.padEnd(10, ' ');\n let text: string;\n if (typeof m.content === 'string') {\n text = m.content.slice(0, 500);\n } else {\n const content = m.content as import('../types/blocks.js').ContentBlock[];\n text = content\n .filter(isTextBlock)\n .map((b) => b.text)\n .join(' ');\n // Also capture tool names for context\n const toolUses = content.filter((b) => b.type === 'tool_use');\n if (toolUses.length > 0) {\n text += ` [tools: ${toolUses.map((b) => (b as { name: string }).name).join(', ')}]`;\n }\n }\n const line = `[${i}][${role}]: ${text}`;\n if (used + line.length > maxChars) break;\n lines.push(line);\n used += line.length;\n }\n return lines.join('\\n');\n}\n\n/**\n * LLM-powered message selector. Calls a sub-LLM to analyze the\n * message history and produce a keep/collapse plan — more surgical\n * than fixed-window rules.\n */\nexport class LLMSelector implements MessageSelector {\n private readonly provider: Provider;\n private readonly model: string;\n private readonly maxContextTokens: number;\n private readonly systemPrompt: string;\n\n constructor(opts: LLMSelectorOptions) {\n this.provider = opts.provider;\n this.model = opts.model ?? 'unknown';\n this.maxContextTokens = opts.maxContextTokens ?? 40_000;\n this.systemPrompt = opts.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\n }\n\n async select(messages: Message[], maxToKeep: number): Promise<SelectorResult> {\n const effectiveBudget = Math.min(maxToKeep, this.maxContextTokens);\n\n // Build a concise representation of the conversation\n const historyText = formatMessages(messages);\n const totalTokens = estimateTokens(messages);\n const systemText = `${this.systemPrompt}\\n\\nConversation (${messages.length} messages, ~${totalTokens} tokens, budget: ${effectiveBudget}):\\n`;\n\n // Add instruction to stay within budget\n const budgetInstruction =\n totalTokens > effectiveBudget\n ? `\\n\\nIMPORTANT: Total conversation (${totalTokens} tokens) exceeds budget (${effectiveBudget}). You MUST collapse enough to fit. Prefer collapsing older/lower-importance ranges.`\n : '';\n\n const req: Request = {\n model: this.model,\n system: [{ type: 'text', text: systemText + budgetInstruction }],\n messages: [{ role: 'user', content: historyText }],\n maxTokens: 1024,\n };\n\n let raw: string;\n try {\n // Wire the AbortController to the provider call so cancellation actually\n // fires — the original code passed a fresh signal that is never connected\n // to anything, leaking the controller on every selector call.\n const ac = new AbortController();\n const res = await this.provider.complete(req, { signal: ac.signal });\n const textBlocks = res.content.filter(isTextBlock);\n raw = textBlocks\n .map((b) => b.text)\n .join('\\n')\n .trim();\n } catch (_err) {\n // Fallback: use simple recency-based selection\n return this.fallbackSelect(messages, effectiveBudget);\n }\n\n return this.parseSelectorOutput(raw, messages.length);\n }\n\n private fallbackSelect(messages: Message[], budget: number): SelectorResult {\n // Simple fallback: keep from the end until we hit budget\n const toKeep: SelectorResult['kept'] = [];\n const toCollapse: SelectorResult['collapsed'] = [];\n\n let tokenCount = 0;\n let startIdx = 0;\n\n // Scan from the end backwards\n for (let i = messages.length - 1; i >= 0; i--) {\n const m = expectDefined(messages[i]);\n const cost =\n typeof m.content === 'string'\n ? Math.ceil(m.content.length / 4)\n : m.content.reduce(\n (acc, b) =>\n acc +\n (b.type === 'text'\n ? Math.ceil(b.text.length / 4)\n : Math.ceil(JSON.stringify(b).length / 4)),\n 0,\n );\n\n if (tokenCount + cost <= budget) {\n tokenCount += cost;\n } else {\n startIdx = i + 1;\n break;\n }\n }\n\n if (startIdx > 0) {\n toCollapse.push({ from: 0, to: startIdx - 1 });\n }\n toKeep.push({ from: startIdx, to: messages.length - 1, importance: 'high' });\n\n return {\n kept: toKeep,\n collapsed: toCollapse,\n reasoning: `Fallback: kept last ${messages.length - startIdx} messages within ${budget} token budget`,\n };\n }\n\n private parseSelectorOutput(raw: string, messageCount: number): SelectorResult {\n // Try to extract JSON from the response\n const jsonStart = raw.indexOf('{');\n const jsonEnd = raw.lastIndexOf('}');\n if (jsonStart === -1 || jsonEnd === -1) {\n // Can't parse — use fallback\n return this.fallbackSelect(\n Array.from({ length: messageCount }, () => ({ role: 'user', content: '' }) as Message),\n this.maxContextTokens,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw.slice(jsonStart, jsonEnd + 1));\n } catch {\n return this.fallbackSelect(\n Array.from({ length: messageCount }, () => ({ role: 'user', content: '' }) as Message),\n this.maxContextTokens,\n );\n }\n\n const obj = parsed as Record<string, unknown>;\n const kept =\n (obj.kept as Array<{ from: number; to: number; importance: string }> | undefined) ?? [];\n const collapsed =\n (obj.collapsed as Array<{ from: number; to: number; summary?: string | undefined }> | undefined) ?? [];\n\n return {\n kept: kept.map((k) => ({\n from: k.from,\n to: k.to,\n importance: (k.importance ?? 'medium') as 'critical' | 'high' | 'medium',\n })),\n collapsed: collapsed.map((c) => ({ from: c.from, to: c.to, summary: c.summary })),\n reasoning: typeof obj.reasoning === 'string' ? obj.reasoning : '',\n };\n }\n}\n"]}
|
|
@@ -5,29 +5,29 @@
|
|
|
5
5
|
interface ModelsDevModel {
|
|
6
6
|
id: string;
|
|
7
7
|
name: string;
|
|
8
|
-
family?: string;
|
|
9
|
-
attachment?: boolean;
|
|
10
|
-
reasoning?: boolean;
|
|
11
|
-
tool_call?: boolean;
|
|
12
|
-
temperature?: boolean;
|
|
13
|
-
knowledge?: string;
|
|
14
|
-
release_date?: string;
|
|
15
|
-
last_updated?: string;
|
|
16
|
-
open_weights?: boolean;
|
|
8
|
+
family?: string | undefined;
|
|
9
|
+
attachment?: boolean | undefined;
|
|
10
|
+
reasoning?: boolean | undefined;
|
|
11
|
+
tool_call?: boolean | undefined;
|
|
12
|
+
temperature?: boolean | undefined;
|
|
13
|
+
knowledge?: string | undefined;
|
|
14
|
+
release_date?: string | undefined;
|
|
15
|
+
last_updated?: string | undefined;
|
|
16
|
+
open_weights?: boolean | undefined;
|
|
17
17
|
modalities?: {
|
|
18
|
-
input?: string[];
|
|
19
|
-
output?: string[];
|
|
18
|
+
input?: string[] | undefined;
|
|
19
|
+
output?: string[] | undefined;
|
|
20
20
|
};
|
|
21
21
|
cost?: {
|
|
22
|
-
input?: number;
|
|
23
|
-
output?: number;
|
|
24
|
-
cache_read?: number;
|
|
25
|
-
cache_write?: number;
|
|
22
|
+
input?: number | undefined;
|
|
23
|
+
output?: number | undefined;
|
|
24
|
+
cache_read?: number | undefined;
|
|
25
|
+
cache_write?: number | undefined;
|
|
26
26
|
[k: string]: number | undefined;
|
|
27
27
|
};
|
|
28
28
|
limit?: {
|
|
29
|
-
context?: number;
|
|
30
|
-
output?: number;
|
|
29
|
+
context?: number | undefined;
|
|
30
|
+
output?: number | undefined;
|
|
31
31
|
};
|
|
32
32
|
[k: string]: unknown;
|
|
33
33
|
}
|
|
@@ -35,13 +35,13 @@ interface ModelsDevProvider {
|
|
|
35
35
|
id: string;
|
|
36
36
|
name: string;
|
|
37
37
|
/** Env vars that hold the API key, in priority order. */
|
|
38
|
-
env?: string[];
|
|
38
|
+
env?: string[] | undefined;
|
|
39
39
|
/** Identifies the wire format family (e.g. @ai-sdk/anthropic). */
|
|
40
|
-
npm?: string;
|
|
40
|
+
npm?: string | undefined;
|
|
41
41
|
/** Default base URL when not provided by SDK defaults. */
|
|
42
|
-
api?: string;
|
|
42
|
+
api?: string | undefined;
|
|
43
43
|
/** Documentation URL. */
|
|
44
|
-
doc?: string;
|
|
44
|
+
doc?: string | undefined;
|
|
45
45
|
models: Record<string, ModelsDevModel>;
|
|
46
46
|
}
|
|
47
47
|
type ModelsDevPayload = Record<string, ModelsDevProvider>;
|
|
@@ -54,11 +54,11 @@ interface ResolvedProvider {
|
|
|
54
54
|
id: string;
|
|
55
55
|
name: string;
|
|
56
56
|
family: WireFamily;
|
|
57
|
-
apiBase?: string;
|
|
57
|
+
apiBase?: string | undefined;
|
|
58
58
|
envVars: string[];
|
|
59
|
-
doc?: string;
|
|
59
|
+
doc?: string | undefined;
|
|
60
60
|
models: ModelsDevModel[];
|
|
61
|
-
npm?: string;
|
|
61
|
+
npm?: string | undefined;
|
|
62
62
|
}
|
|
63
63
|
interface ResolvedModel {
|
|
64
64
|
providerId: string;
|
|
@@ -68,15 +68,15 @@ interface ResolvedModel {
|
|
|
68
68
|
vision: boolean;
|
|
69
69
|
reasoning: boolean;
|
|
70
70
|
maxContext: number;
|
|
71
|
-
maxOutput?: number;
|
|
72
|
-
knowledge?: string;
|
|
71
|
+
maxOutput?: number | undefined;
|
|
72
|
+
knowledge?: string | undefined;
|
|
73
73
|
};
|
|
74
|
-
cost?: ModelsDevModel['cost'];
|
|
74
|
+
cost?: ModelsDevModel['cost'] | undefined;
|
|
75
75
|
}
|
|
76
76
|
interface ModelsRegistry {
|
|
77
77
|
/** Load (from cache or network). Idempotent; second call returns cached value. */
|
|
78
78
|
load(opts?: {
|
|
79
|
-
force?: boolean;
|
|
79
|
+
force?: boolean | undefined;
|
|
80
80
|
}): Promise<ModelsDevPayload>;
|
|
81
81
|
/** Force-refresh from network and overwrite cache. */
|
|
82
82
|
refresh(): Promise<ModelsDevPayload>;
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import { b as ModelsRegistry, M as ModelsDevPayload, c as ResolvedProvider, R as ResolvedModel, W as WireFamily } from './models-registry-
|
|
1
|
+
import { b as ModelsRegistry, M as ModelsDevPayload, c as ResolvedProvider, R as ResolvedModel, W as WireFamily } from './models-registry-Be3osGt5.js';
|
|
2
2
|
|
|
3
3
|
interface DefaultModelsRegistryOptions {
|
|
4
4
|
cacheFile: string;
|
|
5
|
-
url?: string;
|
|
6
|
-
ttlSeconds?: number;
|
|
7
|
-
fetchImpl?: typeof fetch;
|
|
5
|
+
url?: string | undefined;
|
|
6
|
+
ttlSeconds?: number | undefined;
|
|
7
|
+
fetchImpl?: typeof fetch | undefined;
|
|
8
8
|
/** Pre-seeded payload — useful for offline scenarios and tests. */
|
|
9
|
-
seed?: ModelsDevPayload;
|
|
9
|
+
seed?: ModelsDevPayload | undefined;
|
|
10
10
|
/**
|
|
11
11
|
* Maximum age in seconds for stale cache fallback when network fails.
|
|
12
12
|
* Defaults to 7 days. Set to `Infinity` for full offline resilience
|
|
13
13
|
* (risk: deprecated models, wrong pricing). Set to `0` to disable
|
|
14
14
|
* stale fallback entirely.
|
|
15
15
|
*/
|
|
16
|
-
maxStaleAgeSeconds?: number;
|
|
16
|
+
maxStaleAgeSeconds?: number | undefined;
|
|
17
17
|
/**
|
|
18
18
|
* Timeout in milliseconds for the models.dev network fetch. When exceeded,
|
|
19
19
|
* the fetch is aborted and cache/stale fallback is used instead.
|
|
20
20
|
* Defaults to 15 seconds. Set to `0` to disable (infinite wait).
|
|
21
21
|
*/
|
|
22
|
-
refreshTimeoutMs?: number;
|
|
22
|
+
refreshTimeoutMs?: number | undefined;
|
|
23
23
|
/**
|
|
24
24
|
* Curated override payload deep-merged ON TOP of the models.dev base via
|
|
25
25
|
* `mergeModelsPayload` — adds providers/models the base lacks and overrides
|
|
@@ -28,13 +28,13 @@ interface DefaultModelsRegistryOptions {
|
|
|
28
28
|
* (bundled, read from disk). A missing/broken overlay degrades to `{}` and
|
|
29
29
|
* never throws, so the base alone still works.
|
|
30
30
|
*/
|
|
31
|
-
overlay?: ModelsDevPayload;
|
|
31
|
+
overlay?: ModelsDevPayload | undefined;
|
|
32
32
|
/** GitHub-raw (or any) URL serving the curated overlay `providers.json`. */
|
|
33
|
-
overlayUrl?: string;
|
|
33
|
+
overlayUrl?: string | undefined;
|
|
34
34
|
/** Path to the bundled overlay `providers.json` (offline floor). */
|
|
35
|
-
overlayFile?: string;
|
|
35
|
+
overlayFile?: string | undefined;
|
|
36
36
|
/** Cache file for the fetched `overlayUrl`. Defaults next to `cacheFile`. */
|
|
37
|
-
overlayCacheFile?: string;
|
|
37
|
+
overlayCacheFile?: string | undefined;
|
|
38
38
|
}
|
|
39
39
|
declare function classifyFamily(npm: string | undefined): WireFamily;
|
|
40
40
|
declare class DefaultModelsRegistry implements ModelsRegistry {
|
|
@@ -56,7 +56,7 @@ declare class DefaultModelsRegistry implements ModelsRegistry {
|
|
|
56
56
|
private readonly overlayCacheFile?;
|
|
57
57
|
constructor(opts: DefaultModelsRegistryOptions);
|
|
58
58
|
load(opts?: {
|
|
59
|
-
force?: boolean;
|
|
59
|
+
force?: boolean | undefined;
|
|
60
60
|
}): Promise<ModelsDevPayload>;
|
|
61
61
|
/**
|
|
62
62
|
* Load the models.dev base payload: fresh cache → network → stale cache.
|