@narumitw/pi-codex-compact 0.53.0 → 0.53.1
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.
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
} from "./chunk-7H7JJ7ZV.js";
|
|
7
7
|
|
|
8
8
|
// src/settings-menu.ts
|
|
9
|
+
import { runMenu } from "@narumitw/pi-tui-kit";
|
|
9
10
|
function timeoutLabel(milliseconds) {
|
|
10
11
|
return `${milliseconds / 6e4} min`;
|
|
11
12
|
}
|
|
@@ -162,7 +163,6 @@ async function showCodexCompactMenu(runtime, ctx, owner) {
|
|
|
162
163
|
if (ctx.mode !== "tui") {
|
|
163
164
|
throw new Error("/codex-compact requires TUI or RPC UI support");
|
|
164
165
|
}
|
|
165
|
-
const { runMenu } = await import("@narumitw/pi-tui-kit");
|
|
166
166
|
if (owner.signal.aborted || !owner.isCurrent()) return;
|
|
167
167
|
let compactRequested = false;
|
|
168
168
|
await runMenu(
|
|
@@ -205,4 +205,4 @@ export {
|
|
|
205
205
|
createCodexCompactMenu,
|
|
206
206
|
showCodexCompactMenu
|
|
207
207
|
};
|
|
208
|
-
//# sourceMappingURL=settings-menu-
|
|
208
|
+
//# sourceMappingURL=settings-menu-OAWFW2PH.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/settings-menu.ts"],
|
|
4
|
+
"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"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/index.ts
CHANGED
|
@@ -1165,7 +1165,7 @@ function createCodexCompactExtension(options = {}) {
|
|
|
1165
1165
|
if (args.trim()) throw new Error("Usage: /codex-compact");
|
|
1166
1166
|
const ownerGeneration = generation;
|
|
1167
1167
|
const controller = sessionController;
|
|
1168
|
-
const { showCodexCompactMenu } = await import("./chunks/settings-menu-
|
|
1168
|
+
const { showCodexCompactMenu } = await import("./chunks/settings-menu-OAWFW2PH.js");
|
|
1169
1169
|
if (ownerGeneration !== generation || controller.signal.aborted) return;
|
|
1170
1170
|
await showCodexCompactMenu(settingsRuntime, ctx, {
|
|
1171
1171
|
signal: controller.signal,
|
package/package.json
CHANGED
package/src/settings-menu.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Api } from "@earendil-works/pi-ai";
|
|
2
2
|
import type { ExtensionCommandContext } from "@earendil-works/pi-coding-agent";
|
|
3
|
-
import type
|
|
3
|
+
import { type MenuDefinition, runMenu } from "@narumitw/pi-tui-kit";
|
|
4
4
|
import { resolveCompactionRouteForApi } from "./model-api.js";
|
|
5
5
|
import type { CodexCompactSettings, CodexCompactSettingsRuntime, CodexCompactSettingsState } from "./settings.js";
|
|
6
6
|
import { terminalText as safeText } from "./terminal.js";
|
|
@@ -205,7 +205,6 @@ export async function showCodexCompactMenu(
|
|
|
205
205
|
if (ctx.mode !== "tui") {
|
|
206
206
|
throw new Error("/codex-compact requires TUI or RPC UI support");
|
|
207
207
|
}
|
|
208
|
-
const { runMenu } = await import("@narumitw/pi-tui-kit");
|
|
209
208
|
if (owner.signal.aborted || !owner.isCurrent()) return;
|
|
210
209
|
let compactRequested = false;
|
|
211
210
|
await runMenu(
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/settings-menu.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Api } from \"@earendil-works/pi-ai\";\nimport type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport type { MenuDefinition } 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 const { runMenu } = await import(\"@narumitw/pi-tui-kit\");\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"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|