feat: initial Lam Agent extension (#1)

This commit was merged in pull request #1.
This commit is contained in:
2026-10-03 20:32:40 +00:00
parent 1d39aabb50
commit 8b507e7953
36 changed files with 7136 additions and 2 deletions
+54
View File
@@ -0,0 +1,54 @@
import { getPreferenceValues } from "@vicinae/api";
import { DEFAULT_HOST, DEFAULT_MODEL } from "./constants";
/**
* Preferences, read and normalised.
*
* Declared locally rather than relying on the `vicinae-env.d.ts` that the
* `vici` toolchain generates, so this file typechecks and unit-tests without a
* codegen step. The manifest in `package.json` remains the source of truth; if
* a preference is added there, mirror it here.
*/
export interface LamPreferences {
apiKey?: string;
model?: string;
ollamaHost?: string;
systemPrompt?: string;
webSearchEnabled?: boolean;
thinking?: string;
}
/** Preferences with every optional value filled in, so callers never branch on undefined. */
export interface ResolvedPreferences {
apiKey: string;
model: string;
host: string;
systemPrompt: string;
webEnabled: boolean;
/** Undefined when reasoning is off, which is what the API client expects. */
think?: string;
}
export function resolvePreferences(raw: LamPreferences): ResolvedPreferences {
const thinking = (raw.thinking ?? "").trim();
return {
apiKey: (raw.apiKey ?? "").trim(),
model: (raw.model ?? "").trim() || DEFAULT_MODEL,
host: (raw.ollamaHost ?? "").trim() || DEFAULT_HOST,
systemPrompt: (raw.systemPrompt ?? "").trim(),
// Defaults to on: the preference is a checkbox the user has to actively untick.
webEnabled: raw.webSearchEnabled ?? true,
think: thinking && thinking !== "off" ? thinking : undefined,
};
}
export function getLamPreferences(): ResolvedPreferences {
return resolvePreferences(getPreferenceValues<LamPreferences>());
}
/** True when the extension cannot work until the user supplies a key. */
export function needsSetup(preferences: ResolvedPreferences): boolean {
return preferences.apiKey.length === 0;
}