@oh-my-pi/pi-ai 18.1.15 → 18.1.16
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/CHANGELOG.md +7 -0
- package/package.json +6 -6
- package/src/providers/openai-codex-responses.ts +11 -15
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [18.1.16] - 2026-09-09
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- Codex SSE streams that end without a terminal completion event now retry when replay-safe and remain transient errors when partial output prevents replay ([#11349](https://github.com/can1357/oh-my-pi/issues/11349)).
|
|
10
|
+
|
|
5
11
|
## [18.1.15] - 2026-09-08
|
|
6
12
|
|
|
7
13
|
### Fixed
|
|
@@ -10,6 +16,7 @@
|
|
|
10
16
|
- GitHub Copilot sign-in uses the minimal-grant OpenCode OAuth app again (`read:user` only): GitHub renders each app's existing per-user grant on the consent page, so Enterprise organizations that block the Copilot CLI app's broad historic grant can log in as on 18.1.4. API request identity still mimics the Copilot CLI, and tokens minted by either app keep working ([#11280](https://github.com/can1357/oh-my-pi/pull/11280) by [@H4vC](https://github.com/H4vC)).
|
|
11
17
|
- GitHub Copilot plan/model-policy 403s no longer count as credential failures for credential-lifetime decisions: the token is valid, so stored credentials are preserved instead of wiped ([#11280](https://github.com/can1357/oh-my-pi/pull/11280) by [@H4vC](https://github.com/H4vC)).
|
|
12
18
|
- Fixed custom `google-generative-ai` providers failing mid-turn model fallback when Gemini 3 tool calls are replayed without their original thought signature ([#11270](https://github.com/can1357/oh-my-pi/issues/11270)).
|
|
19
|
+
- Fixed Linux `zcode://` (Z.AI coding-plan) OAuth sign-in hanging at the paste prompt after a successful browser authorization: native scheme registration now runs `update-desktop-database`, so `xdg-desktop-portal-gtk` resolves the handler on the first attempt instead of reporting "No Apps available" and no longer routes the callback to a stale transaction directory ([#11279](https://github.com/can1357/oh-my-pi/issues/11279)).
|
|
13
20
|
|
|
14
21
|
## [18.1.14] - 2026-09-07
|
|
15
22
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oh-my-pi/pi-ai",
|
|
3
|
-
"version": "18.1.
|
|
3
|
+
"version": "18.1.16",
|
|
4
4
|
"description": "Unified LLM API with automatic model discovery and provider configuration",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -124,11 +124,11 @@
|
|
|
124
124
|
"fmt": "oxfmt --no-error-on-unmatched-pattern 'src/**/*.{ts,tsx}' '{test,bench,examples,scripts}/**/*.ts' '*.ts'"
|
|
125
125
|
},
|
|
126
126
|
"dependencies": {
|
|
127
|
-
"@oh-my-pi/omptype": "18.1.
|
|
128
|
-
"@oh-my-pi/pi-catalog": "18.1.
|
|
129
|
-
"@oh-my-pi/pi-natives": "18.1.
|
|
130
|
-
"@oh-my-pi/pi-utils": "18.1.
|
|
131
|
-
"@oh-my-pi/pi-wire": "18.1.
|
|
127
|
+
"@oh-my-pi/omptype": "18.1.16",
|
|
128
|
+
"@oh-my-pi/pi-catalog": "18.1.16",
|
|
129
|
+
"@oh-my-pi/pi-natives": "18.1.16",
|
|
130
|
+
"@oh-my-pi/pi-utils": "18.1.16",
|
|
131
|
+
"@oh-my-pi/pi-wire": "18.1.16"
|
|
132
132
|
},
|
|
133
133
|
"devDependencies": {
|
|
134
134
|
"@types/bun": "^1.3.14"
|
|
@@ -2147,6 +2147,17 @@ class CodexStreamProcessor {
|
|
|
2147
2147
|
firstTokenTime = this.#handleStreamEvent(rawEvent, firstTokenTime);
|
|
2148
2148
|
if (this.runtime.sawTerminalEvent) break;
|
|
2149
2149
|
}
|
|
2150
|
+
if (!this.runtime.sawTerminalEvent) {
|
|
2151
|
+
CODEX_DEBUG &&
|
|
2152
|
+
logger.debug("[codex] codex stream ended unexpectedly", {
|
|
2153
|
+
transport: this.runtime.transport,
|
|
2154
|
+
terminalEventSeen: false,
|
|
2155
|
+
unexpectedStreamEnd: true,
|
|
2156
|
+
sentTurnStateHeader: Boolean(this.requestContext.turnState.value),
|
|
2157
|
+
sentModelsEtagHeader: Boolean(this.requestContext.websocketState?.modelsEtag),
|
|
2158
|
+
});
|
|
2159
|
+
throw new CodexProviderStreamError("Codex stream ended before terminal completion event", true);
|
|
2160
|
+
}
|
|
2150
2161
|
return { firstTokenTime };
|
|
2151
2162
|
} catch (error) {
|
|
2152
2163
|
const recovered = await this.#recoverStreamError(error);
|
|
@@ -2952,21 +2963,6 @@ class CodexStreamProcessor {
|
|
|
2952
2963
|
if (this.options?.signal?.aborted) {
|
|
2953
2964
|
throw new AIError.AbortError();
|
|
2954
2965
|
}
|
|
2955
|
-
if (!this.runtime.sawTerminalEvent) {
|
|
2956
|
-
if (this.requestContext.websocketState) {
|
|
2957
|
-
resetCodexWebSocketAppendState(this.requestContext.websocketState);
|
|
2958
|
-
this.requestContext.websocketState.modelsEtag = undefined;
|
|
2959
|
-
}
|
|
2960
|
-
CODEX_DEBUG &&
|
|
2961
|
-
logger.debug("[codex] codex stream ended unexpectedly", {
|
|
2962
|
-
transport: this.runtime.transport,
|
|
2963
|
-
terminalEventSeen: this.runtime.sawTerminalEvent,
|
|
2964
|
-
unexpectedStreamEnd: true,
|
|
2965
|
-
sentTurnStateHeader: Boolean(this.requestContext.turnState.value),
|
|
2966
|
-
sentModelsEtagHeader: Boolean(this.requestContext.websocketState?.modelsEtag),
|
|
2967
|
-
});
|
|
2968
|
-
throw new CodexProviderStreamError("Codex stream ended before terminal completion event", false);
|
|
2969
|
-
}
|
|
2970
2966
|
if (output.stopReason === "aborted" || output.stopReason === "error") {
|
|
2971
2967
|
throw new CodexProviderStreamError("Codex response failed", false);
|
|
2972
2968
|
}
|