{"version":3,"file":"index.mjs","names":["invalid","valid","isModelOptionKey"],"sources":["../src/options/definitions.ts","../src/store.ts","../src/core/state.ts","../src/core/payload.ts","../src/options/presets.ts","../src/options/status.ts","../src/ui/constants.ts","../src/ui/dialogs.ts","../src/ui/panel.ts","../src/options/panel.ts","../src/index.ts"],"sourcesContent":["type ProviderTarget = \"root\" | \"options\";\n\ninterface ValidationResult<T> {\n  ok: boolean;\n  value?: T;\n  message?: string;\n}\n\nexport interface ModelOptionDefinition {\n  label: string;\n  statusLabel: string;\n  providerTargets: readonly ProviderTarget[];\n  validate(input: string): ValidationResult<number>;\n  format(value: number | undefined): string;\n}\n\nconst NUMBER_FORMATTER = (value: number | undefined): string =>\n  value === undefined ? \"-\" : String(value);\n\nfunction invalid(message: string): ValidationResult<number> {\n  return { ok: false, message };\n}\n\nfunction valid(value: number): ValidationResult<number> {\n  return { ok: true, value };\n}\n\nfunction validateInteger(\n  input: string,\n  isValid: (value: number) => boolean,\n  message: string,\n): ValidationResult<number> {\n  if (input.trim() === \"\") return invalid(message);\n  const parsed = Number(input);\n  if (!Number.isInteger(parsed)) return invalid(message);\n  return isValid(parsed) ? valid(parsed) : invalid(message);\n}\n\nfunction validateNumber(\n  input: string,\n  isValid: (value: number) => boolean,\n  message: string,\n): ValidationResult<number> {\n  if (input.trim() === \"\") return invalid(message);\n  const parsed = Number(input);\n  if (!Number.isFinite(parsed)) return invalid(message);\n  return isValid(parsed) ? valid(parsed) : invalid(message);\n}\n\nfunction validateNumCtx(input: string): ValidationResult<number> {\n  return validateInteger(\n    input,\n    (value) => value >= 1024,\n    \"num_ctx must be an integer >= 1024\",\n  );\n}\n\nfunction validateTemperature(input: string): ValidationResult<number> {\n  return validateNumber(\n    input,\n    (value) => value >= 0 && value <= 2,\n    \"Temperature must be between 0 and 2\",\n  );\n}\n\nfunction validateTopP(input: string): ValidationResult<number> {\n  return validateNumber(\n    input,\n    (value) => value > 0 && value <= 1,\n    \"top_p must be > 0 and <= 1\",\n  );\n}\n\nexport const MODEL_OPTION_DEFINITIONS = {\n  temperature: {\n    label: \"Temperature\",\n    statusLabel: \"temp\",\n    providerTargets: [\"root\", \"options\"],\n    validate: validateTemperature,\n    format: NUMBER_FORMATTER,\n  },\n  top_p: {\n    label: \"Top P\",\n    statusLabel: \"top_p\",\n    providerTargets: [\"root\", \"options\"],\n    validate: validateTopP,\n    format: NUMBER_FORMATTER,\n  },\n  num_ctx: {\n    label: \"Num ctx\",\n    statusLabel: \"ctx\",\n    providerTargets: [\"options\"],\n    validate: validateNumCtx,\n    format: NUMBER_FORMATTER,\n  },\n} as const satisfies Record<string, ModelOptionDefinition>;\n\nexport type ModelOptionKey = keyof typeof MODEL_OPTION_DEFINITIONS;\n\nexport interface ModelOptions extends Partial<Record<ModelOptionKey, number>> {\n  enabled: boolean;\n}\n\nexport const MODEL_OPTION_KEYS = Object.keys(\n  MODEL_OPTION_DEFINITIONS,\n) as ModelOptionKey[];\n\nexport function formatOptionValue(\n  key: ModelOptionKey,\n  value: number | undefined,\n): string {\n  return MODEL_OPTION_DEFINITIONS[key].format(value);\n}\n\nexport function hasConfiguredValues(\n  options: ModelOptions | undefined,\n): options is ModelOptions {\n  return (\n    !!options && MODEL_OPTION_KEYS.some((key) => options[key] !== undefined)\n  );\n}\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { getModelKey, type ActiveModel } from \"./core/state\";\nimport {\n  MODEL_OPTION_DEFINITIONS,\n  type ModelOptionKey,\n  type ModelOptions,\n} from \"./options/definitions\";\n\nexport interface Store {\n  version: 1;\n  models: Record<string, ModelOptions>;\n}\n\nconst STORE_PATH = path.join(\n  os.homedir(),\n  \".pi\",\n  \"agent\",\n  \"local-options.json\",\n);\n\nconst EMPTY_STORE: Store = { version: 1, models: {} };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isModelOptionKey(value: string): value is ModelOptionKey {\n  return value in MODEL_OPTION_DEFINITIONS;\n}\n\nfunction isModelOptions(value: unknown): value is ModelOptions {\n  if (!isRecord(value)) return false;\n  if (typeof value.enabled !== \"boolean\") return false;\n\n  for (const [key, optionValue] of Object.entries(value)) {\n    if (key === \"enabled\") continue;\n    if (!isModelOptionKey(key)) return false;\n    if (typeof optionValue !== \"number\") return false;\n  }\n\n  return true;\n}\n\nfunction isStore(value: unknown): value is Store {\n  if (!isRecord(value)) return false;\n  if (value.version !== 1) return false;\n  if (!isRecord(value.models)) return false;\n  return Object.values(value.models).every(isModelOptions);\n}\n\nexport function getModelOptions(\n  store: Store,\n  model: ActiveModel,\n): ModelOptions | undefined {\n  return store.models[getModelKey(model)];\n}\n\nexport function loadStore(): Store {\n  try {\n    if (!fs.existsSync(STORE_PATH)) return EMPTY_STORE;\n    const raw = JSON.parse(fs.readFileSync(STORE_PATH, \"utf8\")) as unknown;\n    return isStore(raw) ? raw : EMPTY_STORE;\n  } catch {\n    return EMPTY_STORE;\n  }\n}\n\nexport function resetModelOptions(store: Store, model: ActiveModel): Store {\n  const models = { ...store.models };\n  delete models[getModelKey(model)];\n  return { ...store, models };\n}\n\nexport function saveStore(store: Store): void {\n  fs.mkdirSync(path.dirname(STORE_PATH), { recursive: true });\n  fs.writeFileSync(STORE_PATH, JSON.stringify(store, null, 2));\n}\n\nexport function setModelOptions(\n  store: Store,\n  model: ActiveModel,\n  options: ModelOptions,\n): Store {\n  return {\n    ...store,\n    models: {\n      ...store.models,\n      [getModelKey(model)]: options,\n    },\n  };\n}\n","import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { loadStore } from \"../store\";\nimport type { Store } from \"../store\";\n\nexport interface ActiveModel {\n  provider: string;\n  id: string;\n}\n\nexport interface ExtensionState {\n  store: Store;\n  activeModel: ActiveModel | undefined;\n}\n\nexport function getContextModel(\n  ctx: ExtensionContext,\n): ActiveModel | undefined {\n  if (!ctx.model) return undefined;\n  return { provider: ctx.model.provider, id: ctx.model.id };\n}\n\nexport function getModelKey(model: ActiveModel): string {\n  return `${model.provider}/${model.id}`;\n}\n\nexport function createState(): ExtensionState {\n  return {\n    store: loadStore(),\n    activeModel: undefined,\n  };\n}\n\nexport function setActiveModel(\n  state: ExtensionState,\n  model: ActiveModel | undefined,\n): void {\n  state.activeModel = model;\n}\n","import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport {\n  hasConfiguredValues,\n  MODEL_OPTION_DEFINITIONS,\n  MODEL_OPTION_KEYS,\n  type ModelOptions,\n} from \"../options/definitions\";\nimport { getModelOptions } from \"../store\";\nimport { getContextModel, type ExtensionState } from \"./state\";\n\ninterface ProviderOptionsPatch {\n  root: Record<string, number>;\n  options: Record<string, number>;\n}\n\nfunction buildProviderOptionsPatch(\n  options: ModelOptions,\n): ProviderOptionsPatch {\n  const patch: ProviderOptionsPatch = { root: {}, options: {} };\n\n  for (const key of MODEL_OPTION_KEYS) {\n    const value = options[key];\n    if (value === undefined) continue;\n\n    for (const target of MODEL_OPTION_DEFINITIONS[key].providerTargets) {\n      patch[target][key] = value;\n    }\n  }\n\n  return patch;\n}\n\nfunction isPayload(value: unknown): value is Record<string, unknown> {\n  return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction omitNullish(\n  payload: Record<string, unknown>,\n): Record<string, unknown> {\n  return Object.fromEntries(\n    Object.entries(payload).filter(\n      ([, value]) => value !== null && value !== undefined,\n    ),\n  );\n}\n\nfunction mergePayloadPatch(\n  payload: Record<string, unknown>,\n  patch: ProviderOptionsPatch,\n): Record<string, unknown> {\n  const next = { ...omitNullish(payload), ...patch.root };\n  const existingOptions = isPayload(payload.options)\n    ? omitNullish(payload.options)\n    : {};\n\n  next.options = { ...existingOptions, ...patch.options };\n  return next;\n}\n\nfunction shouldPatch(\n  options: ModelOptions | undefined,\n): options is ModelOptions {\n  return !!options && options.enabled && hasConfiguredValues(options);\n}\n\nexport function patchPayload(\n  state: ExtensionState,\n  payload: unknown,\n  ctx: ExtensionContext,\n): unknown {\n  if (!isPayload(payload)) return payload;\n\n  const model = getContextModel(ctx) ?? state.activeModel;\n  if (!model) return payload;\n\n  const options = getModelOptions(state.store, model);\n  if (!shouldPatch(options)) return payload;\n\n  return mergePayloadPatch(payload, buildProviderOptionsPatch(options));\n}\n","import {\n  hasConfiguredValues,\n  MODEL_OPTION_KEYS,\n  type ModelOptions,\n} from \"./definitions\";\n\ninterface PresetDefinition {\n  id: string;\n  label: string;\n  options: ModelOptions;\n}\n\nconst PRESET_DEFINITIONS = [\n  {\n    id: \"precise\",\n    label: \"Precise\",\n    options: {\n      enabled: true,\n      temperature: 0.1,\n      top_p: 0.9,\n      num_ctx: 32768,\n    },\n  },\n  {\n    id: \"balanced\",\n    label: \"Balanced\",\n    options: {\n      enabled: true,\n      temperature: 0.3,\n      top_p: 0.9,\n      num_ctx: 32768,\n    },\n  },\n  {\n    id: \"exploratory\",\n    label: \"Exploratory\",\n    options: {\n      enabled: true,\n      temperature: 0.7,\n      top_p: 0.95,\n      num_ctx: 32768,\n    },\n  },\n] as const satisfies readonly PresetDefinition[];\n\nexport type PresetId = (typeof PRESET_DEFINITIONS)[number][\"id\"];\n\nconst PRESET_IDS = PRESET_DEFINITIONS.map((preset) => preset.id);\nconst PRESETS_BY_ID = Object.fromEntries(\n  PRESET_DEFINITIONS.map((preset) => [preset.id, preset]),\n) as Record<PresetId, (typeof PRESET_DEFINITIONS)[number]>;\n\nexport const PRESET_ITEMS = PRESET_DEFINITIONS.map((preset) => ({\n  value: preset.id,\n  label: preset.label,\n}));\n\nfunction isPresetMatch(\n  options: ModelOptions,\n  preset: PresetDefinition,\n): boolean {\n  return MODEL_OPTION_KEYS.every((key) => options[key] === preset.options[key]);\n}\n\nexport function isPresetId(value: string): value is PresetId {\n  return PRESET_IDS.includes(value as PresetId);\n}\n\nexport function getPresetId(options: ModelOptions): PresetId | undefined {\n  return PRESET_DEFINITIONS.find((preset) => isPresetMatch(options, preset))\n    ?.id;\n}\n\nexport function getPresetValue(options: ModelOptions): string {\n  return (\n    getPresetId(options) ?? (hasConfiguredValues(options) ? \"custom\" : \"-\")\n  );\n}\n\nexport function applyPreset(\n  options: ModelOptions,\n  presetId: string,\n): ModelOptions {\n  if (!isPresetId(presetId)) return options;\n  return { ...options, ...PRESETS_BY_ID[presetId].options };\n}\n","import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport {\n  formatOptionValue,\n  hasConfiguredValues,\n  MODEL_OPTION_DEFINITIONS,\n  MODEL_OPTION_KEYS,\n  type ModelOptions,\n} from \"./definitions\";\nimport { getModelOptions } from \"../store\";\nimport {\n  getModelKey,\n  getContextModel,\n  type ActiveModel,\n  type ExtensionState,\n} from \"../core/state\";\nimport { getPresetId } from \"./presets\";\n\nconst STATUS_KEY = \"local-options\";\nconst STATUS_SEPARATOR = \" \";\n\nfunction clearStatus(ctx: ExtensionContext): void {\n  ctx.ui.setStatus(STATUS_KEY, \"\");\n}\n\nfunction formatStatus(model: ActiveModel, options: ModelOptions): string {\n  const presetId = getPresetId(options);\n  const presetLabel = presetId\n    ? presetId.charAt(0).toUpperCase() + presetId.slice(1)\n    : \"\";\n\n  const values = MODEL_OPTION_KEYS.map((key) => {\n    const definition = MODEL_OPTION_DEFINITIONS[key];\n    return `${definition.statusLabel}=${formatOptionValue(key, options[key])}`;\n  }).join(STATUS_SEPARATOR);\n\n  if (presetLabel) {\n    return `local ${getModelKey(model)} ${presetLabel} ${values}`;\n  }\n\n  return `local ${getModelKey(model)} ${values}`;\n}\n\nexport function renderOptionsStatus(\n  state: ExtensionState,\n  ctx: ExtensionContext,\n): void {\n  const model = getContextModel(ctx) ?? state.activeModel;\n  if (!model) {\n    clearStatus(ctx);\n    return;\n  }\n\n  const options = getModelOptions(state.store, model);\n  if (!options || !options.enabled || !hasConfiguredValues(options)) {\n    clearStatus(ctx);\n    return;\n  }\n\n  ctx.ui.setStatus(STATUS_KEY, formatStatus(model, options));\n}\n","export const LIST_HEIGHT = 8;\nexport const SELECT_DIALOG_HINT = \"↑↓ navigate • enter select • esc cancel\";\n","import type { Theme } from \"@earendil-works/pi-coding-agent\";\nimport {\n  Container,\n  Input,\n  SelectList,\n  Text,\n  type Component,\n  type SelectItem,\n} from \"@earendil-works/pi-tui\";\nimport { LIST_HEIGHT, SELECT_DIALOG_HINT } from \"./constants\";\n\nfunction createDialogContainer(title: string, theme: Theme): Container {\n  const container = new Container();\n  container.addChild(new Text(theme.fg(\"accent\", theme.bold(title))));\n  return container;\n}\n\nfunction createInput(prefill: string, done: (value?: string) => void): Input {\n  const input = new Input();\n  input.setValue(prefill);\n  input.onSubmit = (value) => done(value);\n  input.onEscape = () => done(undefined);\n  return input;\n}\n\nfunction createSelectList(\n  items: SelectItem[],\n  theme: Theme,\n  done: (value?: string) => void,\n): SelectList {\n  const list = new SelectList(items, Math.min(items.length, LIST_HEIGHT), {\n    selectedPrefix: (text: string) => theme.fg(\"accent\", text),\n    selectedText: (text: string) => theme.fg(\"accent\", text),\n    description: (text: string) => theme.fg(\"muted\", text),\n    scrollInfo: (text: string) => theme.fg(\"dim\", text),\n    noMatch: (text: string) => theme.fg(\"warning\", text),\n  });\n  list.onSelect = (item: SelectItem) => done(item.value);\n  list.onCancel = () => done(undefined);\n  return list;\n}\n\nexport function createInputDialog(\n  title: string,\n  prefill: string,\n  hint: string,\n  theme: Theme,\n  done: (value?: string) => void,\n): Component {\n  const input = createInput(prefill, done);\n  const container = createDialogContainer(title, theme);\n  container.addChild(input);\n  container.addChild(new Text(theme.fg(\"dim\", hint)));\n\n  return {\n    render: (width: number) => container.render(width),\n    invalidate: () => container.invalidate(),\n    handleInput: (data: string) => input.handleInput(data),\n  };\n}\n\nexport function createSelectDialog(\n  title: string,\n  items: SelectItem[],\n  theme: Theme,\n  done: (value?: string) => void,\n): Component {\n  const list = createSelectList(items, theme, done);\n  const container = createDialogContainer(title, theme);\n  container.addChild(list);\n  container.addChild(new Text(theme.fg(\"dim\", SELECT_DIALOG_HINT)));\n\n  return {\n    render: (width: number) => container.render(width),\n    invalidate: () => container.invalidate(),\n    handleInput: (data: string) => list.handleInput(data),\n  };\n}\n","import {\n  getSettingsListTheme,\n  type ExtensionContext,\n  type Theme,\n} from \"@earendil-works/pi-coding-agent\";\nimport {\n  Container,\n  SettingsList,\n  Text,\n  type SettingItem,\n} from \"@earendil-works/pi-tui\";\nimport { LIST_HEIGHT } from \"./constants\";\n\nexport interface SettingsPanelControls {\n  updateValue(id: string, value: string): void;\n  requestRender(): void;\n}\n\nexport interface SettingsPanelConfig {\n  title: string;\n  buildItems(theme: Theme): SettingItem[];\n  onChange(id: string, value: string, controls: SettingsPanelControls): void;\n}\n\nexport async function openSettingsPanel(\n  ctx: ExtensionContext,\n  config: SettingsPanelConfig,\n): Promise<void> {\n  await ctx.ui.custom<void>((tui, theme, _kb, done) => {\n    const container = new Container();\n    container.addChild(new Text(theme.fg(\"accent\", theme.bold(config.title))));\n\n    const settingsList = new SettingsList(\n      config.buildItems(theme),\n      LIST_HEIGHT,\n      getSettingsListTheme(),\n      (id: string, value: string) => {\n        config.onChange(id, value, {\n          updateValue: (itemId: string, nextValue: string) =>\n            settingsList.updateValue(itemId, nextValue),\n          requestRender: () => tui.requestRender(),\n        });\n      },\n      () => done(undefined),\n    );\n\n    container.addChild(settingsList);\n\n    return {\n      render: (width: number) => container.render(width),\n      invalidate: () => container.invalidate(),\n      handleInput: (data: string) => {\n        settingsList.handleInput?.(data);\n        tui.requestRender();\n      },\n    };\n  });\n}\n","import type { ExtensionContext, Theme } from \"@earendil-works/pi-coding-agent\";\nimport type { SettingItem } from \"@earendil-works/pi-tui\";\nimport {\n  formatOptionValue,\n  MODEL_OPTION_DEFINITIONS,\n  MODEL_OPTION_KEYS,\n  type ModelOptionKey,\n  type ModelOptions,\n} from \"./definitions\";\nimport {\n  applyPreset,\n  getPresetValue,\n  isPresetId,\n  PRESET_ITEMS,\n  type PresetId,\n} from \"./presets\";\nimport {\n  getModelOptions,\n  resetModelOptions,\n  saveStore,\n  setModelOptions,\n} from \"../store\";\nimport {\n  getModelKey,\n  type ActiveModel,\n  type ExtensionState,\n} from \"../core/state\";\nimport { renderOptionsStatus } from \"./status\";\nimport { createInputDialog, createSelectDialog } from \"../ui/dialogs\";\nimport { openSettingsPanel, type SettingsPanelControls } from \"../ui/panel\";\n\nconst INPUT_HINT = \"Enter to save • Esc cancel\";\nconst EMPTY_OPTIONS: ModelOptions = { enabled: false };\nconst ENABLED_ID = \"enabled\";\nconst PRESET_ID = \"preset\";\nconst RESET_ID = \"reset\";\nconst TRUE_VALUE = \"true\";\nconst FALSE_VALUE = \"false\";\nconst CLEAR_VALUE = \"clear\";\nconst UNSET_VALUE = \"-\";\nconst EMPTY_VALUE = \"\";\nconst PRESET_TITLE = \"Preset\";\nconst RESET_LABEL = \"Reset current model\";\nconst INVALID_VALUE_MESSAGE = \"Invalid value\";\nconst ERROR_LEVEL = \"error\";\n\nfunction buildEnabledItem(options: ModelOptions): SettingItem {\n  return {\n    id: ENABLED_ID,\n    label: \"Enabled\",\n    currentValue: String(options.enabled),\n    values: [TRUE_VALUE, FALSE_VALUE],\n  };\n}\n\nfunction buildNumberItem(\n  id: string,\n  label: string,\n  currentValue: string,\n  theme: Theme,\n): SettingItem {\n  return {\n    id,\n    label,\n    currentValue,\n    submenu: (value: string, done: (selectedValue?: string) => void) =>\n      createInputDialog(\n        label,\n        value === UNSET_VALUE ? EMPTY_VALUE : value,\n        INPUT_HINT,\n        theme,\n        done,\n      ),\n  };\n}\n\nfunction buildPresetItem(options: ModelOptions, theme: Theme): SettingItem {\n  return {\n    id: PRESET_ID,\n    label: PRESET_TITLE,\n    currentValue: getPresetValue(options),\n    submenu: (_currentValue: string, done: (selectedValue?: string) => void) =>\n      createSelectDialog(PRESET_TITLE, PRESET_ITEMS, theme, done),\n  };\n}\n\nfunction buildResetItem(): SettingItem {\n  return {\n    id: RESET_ID,\n    label: RESET_LABEL,\n    currentValue: CLEAR_VALUE,\n    values: [CLEAR_VALUE],\n  };\n}\n\nfunction buildSettingItem(\n  key: ModelOptionKey,\n  options: ModelOptions,\n  theme: Theme,\n): SettingItem {\n  return buildNumberItem(\n    key,\n    MODEL_OPTION_DEFINITIONS[key].label,\n    formatOptionValue(key, options[key]),\n    theme,\n  );\n}\n\nfunction buildSettingItems(options: ModelOptions, theme: Theme): SettingItem[] {\n  return [\n    buildPresetItem(options, theme),\n    buildEnabledItem(options),\n    ...MODEL_OPTION_KEYS.map((key) => buildSettingItem(key, options, theme)),\n    buildResetItem(),\n  ];\n}\n\nfunction refreshSettingItems(\n  controls: SettingsPanelControls,\n  options: ModelOptions,\n): void {\n  controls.updateValue(ENABLED_ID, String(options.enabled));\n  for (const key of MODEL_OPTION_KEYS) {\n    controls.updateValue(key, formatOptionValue(key, options[key]));\n  }\n  controls.updateValue(PRESET_ID, getPresetValue(options));\n  controls.updateValue(RESET_ID, CLEAR_VALUE);\n}\n\nfunction isModelOptionKey(value: string): value is ModelOptionKey {\n  return value in MODEL_OPTION_DEFINITIONS;\n}\n\nfunction clearModelOptions(state: ExtensionState, model: ActiveModel): void {\n  state.store = resetModelOptions(state.store, model);\n  saveStore(state.store);\n}\n\nfunction persistModelOptions(\n  state: ExtensionState,\n  model: ActiveModel,\n  options: ModelOptions,\n): void {\n  state.store = setModelOptions(state.store, model, options);\n  saveStore(state.store);\n}\n\nfunction resetOptions(state: ExtensionState, model: ActiveModel): ModelOptions {\n  clearModelOptions(state, model);\n  return EMPTY_OPTIONS;\n}\n\nfunction saveOptions(\n  state: ExtensionState,\n  model: ActiveModel,\n  options: ModelOptions,\n): ModelOptions {\n  persistModelOptions(state, model, options);\n  return options;\n}\n\ntype OptionAction =\n  | { type: \"set-enabled\"; enabled: boolean }\n  | { type: \"apply-preset\"; presetId: PresetId }\n  | { type: \"reset\" }\n  | { type: \"set-option\"; key: ModelOptionKey; value: number };\n\ntype ActionResult =\n  | { ok: true; action: OptionAction }\n  | { ok: false; message: string };\n\nfunction invalid(message: string): ActionResult {\n  return { ok: false, message };\n}\n\nfunction valid(action: OptionAction): ActionResult {\n  return { ok: true, action };\n}\n\nfunction parseOptionAction(id: string, value: string): ActionResult {\n  if (id === ENABLED_ID) {\n    if (value === TRUE_VALUE)\n      return valid({ type: \"set-enabled\", enabled: true });\n    if (value === FALSE_VALUE) {\n      return valid({ type: \"set-enabled\", enabled: false });\n    }\n    return invalid(INVALID_VALUE_MESSAGE);\n  }\n\n  if (id === PRESET_ID) {\n    if (!isPresetId(value)) return invalid(INVALID_VALUE_MESSAGE);\n    return valid({ type: \"apply-preset\", presetId: value });\n  }\n\n  if (id === RESET_ID) return valid({ type: \"reset\" });\n  if (!isModelOptionKey(id)) return invalid(INVALID_VALUE_MESSAGE);\n\n  const result = MODEL_OPTION_DEFINITIONS[id].validate(value);\n  if (!result.ok || result.value === undefined) {\n    return invalid(result.message ?? INVALID_VALUE_MESSAGE);\n  }\n\n  return valid({ type: \"set-option\", key: id, value: result.value });\n}\n\nfunction applyOptionAction(\n  state: ExtensionState,\n  model: ActiveModel,\n  action: OptionAction,\n): ModelOptions {\n  const current = getModelOptions(state.store, model) ?? EMPTY_OPTIONS;\n\n  if (action.type === \"set-enabled\") {\n    return saveOptions(state, model, { ...current, enabled: action.enabled });\n  }\n  if (action.type === \"apply-preset\") {\n    return saveOptions(state, model, applyPreset(current, action.presetId));\n  }\n  if (action.type === \"reset\") return resetOptions(state, model);\n\n  return saveOptions(state, model, {\n    ...current,\n    [action.key]: action.value,\n    enabled: true,\n  });\n}\n\nexport async function openOptionsPanel(\n  state: ExtensionState,\n  ctx: ExtensionContext,\n  model: ActiveModel,\n): Promise<void> {\n  const options = getModelOptions(state.store, model) ?? EMPTY_OPTIONS;\n\n  await openSettingsPanel(ctx, {\n    title: `Model options: ${getModelKey(model)}`,\n    buildItems: (theme) => buildSettingItems(options, theme),\n    onChange: (id, value, controls) => {\n      const result = parseOptionAction(id, value);\n      if (!result.ok) {\n        ctx.ui.notify(result.message, ERROR_LEVEL);\n        controls.requestRender();\n        return;\n      }\n\n      const next = applyOptionAction(state, model, result.action);\n      renderOptionsStatus(state, ctx);\n      refreshSettingItems(controls, next);\n      controls.requestRender();\n    },\n  });\n}\n","import type {\n  ExtensionAPI,\n  ExtensionContext,\n} from \"@earendil-works/pi-coding-agent\";\nimport {\n  createState,\n  getContextModel,\n  setActiveModel,\n  type ExtensionState,\n} from \"./core/state\";\nimport { patchPayload } from \"./core/payload\";\nimport { openOptionsPanel } from \"./options/panel\";\nimport { renderOptionsStatus } from \"./options/status\";\n\nconst SESSION_START_EVENT = \"session_start\";\nconst MODEL_SELECT_EVENT = \"model_select\";\nconst BEFORE_PROVIDER_REQUEST_EVENT = \"before_provider_request\";\nconst COMMAND_NAME = \"local\";\nconst COMMAND_DESCRIPTION = \"Configure local options for the active model\";\nconst PICK_MODEL_MESSAGE = \"Pick a model first\";\nconst INFO_LEVEL = \"info\";\n\nasync function openCommand(\n  state: ExtensionState,\n  ctx: ExtensionContext,\n): Promise<void> {\n  const model = getContextModel(ctx) ?? state.activeModel;\n  if (!model) {\n    ctx.ui.notify(PICK_MODEL_MESSAGE, INFO_LEVEL);\n    return;\n  }\n\n  await openOptionsPanel(state, ctx, model);\n}\n\nexport default function optionsExtension(pi: ExtensionAPI): void {\n  const state = createState();\n\n  pi.on(SESSION_START_EVENT, (_event, ctx) => {\n    setActiveModel(state, getContextModel(ctx));\n    renderOptionsStatus(state, ctx);\n  });\n\n  pi.on(MODEL_SELECT_EVENT, (event, ctx) => {\n    setActiveModel(state, {\n      provider: event.model.provider,\n      id: event.model.id,\n    });\n    renderOptionsStatus(state, ctx);\n  });\n\n  pi.on(BEFORE_PROVIDER_REQUEST_EVENT, (event, ctx) =>\n    patchPayload(state, event.payload, ctx),\n  );\n\n  pi.registerCommand(COMMAND_NAME, {\n    description: COMMAND_DESCRIPTION,\n    handler: async (_args: string, ctx: ExtensionContext) => {\n      await openCommand(state, ctx);\n    },\n  });\n}\n"],"mappings":"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"}