{
  "version": 3,
  "sources": ["../../src/settings-menu.ts"],
  "sourcesContent": ["import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport type { MenuDefinition } from \"@narumitw/pi-tui-kit\";\nimport type { ContextManagementSettingsRuntime, ContextManagementSettingsState } from \"./settings.js\";\nimport { terminalText as safeText } from \"./terminal.js\";\n\ntype Screen = \"main\" | \"settings\" | \"status\" | \"help\" | \"invalid\";\ntype Action = \"set-enabled\";\n\nexport interface ContextManagementMenuOwner {\n  signal: AbortSignal;\n  isCurrent(): boolean;\n  isActive(): boolean;\n  onSettingsChanged(): void | Promise<void>;\n}\n\nconst settingsChangeQueues = new WeakMap<ContextManagementSettingsRuntime, Promise<void>>();\n\nfunction enqueueSettingsChange<T>(runtime: ContextManagementSettingsRuntime, operation: () => Promise<T>): Promise<T> {\n  const queued = settingsChangeQueues.get(runtime) ?? Promise.resolve();\n  const result = queued.then(operation, operation);\n  settingsChangeQueues.set(\n    runtime,\n    result.then(\n      () => undefined,\n      () => undefined,\n    ),\n  );\n  return result;\n}\n\nasync function updateEnabled(\n  runtime: ContextManagementSettingsRuntime,\n  ctx: ExtensionCommandContext,\n  enabled: boolean,\n  signal: AbortSignal,\n  onSettingsChanged: () => void | Promise<void>,\n) {\n  return enqueueSettingsChange(runtime, async () => {\n    const previous = runtime.get().settings.enabled;\n    try {\n      await runtime.update({ enabled }, signal);\n    } catch (error) {\n      if (signal.aborted) return { kind: \"rejected\" as const };\n      ctx.ui.notify(\n        `Could not save pi-context-management.json: ${safeText(error instanceof Error ? error.message : String(error))}`,\n        \"error\",\n      );\n      return { kind: \"rejected\" as const };\n    }\n    try {\n      // A completed save remains committed even if menu cancellation races with reconciliation.\n      await onSettingsChanged();\n    } catch (error) {\n      let rollbackError: unknown;\n      try {\n        await runtime.update({ enabled: previous });\n        await onSettingsChanged();\n      } catch (recoveryError) {\n        rollbackError = recoveryError;\n      }\n      if (signal.aborted) return { kind: \"rejected\" as const };\n      const failure = safeText(error instanceof Error ? error.message : String(error));\n      const recovery = rollbackError\n        ? ` The previous setting could not be fully restored: ${safeText(rollbackError instanceof Error ? rollbackError.message : String(rollbackError))}`\n        : \" The previous setting was restored.\";\n      ctx.ui.notify(`Could not apply experimental context management: ${failure}.${recovery}`, \"error\");\n      return { kind: \"rejected\" as const };\n    }\n    if (signal.aborted) return { kind: \"rejected\" as const };\n    ctx.ui.notify(\"Context management settings saved.\", \"info\");\n    return { kind: \"stay\" as const };\n  });\n}\n\nexport function createContextManagementMenu(\n  runtime: ContextManagementSettingsRuntime,\n  options: {\n    isActive?: () => boolean;\n    onSettingsChanged?: () => void | Promise<void>;\n  } = {},\n): MenuDefinition<ContextManagementSettingsState, Screen, Action, ExtensionCommandContext> {\n  return {\n    start: \"main\",\n    screens: {\n      main: ({ state }) => ({\n        kind: \"actions\",\n        title: \"Experimental Context Management\",\n        lines: [\n          `Configured: ${state.settings.enabled ? \"On\" : \"Off\"}`,\n          `Runtime: ${options.isActive?.() ? \"Active\" : state.settings.enabled ? \"Unavailable\" : \"Inactive\"}`,\n        ],\n        items: [\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: \"status\", label: \"Status\", to: \"status\" as const },\n          { id: \"help\", label: \"Help\", to: \"help\" as const },\n          { id: \"close\", label: \"Close\", close: true },\n        ],\n        hint: \"close\",\n      }),\n      settings: ({ state }) => ({\n        kind: \"settings\",\n        title: \"Context Management Settings\",\n        lines: [`User settings \u00B7 ${safeText(state.path)}`],\n        items: [\n          {\n            id: \"enabled\",\n            label: \"Experimental context management\",\n            description: \"Use summary-free local rollover and four branch-local context tools.\",\n            currentValue: state.settings.enabled ? \"On\" : \"Off\",\n            values: [\"On\", \"Off\"],\n            action: \"set-enabled\",\n          },\n        ],\n      }),\n      status: ({ state }) => ({\n        kind: \"detail\",\n        title: \"Context Management Status\",\n        lines: [\n          `Configured: ${state.settings.enabled ? \"On\" : \"Off\"}`,\n          `Runtime: ${options.isActive?.() ? \"Active\" : state.settings.enabled ? \"Unavailable\" : \"Inactive\"}`,\n          `Settings: ${safeText(state.path)}`,\n        ],\n        hint: \"back\",\n      }),\n      help: () => ({\n        kind: \"detail\",\n        title: \"Context Management Help\",\n        lines: [\n          \"This experimental extension starts summary-free context windows and exposes bounded history and note tools.\",\n          \"Save important information in notes before starting a new context.\",\n          \"Disabling the extension restores Pi-native compaction after the active run settles.\",\n        ],\n        hint: \"back\",\n      }),\n      invalid: ({ state }) => ({\n        kind: \"detail\",\n        title: \"Context Management 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      \"set-enabled\": ({ ctx, value, signal }) =>\n        updateEnabled(runtime, ctx, value === \"On\", signal, options.onSettingsChanged ?? (() => undefined)),\n    },\n  };\n}\n\nexport async function showContextManagementMenu(\n  runtime: ContextManagementSettingsRuntime,\n  ctx: ExtensionCommandContext,\n  owner: ContextManagementMenuOwner,\n): Promise<void> {\n  if (ctx.mode === \"rpc\" && ctx.hasUI) {\n    ctx.ui.notify(`Edit experimental context management settings at ${safeText(runtime.get().path)}.`, \"info\");\n    return;\n  }\n  if (ctx.mode !== \"tui\") {\n    throw new Error(\"/context-management requires TUI or RPC UI support\");\n  }\n  const { runMenu } = await import(\"@narumitw/pi-tui-kit\");\n  if (owner.signal.aborted || !owner.isCurrent()) return;\n  await runMenu(\n    ctx,\n    createContextManagementMenu(runtime, {\n      isActive: owner.isActive,\n      onSettingsChanged: owner.onSettingsChanged,\n    }),\n    {\n      getState: () => runtime.get(),\n      signal: owner.signal,\n      isCurrent: owner.isCurrent,\n    },\n  );\n}\n"],
  "mappings": "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",
  "names": []
}
