jeo-code 0.6.28 → 0.6.29
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 +13 -0
- package/README.ja.md +1 -1
- package/README.ko.md +1 -1
- package/README.md +1 -1
- package/README.zh.md +1 -1
- package/package.json +1 -1
- package/src/ai/model-catalog.ts +12 -5
- package/src/ai/providers/anthropic.ts +9 -2
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
6
6
|
|
|
7
7
|
The README mirrors the latest 5 entries — regenerate with `bun run changelog:sync`.
|
|
8
8
|
|
|
9
|
+
## [0.6.29] - 2026-06-19
|
|
10
|
+
_Signature-only thinking-block replay (Anthropic opus-4-7/4-8), plus a tmux mouse-flood memory guard confirming `jeo --tmux` does not leak._
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- **Anthropic thinking-block replay now covers signature-only artifacts.** Newer Opus models (opus-4-7/opus-4-8) think internally — tokens billed, a valid `signature` present — but return empty thinking text. The cross-turn replay required both `signature` AND `text`, so those models' reasoning was dropped between steps. Replay now sends a signed `thinking` block whenever a `signature` (or `redacted`) is present (text defaults to `""`), restoring multi-step reasoning continuity for signature-only models. API-key requests also send the `interleaved-thinking` + `prompt-caching-scope` betas so thinking+tools and scoped caching work outside OAuth.
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
- **`claude-opus-4-7` catalogued** (FULL thinking, 200k ctx) and a dynamic context-window fallback for uncatalogued ids (claude 200k / gpt-5 400k / gemini-3 1M).
|
|
17
|
+
- **tmux mouse-report-flood memory guard** (`test/mouse-report-filter.test.ts`): 100k SGR mouse-move reports through `queuePromptInputChunk` leave the prompt queue at zero accumulation — the regression guard for the "`jeo --tmux` slows down over time" concern.
|
|
18
|
+
|
|
19
|
+
### Verified
|
|
20
|
+
- **`jeo --tmux` has no bun memory leak.** The in-process lifecycle probe (`scripts/mem-probe.ts`, 3000 turns) reports a per-turn heap slope of ≈0 (returns to baseline, exit-listeners flat); a real `jeo --tmux` process plateaus in RSS under sustained mouse/resize/keystroke churn instead of climbing; and mouse reports are filtered (not buffered) with `activityLog` bounded to a 200-entry per-turn ring.
|
|
21
|
+
|
|
9
22
|
## [0.6.28] - 2026-06-19
|
|
10
23
|
_Signed thinking-block replay: native reasoning is now sent BACK to providers across steps/turns, restoring multi-step reasoning continuity (gajae parity)._
|
|
11
24
|
|
package/README.ja.md
CHANGED
|
@@ -200,11 +200,11 @@ CI は `.github/workflows/npm-publish.yml` で公開します — GitHub リリ
|
|
|
200
200
|
## 変更履歴 (Changelog)
|
|
201
201
|
|
|
202
202
|
<!-- CHANGELOG:START (auto-generated from CHANGELOG.md — run `bun run changelog:sync`) -->
|
|
203
|
+
- **[0.6.29]** (2026-06-19) — Signature-only thinking-block replay (Anthropic opus-4-7/4-8), plus a tmux mouse-flood memory guard confirming `jeo --tmux` does not leak.
|
|
203
204
|
- **[0.6.28]** (2026-06-19) — Signed thinking-block replay: native reasoning is now sent BACK to providers across steps/turns, restoring multi-step reasoning continuity (gajae parity).
|
|
204
205
|
- **[0.6.27]** (2026-06-19) — Ponytail pass on the reasoning-tier mapper, plus a real-tmux verification of `jeo --tmux`.
|
|
205
206
|
- **[0.6.26]** (2026-06-19) — The forge emblem is redrawn again as the mascot crayfish, foregrounding its signature pincer claws (집게).
|
|
206
207
|
- **[0.6.25]** (2026-06-19) — Reasoning works at every thinking level (gajae parity), and the forge emblem is redrawn as the neon-lens coding wizard.
|
|
207
|
-
- **[0.6.24]** (2026-06-19) — `/provider` opens an interactive onboarding selector (OAuth vs API-compatible), and OpenAI-compatible backends gain per-vendor native-reasoning formats.
|
|
208
208
|
|
|
209
209
|
See [CHANGELOG.md](CHANGELOG.md) for the full history.
|
|
210
210
|
<!-- CHANGELOG:END -->
|
package/README.ko.md
CHANGED
|
@@ -200,11 +200,11 @@ CI는 `.github/workflows/npm-publish.yml`로 배포합니다 — GitHub 릴리
|
|
|
200
200
|
## 변경 이력 (Changelog)
|
|
201
201
|
|
|
202
202
|
<!-- CHANGELOG:START (auto-generated from CHANGELOG.md — run `bun run changelog:sync`) -->
|
|
203
|
+
- **[0.6.29]** (2026-06-19) — Signature-only thinking-block replay (Anthropic opus-4-7/4-8), plus a tmux mouse-flood memory guard confirming `jeo --tmux` does not leak.
|
|
203
204
|
- **[0.6.28]** (2026-06-19) — Signed thinking-block replay: native reasoning is now sent BACK to providers across steps/turns, restoring multi-step reasoning continuity (gajae parity).
|
|
204
205
|
- **[0.6.27]** (2026-06-19) — Ponytail pass on the reasoning-tier mapper, plus a real-tmux verification of `jeo --tmux`.
|
|
205
206
|
- **[0.6.26]** (2026-06-19) — The forge emblem is redrawn again as the mascot crayfish, foregrounding its signature pincer claws (집게).
|
|
206
207
|
- **[0.6.25]** (2026-06-19) — Reasoning works at every thinking level (gajae parity), and the forge emblem is redrawn as the neon-lens coding wizard.
|
|
207
|
-
- **[0.6.24]** (2026-06-19) — `/provider` opens an interactive onboarding selector (OAuth vs API-compatible), and OpenAI-compatible backends gain per-vendor native-reasoning formats.
|
|
208
208
|
|
|
209
209
|
See [CHANGELOG.md](CHANGELOG.md) for the full history.
|
|
210
210
|
<!-- CHANGELOG:END -->
|
package/README.md
CHANGED
|
@@ -200,11 +200,11 @@ Required npm token permissions (repository secret `NPM_TOKEN`):
|
|
|
200
200
|
## Changelog
|
|
201
201
|
|
|
202
202
|
<!-- CHANGELOG:START (auto-generated from CHANGELOG.md — run `bun run changelog:sync`) -->
|
|
203
|
+
- **[0.6.29]** (2026-06-19) — Signature-only thinking-block replay (Anthropic opus-4-7/4-8), plus a tmux mouse-flood memory guard confirming `jeo --tmux` does not leak.
|
|
203
204
|
- **[0.6.28]** (2026-06-19) — Signed thinking-block replay: native reasoning is now sent BACK to providers across steps/turns, restoring multi-step reasoning continuity (gajae parity).
|
|
204
205
|
- **[0.6.27]** (2026-06-19) — Ponytail pass on the reasoning-tier mapper, plus a real-tmux verification of `jeo --tmux`.
|
|
205
206
|
- **[0.6.26]** (2026-06-19) — The forge emblem is redrawn again as the mascot crayfish, foregrounding its signature pincer claws (집게).
|
|
206
207
|
- **[0.6.25]** (2026-06-19) — Reasoning works at every thinking level (gajae parity), and the forge emblem is redrawn as the neon-lens coding wizard.
|
|
207
|
-
- **[0.6.24]** (2026-06-19) — `/provider` opens an interactive onboarding selector (OAuth vs API-compatible), and OpenAI-compatible backends gain per-vendor native-reasoning formats.
|
|
208
208
|
|
|
209
209
|
See [CHANGELOG.md](CHANGELOG.md) for the full history.
|
|
210
210
|
<!-- CHANGELOG:END -->
|
package/README.zh.md
CHANGED
|
@@ -200,11 +200,11 @@ CI 通过 `.github/workflows/npm-publish.yml` 发布 — GitHub 发布 release
|
|
|
200
200
|
## 更新日志 (Changelog)
|
|
201
201
|
|
|
202
202
|
<!-- CHANGELOG:START (auto-generated from CHANGELOG.md — run `bun run changelog:sync`) -->
|
|
203
|
+
- **[0.6.29]** (2026-06-19) — Signature-only thinking-block replay (Anthropic opus-4-7/4-8), plus a tmux mouse-flood memory guard confirming `jeo --tmux` does not leak.
|
|
203
204
|
- **[0.6.28]** (2026-06-19) — Signed thinking-block replay: native reasoning is now sent BACK to providers across steps/turns, restoring multi-step reasoning continuity (gajae parity).
|
|
204
205
|
- **[0.6.27]** (2026-06-19) — Ponytail pass on the reasoning-tier mapper, plus a real-tmux verification of `jeo --tmux`.
|
|
205
206
|
- **[0.6.26]** (2026-06-19) — The forge emblem is redrawn again as the mascot crayfish, foregrounding its signature pincer claws (집게).
|
|
206
207
|
- **[0.6.25]** (2026-06-19) — Reasoning works at every thinking level (gajae parity), and the forge emblem is redrawn as the neon-lens coding wizard.
|
|
207
|
-
- **[0.6.24]** (2026-06-19) — `/provider` opens an interactive onboarding selector (OAuth vs API-compatible), and OpenAI-compatible backends gain per-vendor native-reasoning formats.
|
|
208
208
|
|
|
209
209
|
See [CHANGELOG.md](CHANGELOG.md) for the full history.
|
|
210
210
|
<!-- CHANGELOG:END -->
|
package/package.json
CHANGED
package/src/ai/model-catalog.ts
CHANGED
|
@@ -37,6 +37,8 @@ const STD: ThinkLevel[] = ["minimal", "low", "medium", "high"];
|
|
|
37
37
|
export const ANTIGRAVITY_MODELS = [
|
|
38
38
|
"claude-opus-4-5-thinking",
|
|
39
39
|
"claude-opus-4-6-thinking",
|
|
40
|
+
"claude-opus-4-7",
|
|
41
|
+
"claude-opus-4-7-thinking",
|
|
40
42
|
"claude-opus-4-8",
|
|
41
43
|
"claude-opus-4-8-thinking",
|
|
42
44
|
"claude-sonnet-4-5",
|
|
@@ -52,6 +54,7 @@ export const ANTIGRAVITY_MODELS = [
|
|
|
52
54
|
"gemini-3.1-pro-high",
|
|
53
55
|
"gemini-3.1-pro-low",
|
|
54
56
|
"gpt-oss-120b-medium",
|
|
57
|
+
"gpt-5.5",
|
|
55
58
|
] as const;
|
|
56
59
|
|
|
57
60
|
/** A curated set of common public models with their documented capabilities. */
|
|
@@ -62,9 +65,13 @@ export const MODEL_CATALOG: readonly CatalogModel[] = [
|
|
|
62
65
|
{ canonical: "claude-sonnet-4-5", provider: "anthropic", providerModel: "claude-sonnet-4-5-20250929", contextTokens: 200_000, maxOutputTokens: 64_000, thinking: FULL, images: true },
|
|
63
66
|
{ canonical: "claude-opus-4-1", provider: "anthropic", providerModel: "claude-opus-4-1-20250805", contextTokens: 200_000, maxOutputTokens: 32_000, thinking: FULL, images: true },
|
|
64
67
|
{ canonical: "claude-opus-4-5", provider: "anthropic", providerModel: "claude-opus-4-5-20251101", contextTokens: 200_000, maxOutputTokens: 64_000, thinking: FULL, images: true },
|
|
65
|
-
// NOTE:
|
|
66
|
-
//
|
|
68
|
+
// NOTE: opus-4-7 accepts extended thinking but currently returns 0 thinking tokens
|
|
69
|
+
// (model-internal, no visible thought). opus-4-8 thinks internally (tokens billed,
|
|
70
|
+
// signature present) but returns empty thinking text. Both are FULL-capable in the
|
|
71
|
+
// catalog so the budget is always sent — the nativizable path handles signature-only
|
|
72
|
+
// artifacts for cross-turn continuity.
|
|
67
73
|
{ canonical: "claude-opus-4-6", provider: "anthropic", providerModel: "claude-opus-4-6", contextTokens: 200_000, maxOutputTokens: 64_000, thinking: FULL, images: true },
|
|
74
|
+
{ canonical: "claude-opus-4-7", provider: "anthropic", providerModel: "claude-opus-4-7", contextTokens: 200_000, maxOutputTokens: 64_000, thinking: FULL, images: true },
|
|
68
75
|
{ canonical: "claude-opus-4-8", provider: "anthropic", providerModel: "claude-opus-4-8", contextTokens: 200_000, maxOutputTokens: 64_000, thinking: FULL, images: true },
|
|
69
76
|
// OpenAI
|
|
70
77
|
{ canonical: "gpt-4o", provider: "openai", providerModel: "gpt-4o", contextTokens: 128_000, maxOutputTokens: 16_384, thinking: [], images: true },
|
|
@@ -96,9 +103,9 @@ export const MODEL_CATALOG: readonly CatalogModel[] = [
|
|
|
96
103
|
canonical: `antigravity/${id}`,
|
|
97
104
|
provider: "antigravity",
|
|
98
105
|
providerModel: id,
|
|
99
|
-
contextTokens: id.includes("claude") ? 200_000 : id.includes("gemini-3") ? 1_000_000 : 1_000_000,
|
|
100
|
-
maxOutputTokens: id.includes("claude") ? 64_000 : 65_536,
|
|
101
|
-
thinking: id.includes("thinking") || id.includes("-high") || id.includes("-low") || id.includes("gemini-3") ? FULL : STD,
|
|
106
|
+
contextTokens: id.includes("claude") ? 200_000 : id.startsWith("gpt-5") ? 400_000 : id.includes("gemini-3") ? 1_000_000 : 1_000_000,
|
|
107
|
+
maxOutputTokens: id.includes("claude") ? 64_000 : id.startsWith("gpt-5") ? 128_000 : 65_536,
|
|
108
|
+
thinking: id.includes("thinking") || id.includes("-high") || id.includes("-low") || id.includes("gemini-3") || id.startsWith("gpt-5") ? FULL : STD,
|
|
102
109
|
images: !id.includes("gpt-oss"),
|
|
103
110
|
company: id.includes("claude") ? "Anthropic via Antigravity" : id.includes("gpt") ? "OpenAI via Antigravity" : "Google Antigravity",
|
|
104
111
|
})),
|
|
@@ -11,6 +11,12 @@ const DEPRECATED_TEMPERATURE = "`temperature` is deprecated for this model.";
|
|
|
11
11
|
const CLAUDE_CODE_VERSION = "2.1.63";
|
|
12
12
|
const CLAUDE_CODE_SYSTEM_INSTRUCTION = "You are a Claude agent, built on Anthropic's Claude Agent SDK.";
|
|
13
13
|
const CLAUDE_BILLING_HEADER_PREFIX = "x-anthropic-billing-header:";
|
|
14
|
+
/** Betas needed for API-key requests: interleaved-thinking enables thinking+tools,
|
|
15
|
+
* prompt-caching-scope gives scoped cache breakpoints. */
|
|
16
|
+
const ANTHROPIC_API_KEY_BETA = [
|
|
17
|
+
"interleaved-thinking-2025-05-14",
|
|
18
|
+
"prompt-caching-scope-2026-01-05",
|
|
19
|
+
].join(",");
|
|
14
20
|
const ANTHROPIC_OAUTH_BETA = [
|
|
15
21
|
"claude-code-20250219",
|
|
16
22
|
"oauth-2025-04-20",
|
|
@@ -99,7 +105,7 @@ type AnthropicMessage = { role: string; content: string | AnthropicContentBlock[
|
|
|
99
105
|
export function anthropicNativizable(m: Message, model: string, thinkingEnabled: boolean): boolean {
|
|
100
106
|
return thinkingEnabled
|
|
101
107
|
&& !!m.toolUse?.length
|
|
102
|
-
&& !!m.reasoningArtifacts?.some(a => a.provider === "anthropic" && a.model === model && (
|
|
108
|
+
&& !!m.reasoningArtifacts?.some(a => a.provider === "anthropic" && a.model === model && (!!a.signature || !!a.redacted));
|
|
103
109
|
}
|
|
104
110
|
|
|
105
111
|
/** Build Anthropic wire messages, reconstructing native tool_use / tool_result / thinking
|
|
@@ -121,7 +127,7 @@ export function buildAnthropicMessages(messages: Message[], model: string, think
|
|
|
121
127
|
const blocks: AnthropicContentBlock[] = [];
|
|
122
128
|
for (const a of m.reasoningArtifacts!) {
|
|
123
129
|
if (a.provider !== "anthropic" || a.model !== model) continue;
|
|
124
|
-
if (a.signature
|
|
130
|
+
if (a.signature) blocks.push({ type: "thinking", thinking: a.text ?? "", signature: a.signature });
|
|
125
131
|
else if (a.redacted) blocks.push({ type: "redacted_thinking", data: a.redacted });
|
|
126
132
|
}
|
|
127
133
|
for (const tu of m.toolUse!) blocks.push({ type: "tool_use", id: tu.id, name: tu.tool, input: tu.arguments });
|
|
@@ -454,6 +460,7 @@ function headersFor(credential: Credential, stream: boolean): Record<string, str
|
|
|
454
460
|
"content-type": "application/json",
|
|
455
461
|
"x-api-key": credential.token,
|
|
456
462
|
"anthropic-version": "2023-06-01",
|
|
463
|
+
"anthropic-beta": ANTHROPIC_API_KEY_BETA,
|
|
457
464
|
};
|
|
458
465
|
}
|
|
459
466
|
throw new Error("anthropic adapter requires a credential");
|