@gajae-code/agent-core 0.10.1 → 0.10.2

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
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.10.2] - 2026-07-14
6
+
7
+ ### Fixed
8
+
9
+ - Extended the gpt-5.6 `Request blocked (code=invalid_prompt)` fix to the compaction paths that bypass the streaming transport. Remote OpenAI compaction (`/responses/compact`, `compaction.remoteEnabled` default on — the "remote compact task" in openai/codex#32028) built its native `input` from reasoning signatures, verbatim history items, and message/tool text without neutralizing leaked Harmony control-token markers (e.g. `<|channel|>analysis`), so gpt-5.6 rejected the compaction request and, on retry, could escalate to account-level blocking. `requestOpenAiRemoteCompaction` now neutralizes reserved control tokens across the whole outgoing `input`, and the generic `requestRemoteCompaction` prompt/systemPrompt are neutralized too. Local summarization was already covered by the streaming-transport request-boundary fix.
10
+
5
11
  ## [0.10.0] - 2026-07-12
6
12
 
7
13
  ### Fixed
@@ -310,7 +310,7 @@ export declare class Agent {
310
310
  emitExternalEvent(event: AgentEvent): void;
311
311
  createExternalEventEmitterForCurrentRun(): ((event: AgentEvent) => void) | undefined;
312
312
  setSystemPrompt(v: string[]): void;
313
- setModel(m: Model): void;
313
+ setModel(m: Model | undefined): void;
314
314
  setThinkingLevel(l: Effort | undefined): void;
315
315
  setSteeringMode(mode: "all" | "one-at-a-time"): void;
316
316
  getSteeringMode(): "all" | "one-at-a-time";
@@ -308,7 +308,7 @@ export type AgentMessage = Message | CustomAgentMessages[keyof CustomAgentMessag
308
308
  */
309
309
  export interface AgentState {
310
310
  systemPrompt: string[];
311
- model: Model;
311
+ model: Model | undefined;
312
312
  thinkingLevel?: Effort;
313
313
  tools: AgentTool<any>[];
314
314
  messages: AgentMessage[];
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@gajae-code/agent-core",
4
- "version": "0.10.1",
4
+ "version": "0.10.2",
5
5
  "description": "General-purpose agent with transport abstraction, state management, and attachment support",
6
6
  "homepage": "https://gajae-code.com",
7
7
  "author": "Yeachan-Heo and Gajae Code Contributors",
@@ -32,9 +32,9 @@
32
32
  "fmt": "biome format --write ."
33
33
  },
34
34
  "dependencies": {
35
- "@gajae-code/ai": "0.10.1",
36
- "@gajae-code/natives": "0.10.1",
37
- "@gajae-code/utils": "0.10.1",
35
+ "@gajae-code/ai": "0.10.2",
36
+ "@gajae-code/natives": "0.10.2",
37
+ "@gajae-code/utils": "0.10.2",
38
38
  "@opentelemetry/api": "^1.9.0"
39
39
  },
40
40
  "devDependencies": {
package/src/agent.ts CHANGED
@@ -830,7 +830,7 @@ export class Agent {
830
830
  this.#contextRevision++;
831
831
  }
832
832
 
833
- setModel(m: Model) {
833
+ setModel(m: Model | undefined) {
834
834
  this.#state.model = m;
835
835
  this.#contextRevision++;
836
836
  }
@@ -24,6 +24,8 @@ import type { AssistantMessage, Message, Model } from "@gajae-code/ai/types";
24
24
  import {
25
25
  getOpenAIResponsesHistoryItems,
26
26
  getOpenAIResponsesHistoryPayload,
27
+ neutralizeReservedControlTokens,
28
+ neutralizeResponsesInputControlTokens,
27
29
  normalizeResponsesToolCallId,
28
30
  } from "@gajae-code/ai/utils";
29
31
  import { $env, logger } from "@gajae-code/utils";
@@ -479,10 +481,12 @@ export async function requestOpenAiRemoteCompaction(
479
481
  const endpoint = resolveOpenAiCompactEndpoint(model, options?.authCredentialType);
480
482
  const request: OpenAiRemoteCompactionRequest = {
481
483
  model: model.id,
482
- input: trimOpenAiCompactInput(
483
- compactInput,
484
- resolveOpenAiCompactInputBudget(model.contextWindow, model.maxTokens),
485
- instructions,
484
+ input: neutralizeResponsesInputControlTokens(
485
+ trimOpenAiCompactInput(
486
+ compactInput,
487
+ resolveOpenAiCompactInputBudget(model.contextWindow, model.maxTokens),
488
+ instructions,
489
+ ),
486
490
  ),
487
491
  instructions,
488
492
  };
@@ -553,10 +557,17 @@ export async function requestRemoteCompaction(
553
557
  request: RemoteCompactionRequest,
554
558
  signal?: AbortSignal,
555
559
  ): Promise<RemoteCompactionResponse> {
560
+ // The prompt embeds the serialized transcript, which can carry leaked Harmony
561
+ // control-token markers (e.g. `<|channel|>analysis`) from model output; a
562
+ // gpt-5.6-backed summarization endpoint rejects those with `Request blocked`.
563
+ const sanitizedRequest: RemoteCompactionRequest = {
564
+ systemPrompt: neutralizeReservedControlTokens(request.systemPrompt),
565
+ prompt: neutralizeReservedControlTokens(request.prompt),
566
+ };
556
567
  const response = await fetch(endpoint, {
557
568
  method: "POST",
558
569
  headers: { "content-type": "application/json" },
559
- body: JSON.stringify(request),
570
+ body: JSON.stringify(sanitizedRequest),
560
571
  signal,
561
572
  });
562
573
 
package/src/types.ts CHANGED
@@ -357,7 +357,7 @@ export type AgentMessage = Message | CustomAgentMessages[keyof CustomAgentMessag
357
357
  */
358
358
  export interface AgentState {
359
359
  systemPrompt: string[];
360
- model: Model;
360
+ model: Model | undefined;
361
361
  thinkingLevel?: Effort;
362
362
  tools: AgentTool<any>[];
363
363
  messages: AgentMessage[]; // Can include attachments + custom message types