@gajae-code/coding-agent 0.16.1 → 0.16.3

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,17 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.16.3] - 2026-09-04
6
+
7
+ ## [0.16.2] - 2026-09-04
8
+
9
+ - Primary model binding now rejects GPT-5.6 Sol when the selected openai-codex OAuth account is known to be below the Pro tier, preventing a raw entitlement failure on the first turn and preserving the prior model on a failed selection.
10
+
11
+ - Fixed the steer-triggered bash fold being skipped under `toolInterruptPolicy: finish_tools`: a composer steer over a long foreground `bash` was aborted instead of folded because the fold gate wrongly treated the policy as an exclusion. `finish_tools` governs sibling tools in the batch, not the fold; the fold kills nothing and now applies under both policies. A tmux dogfood driver (`scripts/dogfood/steer-fold-tmux.sh`) proves the real binary folds, answers the steer in the same turn, and wakes on completion.
12
+ - SDK session tails now preserve authoritative transcript revisions in item identity and lifecycle ordering, close the pre-checkpoint live/replay dedupe race, and recover held live frames across reconnect replay without losing ordered delivery.
13
+ - Native Windows external editors now reassert runtime raw input for ConPTY-backed terminals after returning from the editor, preventing cooked-mode handoff from swallowing the first keystroke.
14
+ - ACP reconnect cancellation now reports `cancelled` only after the SDK acknowledges the abort; pre-ack owner loss remains `connection_closed`, while failed aborts preserve non-cancelled prompt outcomes and leave the session reusable.
15
+
5
16
  ## [0.16.1] - 2026-09-03
6
17
 
7
18
  - Broker-launched SDK sessions now activate an already-cached default model profile before refreshing provider catalogs in the background, preventing redundant online discovery from consuming the fixed semantic-readiness window while preserving strict refresh fallback when cached profile resolution fails.
@@ -75,6 +75,13 @@ export interface SdkTailEnvelopeV1 {
75
75
  gap?: SdkRetentionGapV1;
76
76
  items: SdkTailItemV1[];
77
77
  }
78
+ export declare function tailItemKey(item: SdkTailItemV1): string;
79
+ /** Holds positioned live frames until the checkpoint can stamp their authoritative revision. */
80
+ export declare class TailRevisionBuffer {
81
+ #private;
82
+ push(item: SdkTailItemV1): SdkTailItemV1[];
83
+ resolve(revision: number): SdkTailItemV1[];
84
+ }
78
85
  /** Recursively removes secret-shaped fields (defense in depth for DTO output). */
79
86
  export declare function stripSecretFields(value: unknown): unknown;
80
87
  /**
@@ -26,6 +26,7 @@ export declare class SessionEventStream {
26
26
  generation?: number;
27
27
  ringSize?: number;
28
28
  resyncQueryIds?: string[];
29
+ revisionProvider?: () => number | undefined;
29
30
  });
30
31
  get generation(): number;
31
32
  get sequence(): number;
@@ -34,6 +34,8 @@ export type SessionActivationGate = (input: {
34
34
  export interface SessionSdkHostOptions extends HostEndpointAdapters {
35
35
  control?: (connectionId: string, frame: SdkFrame) => unknown | Promise<unknown>;
36
36
  query?: (connectionId: string, frame: SdkFrame) => unknown | Promise<unknown>;
37
+ /** Supplies the durable transcript revision stamped on ordinary emitted events. */
38
+ eventRevision?: () => number | undefined;
37
39
  /** Test/lifecycle seam invoked synchronously before fire-and-forget dispatch. */
38
40
  onFrameAdmitted?: (connectionId: string, frame: SdkFrame) => void;
39
41
  /** Synchronously rejects external input while a runtime is being replaced. */
@@ -191,8 +191,6 @@ export interface ToolSession {
191
191
  hasForegroundBashBackgroundRequestHandler?: () => boolean;
192
192
  /** Request that a foreground wait fold into a background job, if supported. `reason` names the trigger; `adapter` targets a specific wait instead of the newest registration. */
193
193
  requestForegroundBashBackground?: (reason?: FoldReason, adapter?: FoldAdapter) => Promise<boolean>;
194
- /** Current tool interrupt policy; `finish_tools` lets the running tool finish, so a steer must not fold it. */
195
- getToolInterruptPolicy?: () => "abort_tools" | "finish_tools";
196
194
  /** Get the session-owned or inherited async job manager. */
197
195
  getAsyncJobManager?: () => AsyncJobManager | undefined;
198
196
  /** Resolves on a steer admitted after the wait starts, or when `signal` aborts, without consuming the steer. */
@@ -17,6 +17,10 @@ export declare function trimEditorTrailingNewline(text: string): string;
17
17
  * files still require a shell on Windows; ordinary executables do not.
18
18
  */
19
19
  export declare function shouldUseExternalEditorShell(editor: string, platform?: NodeJS.Platform): boolean;
20
+ interface RawModeInput {
21
+ setRawMode?: (mode: boolean) => unknown;
22
+ }
23
+ export declare function prepareWindowsConsoleForExternalEditor(platform?: NodeJS.Platform, input?: RawModeInput): void;
20
24
  /**
21
25
  * Opens `content` in the user's external editor and returns the edited text.
22
26
  * Returns `null` if the editor exits with a non-zero code.
@@ -24,3 +28,4 @@ export declare function shouldUseExternalEditorShell(editor: string, platform?:
24
28
  * The caller is responsible for stopping/starting the TUI around this call.
25
29
  */
26
30
  export declare function openInEditor(editorCmd: string, content: string, options?: OpenInEditorOptions): Promise<string | null>;
31
+ export {};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@gajae-code/coding-agent",
4
- "version": "0.16.1",
4
+ "version": "0.16.3",
5
5
  "description": "Gajae Code CLI with read, bash, edit, write tools and session management",
6
6
  "homepage": "https://gajae-code.com",
7
7
  "author": "Yeachan-Heo and Gajae Code Contributors",
@@ -56,12 +56,12 @@
56
56
  "@agentclientprotocol/sdk": "1.3.0",
57
57
  "@babel/parser": "^7.29.3",
58
58
  "@mozilla/readability": "^0.6.0",
59
- "@gajae-code/stats": "0.16.1",
60
- "@gajae-code/agent-core": "0.16.1",
61
- "@gajae-code/ai": "0.16.1",
62
- "@gajae-code/natives": "0.16.1",
63
- "@gajae-code/tui": "0.16.1",
64
- "@gajae-code/utils": "0.16.1",
59
+ "@gajae-code/stats": "0.16.3",
60
+ "@gajae-code/agent-core": "0.16.3",
61
+ "@gajae-code/ai": "0.16.3",
62
+ "@gajae-code/natives": "0.16.3",
63
+ "@gajae-code/tui": "0.16.3",
64
+ "@gajae-code/utils": "0.16.3",
65
65
  "@puppeteer/browsers": "^2.13.0",
66
66
  "@types/turndown": "5.0.6",
67
67
  "@xterm/headless": "^6.0.0",
@@ -241,8 +241,7 @@ function removeOwnedTransitionClaim(nativePath: string, generation: TransitionDi
241
241
  if (!captured.ok || !captured.snapshot) return captured.code === "not_found";
242
242
  const root = captured.snapshot.entries.find(entry => entry.relativePath === "");
243
243
  if (
244
- !root ||
245
- root.kind !== "directory" ||
244
+ root?.kind !== "directory" ||
246
245
  root.dev !== String(generation.dev) ||
247
246
  root.ino !== String(generation.ino) ||
248
247
  root.nlink !== String(generation.nlink) ||
@@ -1728,8 +1727,7 @@ async function reclaimStaleTransitionClaim(transitionDir: string, quarantineName
1728
1727
  if (!captured.ok || !captured.snapshot) return false;
1729
1728
  const root = captured.snapshot.entries.find(entry => entry.relativePath === "");
1730
1729
  if (
1731
- !root ||
1732
- root.kind !== "directory" ||
1730
+ root?.kind !== "directory" ||
1733
1731
  root.dev !== String(generation.dev) ||
1734
1732
  root.ino !== String(generation.ino) ||
1735
1733
  root.nlink !== String(generation.nlink) ||