pi-openai-toolkit 0.20.8 → 0.21.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.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # pi-openai-toolkit
2
2
 
3
- Remote context windows, Responses compaction, web search, image generation, and tool-call review for Pi. Uses Pi's existing models, endpoints, authentication, and sessions without registering another provider or model.
3
+ Remote context windows, Responses compaction, web search, and image generation for Pi. Uses Pi's existing models, endpoints, authentication, and sessions without registering another provider or model.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/pi-openai-toolkit.svg)](https://www.npmjs.com/package/pi-openai-toolkit)
6
6
  [![MIT](https://img.shields.io/npm/l/pi-openai-toolkit.svg)](LICENSE)
@@ -15,7 +15,7 @@ Requires Node.js **22.19.0+** and Pi **0.87.0+**. Current development dependenci
15
15
  pi install npm:pi-openai-toolkit
16
16
  ```
17
17
 
18
- Configure your model and credentials in Pi, then start Pi normally. Without a Toolkit config file, eligible models use remote compaction by default. Search remains managed by Pi and other extensions; image generation and Auto Mode are off.
18
+ Configure your model and credentials in Pi, then start Pi normally. Without a Toolkit config file, eligible models use remote compaction by default. Search remains managed by Pi and other extensions; image generation is off.
19
19
 
20
20
  Toolkit reads one global configuration file, even for a project-local installation:
21
21
 
@@ -50,7 +50,9 @@ Set `defaults.context.mode` or an individual model's `context.mode`:
50
50
  - `remote-windows`: use Codex remote context windows, retrieve earlier work with `history`, and save handoff notes with `notes`
51
51
  - `pi`: leave context management to Pi
52
52
 
53
- **Remote compaction** accepts the `openai-responses`, `openai-codex-responses`, and `azure-openai-responses` API types. The backend must still support the checkpoint protocol. Set `context.remoteCompaction.model` to use a separate compaction model; remote compaction requires the same effective base URL as the active model. Native summary fallback has separate settings and does not apply to every failure: empty checkpoints, incompatible provenance, or edits to sealed history block storage or replay. See [context settings](docs/configuration.md#context) and [checkpoint rules](docs/internals.md#remote-compaction-v2-wire-contract).
53
+ **Remote compaction** accepts `openai-responses`, `openai-codex-responses`, and `azure-openai-responses`. It tries V2 first. On the official OpenAI API-key route, a qualifying protocol failure can trigger one standalone `/v1/responses/compact` request; its complete encrypted replacement window is preserved for replay. OpenAI OAuth, native Codex, Azure, and gateways keep their existing V2 route. OpenAI subscription-sharing OAuth and native Codex login are separate grants, not interchangeable credentials. Backend/model access is still required.
54
+
55
+ Set `context.remoteCompaction.model` to use a separate producer on the same effective base URL without changing the active model. Exhausted remote attempts warn before continuing with a native text summary. `nativeFallback.enabled: false` disables only Toolkit's configured-model tier, not Pi's default summary. Aborts, incompatible provenance, and edits to sealed history still cancel rather than bypassing checkpoint safety. See [context settings](docs/configuration.md#context) and [checkpoint rules](docs/internals.md#remote-compaction-v2-wire-contract).
54
56
 
55
57
  **Remote windows** require the native `openai-codex` provider with `openai-codex-responses`, or an `openai-responses` gateway implementing the protocol. Gateways require `compatibility.transport: "codex-gateway"` on the exact model entry. This setting does not add the capability to an ordinary compatible endpoint.
56
58
 
@@ -58,7 +60,7 @@ Change `mode` in the example above to `remote-windows`. Eligible sessions expose
58
60
 
59
61
  Remote windows use alpha endpoints that may change upstream. When switching models, the remote window remains persisted and reusable; see the [window lifecycle](docs/internals.md#rollover-lifecycle).
60
62
 
61
- ## Search, images, and tool review
63
+ ## Search, images, and transport
62
64
 
63
65
  ### Web search
64
66
 
@@ -107,30 +109,10 @@ The Toolkit WebSocket adapter is disabled by default. Enable it globally for GPT
107
109
 
108
110
  It reuses the selected model's provider, base URL, credentials, headers, and model ID without registering another provider. Pi's `transport: "auto"` tries WebSocket first and falls back to SSE before streaming starts; with a stable session it also reuses the socket and sends only the new continuation input when the transcript matches. Use `transport: "websocket-cached"` to require that cached path, or `transport: "sse"` to keep the original HTTP/SSE path. Restart or reload Pi after changing the Toolkit setting. See [WebSocket configuration](docs/configuration.md#responses-websocket-transport).
109
111
 
110
- ### Auto Mode
111
-
112
- Auto Mode uses model-based review before tool execution. Permit it and select a reviewer registered and authenticated in Pi, then engage it explicitly:
113
-
114
- ```json
115
- {
116
- "schemaVersion": 2,
117
- "defaults": {
118
- "autoMode": {
119
- "available": true,
120
- "reviewerModel": "provider/reviewer-model-id"
121
- }
122
- }
123
- }
124
- ```
125
-
126
- Replace `provider/reviewer-model-id` with a real model reference. Use `/auto on` or the `--auto` startup flag to engage, and `/auto off` to disengage. Setting `available: true` alone does not engage the gate.
127
-
128
- The default `gate: "side-effect"` reviews `bash`, `write`, `edit`, and `extraTools`. Use `gate: "all"` to cover every tool. Read-only evidence gathering, denial circuit breakers, and optional background classifier pre-scoring are supported. With the classifier enabled, some calls can pass based on a pre-score.
129
-
130
- A timeout or unavailable review is never approval: interactive sessions ask for confirmation, while headless sessions block the call. This is not a sandbox or a guarantee of correct decisions. Selecting an ineligible model disengages Auto Mode. See [Auto Mode settings](docs/configuration.md#auto-mode).
131
-
132
112
  ## Compatibility and troubleshooting
133
113
 
114
+ Auto Mode, `/auto`, and `--auto` have been removed. Toolkit no longer reviews tool calls through this feature. Existing `autoMode` configuration is ignored with a warning and can be deleted; other valid settings keep working. See [removal guidance](docs/configuration.md#removed-auto-mode).
115
+
134
116
  - Keep providers, endpoints, and credentials in Pi, not Toolkit configuration. See [provider setup](docs/configuration.md#provider-specific-responses-endpoints) for Azure deployment mapping, `api-version`, and authentication
135
117
  - `pi-virtual` capability checks use the physical provider/model resolved by Pi, without inferring support from the virtual model's name
136
118
  - Compaction and replay honor `inputLimits.images` resizing and count limits from Pi model metadata without changing the persisted session or original request object
package/README.zh.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # pi-openai-toolkit
2
2
 
3
- 为 Pi 添加远程上下文窗口、Responses 压缩、联网搜索、图像生成和工具调用审查。沿用 Pi 的模型、端点、认证和会话配置,不另行注册提供商或模型。
3
+ 为 Pi 添加远程上下文窗口、Responses 压缩、联网搜索和图像生成。沿用 Pi 的模型、端点、认证和会话配置,不另行注册提供商或模型。
4
4
 
5
5
  [![npm 版本](https://img.shields.io/npm/v/pi-openai-toolkit.svg)](https://www.npmjs.com/package/pi-openai-toolkit)
6
6
  [![MIT](https://img.shields.io/npm/l/pi-openai-toolkit.svg)](LICENSE)
@@ -15,7 +15,7 @@
15
15
  pi install npm:pi-openai-toolkit
16
16
  ```
17
17
 
18
- 在 Pi 中配置好模型和凭据后,照常启动。没有 Toolkit 配置文件时,符合条件的模型默认使用远程压缩;搜索由 Pi 和其他扩展管理,生图和 Auto Mode 默认关闭。
18
+ 在 Pi 中配置好模型和凭据后,照常启动。没有 Toolkit 配置文件时,符合条件的模型默认使用远程压缩;搜索由 Pi 和其他扩展管理,生图默认关闭。
19
19
 
20
20
  Toolkit 只读取一个全局配置文件,即使扩展安装在项目内也一样:
21
21
 
@@ -50,7 +50,9 @@ Toolkit 只读取一个全局配置文件,即使扩展安装在项目内也一
50
50
  - `remote-windows`:使用 Codex 远程上下文窗口,通过 `history` 检索较早内容、`notes` 保存交接信息
51
51
  - `pi`:交给 Pi 管理上下文
52
52
 
53
- **远程压缩**支持的 API 类型是 `openai-responses`、`openai-codex-responses` 和 `azure-openai-responses`,但后端仍须支持对应的检查点协议。可用 `context.remoteCompaction.model` 指定独立的压缩模型;远程压缩要求它与当前模型使用相同的有效 base URL。原生摘要回退有独立配置,并非所有失败都会回退;空检查点、来源不匹配或被修改的已封存历史会阻止存储或重放。详见[上下文配置](docs/configuration.md#context)和[检查点规则](docs/internals.md#remote-compaction-v2-wire-contract)。
53
+ **远程压缩**支持 `openai-responses`、`openai-codex-responses` 和 `azure-openai-responses`,先尝试 V2。官方 OpenAI API-key 路由遇到符合条件的协议失败时,可再尝试一次独立的 `/v1/responses/compact`,并完整保存返回的加密替换窗口用于重放。OpenAI OAuth、原生 Codex、Azure 和网关保持原有 V2 路由。OpenAI subscription-sharing OAuth 与原生 Codex 登录是两种独立授权,凭据不能互换;模型和后端仍须具备相应权限。
54
+
55
+ 可用 `context.remoteCompaction.model` 指定同一有效 base URL 下的独立压缩模型,不改变当前模型。远程尝试全部失败后,会明确提示并继续普通文本摘要。`nativeFallback.enabled: false` 只关闭 Toolkit 的指定模型回退层,不关闭 Pi 默认摘要。取消操作、来源不匹配或已封存历史被修改时,仍会取消,不能绕过检查点安全检查。详见[上下文配置](docs/configuration.md#context)和[检查点规则](docs/internals.md#remote-compaction-v2-wire-contract)。
54
56
 
55
57
  **远程窗口**需要原生 `openai-codex` 提供商的 `openai-codex-responses` API,或支持相应协议的 `openai-responses` 网关。网关必须在精确模型下设置 `compatibility.transport: "codex-gateway"`;这一设置不会让普通兼容端点自动获得该能力。
56
58
 
@@ -58,7 +60,7 @@ Toolkit 只读取一个全局配置文件,即使扩展安装在项目内也一
58
60
 
59
61
  远程窗口依赖 alpha 接口,上游可能随时调整。切换模型时远程窗口状态仍会持久化并可复用,详见[窗口生命周期](docs/internals.md#rollover-lifecycle)。
60
62
 
61
- ## 搜索、生图与工具审查
63
+ ## 搜索、生图与传输
62
64
 
63
65
  ### 联网搜索
64
66
 
@@ -107,30 +109,10 @@ Toolkit 的 WebSocket adapter 默认关闭。对使用 Pi `openai-responses` API
107
109
 
108
110
  它沿用当前模型的 provider、base URL、凭据、headers 和 model ID,不注册新的 provider。Pi 的 `transport: "auto"` 会先尝试 WebSocket,并在开始流式输出前回退到 SSE;会话 ID 稳定时还会复用连接,并在历史匹配时只发送新的 continuation 输入。使用 `transport: "websocket-cached"` 可强制要求缓存连接路径,使用 `transport: "sse"` 则保持原有 HTTP/SSE 路径。修改 Toolkit 配置后请重启或 reload Pi。详见[WebSocket 配置](docs/configuration.md#responses-websocket-transport)。
109
111
 
110
- ### Auto Mode
111
-
112
- Auto Mode 在工具执行前进行模型审查。先允许使用并指定 Pi 中已注册、可认证的审查模型,再手动开启:
113
-
114
- ```json
115
- {
116
- "schemaVersion": 2,
117
- "defaults": {
118
- "autoMode": {
119
- "available": true,
120
- "reviewerModel": "provider/reviewer-model-id"
121
- }
122
- }
123
- }
124
- ```
125
-
126
- 将 `provider/reviewer-model-id` 替换为实际模型。用 `/auto on` 或启动参数 `--auto` 开启,`/auto off` 关闭;只设置 `available: true` 不会自动开启。
127
-
128
- 默认 `gate: "side-effect"` 审查 `bash`、`write`、`edit` 和 `extraTools` 中的工具,`gate: "all"` 审查所有工具。支持只读取证、拒绝次数熔断和可选的后台分类器预评分;开启分类器后,部分调用可依据预评分放行。
129
-
130
- 审查超时或不可用不算批准:交互模式会请求用户确认,无界面模式会阻止调用。它不是沙箱,也不保证每次判断正确;选择不符合条件的模型会关闭 Auto Mode。完整配置见[Auto Mode](docs/configuration.md#auto-mode)。
131
-
132
112
  ## 兼容性与排查
133
113
 
114
+ Auto Mode、`/auto` 和 `--auto` 已移除,Toolkit 不再通过此功能审查工具调用。旧 `autoMode` 配置会被忽略并提示警告,可手动删除;其他有效设置继续正常工作。详见[移除说明](docs/configuration.md#removed-auto-mode)。
115
+
134
116
  - 提供商、端点和凭据仍由 Pi 管理,不写进 Toolkit 配置。Azure 的部署映射、`api-version` 和认证说明见[提供商配置](docs/configuration.md#provider-specific-responses-endpoints)
135
117
  - `pi-virtual` 使用 Pi 解析出的实际提供商和模型检查能力,不按虚拟模型名称推断支持情况
136
118
  - 压缩和重放时遵守 Pi 模型元数据中的 `inputLimits.images` 缩放与数量限制,不修改持久化会话或原始请求对象
@@ -46,12 +46,6 @@
46
46
  }
47
47
  ]
48
48
  },
49
- "stringList": {
50
- "type": "array",
51
- "items": {
52
- "type": "string"
53
- }
54
- },
55
49
  "responsesApis": {
56
50
  "type": "array",
57
51
  "items": {
@@ -194,91 +188,9 @@
194
188
  }
195
189
  }
196
190
  },
197
- "autoMode": {
198
- "type": "object",
199
- "additionalProperties": false,
200
- "properties": {
201
- "available": {
202
- "type": "boolean"
203
- },
204
- "reviewerModel": {
205
- "$ref": "#/$defs/modelRef"
206
- },
207
- "gate": {
208
- "enum": [
209
- "side-effect",
210
- "all"
211
- ]
212
- },
213
- "extraTools": {
214
- "$ref": "#/$defs/stringList"
215
- },
216
- "timeoutMs": {
217
- "type": "integer",
218
- "minimum": 1000,
219
- "maximum": 120000
220
- },
221
- "transcript": {
222
- "type": "boolean"
223
- },
224
- "evidenceTools": {
225
- "type": "boolean"
226
- },
227
- "maxEvidenceRounds": {
228
- "type": "integer",
229
- "minimum": 0,
230
- "maximum": 8
231
- },
232
- "classifier": {
233
- "$ref": "#/$defs/classifier"
234
- },
235
- "circuitBreaker": {
236
- "$ref": "#/$defs/circuitBreaker"
237
- }
238
- }
239
- },
240
- "classifier": {
241
- "type": "object",
242
- "additionalProperties": false,
243
- "properties": {
244
- "enabled": {
245
- "type": "boolean"
246
- },
247
- "model": {
248
- "$ref": "#/$defs/modelRef"
249
- },
250
- "timeoutMs": {
251
- "type": "integer",
252
- "minimum": 1000,
253
- "maximum": 120000
254
- },
255
- "maxLag": {
256
- "type": "integer",
257
- "minimum": 0,
258
- "maximum": 20
259
- }
260
- }
261
- },
262
- "circuitBreaker": {
263
- "type": "object",
264
- "additionalProperties": false,
265
- "properties": {
266
- "consecutiveDenials": {
267
- "type": "integer",
268
- "minimum": 0,
269
- "maximum": 100
270
- },
271
- "recentDenials": {
272
- "type": "integer",
273
- "minimum": 0,
274
- "maximum": 100
275
- },
276
- "windowSize": {
277
- "type": "integer",
278
- "minimum": 1,
279
- "maximum": 200
280
- }
281
- }
191
+ "retiredAutoMode": {
192
+ "deprecated": true,
193
+ "description": "Auto Mode has been removed. This value is ignored with a warning; tool calls are no longer reviewed by it. Remove this section from your configuration."
282
194
  },
283
195
  "compatibility": {
284
196
  "type": "object",
@@ -309,7 +221,7 @@
309
221
  "$ref": "#/$defs/responsesWebSocket"
310
222
  },
311
223
  "autoMode": {
312
- "$ref": "#/$defs/autoMode"
224
+ "$ref": "#/$defs/retiredAutoMode"
313
225
  }
314
226
  }
315
227
  },
@@ -324,7 +236,7 @@
324
236
  "$ref": "#/$defs/webSearch"
325
237
  },
326
238
  "autoMode": {
327
- "$ref": "#/$defs/autoMode"
239
+ "$ref": "#/$defs/retiredAutoMode"
328
240
  },
329
241
  "compatibility": {
330
242
  "$ref": "#/$defs/compatibility"
@@ -21,8 +21,7 @@ Create the file and parent directory if absent. This example states the shipped
21
21
  "defaultModel": "grok-imagine-image-2.0",
22
22
  "allowedModels": ["grok-imagine-image-2.0"]
23
23
  },
24
- "responsesWebSocket": { "enabled": false },
25
- "autoMode": { "available": false }
24
+ "responsesWebSocket": { "enabled": false }
26
25
  },
27
26
  "models": {},
28
27
  "diagnostics": {
@@ -43,11 +42,11 @@ Create the file and parent directory if absent. This example states the shipped
43
42
 
44
43
  Precedence is built-ins, then `defaults`, then `models["provider/model-id"]`. Keys are exact and case-sensitive. Leading/trailing whitespace is trimmed; conflicting normalized keys are rejected. Model IDs may contain further slashes. No pattern matching or endpoint/capability guessing occurs.
45
44
 
46
- Known nested objects merge by field. Missing fields inherit, arrays replace instead of append, and `false`/`0` retain their meanings. Only optional model references accept `null`: context producer, native-fallback model, auto reviewer, and classifier model. `null` elsewhere is invalid. Defaults do not prohibit exact overrides; an exact model can set `available: true` over a default of `false`.
45
+ Known nested objects merge by field. Missing fields inherit, arrays replace instead of append, and `false`/`0` retain their meanings. Only optional model references accept `null`: context producer and native-fallback model. Other active settings reject `null`. Defaults do not prohibit exact overrides; an exact model can select a different context mode or search route.
47
46
 
48
47
  A missing file uses independent built-in defaults. Invalid JSON, an unreadable file, missing/unsupported `schemaVersion` on a v2-shaped document, or mixed legacy/v2 fields are reported distinctly. Unknown v2 policy keys are errors in their owning scope. Invalid selected settings block dependent operations; they never silently pick a more permissive route. Errors in other models remain visible without replacing a valid current model's policy. A valid exact leaf may shadow an invalid default leaf, but cannot hide a malformed containing object or unknown field in that feature scope.
49
48
 
50
- Each public callback, tool execution, compaction, reviewer/classifier operation, or config command uses an immutable snapshot across its awaited helpers. The next operation reads again. This does not make separate Pi headers, payload, and tool events one atomic transaction. Engagement, overrides, scores, windows, and results stay out of the config file.
49
+ Each public callback, tool execution, compaction, or config command uses an immutable snapshot across its awaited helpers. The next operation reads again. This does not make separate Pi headers, payload, and tool events one atomic transaction. Windows and results stay out of the config file.
51
50
 
52
51
  ---
53
52
 
@@ -68,9 +67,13 @@ Place `context` under `defaults` or an exact `models` entry.
68
67
  | `remoteWindows.leaveManagedMode` | `"warn"` | Legacy compatibility field. Both values preserve the same behavior: non-window models receive only the current local window, and no bulk close-out compaction is started for retired Remote Context history. |
69
68
  | `remoteWindows.reminderThresholdPercent` | `5` | Integer 0-100. `0` disables both the once-per-window reminder and exhausted-window fallback. |
70
69
 
70
+ Ordinary remote compaction tries V2 first. One automatic standalone `/v1/responses/compact` attempt is available only for the official HTTPS OpenAI endpoint, an `openai-responses` physical producer, public Pi auth metadata explicitly indicating configured non-OAuth auth, and an outgoing Bearer header matching Pi's resolved key. Missing/unknown auth metadata, an unrelated Authorization override, Codex affinity, OAuth, Azure, and third-party gateways do not opt in. A protocol-compatible rejection or invalid successful V2 checkpoint can qualify; auth/subscription, quota/rate-limit, network, abort, and unrelated server failures do not. No protocol selector, credential switch, or capability cache is added; a selected standalone attempt may add latency/cost.
71
+
72
+ Standalone success preserves the full canonical output window, including retained items, rather than treating retained assistant text as a summary. When actual remote attempts are exhausted, Toolkit warns that no encrypted checkpoint was produced and starts the existing native text-summary chain: the configured remote producer after a remote attempt, or `nativeFallback.model` when remote compaction is unavailable. `nativeFallback.enabled: false` disables only the configured-model tier; disabled/unset/same-model selections still permit Pi's default summary. Explicit summary-model failures and checkpoint-integrity failures cancel. OpenAI subscription-sharing OAuth can reject compaction; separately authenticating native Codex is a different route, not a way to reuse that grant. See the [wire contract](internals.md#remote-compaction-v2-wire-contract).
73
+
71
74
  Native Codex eligibility derives from the actual Pi provider/API. Gateways additionally need the exact transport opt-in below. `remote-windows` keeps the Remote Window state persisted when a model without window capability is selected: that model receives only the current local window, while retired/managed Remote Context history is excluded from live requests and compaction producers. A no-summary boundary preserves the marker for later reuse. A configured window model whose activation fails does not silently receive a summary fallback. Normal `new_context` keeps its persisted-notes, duplicate and cooldown gates. Synthetic Remote V2 producer/consumer identity and checkpoint provenance are unchanged. See [Toolkit internals](internals.md).
72
75
 
73
- In active `remote-windows`, `/compact [instructions]` starts checkpoint duty rather than producing a summary. The selected model must authenticate to the same native backend/account or gateway credential/affinity domain, fit the projected window plus its output reserve, and retain the required permitted context tools. Invalid or unsuitable explicit targets are refused without switching to a fallback model. If Auto Mode is engaged, the target must also be eligible for its gate. The entire handoff uses the initiating context-policy snapshot; no config or global Pi defaults are rewritten.
76
+ In active `remote-windows`, `/compact [instructions]` starts checkpoint duty rather than producing a summary. The selected model must authenticate to the same native backend/account or gateway credential/affinity domain, fit the projected window plus its output reserve, and retain the required permitted context tools. Invalid or unsuitable explicit targets are refused without switching to a fallback model. The entire handoff uses the initiating context-policy snapshot; no config or global Pi defaults are rewritten.
74
77
 
75
78
  Only a new persisted successful notes write/append after the handoff and the latest delivered user message authorizes its rollover. After the exact target marker is durable, Toolkit restores the original model/thinking before new-window inference and asks it to read the receipt first. Failure or cancellation restores an owned selection; a later user selection takes priority. Failed restoration blocks further handoff requests until selection/auth is repaired. Reload can recover selection, but does not automatically restart inference.
76
79
 
@@ -90,19 +93,23 @@ This selects an existing Toolkit protocol profile, independently of context mode
90
93
 
91
94
  The Responses WebSocket extension is disabled by default. Enable it globally with `defaults.responsesWebSocket.enabled: true`; it is intentionally not a model-scoped override. Restart or reload Pi after changing this setting. An invalid or legacy configuration keeps the feature disabled.
92
95
 
93
- The extension is an API-adapter override, not a provider registration. It applies to GPT model IDs whose Pi API is `openai-responses`, regardless of provider name. The active model's `baseUrl`, `apiKey`, configured headers, session id, and payload remain the source of truth.
96
+ The extension is an API-adapter override, not a provider registration. For requests dispatched through this API adapter, it applies to GPT model IDs whose Pi API is `openai-responses`, regardless of provider name. Providers that bypass the compat API adapter keep their own transport behavior. The active model's `baseUrl`, `apiKey`, configured headers, session id, and payload remain the source of truth.
94
97
 
95
98
  The extension honors Pi's global `transport` setting:
96
99
 
97
100
  | Pi `transport` | Behavior |
98
101
  | --- | --- |
99
- | `auto` | Try `wss://.../responses?model=...` first; fall back to the original SSE adapter only before a stream starts. With a stable session id, reuse the WebSocket and send a continuation delta when possible. |
102
+ | `auto` | Try `wss://.../responses?model=...` first; allow one original HTTP/SSE fallback per fetch call for a recoverable WS failure before the first valid event is exposed. With a stable session id, reuse the WebSocket and send a continuation delta when possible. |
100
103
  | `websocket` | Require the WebSocket path; do not fall back to SSE. This mode opens a request-scoped connection. |
101
104
  | `websocket-cached` | Require the WebSocket path and keep a session-scoped connection for later turns. |
102
105
  | `sse` | Bypass the extension and use the original HTTP/SSE adapter. |
103
106
 
104
107
  The endpoint is derived from the model's base URL by appending `/responses` when needed and switching `https:`/`http:` to `wss:`/`ws:`. The first frame is a standard `response.create` object and incoming frames are passed through Pi's existing Responses event normalizer. For `auto` and `websocket-cached`, Toolkit caches an open socket by session/model/endpoint/auth identity for up to five minutes idle or 55 minutes of age. When the current transcript has the cached request and response as a prefix, the next frame uses `previous_response_id` and only the new input items; if it cannot prove that relationship, it sends the full payload instead. A missing session id or `cacheRetention: "none"` disables reuse. The upstream must support the standard Responses WebSocket contract, including continuation semantics for `previous_response_id`; this does not rewrite a server that only exposes Codex's `/codex/responses` path or Codex-only authentication.
105
108
 
109
+ The first valid exposed event commits the WS attempt, including `response.created` even before text or tool arguments arrive. After that boundary, Toolkit never switches transport or splices a new generation into the same stream. Local transient WS failures and compatible WS error envelopes containing `stream closed before response.completed` retain their diagnostics with a Pi-recognized transport indication; Pi's native retry settings and budget decide whether to retry the failed step. Authentication, quota/billing, context/invalid-request/policy errors, malformed frames, and cancellation do not authorize Toolkit fallback. An SDK request deadline can cancel startup before a fallback is possible.
110
+
111
+ A failed connection is evicted. Any permitted fallback receives the original complete effective request, not a cached input delta; a new WS connection also starts from the full request. Pi remains responsible for effective context, completed tool results, failed-attempt history, tool execution, and usage. This prevents Toolkit from replaying completed tools as part of recovery, but does not guarantee idempotency if the model explicitly requests the same operation again. Direct SSE and errors from the original fallback SSE path are unchanged. Recovery depends on backend health and Pi's native retry policy; it is not token-level resumption or an unlimited retry loop.
112
+
106
113
  This feature does not write Pi settings, model files, auth files, or global extensions. To keep the Toolkit adapter disabled, set `defaults.responsesWebSocket.enabled` to `false` or omit it. Once enabled, Pi's global `transport: "sse"` still bypasses the WebSocket path for a request.
107
114
 
108
115
  ---
@@ -236,29 +243,11 @@ At the compaction and replay boundary, Toolkit applies the declared resize profi
236
243
 
237
244
  ---
238
245
 
239
- ### Auto Mode
246
+ ### Removed Auto Mode
240
247
 
241
- Place `autoMode` under `defaults` or an exact model. `available` permits engagement; it does not engage the runtime. Use `/auto on` or `--auto`, and `/auto off` to disengage. If an engaged session encounters invalid policy, calls remain blocked until policy is corrected or the user explicitly turns the gate off. A review timeout never means approval.
248
+ Auto Mode, `/auto`, and `--auto` have been removed. Toolkit no longer performs this feature's tool-call review, background classification, or review confirmations. No replacement approval gate is installed.
242
249
 
243
- | Relative field | Default | Contract |
244
- | --- | --- | --- |
245
- | `available` | `false` | Model eligibility for engagement. |
246
- | `reviewerModel` | `null` | Exact review-model reference; required for useful engagement. |
247
- | `gate` | `"side-effect"` | Reviews `bash`, `write`, `edit`, and `extraTools`; `"all"` reviews every tool. Session gate overrides remain runtime state. |
248
- | `extraTools` | `[]` | Additional names for the side-effect gate. |
249
- | `timeoutMs` | `30000` | Integer 1000-120000 milliseconds. |
250
- | `transcript` | `true` | Include transcript context in the blocking review. |
251
- | `evidenceTools` | `true` | Permit the reviewer's existing read-only evidence tools. |
252
- | `maxEvidenceRounds` | `3` | Integer 0-8. |
253
- | `classifier.enabled` | `false` | Enable nonblocking trajectory pre-scoring. |
254
- | `classifier.model` | `null` | Exact reference; `null` uses the reviewer. |
255
- | `classifier.timeoutMs` | `15000` | Integer 1000-120000 milliseconds. |
256
- | `classifier.maxLag` | `2` | Integer 0-20. |
257
- | `circuitBreaker.consecutiveDenials` | `3` | Integer 0-100; `0` disables this limit. |
258
- | `circuitBreaker.recentDenials` | `10` | Integer 0-100; `0` disables this limit. |
259
- | `circuitBreaker.windowSize` | `50` | Integer 1-200, recent-verdict window size. |
260
-
261
- Reviewer and classifier references are not active-session overrides. Classifier scores, denial history, and human decisions never become config entries. The reviewer and its read-only evidence calls share one cancellable deadline, including dependencies that ignore abort. Denial history resets on actual delivery of a user message, including identical queued messages, not on enqueue or an ordinary tool continuation. Pre-scores are bound to a full structured authorization fingerprint; the bounded review transcript prioritizes recent user instructions and reports omissions.
250
+ Legacy root `autoMode`, v2 `defaults.autoMode`, and exact-model `autoMode` sections are ignored with an explicit removal warning, regardless of their contents. They do not invalidate other valid settings. The editor schema retains only deprecated compatibility entries, not the old controls. Remove these sections and any `--auto` launcher argument manually; Toolkit does not rewrite your configuration, session history, or saved review artifacts. Unrelated invalid settings and mixed legacy/v2 documents still fail validation.
262
251
 
263
252
  ---
264
253
 
@@ -283,7 +272,7 @@ Diagnostics are plugin-wide, not model-scoped.
283
272
 
284
273
  ### Legacy compatibility and migration
285
274
 
286
- Do not combine unversioned roots (`compaction`, `webSearch`, `imageGeneration`, `autoMode`) with `schemaVersion: 2`. Valid legacy behavior is retained through a compatibility adapter, including nullable model clears, legacy image-list defaults, and source-dependent hosted-search failure handling. Invalid selected legacy route values are now blocked instead of disappearing into another selection.
275
+ Do not combine unversioned roots (`compaction`, `webSearch`, `imageGeneration`, `autoMode`) with `schemaVersion: 2`. Remaining legacy features are retained through a compatibility adapter, including nullable model clears, legacy image-list defaults, and source-dependent hosted-search failure handling. Invalid selected legacy route values are now blocked instead of disappearing into another selection.
287
276
 
288
277
  The preview maps recognized fields into a candidate, supplies leaf origins, lists unmapped/dormant paths, and reports `ready`, `needs-review`, `already-v2`, or `unavailable`. `ready` means no known semantic difference was found in recognized active policy; it is not authorization to apply or proof of provider support. Unknown names are masked and their values are never copied into the report. The original source bytes remain the authoritative copy of unknown and dormant content.
289
278
 
@@ -296,8 +285,7 @@ The preview maps recognized fields into a candidate, supplies leaf origins, list
296
285
  | `compaction.gatewayContextModels` | Exact `models[key].compatibility.transport` |
297
286
  | `webSearch.defaultRoute`, `routes`, `models` | Default/exact search route candidates, subject to review below |
298
287
  | `imageGeneration.models` | `allowedModels` plus an explicit default taken from the legacy first entry |
299
- | `autoMode.enabled` / `models` | Default/exact `autoMode.available` |
300
- | Legacy auto reviewer/classifier/breaker controls | Corresponding `autoMode` controls |
288
+ | `autoMode` | Removed; omitted from the candidate with a warning and `needs-review` |
301
289
  | Legacy compaction debug/capture/path settings | `diagnostics` |
302
290
 
303
291
  The preview cannot claim universal lossless conversion:
package/docs/internals.md CHANGED
@@ -11,7 +11,6 @@ Developer-facing reference for [pi-openai-toolkit](../README.md). The README kee
11
11
  - [Rollover lifecycle](#rollover-lifecycle)
12
12
  - [Managed manual compact](#managed-manual-compact)
13
13
  - [Remote Compaction v2 wire contract](#remote-compaction-v2-wire-contract)
14
- - [Auto Mode TUI review renderer](#auto-mode-tui-review-renderer)
15
14
  - [Artifacts and debugging](#artifacts-and-debugging)
16
15
  - [Provenance](#provenance)
17
16
 
@@ -23,7 +22,7 @@ The single global document is loaded through [src/config.ts](../src/config.ts).
23
22
 
24
23
  Feature entrypoints resolve once per public operation and pass that immutable snapshot through awaited helpers. A separately named compaction producer is resolved from the same decoded document for its own identity. Subsequent independent callbacks reload; a managed manual handoff retains its initiating context-policy snapshot until selection is restored. There is no general cross-event provider transaction, project lookup, singleton cache, or config state writer. Internal legacy-shaped engine adapters preserve compaction/search algorithms without exposing v2 parsing to consumers. Cross-feature gateway policy belongs to the resolver, not the context enable switch.
25
24
 
26
- Selected invalid policy blocks dependent operations; unrelated model errors remain reportable without replacing the selected model. An engaged auto gate stays blocking when its policy becomes invalid. Image choices are checked before auth, uploads, or paid requests. The human `/toolkit-config` command inspects effective values, validation, or a migration candidate without action APIs or network access. Migration is preview-only; source bytes and unknown/dormant content stay untouched.
25
+ Selected invalid policy blocks dependent operations; unrelated model errors remain reportable without replacing the selected model. Retired `autoMode` sections are ignored with a warning; they never create effective policy or invalidate other features. Image choices are checked before auth, uploads, or paid requests. The human `/toolkit-config` command inspects effective values, validation, or a migration candidate without action APIs or network access. Migration is preview-only; source bytes and unknown/dormant content stay untouched.
27
26
 
28
27
  ---
29
28
 
@@ -105,7 +104,7 @@ State invariants the lifecycle code must keep honest:
105
104
 
106
105
  [src/context-management/manual-compact.ts](../src/context-management/manual-compact.ts) owns manual checkpoint duty. It uses public Pi lifecycle and selection APIs; it does not replace the built-in command or patch the scheduler. [src/context-management/window-manager.ts](../src/context-management/window-manager.ts) remains the sole owner of notes pairing, window identity, projection and trim.
107
106
 
108
- 1. An active managed `session_before_compact` with reason `manual` validates the source/target policies from one snapshot, actual permitted tools, remaining capacity, backend/account scope and approval eligibility. It records the original model/thinking and cancels the native compact attempt. Internal window-bulk maintenance has a separate in-process owner even though Pi also labels it `manual`.
107
+ 1. An active managed `session_before_compact` with reason `manual` validates the source/target policies from one snapshot, actual permitted tools, remaining capacity and backend/account scope. It records the original model/thinking and cancels the native compact attempt. Internal window-bulk maintenance has a separate in-process owner even though Pi also labels it `manual`.
109
108
  2. The matching `session_compact_failed` callback launches duty only after Pi is idle. Public `setModel` changes the session selection, and a visible `sendUserMessage` rebuilds the target's normal prompt/tools. Delivery is observed through `message_start`; return from the fire-and-forget send API is not proof. A delivery timeout restores an abandoned idle selection.
110
109
  3. The existing `new_context` gate additionally requires a successful paired notes result after this operation and any later delivered user message. It records the exact target window before queueing a context-only marker, and returns a terminating result. Ordinary tools are blocked during checkpoint duty. Normal `new_context` outside this operation is unchanged.
111
110
  4. A terminating result alone does not stop mixed batches or queued messages. At `turn_end`, Toolkit requests abort without awaiting idle; context/request guards also refuse an unsafe continuation. The standard Responses and native Codex transports must not send an already-aborted continuation. Pi can deliver queued user content during that stop; it remains persisted and ordered for the original model.
@@ -113,8 +112,6 @@ State invariants the lifecycle code must keep honest:
113
112
 
114
113
  Versioned `pi-openai-toolkit:manual-compact` custom entries record operation/session/branch/window identities, exact model keys, original thinking and phase. They contain no credentials, transcript copy or note contents. Reload/navigation reads the current branch and only recovers still-owned selection; it never retries notes, rollover or paid inference. A newer user model/thinking selection ends ownership. Failed restoration stays durable and blocks further provider requests until recovery or an explicit user selection.
115
114
 
116
- An engaged Auto Mode gate grants a session/operation-scoped selection lease through [src/auto-mode/model-selection-guard.ts](../src/auto-mode/model-selection-guard.ts). An ineligible target is refused. While switching, a later eligibility change cannot silently disengage the gate: calls remain blocked. The lease neither enables Auto Mode nor widens its allowlist.
117
-
118
115
  The underlying native compact promise still rejects its intentional cancellation. Empty/already-compacted sessions can fail before the extension hook. This is a separate handoff operation, not a fabricated successful native compaction. An observed user cancellation before the owned checkpoint stop restores selection without automatically resuming. Tests use the official Pi runtime, disk-backed sessions, isolated HOME/settings and synthetic Responses/native Codex traffic in [test/pi-managed-compact.test.ts](../test/pi-managed-compact.test.ts); they assert every request's model/thinking, marker/note order, retained tool head and queue preservation.
119
116
 
120
117
  ---
@@ -127,34 +124,27 @@ A `compaction_trigger` item appended to the live streaming request yields one ou
127
124
 
128
125
  The incremental SSE consumer validates the first terminal event and reconciles its checkpoint with prior item evidence. A valid completed frame ends the operation even if the HTTP body stays open; reader cancellation is best-effort cleanup and is not awaited. Incomplete frames at EOF, conflicting checkpoint evidence and terminal errors cannot become successful checkpoints.
129
126
 
130
- A v2 response with a missing or empty checkpoint is never stored, and the `nativeFallback` tier is skipped. Pi's own threshold drives the next attempt, which may use `remoteCompactModel` when configured. `remoteCompactModel` must resolve to the same effective base URL as the active model.
131
-
132
- Pi 0.87 makes `SessionManager` the source of model-visible context. An omitted `context.remoteCompaction.inputSource` keeps `"legacy"` behavior: first compaction reads `buildSessionProjection()` (falling back to Pi's preparation if unavailable), and recursion uses the opaque window plus the canonically projected branch tail. Both paths honor persisted context edits. Legacy mode still bypasses request-time extension transforms.
133
-
134
- Setting `context.remoteCompaction.inputSource: "pi-context-hook"` opts into a narrow runtime bridge around Pi's public `ExtensionRunner.createContext()`. It adds a non-enumerable `ctx.projectContextForCompaction(messages)` method backed by `ExtensionRunner.emitContext()`. This runs the ordered conversation-only and full-transcript phases on the canonical projection. If the bridge, session projection, or recursive summary anchor is unavailable, the extension cancels rather than sending unprojected history.
127
+ A missing, empty, or invalid V2 checkpoint is never stored. Ordinary compaction may then try the gated standalone protocol below; exhausted remote attempts warn once and enter the unchanged native text-summary chain. A failed remote operation selects `remoteCompactModel` for the configured native tier; a remote-ineligible model selects `nativeFallback.model`. Disabled/unset/same-model selections delegate to Pi's default summary, including when `nativeFallback.enabled` is false. Explicit summary-model failures cancel instead of retrying with the active model. Aborts and projection/provenance/context-edit failures still cancel immediately. `remoteCompactModel` must resolve to the same effective base URL as the active consumer, which is never switched for synthetic requests.
135
128
 
136
- Retained-message matching uses the SDK projection and source entry IDs, including omissions and replacements made before compaction. Older retained compaction entries contribute no second summary. A compaction whose kept boundary is its own ID retains no earlier messages. Edits to post-checkpoint input are applied to the live tail; an edit targeting history already sealed in an opaque checkpoint blocks replay and recursive compaction with `checkpoint-context-edited`. The encrypted checkpoint cannot be selectively rewritten. Start a new session or navigate before that checkpoint to rebuild from editable history; the raw log remains unchanged.
129
+ #### Official API-key standalone fallback
137
130
 
138
- New checkpoints record `inputProvenance: "pi-context-hook-v1"` or `"legacy-raw-context-v1"`, and replay/recursion reject missing or mode-mismatched markers without searching past the latest compaction. Retained `role: "custom"` messages are optional during replay because they may be changed or removed by context hooks; required user, assistant, and complete tool-call/result content remains ordered and fail-closed.
131
+ The ordinary path reuses one resolved physical producer, auth snapshot, and prepared full input. After a qualifying V2 failure, it makes at most one POST to `https://api.openai.com/v1/responses/compact`. Eligibility requires `openai-responses`, no Codex gateway affinity, public `ModelRegistry.hasConfiguredAuth(model) === true` and `isUsingOAuth(model) === false`, and the final Authorization header matching the resolved Bearer key. Missing/throwing/nonboolean metadata is unknown, not API-key evidence. Provider aliases may qualify at the official endpoint; OAuth, native Codex, Azure, custom gateways, managed handoff and inactive Remote Context recovery retain their previous routing. No token-shape inspection, extra auth resolution, model/account switch, redirect, capability cache, or generated version/beta header is introduced.
139
132
 
140
- ---
133
+ Qualifying failures are HTTP 400/404/405/422/501 without auth/quota exclusions, invalid/empty successful V2 checkpoint responses, or streamed errors with a recognized unsupported-protocol code. HTTP 401/403/429, known subscription/auth/billing/rate-limit restrictions, network failures, aborts, and generic server outages never trigger another protocol probe. OpenAI subscription-sharing OAuth and native Codex OAuth are distinct grants; selecting a separately authenticated Codex route does not authorize copying its credential to OpenAI.
141
134
 
142
- ### Auto Mode TUI review renderer
135
+ Standalone JSON contains `model`, `input`, `instructions` and only validated SDK-supported service-tier/cache fields. It omits `previous_response_id`, stream/store/tools/reasoning/text and the V2 trigger. A nonempty output must contain at least one nonempty encrypted `compaction` item and no malformed checkpoint. Every returned item and unknown structured field survives in original order, including retained user/assistant messages. Unlike V2, this protocol does not impose a single-output-item invariant. The existing `openai-native-compact-v1` strategy and an honest opaque window marker are persisted with consumer/producer identity, input provenance, deferred tools and Pi's `tokensBefore`. Retained assistant text is not a portable summary.
143
136
 
144
- Approval state is scoped to actual user-message delivery. Full structured user content is SHA-256 hashed independently of transcript truncation, and generation-owned classifier completions cannot overwrite newer samples. The bounded transcript selects recent user instructions first and reports omissions. The blocking reviewer and its read-only evidence loop share one deadline that also races uncooperative dependencies; timeout/cancellation is an unavailable review, never approval or a safety denial.
137
+ Existing persistence/replay splices the entire canonical window between the leading prompt and live tail. Recursion uses that window plus current live tail once; verified Pi-retained copies are removed, current deferred schemas load after the end of the whole window, and historical declarations remain intact. Standalone cancellation can win before JSON checkpoint acceptance; V2's validated terminal remains authoritative over later reader cleanup cancellation.
145
138
 
146
- Auto Mode owns the review decision, but Pi owns the built-in tool-block component. Pi 0.87 exports `ToolExecutionComponent` without a public decorator interface, so `src/auto-mode/tool-review-tui.ts` installs a narrow, idempotent compatibility patch on its `render()` method. The patch only reads the component's existing tool-call ID and appends one bounded, single-line status after the normal block output; it never changes tool execution, event ordering, or provider payloads.
139
+ The API-key path is covered by isolated mocked wire tests and real Pi persistence/reopen/continuation fixtures in both input-source modes. This is not live API-key acceptance. Earlier credentialed evidence used native Codex OAuth only; it does not establish API-key or OpenAI subscription-sharing OAuth support for every model/account.
147
140
 
148
- The extension updates an ephemeral per-call state through the same `tool_call` lifecycle that performs the review:
141
+ Pi 0.87 makes `SessionManager` the source of model-visible context. An omitted `context.remoteCompaction.inputSource` keeps `"legacy"` behavior: first compaction reads `buildSessionProjection()` (falling back to Pi's preparation if unavailable), and recursion uses the opaque window plus the canonically projected branch tail. Both paths honor persisted context edits. Legacy mode still bypasses request-time extension transforms.
149
142
 
150
- - `skipped` when the tool is outside the configured Auto Mode gate;
151
- - `reviewing` while the reviewer model is running;
152
- - `awaiting-user` when an unavailable review reaches interactive confirmation;
153
- - `allowed`, `denied`, or `blocked` after the final decision.
143
+ Setting `context.remoteCompaction.inputSource: "pi-context-hook"` opts into a narrow runtime bridge around Pi's public `ExtensionRunner.createContext()`. It adds a non-enumerable `ctx.projectContextForCompaction(messages)` method backed by `ExtensionRunner.emitContext()`. This runs the ordered conversation-only and full-transcript phases on the canonical projection. If the bridge, session projection, or recursive summary anchor is unavailable, the extension cancels rather than sending unprojected history.
154
144
 
155
- The state is intentionally not persisted to the session. It is bounded to recent calls and cleared at `session_start`, so reloading a session does not invent historical approval claims. The renderer uses Pi's current theme when available, truncates untrusted rationale text, and preserves the original render output when no state exists.
145
+ Retained-message matching uses the SDK projection and source entry IDs, including omissions and replacements made before compaction. Older retained compaction entries contribute no second summary. A compaction whose kept boundary is its own ID retains no earlier messages. Edits to post-checkpoint input are applied to the live tail; an edit targeting history already sealed in an opaque checkpoint blocks replay and recursive compaction with `checkpoint-context-edited`. The encrypted checkpoint cannot be selectively rewritten. Start a new session or navigate before that checkpoint to rebuild from editable history; the raw log remains unchanged.
156
146
 
157
- This is a version-coupled adapter, not a stable Pi extension contract. It is feature-detected at registration time and marked with a global symbol so extension reloads do not wrap the class repeatedly. If the exported component shape changes or becomes non-writable, the adapter becomes a no-op, emits one warning in TUI mode, and the existing footer/working-message review indicators remain the fallback.
147
+ New checkpoints record `inputProvenance: "pi-context-hook-v1"` or `"legacy-raw-context-v1"`, and replay/recursion reject missing or mode-mismatched markers without searching past the latest compaction. Retained `role: "custom"` messages are optional during replay because they may be changed or removed by context hooks; required user, assistant, and complete tool-call/result content remains ordered and fail-closed.
158
148
 
159
149
  ---
160
150
 
@@ -165,6 +155,7 @@ With `diagnostics.level: "debug"`, the toolkit writes lifecycle and compaction a
165
155
  - Each `session_start` writes a lifecycle artifact whose `activation` field records `active` or the exact inactive reason, such as `unsupported-model`, `unsupported-api`, `missing-api-key`, `auth-resolution-failed`, or `tool-name-conflict`.
166
156
  - `diagnostics.captureRequests` independently writes provider request metadata and payloads, while `diagnostics.captureResponses` writes compact status and structural summaries with complete response and body fields critically redacted. Keep both off unless inspecting a specific request.
167
157
  - Artifacts always redact Authorization credentials, API keys and tokens, Codex account IDs, and opaque `encrypted_content` or `encrypted_output`, even when `diagnostics.redactSensitiveData` is `false`.
158
+ - Compaction failures record protocol, stable reason/status, controlled public error identifiers/hints and the next step. Arbitrary provider messages and raw bodies are never promoted into diagnostics; unknown identifiers are omitted, and network exceptions use a generic content-free message. Debug-enabled headless runs record the same remote-to-native transition without requiring UI notifications.
168
159
 
169
160
  ---
170
161
 
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-openai-toolkit",
3
- "version": "0.20.8",
3
+ "version": "0.21.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "engines": {
7
7
  "node": ">=22.19.0"
8
8
  },
9
- "description": "OpenAI toolkit for Pi: Codex Remote Context windows, remote compaction v2, routed Web Search, image gen, auto mode.",
9
+ "description": "OpenAI toolkit for Pi: Codex Remote Context windows, remote compaction v2, routed Web Search, image gen.",
10
10
  "author": "awoaCrim and contributors",
11
11
  "license": "MIT",
12
12
  "repository": {
@@ -28,7 +28,6 @@
28
28
  "compaction",
29
29
  "web-search",
30
30
  "image-generation",
31
- "auto-mode",
32
31
  "codex",
33
32
  "responses"
34
33
  ],
@@ -37,13 +36,13 @@
37
36
  "./src/extension-runtime.ts",
38
37
  "./src/web-search/extension.ts",
39
38
  "./src/image-generation/extension.ts",
40
- "./src/auto-mode/extension.ts",
41
39
  "./src/codex-astra/extension.ts",
42
40
  "./src/responses-websocket/extension.ts"
43
41
  ]
44
42
  },
45
43
  "files": [
46
44
  "src/compact-client.ts",
45
+ "src/compaction-errors.ts",
47
46
  "src/compaction-projection.ts",
48
47
  "src/pi-context-hook.ts",
49
48
  "src/config.ts",
@@ -79,15 +78,6 @@
79
78
  "src/image-generation/render.ts",
80
79
  "src/image-generation/service.ts",
81
80
  "src/image-generation/types.ts",
82
- "src/auto-mode/extension.ts",
83
- "src/auto-mode/tool-review-tui.ts",
84
- "src/auto-mode/policy.ts",
85
- "src/auto-mode/model-selection-guard.ts",
86
- "src/auto-mode/prompt.ts",
87
- "src/auto-mode/transcript.ts",
88
- "src/auto-mode/reviewer.ts",
89
- "src/auto-mode/classifier.ts",
90
- "src/auto-mode/types.ts",
91
81
  "src/codex-astra/effort-planner.ts",
92
82
  "src/codex-astra/extension.ts",
93
83
  "src/responses-websocket/extension.ts",