jeo-code 0.6.20 → 0.6.22

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 CHANGED
@@ -6,6 +6,24 @@ 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.22] - 2026-06-18
10
+ _Extended-thinking activation is now consistent across providers: a `low` session thinking level enables reasoning everywhere._
11
+
12
+ ### Changed
13
+ - **Anthropic now enables extended thinking at `low` effort, matching Gemini and OpenAI.** Previously Anthropic disabled extended thinking for `low`/`minimal`/unset effort while Gemini (`thinkingConfig.thinkingBudget`) and OpenAI (`reasoning_effort`) kept reasoning on at `low`, so the same session thinking level produced thinking on some providers but not Anthropic. `anthropicThinkingBudget` now maps `low → 4000` budget_tokens (same tier as Gemini), with `medium → 10000` and `high → 24000` unchanged; only `minimal`/unset stay non-thinking so `/fast` and minimal thinking remain cheaper/faster across all providers.
14
+
15
+ ### Added
16
+ - **Anthropic `low`-effort thinking-parity test** (`test/anthropic-stream.test.ts`) asserting `anthropicPayload` emits `thinking.budget_tokens` for low/medium/high and omits it for minimal/unset.
17
+
18
+ ## [0.6.21] - 2026-06-18
19
+ _Session thinking level now reaches the provider's actual reasoning depth, not just the token ceiling._
20
+
21
+ ### Fixed
22
+ - **`/thinking`, `--thinking`, and `/fast` now change real provider reasoning depth.** Previously a live session thinking change only adjusted the per-step `maxTokens` budget; the provider's reasoning effort (Anthropic `thinking.budget_tokens`, OpenAI `reasoning_effort`, Gemini `thinkingConfig.thinkingBudget`) still came from the global `~/.jeo/config.json` `thinkingLevel`. `reasoningEffort` is now threaded from the session level through `AgentLoopOptions` → `ChatOptions` → the model manager, so the session setting actually controls how deeply the model reasons. When unset it still falls back to the global config.
23
+
24
+ ### Added
25
+ - **`thinkingToReasoningEffort` mapping test** locking the session-level → provider-tier contract (minimal/low → low, medium → medium, high/xhigh → high, unset → undefined).
26
+
9
27
  ## [0.6.20] - 2026-06-18
10
28
  _Launch REPL internals decomposed into testable modules: `@mention` path completion, slash-command view renderers, and slash-command handlers extracted from the monolithic `launch.ts` into dedicated files with full unit-test coverage._
11
29
 
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.22]** (2026-06-18) — Extended-thinking activation is now consistent across providers: a `low` session thinking level enables reasoning everywhere.
204
+ - **[0.6.21]** (2026-06-18) — Session thinking level now reaches the provider's actual reasoning depth, not just the token ceiling.
203
205
  - **[0.6.20]** (2026-06-18) — Launch REPL internals decomposed into testable modules: `@mention` path completion, slash-command view renderers, and slash-command handlers extracted from the monolithic `launch.ts` into dedicated files with full unit-test coverage.
204
206
  - **[0.6.19]** (2026-06-18) — Post-turn hooks run once per batch (not per edit), local hook reads are mtime-cached, tool-result formatting is parallelized, and wrapped colored text keeps its tint.
205
207
  - **[0.6.18]** (2026-06-17) — Memory data-flow diagram and a README "Memory flow" section documenting the actual runtime behavior.
206
- - **[0.6.17]** (2026-06-17) — Legacy MEMORY.md migrates losslessly into the OKF concept bundle, with a one-shot command and a rollback toggle.
207
- - **[0.6.16]** (2026-06-17) — OKF memory grows a concept cross-link graph: 1-hop search expansion, bundle lint, graphify-optional.
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.22]** (2026-06-18) — Extended-thinking activation is now consistent across providers: a `low` session thinking level enables reasoning everywhere.
204
+ - **[0.6.21]** (2026-06-18) — Session thinking level now reaches the provider's actual reasoning depth, not just the token ceiling.
203
205
  - **[0.6.20]** (2026-06-18) — Launch REPL internals decomposed into testable modules: `@mention` path completion, slash-command view renderers, and slash-command handlers extracted from the monolithic `launch.ts` into dedicated files with full unit-test coverage.
204
206
  - **[0.6.19]** (2026-06-18) — Post-turn hooks run once per batch (not per edit), local hook reads are mtime-cached, tool-result formatting is parallelized, and wrapped colored text keeps its tint.
205
207
  - **[0.6.18]** (2026-06-17) — Memory data-flow diagram and a README "Memory flow" section documenting the actual runtime behavior.
206
- - **[0.6.17]** (2026-06-17) — Legacy MEMORY.md migrates losslessly into the OKF concept bundle, with a one-shot command and a rollback toggle.
207
- - **[0.6.16]** (2026-06-17) — OKF memory grows a concept cross-link graph: 1-hop search expansion, bundle lint, graphify-optional.
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.22]** (2026-06-18) — Extended-thinking activation is now consistent across providers: a `low` session thinking level enables reasoning everywhere.
204
+ - **[0.6.21]** (2026-06-18) — Session thinking level now reaches the provider's actual reasoning depth, not just the token ceiling.
203
205
  - **[0.6.20]** (2026-06-18) — Launch REPL internals decomposed into testable modules: `@mention` path completion, slash-command view renderers, and slash-command handlers extracted from the monolithic `launch.ts` into dedicated files with full unit-test coverage.
204
206
  - **[0.6.19]** (2026-06-18) — Post-turn hooks run once per batch (not per edit), local hook reads are mtime-cached, tool-result formatting is parallelized, and wrapped colored text keeps its tint.
205
207
  - **[0.6.18]** (2026-06-17) — Memory data-flow diagram and a README "Memory flow" section documenting the actual runtime behavior.
206
- - **[0.6.17]** (2026-06-17) — Legacy MEMORY.md migrates losslessly into the OKF concept bundle, with a one-shot command and a rollback toggle.
207
- - **[0.6.16]** (2026-06-17) — OKF memory grows a concept cross-link graph: 1-hop search expansion, bundle lint, graphify-optional.
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.22]** (2026-06-18) — Extended-thinking activation is now consistent across providers: a `low` session thinking level enables reasoning everywhere.
204
+ - **[0.6.21]** (2026-06-18) — Session thinking level now reaches the provider's actual reasoning depth, not just the token ceiling.
203
205
  - **[0.6.20]** (2026-06-18) — Launch REPL internals decomposed into testable modules: `@mention` path completion, slash-command view renderers, and slash-command handlers extracted from the monolithic `launch.ts` into dedicated files with full unit-test coverage.
204
206
  - **[0.6.19]** (2026-06-18) — Post-turn hooks run once per batch (not per edit), local hook reads are mtime-cached, tool-result formatting is parallelized, and wrapped colored text keeps its tint.
205
207
  - **[0.6.18]** (2026-06-17) — Memory data-flow diagram and a README "Memory flow" section documenting the actual runtime behavior.
206
- - **[0.6.17]** (2026-06-17) — Legacy MEMORY.md migrates losslessly into the OKF concept bundle, with a one-shot command and a rollback toggle.
207
- - **[0.6.16]** (2026-06-17) — OKF memory grows a concept cross-link graph: 1-hop search expansion, bundle lint, graphify-optional.
208
208
 
209
209
  See [CHANGELOG.md](CHANGELOG.md) for the full history.
210
210
  <!-- CHANGELOG:END -->
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jeo-code",
3
- "version": "0.6.20",
3
+ "version": "0.6.22",
4
4
  "description": "Clean, highly optimized AI coding agent using spec-first loop",
5
5
  "type": "module",
6
6
  "main": "src/cli.ts",
@@ -28,6 +28,7 @@ async function invokeCallLlm(history: Message[], options: {
28
28
  jsonMode: boolean;
29
29
  model?: string;
30
30
  maxTokens?: number;
31
+ reasoningEffort?: import("../ai/types").CallOptions["reasoningEffort"];
31
32
  signal?: AbortSignal;
32
33
  onUsage?: (u: { inputTokens?: number; outputTokens?: number }) => void;
33
34
  onRetry?: (attempt: number, err: unknown, delayMs: number) => void;
@@ -205,6 +206,11 @@ export interface AgentLoopOptions {
205
206
  model?: string;
206
207
  /** Max generation tokens per step (drives the thinking budget). */
207
208
  maxTokens?: number;
209
+ /** Provider reasoning depth (mapped from the live session thinking level). Threaded to
210
+ * callLlm so `/thinking`, `--thinking`, and `/fast` reach the provider's actual reasoning
211
+ * budget (Anthropic budget_tokens / OpenAI reasoning_effort / Gemini thinkingBudget), not
212
+ * just the max-token ceiling. When unset the model-manager falls back to the global config. */
213
+ reasoningEffort?: import("../ai/types").CallOptions["reasoningEffort"];
208
214
  tools?: Record<string, ToolHandler>;
209
215
  signal?: AbortSignal;
210
216
  events?: AgentLoopEvents;
@@ -499,6 +505,7 @@ export async function runAgentLoop(history: Message[], opts: AgentLoopOptions):
499
505
  tools: nativeToolSchemasFor(Object.keys(tools)),
500
506
  model: opts.model,
501
507
  maxTokens: opts.maxTokens,
508
+ reasoningEffort: opts.reasoningEffort,
502
509
  signal: opts.signal,
503
510
  onUsage: u => { acc.inputTokens += u.inputTokens ?? 0; acc.outputTokens += u.outputTokens ?? 0; sawUsage = true; },
504
511
  onToken,
package/src/agent/loop.ts CHANGED
@@ -10,6 +10,11 @@ export interface ChatOptions {
10
10
  systemPrompt?: string;
11
11
  temperature?: number;
12
12
  maxTokens?: number;
13
+ /** Provider reasoning depth (mapped from the live session thinking level). When set it
14
+ * overrides the global config-derived effort, so `/thinking` and `--thinking` reach the
15
+ * provider's actual reasoning budget (Anthropic budget_tokens / OpenAI reasoning_effort /
16
+ * Gemini thinkingBudget), not just the max-token ceiling. */
17
+ reasoningEffort?: import("../ai/types").CallOptions["reasoningEffort"];
13
18
  jsonMode?: boolean;
14
19
  signal?: AbortSignal;
15
20
  onUsage?: (usage: import("../ai/types").Usage) => void;
@@ -72,11 +72,13 @@ function anthropicSystemBlocks(
72
72
  return blocks;
73
73
  }
74
74
 
75
- /** Anthropic extended-thinking budget by reasoning effort (kept under max_tokens). Off for
76
- * low/minimal/unset effort so /fast and minimal thinking stay non-thinking (cheaper/faster). */
75
+ /** Anthropic extended-thinking budget by reasoning effort (kept under max_tokens). Cross-provider
76
+ * parity (matches Gemini's tiers): low/medium/high all enable thinking with scaling depth; only
77
+ * minimal/unset stay non-thinking so /fast and minimal thinking remain cheaper/faster. */
77
78
  function anthropicThinkingBudget(effort: CallOptions["reasoningEffort"], maxTokens: number): number | undefined {
78
79
  let budget: number;
79
80
  switch (effort) {
81
+ case "low": budget = 4000; break;
80
82
  case "medium": budget = 10000; break;
81
83
  case "high": budget = 24000; break;
82
84
  default: return undefined;
@@ -36,7 +36,7 @@ import { callLlm, type Message } from "../agent/loop";
36
36
  import { friendlyProviderError } from "../util/provider-error";
37
37
  import { readGlobalConfig, saveConfigPatch } from "../agent/state";
38
38
  import { rememberModelPatch, recentModelsForDisplay } from "../agent/model-recency";
39
- import { describeModel, describeAllProviders, thinkingMaxTokens, discoverModels, flattenModels, resolveSelection, catalogMetadata, resolveRoleModel, CODEX_MODELS, qualifyModelId } from "../ai";
39
+ import { describeModel, describeAllProviders, thinkingMaxTokens, thinkingToReasoningEffort, discoverModels, flattenModels, resolveSelection, catalogMetadata, resolveRoleModel, CODEX_MODELS, qualifyModelId } from "../ai";
40
40
  import type { ProviderModelsResult, PickEntry, ProviderName, ModelRole, ThinkLevel } from "../ai";
41
41
  import { readGoalState, writeGoalState, clearGoalState, verifyGoal } from "../agent/goal-verifier";
42
42
 
@@ -786,6 +786,7 @@ export async function runLaunchCommand(args: string[]): Promise<void> {
786
786
  maxSteps: flags.maxSteps,
787
787
  model: sessionModel,
788
788
  maxTokens: sessionThinking ? thinkingMaxTokens(sessionThinking) : undefined,
789
+ reasoningEffort: sessionThinking ? thinkingToReasoningEffort(sessionThinking) : undefined,
789
790
  signal: ac.signal,
790
791
  steer: drainSteer,
791
792
  events: wrapEvents(withStepPersistence({ ...withToolDetailCapture(tui ? tui.events() : streamEvents), onBeforeDone }, persistTurnTail), opik),
@@ -804,6 +805,7 @@ export async function runLaunchCommand(args: string[]): Promise<void> {
804
805
  budget: { maxExtensions: 0 },
805
806
  model: sessionModel,
806
807
  maxTokens: sessionThinking ? thinkingMaxTokens(sessionThinking) : undefined,
808
+ reasoningEffort: sessionThinking ? thinkingToReasoningEffort(sessionThinking) : undefined,
807
809
  signal: ac.signal,
808
810
  steer: drainSteer,
809
811
  events: wrapEvents(withToolDetailCapture(tui ? tui.events() : streamEvents), opik),