{
  "version": 3,
  "sources": ["../../src/settings-menu.ts"],
  "sourcesContent": ["import type { Api } from \"@earendil-works/pi-ai\";\nimport type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { type MenuDefinition, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { resolveCompactionRouteForApi } from \"./model-api.js\";\nimport type { CodexCompactSettings, CodexCompactSettingsRuntime, CodexCompactSettingsState } from \"./settings.js\";\nimport { terminalText as safeText } from \"./terminal.js\";\n\ntype Screen = \"main\" | \"settings\" | \"invalid\";\ntype Action =\n  | \"compact-now\"\n  | \"set-enabled\"\n  | \"set-protocol\"\n  | \"set-timeout\"\n  | \"set-retries\"\n  | \"set-retention\"\n  | \"set-notify\";\n\nexport interface SettingsMenuOwner {\n  signal: AbortSignal;\n  isCurrent(): boolean;\n}\n\ninterface CompactMenuStatus {\n  model: string;\n  api?: Api;\n}\n\nfunction timeoutLabel(milliseconds: number): string {\n  return `${milliseconds / 60_000} min`;\n}\n\nfunction retentionLabel(tokens: number): string {\n  return `${tokens / 1000}K tokens`;\n}\n\nfunction protocolLabel(protocol: CodexCompactSettings[\"protocol\"]): string {\n  switch (protocol) {\n    case \"auto\":\n      return \"Auto\";\n    case \"remote-v2\":\n      return \"Remote V2\";\n    case \"responses-compact\":\n      return \"Responses Compact\";\n  }\n}\n\nasync function update(\n  runtime: CodexCompactSettingsRuntime,\n  ctx: ExtensionCommandContext,\n  patch: Partial<CodexCompactSettings>,\n  signal: AbortSignal,\n) {\n  try {\n    await runtime.update(patch, signal);\n    if (signal.aborted) return { kind: \"rejected\" as const };\n    ctx.ui.notify(\"Responses compaction settings saved.\", \"info\");\n    return { kind: \"stay\" as const };\n  } catch (error) {\n    if (signal.aborted) return { kind: \"rejected\" as const };\n    ctx.ui.notify(\n      `Could not save pi-codex-compact.json: ${safeText(error instanceof Error ? error.message : String(error))}`,\n      \"error\",\n    );\n    return { kind: \"rejected\" as const };\n  }\n}\n\nexport function createCodexCompactMenu(\n  runtime: CodexCompactSettingsRuntime,\n  options: { onCompactRequested?: () => void; status?: CompactMenuStatus } = {},\n): MenuDefinition<CodexCompactSettingsState, Screen, Action, ExtensionCommandContext> {\n  return {\n    start: \"main\",\n    screens: {\n      main: ({ state }) => ({\n        kind: \"actions\",\n        title: \"Responses Compaction\",\n        lines: [\n          `Remote compaction: ${state.settings.enabled ? \"On\" : \"Off\"}`,\n          `Protocol setting: ${protocolLabel(state.settings.protocol)}`,\n          `Active model: ${safeText(options.status?.model ?? \"none\")}`,\n          `Compact route: ${safeText(compactRoute(state, options.status))}`,\n        ],\n        items: [\n          {\n            id: \"compact-now\",\n            label: \"Compact now\",\n            description: \"Close this menu and compact the active session immediately.\",\n            action: \"compact-now\",\n          },\n          state.kind === \"invalid\"\n            ? {\n                id: \"settings\",\n                label: \"Settings\",\n                description: \"Read-only until the invalid settings file is repaired.\",\n                to: \"invalid\" as const,\n              }\n            : { id: \"settings\", label: \"Settings\", to: \"settings\" as const },\n          { id: \"close\", label: \"Close\", close: true },\n        ],\n        hint: \"close\",\n      }),\n      settings: ({ state }) => ({\n        kind: \"settings\",\n        title: \"Responses Compaction Settings\",\n        lines: [`User settings \u00B7 ${safeText(state.path)}`],\n        items: [\n          {\n            id: \"enabled\",\n            label: \"Remote compaction\",\n            description: \"Use a supported Responses compaction protocol.\",\n            currentValue: state.settings.enabled ? \"On\" : \"Off\",\n            values: [\"On\", \"Off\"],\n            action: \"set-enabled\",\n          },\n          {\n            id: \"protocol\",\n            label: \"Protocol\",\n            description: \"Choose automatically or force one supported remote protocol.\",\n            currentValue: protocolLabel(state.settings.protocol),\n            values: [\"Auto\", \"Remote V2\", \"Responses Compact\"],\n            action: \"set-protocol\",\n          },\n          {\n            id: \"requestTimeoutMs\",\n            label: \"Request timeout\",\n            description: \"Maximum time for the extension-owned remote compaction request.\",\n            currentValue: timeoutLabel(state.settings.requestTimeoutMs),\n            values: [\"2 min\", \"5 min\", \"10 min\"],\n            action: \"set-timeout\",\n          },\n          {\n            id: \"maxRetries\",\n            label: \"Transport retries\",\n            description: \"Retry transient provider failures before falling back to Pi.\",\n            currentValue: String(state.settings.maxRetries),\n            values: [\"0\", \"1\", \"2\"],\n            action: \"set-retries\",\n          },\n          {\n            id: \"replacementTokenBudget\",\n            label: \"Retained user history\",\n            description: \"Approximate user-message budget kept beside the opaque checkpoint.\",\n            currentValue: retentionLabel(state.settings.replacementTokenBudget),\n            values: [\"32K tokens\", \"64K tokens\", \"96K tokens\", \"128K tokens\"],\n            action: \"set-retention\",\n          },\n          {\n            id: \"notifyOnFallback\",\n            label: \"Fallback notifications\",\n            description: \"Warn when remote compaction fails and Pi native takes over.\",\n            currentValue: state.settings.notifyOnFallback ? \"On\" : \"Off\",\n            values: [\"On\", \"Off\"],\n            action: \"set-notify\",\n          },\n        ],\n      }),\n      invalid: ({ state }) => ({\n        kind: \"detail\",\n        title: \"Codex Compact Settings \u00B7 Read only\",\n        lines: [\n          `Invalid settings file: ${safeText(state.path)}`,\n          `Issue: ${safeText(state.issue ?? \"unknown validation error\")}`,\n          \"Built-in defaults are active. Repair the file and run /reload; it will not be overwritten.\",\n        ],\n        hint: \"back\",\n      }),\n    },\n    actions: {\n      \"compact-now\": async () => {\n        options.onCompactRequested?.();\n        return { kind: \"close\" };\n      },\n      \"set-enabled\": ({ ctx, value, signal }) => update(runtime, ctx, { enabled: value === \"On\" }, signal),\n      \"set-protocol\": ({ ctx, value, signal }) =>\n        update(\n          runtime,\n          ctx,\n          {\n            protocol:\n              value === \"Remote V2\" ? \"remote-v2\" : value === \"Responses Compact\" ? \"responses-compact\" : \"auto\",\n          },\n          signal,\n        ),\n      \"set-timeout\": ({ ctx, value, signal }) =>\n        update(runtime, ctx, { requestTimeoutMs: Number.parseInt(value ?? \"5\", 10) * 60_000 }, signal),\n      \"set-retries\": ({ ctx, value, signal }) =>\n        update(runtime, ctx, { maxRetries: Number.parseInt(value ?? \"2\", 10) }, signal),\n      \"set-retention\": ({ ctx, value, signal }) =>\n        update(runtime, ctx, { replacementTokenBudget: Number.parseInt(value ?? \"64\", 10) * 1000 }, signal),\n      \"set-notify\": ({ ctx, value, signal }) => update(runtime, ctx, { notifyOnFallback: value === \"On\" }, signal),\n    },\n  };\n}\n\nexport async function showCodexCompactMenu(\n  runtime: CodexCompactSettingsRuntime,\n  ctx: ExtensionCommandContext,\n  owner: SettingsMenuOwner,\n): Promise<void> {\n  if (ctx.mode === \"rpc\" && ctx.hasUI) {\n    ctx.ui.notify(`Edit Responses compaction settings at ${safeText(runtime.get().path)}.`, \"info\");\n    return;\n  }\n  if (ctx.mode !== \"tui\") {\n    throw new Error(\"/codex-compact requires TUI or RPC UI support\");\n  }\n  if (owner.signal.aborted || !owner.isCurrent()) return;\n  let compactRequested = false;\n  await runMenu(\n    ctx,\n    createCodexCompactMenu(runtime, {\n      onCompactRequested: () => {\n        compactRequested = true;\n      },\n      status: compactMenuStatus(ctx),\n    }),\n    {\n      getState: () => runtime.get(),\n      signal: owner.signal,\n      isCurrent: owner.isCurrent,\n    },\n  );\n  if (!compactRequested || owner.signal.aborted || !owner.isCurrent()) return;\n  ctx.compact({\n    onError: (error) => {\n      if (!owner.signal.aborted && owner.isCurrent()) {\n        ctx.ui.notify(`Compaction failed: ${safeText(error.message)}`, \"error\");\n      }\n    },\n  });\n}\n\nexport function compactMenuStatus(ctx: ExtensionCommandContext): CompactMenuStatus {\n  const model = ctx.model;\n  return {\n    model: model ? `${model.provider}/${model.id}` : \"none\",\n    api: model?.api,\n  };\n}\n\nfunction compactRoute(state: Readonly<CodexCompactSettingsState>, status: CompactMenuStatus | undefined): string {\n  const route = resolveCompactionRouteForApi(status?.api, state.settings);\n  if (route.kind === \"native\") return `Pi native (${route.reason})`;\n  return route.protocol === \"remote-v2\" ? \"Responses Remote V2\" : \"Responses Compact API\";\n}\n"],
  "mappings": ";;;;;;;;AAEA,SAA8B,eAAe;AAyB7C,SAAS,aAAa,cAA8B;AAClD,SAAO,GAAG,eAAe,GAAM;AACjC;AAEA,SAAS,eAAe,QAAwB;AAC9C,SAAO,GAAG,SAAS,GAAI;AACzB;AAEA,SAAS,cAAc,UAAoD;AACzE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,eAAe,OACb,SACA,KACA,OACA,QACA;AACA,MAAI;AACF,UAAM,QAAQ,OAAO,OAAO,MAAM;AAClC,QAAI,OAAO,QAAS,QAAO,EAAE,MAAM,WAAoB;AACvD,QAAI,GAAG,OAAO,wCAAwC,MAAM;AAC5D,WAAO,EAAE,MAAM,OAAgB;AAAA,EACjC,SAAS,OAAO;AACd,QAAI,OAAO,QAAS,QAAO,EAAE,MAAM,WAAoB;AACvD,QAAI,GAAG;AAAA,MACL,yCAAyC,aAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,CAAC;AAAA,MACzG;AAAA,IACF;AACA,WAAO,EAAE,MAAM,WAAoB;AAAA,EACrC;AACF;AAEO,SAAS,uBACd,SACA,UAA2E,CAAC,GACQ;AACpF,SAAO;AAAA,IACL,OAAO;AAAA,IACP,SAAS;AAAA,MACP,MAAM,CAAC,EAAE,MAAM,OAAO;AAAA,QACpB,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,UACL,sBAAsB,MAAM,SAAS,UAAU,OAAO,KAAK;AAAA,UAC3D,qBAAqB,cAAc,MAAM,SAAS,QAAQ,CAAC;AAAA,UAC3D,iBAAiB,aAAS,QAAQ,QAAQ,SAAS,MAAM,CAAC;AAAA,UAC1D,kBAAkB,aAAS,aAAa,OAAO,QAAQ,MAAM,CAAC,CAAC;AAAA,QACjE;AAAA,QACA,OAAO;AAAA,UACL;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,aAAa;AAAA,YACb,QAAQ;AAAA,UACV;AAAA,UACA,MAAM,SAAS,YACX;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,aAAa;AAAA,YACb,IAAI;AAAA,UACN,IACA,EAAE,IAAI,YAAY,OAAO,YAAY,IAAI,WAAoB;AAAA,UACjE,EAAE,IAAI,SAAS,OAAO,SAAS,OAAO,KAAK;AAAA,QAC7C;AAAA,QACA,MAAM;AAAA,MACR;AAAA,MACA,UAAU,CAAC,EAAE,MAAM,OAAO;AAAA,QACxB,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO,CAAC,sBAAmB,aAAS,MAAM,IAAI,CAAC,EAAE;AAAA,QACjD,OAAO;AAAA,UACL;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,aAAa;AAAA,YACb,cAAc,MAAM,SAAS,UAAU,OAAO;AAAA,YAC9C,QAAQ,CAAC,MAAM,KAAK;AAAA,YACpB,QAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,aAAa;AAAA,YACb,cAAc,cAAc,MAAM,SAAS,QAAQ;AAAA,YACnD,QAAQ,CAAC,QAAQ,aAAa,mBAAmB;AAAA,YACjD,QAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,aAAa;AAAA,YACb,cAAc,aAAa,MAAM,SAAS,gBAAgB;AAAA,YAC1D,QAAQ,CAAC,SAAS,SAAS,QAAQ;AAAA,YACnC,QAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,aAAa;AAAA,YACb,cAAc,OAAO,MAAM,SAAS,UAAU;AAAA,YAC9C,QAAQ,CAAC,KAAK,KAAK,GAAG;AAAA,YACtB,QAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,aAAa;AAAA,YACb,cAAc,eAAe,MAAM,SAAS,sBAAsB;AAAA,YAClE,QAAQ,CAAC,cAAc,cAAc,cAAc,aAAa;AAAA,YAChE,QAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,aAAa;AAAA,YACb,cAAc,MAAM,SAAS,mBAAmB,OAAO;AAAA,YACvD,QAAQ,CAAC,MAAM,KAAK;AAAA,YACpB,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,MACA,SAAS,CAAC,EAAE,MAAM,OAAO;AAAA,QACvB,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,UACL,0BAA0B,aAAS,MAAM,IAAI,CAAC;AAAA,UAC9C,UAAU,aAAS,MAAM,SAAS,0BAA0B,CAAC;AAAA,UAC7D;AAAA,QACF;AAAA,QACA,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,eAAe,YAAY;AACzB,gBAAQ,qBAAqB;AAC7B,eAAO,EAAE,MAAM,QAAQ;AAAA,MACzB;AAAA,MACA,eAAe,CAAC,EAAE,KAAK,OAAO,OAAO,MAAM,OAAO,SAAS,KAAK,EAAE,SAAS,UAAU,KAAK,GAAG,MAAM;AAAA,MACnG,gBAAgB,CAAC,EAAE,KAAK,OAAO,OAAO,MACpC;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,UACE,UACE,UAAU,cAAc,cAAc,UAAU,sBAAsB,sBAAsB;AAAA,QAChG;AAAA,QACA;AAAA,MACF;AAAA,MACF,eAAe,CAAC,EAAE,KAAK,OAAO,OAAO,MACnC,OAAO,SAAS,KAAK,EAAE,kBAAkB,OAAO,SAAS,SAAS,KAAK,EAAE,IAAI,IAAO,GAAG,MAAM;AAAA,MAC/F,eAAe,CAAC,EAAE,KAAK,OAAO,OAAO,MACnC,OAAO,SAAS,KAAK,EAAE,YAAY,OAAO,SAAS,SAAS,KAAK,EAAE,EAAE,GAAG,MAAM;AAAA,MAChF,iBAAiB,CAAC,EAAE,KAAK,OAAO,OAAO,MACrC,OAAO,SAAS,KAAK,EAAE,wBAAwB,OAAO,SAAS,SAAS,MAAM,EAAE,IAAI,IAAK,GAAG,MAAM;AAAA,MACpG,cAAc,CAAC,EAAE,KAAK,OAAO,OAAO,MAAM,OAAO,SAAS,KAAK,EAAE,kBAAkB,UAAU,KAAK,GAAG,MAAM;AAAA,IAC7G;AAAA,EACF;AACF;AAEA,eAAsB,qBACpB,SACA,KACA,OACe;AACf,MAAI,IAAI,SAAS,SAAS,IAAI,OAAO;AACnC,QAAI,GAAG,OAAO,yCAAyC,aAAS,QAAQ,IAAI,EAAE,IAAI,CAAC,KAAK,MAAM;AAC9F;AAAA,EACF;AACA,MAAI,IAAI,SAAS,OAAO;AACtB,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACA,MAAI,MAAM,OAAO,WAAW,CAAC,MAAM,UAAU,EAAG;AAChD,MAAI,mBAAmB;AACvB,QAAM;AAAA,IACJ;AAAA,IACA,uBAAuB,SAAS;AAAA,MAC9B,oBAAoB,MAAM;AACxB,2BAAmB;AAAA,MACrB;AAAA,MACA,QAAQ,kBAAkB,GAAG;AAAA,IAC/B,CAAC;AAAA,IACD;AAAA,MACE,UAAU,MAAM,QAAQ,IAAI;AAAA,MAC5B,QAAQ,MAAM;AAAA,MACd,WAAW,MAAM;AAAA,IACnB;AAAA,EACF;AACA,MAAI,CAAC,oBAAoB,MAAM,OAAO,WAAW,CAAC,MAAM,UAAU,EAAG;AACrE,MAAI,QAAQ;AAAA,IACV,SAAS,CAAC,UAAU;AAClB,UAAI,CAAC,MAAM,OAAO,WAAW,MAAM,UAAU,GAAG;AAC9C,YAAI,GAAG,OAAO,sBAAsB,aAAS,MAAM,OAAO,CAAC,IAAI,OAAO;AAAA,MACxE;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEO,SAAS,kBAAkB,KAAiD;AACjF,QAAM,QAAQ,IAAI;AAClB,SAAO;AAAA,IACL,OAAO,QAAQ,GAAG,MAAM,QAAQ,IAAI,MAAM,EAAE,KAAK;AAAA,IACjD,KAAK,OAAO;AAAA,EACd;AACF;AAEA,SAAS,aAAa,OAA4C,QAA+C;AAC/G,QAAM,QAAQ,6BAA6B,QAAQ,KAAK,MAAM,QAAQ;AACtE,MAAI,MAAM,SAAS,SAAU,QAAO,cAAc,MAAM,MAAM;AAC9D,SAAO,MAAM,aAAa,cAAc,wBAAwB;AAClE;",
  "names": []
}
