@narumitw/pi-codex-compact 0.51.3 → 0.52.0

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.
@@ -1,16 +1,19 @@
1
+ import type { Api } from "@earendil-works/pi-ai";
1
2
  import type { ExtensionCommandContext } from "@earendil-works/pi-coding-agent";
2
3
  import type { MenuDefinition } from "@narumitw/pi-tui-kit";
3
- import { usesCodexResponsesApi } from "./model-api.js";
4
+ import { resolveCompactionRouteForApi } from "./model-api.js";
4
5
  import type {
5
6
  CodexCompactSettings,
6
7
  CodexCompactSettingsRuntime,
7
8
  CodexCompactSettingsState,
8
9
  } from "./settings.js";
10
+ import { terminalText as safeText } from "./terminal.js";
9
11
 
10
12
  type Screen = "main" | "settings" | "invalid";
11
13
  type Action =
12
14
  | "compact-now"
13
15
  | "set-enabled"
16
+ | "set-protocol"
14
17
  | "set-timeout"
15
18
  | "set-retries"
16
19
  | "set-retention"
@@ -23,14 +26,7 @@ export interface SettingsMenuOwner {
23
26
 
24
27
  interface CompactMenuStatus {
25
28
  model: string;
26
- remoteEligible: boolean;
27
- }
28
-
29
- function safeText(value: string): string {
30
- return Array.from(value, (character) => {
31
- const codePoint = character.codePointAt(0) ?? 0;
32
- return codePoint < 32 || (codePoint >= 127 && codePoint <= 159) ? " " : character;
33
- }).join("");
29
+ api?: Api;
34
30
  }
35
31
 
36
32
  function timeoutLabel(milliseconds: number): string {
@@ -41,6 +37,17 @@ function retentionLabel(tokens: number): string {
41
37
  return `${tokens / 1000}K tokens`;
42
38
  }
43
39
 
40
+ function protocolLabel(protocol: CodexCompactSettings["protocol"]): string {
41
+ switch (protocol) {
42
+ case "auto":
43
+ return "Auto";
44
+ case "remote-v2":
45
+ return "Remote V2";
46
+ case "responses-compact":
47
+ return "Responses Compact";
48
+ }
49
+ }
50
+
44
51
  async function update(
45
52
  runtime: CodexCompactSettingsRuntime,
46
53
  ctx: ExtensionCommandContext,
@@ -49,7 +56,8 @@ async function update(
49
56
  ) {
50
57
  try {
51
58
  await runtime.update(patch, signal);
52
- ctx.ui.notify("Codex compaction settings saved.", "info");
59
+ if (signal.aborted) return { kind: "rejected" as const };
60
+ ctx.ui.notify("Responses compaction settings saved.", "info");
53
61
  return { kind: "stay" as const };
54
62
  } catch (error) {
55
63
  if (signal.aborted) return { kind: "rejected" as const };
@@ -70,9 +78,10 @@ export function createCodexCompactMenu(
70
78
  screens: {
71
79
  main: ({ state }) => ({
72
80
  kind: "actions",
73
- title: "Codex Remote Compaction",
81
+ title: "Responses Compaction",
74
82
  lines: [
75
- `Remote V2: ${state.settings.enabled ? "On" : "Off"}`,
83
+ `Remote compaction: ${state.settings.enabled ? "On" : "Off"}`,
84
+ `Protocol setting: ${protocolLabel(state.settings.protocol)}`,
76
85
  `Active model: ${safeText(options.status?.model ?? "none")}`,
77
86
  `Compact route: ${safeText(compactRoute(state, options.status))}`,
78
87
  ],
@@ -97,17 +106,25 @@ export function createCodexCompactMenu(
97
106
  }),
98
107
  settings: ({ state }) => ({
99
108
  kind: "settings",
100
- title: "Codex Remote Compaction Settings",
109
+ title: "Responses Compaction Settings",
101
110
  lines: [`User settings · ${safeText(state.path)}`],
102
111
  items: [
103
112
  {
104
113
  id: "enabled",
105
114
  label: "Remote compaction",
106
- description: "Use Codex Remote V2 when the model uses openai-codex-responses.",
115
+ description: "Use a supported Responses compaction protocol.",
107
116
  currentValue: state.settings.enabled ? "On" : "Off",
108
117
  values: ["On", "Off"],
109
118
  action: "set-enabled",
110
119
  },
120
+ {
121
+ id: "protocol",
122
+ label: "Protocol",
123
+ description: "Choose automatically or force one supported remote protocol.",
124
+ currentValue: protocolLabel(state.settings.protocol),
125
+ values: ["Auto", "Remote V2", "Responses Compact"],
126
+ action: "set-protocol",
127
+ },
111
128
  {
112
129
  id: "requestTimeoutMs",
113
130
  label: "Request timeout",
@@ -135,7 +152,7 @@ export function createCodexCompactMenu(
135
152
  {
136
153
  id: "notifyOnFallback",
137
154
  label: "Fallback notifications",
138
- description: "Warn when Remote V2 fails and native Pi compaction takes over.",
155
+ description: "Warn when remote compaction fails and Pi native takes over.",
139
156
  currentValue: state.settings.notifyOnFallback ? "On" : "Off",
140
157
  values: ["On", "Off"],
141
158
  action: "set-notify",
@@ -160,6 +177,20 @@ export function createCodexCompactMenu(
160
177
  },
161
178
  "set-enabled": ({ ctx, value, signal }) =>
162
179
  update(runtime, ctx, { enabled: value === "On" }, signal),
180
+ "set-protocol": ({ ctx, value, signal }) =>
181
+ update(
182
+ runtime,
183
+ ctx,
184
+ {
185
+ protocol:
186
+ value === "Remote V2"
187
+ ? "remote-v2"
188
+ : value === "Responses Compact"
189
+ ? "responses-compact"
190
+ : "auto",
191
+ },
192
+ signal,
193
+ ),
163
194
  "set-timeout": ({ ctx, value, signal }) =>
164
195
  update(
165
196
  runtime,
@@ -187,10 +218,13 @@ export async function showCodexCompactMenu(
187
218
  ctx: ExtensionCommandContext,
188
219
  owner: SettingsMenuOwner,
189
220
  ): Promise<void> {
190
- if (ctx.mode !== "tui") {
191
- ctx.ui.notify(`Edit Codex compaction settings at ${safeText(runtime.get().path)}.`, "info");
221
+ if (ctx.mode === "rpc" && ctx.hasUI) {
222
+ ctx.ui.notify(`Edit Responses compaction settings at ${safeText(runtime.get().path)}.`, "info");
192
223
  return;
193
224
  }
225
+ if (ctx.mode !== "tui") {
226
+ throw new Error("/codex-compact requires TUI or RPC UI support");
227
+ }
194
228
  const { runMenu } = await import("@narumitw/pi-tui-kit");
195
229
  if (owner.signal.aborted || !owner.isCurrent()) return;
196
230
  let compactRequested = false;
@@ -222,7 +256,7 @@ export function compactMenuStatus(ctx: ExtensionCommandContext): CompactMenuStat
222
256
  const model = ctx.model;
223
257
  return {
224
258
  model: model ? `${model.provider}/${model.id}` : "none",
225
- remoteEligible: usesCodexResponsesApi(model),
259
+ api: model?.api,
226
260
  };
227
261
  }
228
262
 
@@ -230,6 +264,7 @@ function compactRoute(
230
264
  state: Readonly<CodexCompactSettingsState>,
231
265
  status: CompactMenuStatus | undefined,
232
266
  ): string {
233
- if (!state.settings.enabled) return "Pi native (Remote V2 off)";
234
- return status?.remoteEligible ? "Codex Remote V2" : "Pi native (requires openai-codex-responses)";
267
+ const route = resolveCompactionRouteForApi(status?.api, state.settings);
268
+ if (route.kind === "native") return `Pi native (${route.reason})`;
269
+ return route.protocol === "remote-v2" ? "Responses Remote V2" : "Responses Compact API";
235
270
  }
package/src/settings.ts CHANGED
@@ -3,12 +3,14 @@ import { constants } from "node:fs";
3
3
  import { mkdir, open, rename, rm, writeFile } from "node:fs/promises";
4
4
  import { basename, dirname, join } from "node:path";
5
5
  import { getAgentDir } from "@earendil-works/pi-coding-agent";
6
+ import type { RemoteCompactionProtocolSetting } from "./model-api.js";
6
7
 
7
8
  export const CODEX_COMPACT_SETTINGS_FILE = "pi-codex-compact.json";
8
9
  export const MAX_SETTINGS_BYTES = 64 * 1024;
9
10
 
10
11
  export interface CodexCompactSettings {
11
12
  enabled: boolean;
13
+ protocol: RemoteCompactionProtocolSetting;
12
14
  requestTimeoutMs: number;
13
15
  maxRetries: number;
14
16
  replacementTokenBudget: number;
@@ -17,6 +19,7 @@ export interface CodexCompactSettings {
17
19
 
18
20
  export const DEFAULT_CODEX_COMPACT_SETTINGS: Readonly<CodexCompactSettings> = Object.freeze({
19
21
  enabled: true,
22
+ protocol: "auto",
20
23
  requestTimeoutMs: 300_000,
21
24
  maxRetries: 2,
22
25
  replacementTokenBudget: 64_000,
@@ -60,6 +63,14 @@ function validInteger(value: unknown, minimum: number, maximum: number): value i
60
63
  export function normalizeCodexCompactSettings(value: unknown): CodexCompactSettings | undefined {
61
64
  if (!isRecord(value)) return undefined;
62
65
  if (Object.hasOwn(value, "enabled") && typeof value.enabled !== "boolean") return undefined;
66
+ if (
67
+ Object.hasOwn(value, "protocol") &&
68
+ value.protocol !== "auto" &&
69
+ value.protocol !== "remote-v2" &&
70
+ value.protocol !== "responses-compact"
71
+ ) {
72
+ return undefined;
73
+ }
63
74
  if (Object.hasOwn(value, "notifyOnFallback") && typeof value.notifyOnFallback !== "boolean") {
64
75
  return undefined;
65
76
  }
@@ -76,6 +87,10 @@ export function normalizeCodexCompactSettings(value: unknown): CodexCompactSetti
76
87
  return {
77
88
  enabled:
78
89
  typeof value.enabled === "boolean" ? value.enabled : DEFAULT_CODEX_COMPACT_SETTINGS.enabled,
90
+ protocol:
91
+ value.protocol === "remote-v2" || value.protocol === "responses-compact"
92
+ ? value.protocol
93
+ : DEFAULT_CODEX_COMPACT_SETTINGS.protocol,
79
94
  requestTimeoutMs:
80
95
  typeof value.requestTimeoutMs === "number"
81
96
  ? value.requestTimeoutMs
@@ -0,0 +1,6 @@
1
+ export function terminalText(value: string): string {
2
+ return Array.from(value, (character) => {
3
+ const codePoint = character.codePointAt(0) ?? 0;
4
+ return codePoint < 32 || (codePoint >= 127 && codePoint <= 159) ? " " : character;
5
+ }).join("");
6
+ }
@@ -1,13 +0,0 @@
1
- // @generated by scripts/build-runtime.mjs; do not edit.
2
- // @ts-nocheck -- the generated entry uses a .ts extension for Pi's Jiti loader.
3
-
4
- // src/model-api.ts
5
- import { hasApi } from "@earendil-works/pi-ai";
6
- function usesCodexResponsesApi(model) {
7
- return model !== void 0 && hasApi(model, "openai-codex-responses");
8
- }
9
-
10
- export {
11
- usesCodexResponsesApi
12
- };
13
- //# sourceMappingURL=chunk-6TZ2L2BM.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/model-api.ts"],
4
- "sourcesContent": ["import type { Api, Model } from \"@earendil-works/pi-ai\";\nimport { hasApi } from \"@earendil-works/pi-ai\";\n\nexport function usesCodexResponsesApi(\n\tmodel: Model<Api> | undefined,\n): model is Model<\"openai-codex-responses\"> {\n\treturn model !== undefined && hasApi(model, \"openai-codex-responses\");\n}\n"],
5
- "mappings": ";;;;AACA,SAAS,cAAc;AAEhB,SAAS,sBACf,OAC2C;AAC3C,SAAO,UAAU,UAAa,OAAO,OAAO,wBAAwB;AACrE;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/settings-menu.ts"],
4
- "sourcesContent": ["import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport type { MenuDefinition } from \"@narumitw/pi-tui-kit\";\nimport { usesCodexResponsesApi } from \"./model-api.js\";\nimport type {\n\tCodexCompactSettings,\n\tCodexCompactSettingsRuntime,\n\tCodexCompactSettingsState,\n} from \"./settings.js\";\n\ntype Screen = \"main\" | \"settings\" | \"invalid\";\ntype Action =\n\t| \"compact-now\"\n\t| \"set-enabled\"\n\t| \"set-timeout\"\n\t| \"set-retries\"\n\t| \"set-retention\"\n\t| \"set-notify\";\n\nexport interface SettingsMenuOwner {\n\tsignal: AbortSignal;\n\tisCurrent(): boolean;\n}\n\ninterface CompactMenuStatus {\n\tmodel: string;\n\tremoteEligible: boolean;\n}\n\nfunction safeText(value: string): string {\n\treturn Array.from(value, (character) => {\n\t\tconst codePoint = character.codePointAt(0) ?? 0;\n\t\treturn codePoint < 32 || (codePoint >= 127 && codePoint <= 159) ? \" \" : character;\n\t}).join(\"\");\n}\n\nfunction timeoutLabel(milliseconds: number): string {\n\treturn `${milliseconds / 60_000} min`;\n}\n\nfunction retentionLabel(tokens: number): string {\n\treturn `${tokens / 1000}K tokens`;\n}\n\nasync function update(\n\truntime: CodexCompactSettingsRuntime,\n\tctx: ExtensionCommandContext,\n\tpatch: Partial<CodexCompactSettings>,\n\tsignal: AbortSignal,\n) {\n\ttry {\n\t\tawait runtime.update(patch, signal);\n\t\tctx.ui.notify(\"Codex compaction settings saved.\", \"info\");\n\t\treturn { kind: \"stay\" as const };\n\t} catch (error) {\n\t\tif (signal.aborted) return { kind: \"rejected\" as const };\n\t\tctx.ui.notify(\n\t\t\t`Could not save pi-codex-compact.json: ${safeText(error instanceof Error ? error.message : String(error))}`,\n\t\t\t\"error\",\n\t\t);\n\t\treturn { kind: \"rejected\" as const };\n\t}\n}\n\nexport function createCodexCompactMenu(\n\truntime: CodexCompactSettingsRuntime,\n\toptions: { onCompactRequested?: () => void; status?: CompactMenuStatus } = {},\n): MenuDefinition<CodexCompactSettingsState, Screen, Action, ExtensionCommandContext> {\n\treturn {\n\t\tstart: \"main\",\n\t\tscreens: {\n\t\t\tmain: ({ state }) => ({\n\t\t\t\tkind: \"actions\",\n\t\t\t\ttitle: \"Codex Remote Compaction\",\n\t\t\t\tlines: [\n\t\t\t\t\t`Remote V2: ${state.settings.enabled ? \"On\" : \"Off\"}`,\n\t\t\t\t\t`Active model: ${safeText(options.status?.model ?? \"none\")}`,\n\t\t\t\t\t`Compact route: ${safeText(compactRoute(state, options.status))}`,\n\t\t\t\t],\n\t\t\t\titems: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"compact-now\",\n\t\t\t\t\t\tlabel: \"Compact now\",\n\t\t\t\t\t\tdescription: \"Close this menu and compact the active session immediately.\",\n\t\t\t\t\t\taction: \"compact-now\",\n\t\t\t\t\t},\n\t\t\t\t\tstate.kind === \"invalid\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tid: \"settings\",\n\t\t\t\t\t\t\t\tlabel: \"Settings\",\n\t\t\t\t\t\t\t\tdescription: \"Read-only until the invalid settings file is repaired.\",\n\t\t\t\t\t\t\t\tto: \"invalid\" as const,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: { id: \"settings\", label: \"Settings\", to: \"settings\" as const },\n\t\t\t\t\t{ id: \"close\", label: \"Close\", close: true },\n\t\t\t\t],\n\t\t\t\thint: \"close\",\n\t\t\t}),\n\t\t\tsettings: ({ state }) => ({\n\t\t\t\tkind: \"settings\",\n\t\t\t\ttitle: \"Codex Remote Compaction Settings\",\n\t\t\t\tlines: [`User settings \u00B7 ${safeText(state.path)}`],\n\t\t\t\titems: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"enabled\",\n\t\t\t\t\t\tlabel: \"Remote compaction\",\n\t\t\t\t\t\tdescription: \"Use Codex Remote V2 when the model uses openai-codex-responses.\",\n\t\t\t\t\t\tcurrentValue: state.settings.enabled ? \"On\" : \"Off\",\n\t\t\t\t\t\tvalues: [\"On\", \"Off\"],\n\t\t\t\t\t\taction: \"set-enabled\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"requestTimeoutMs\",\n\t\t\t\t\t\tlabel: \"Request timeout\",\n\t\t\t\t\t\tdescription: \"Maximum time for the extension-owned remote compaction request.\",\n\t\t\t\t\t\tcurrentValue: timeoutLabel(state.settings.requestTimeoutMs),\n\t\t\t\t\t\tvalues: [\"2 min\", \"5 min\", \"10 min\"],\n\t\t\t\t\t\taction: \"set-timeout\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"maxRetries\",\n\t\t\t\t\t\tlabel: \"Transport retries\",\n\t\t\t\t\t\tdescription: \"Retry transient provider failures before falling back to Pi.\",\n\t\t\t\t\t\tcurrentValue: String(state.settings.maxRetries),\n\t\t\t\t\t\tvalues: [\"0\", \"1\", \"2\"],\n\t\t\t\t\t\taction: \"set-retries\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"replacementTokenBudget\",\n\t\t\t\t\t\tlabel: \"Retained user history\",\n\t\t\t\t\t\tdescription: \"Approximate user-message budget kept beside the opaque checkpoint.\",\n\t\t\t\t\t\tcurrentValue: retentionLabel(state.settings.replacementTokenBudget),\n\t\t\t\t\t\tvalues: [\"32K tokens\", \"64K tokens\", \"96K tokens\", \"128K tokens\"],\n\t\t\t\t\t\taction: \"set-retention\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"notifyOnFallback\",\n\t\t\t\t\t\tlabel: \"Fallback notifications\",\n\t\t\t\t\t\tdescription: \"Warn when Remote V2 fails and native Pi compaction takes over.\",\n\t\t\t\t\t\tcurrentValue: state.settings.notifyOnFallback ? \"On\" : \"Off\",\n\t\t\t\t\t\tvalues: [\"On\", \"Off\"],\n\t\t\t\t\t\taction: \"set-notify\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t}),\n\t\t\tinvalid: ({ state }) => ({\n\t\t\t\tkind: \"detail\",\n\t\t\t\ttitle: \"Codex Compact Settings \u00B7 Read only\",\n\t\t\t\tlines: [\n\t\t\t\t\t`Invalid settings file: ${safeText(state.path)}`,\n\t\t\t\t\t`Issue: ${safeText(state.issue ?? \"unknown validation error\")}`,\n\t\t\t\t\t\"Built-in defaults are active. Repair the file and run /reload; it will not be overwritten.\",\n\t\t\t\t],\n\t\t\t\thint: \"back\",\n\t\t\t}),\n\t\t},\n\t\tactions: {\n\t\t\t\"compact-now\": async () => {\n\t\t\t\toptions.onCompactRequested?.();\n\t\t\t\treturn { kind: \"close\" };\n\t\t\t},\n\t\t\t\"set-enabled\": ({ ctx, value, signal }) =>\n\t\t\t\tupdate(runtime, ctx, { enabled: value === \"On\" }, signal),\n\t\t\t\"set-timeout\": ({ ctx, value, signal }) =>\n\t\t\t\tupdate(\n\t\t\t\t\truntime,\n\t\t\t\t\tctx,\n\t\t\t\t\t{ requestTimeoutMs: Number.parseInt(value ?? \"5\", 10) * 60_000 },\n\t\t\t\t\tsignal,\n\t\t\t\t),\n\t\t\t\"set-retries\": ({ ctx, value, signal }) =>\n\t\t\t\tupdate(runtime, ctx, { maxRetries: Number.parseInt(value ?? \"2\", 10) }, signal),\n\t\t\t\"set-retention\": ({ ctx, value, signal }) =>\n\t\t\t\tupdate(\n\t\t\t\t\truntime,\n\t\t\t\t\tctx,\n\t\t\t\t\t{ replacementTokenBudget: Number.parseInt(value ?? \"64\", 10) * 1000 },\n\t\t\t\t\tsignal,\n\t\t\t\t),\n\t\t\t\"set-notify\": ({ ctx, value, signal }) =>\n\t\t\t\tupdate(runtime, ctx, { notifyOnFallback: value === \"On\" }, signal),\n\t\t},\n\t};\n}\n\nexport async function showCodexCompactMenu(\n\truntime: CodexCompactSettingsRuntime,\n\tctx: ExtensionCommandContext,\n\towner: SettingsMenuOwner,\n): Promise<void> {\n\tif (ctx.mode !== \"tui\") {\n\t\tctx.ui.notify(`Edit Codex compaction settings at ${safeText(runtime.get().path)}.`, \"info\");\n\t\treturn;\n\t}\n\tconst { runMenu } = await import(\"@narumitw/pi-tui-kit\");\n\tif (owner.signal.aborted || !owner.isCurrent()) return;\n\tlet compactRequested = false;\n\tawait runMenu(\n\t\tctx,\n\t\tcreateCodexCompactMenu(runtime, {\n\t\t\tonCompactRequested: () => {\n\t\t\t\tcompactRequested = true;\n\t\t\t},\n\t\t\tstatus: compactMenuStatus(ctx),\n\t\t}),\n\t\t{\n\t\t\tgetState: () => runtime.get(),\n\t\t\tsignal: owner.signal,\n\t\t\tisCurrent: owner.isCurrent,\n\t\t},\n\t);\n\tif (!compactRequested || owner.signal.aborted || !owner.isCurrent()) return;\n\tctx.compact({\n\t\tonError: (error) => {\n\t\t\tif (!owner.signal.aborted && owner.isCurrent()) {\n\t\t\t\tctx.ui.notify(`Compaction failed: ${safeText(error.message)}`, \"error\");\n\t\t\t}\n\t\t},\n\t});\n}\n\nexport function compactMenuStatus(ctx: ExtensionCommandContext): CompactMenuStatus {\n\tconst model = ctx.model;\n\treturn {\n\t\tmodel: model ? `${model.provider}/${model.id}` : \"none\",\n\t\tremoteEligible: usesCodexResponsesApi(model),\n\t};\n}\n\nfunction compactRoute(\n\tstate: Readonly<CodexCompactSettingsState>,\n\tstatus: CompactMenuStatus | undefined,\n): string {\n\tif (!state.settings.enabled) return \"Pi native (Remote V2 off)\";\n\treturn status?.remoteEligible ? \"Codex Remote V2\" : \"Pi native (requires openai-codex-responses)\";\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }