Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.

## [Unreleased]

### Features

- **Active-turn message queue** (#363, @srothgan): Upgrade to Agent SDK `0.3.258` and queue up to ten messages with correlated chat insertion.

### Fixes

- **Responsive startup and file indexing** (#352, @srothgan): Keep the composer editable while connecting, defer sends until the session is ready, and run one bounded post-connection file index.
Expand Down
72 changes: 36 additions & 36 deletions agent-sdk/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion agent-sdk/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"node": ">=24"
},
"dependencies": {
"@anthropic-ai/claude-agent-sdk": "0.3.239"
"@anthropic-ai/claude-agent-sdk": "0.3.258"
},
"devDependencies": {
"@biomejs/biome": "2.5.11",
Expand Down
27 changes: 26 additions & 1 deletion agent-sdk/src/bridge.contract.test.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,28 @@
import test from "node:test";
import assert from "node:assert/strict";
import { spawn, type ChildProcessWithoutNullStreams } from "node:child_process";
import { readdirSync, readFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { dirname, join } from "node:path";
import { dirname, join, resolve } from "node:path";
import readline from "node:readline";
import { fileURLToPath } from "node:url";

type BridgeEnvelope = Record<string, unknown>;

const bridgePath = join(dirname(fileURLToPath(import.meta.url)), "bridge.js");

function productionTypeScriptFiles(directory: string): string[] {
return readdirSync(directory, { withFileTypes: true }).flatMap((entry) => {
const path = join(directory, entry.name);
if (entry.isDirectory()) {
return productionTypeScriptFiles(path);
}
return entry.isFile() && entry.name.endsWith(".ts") && !entry.name.endsWith(".test.ts")
? [path]
: [];
});
}

class SpawnedBridge {
readonly child: ChildProcessWithoutNullStreams;
readonly stderrLines: string[] = [];
Expand Down Expand Up @@ -277,3 +290,15 @@ test("bridge process reports actionable session initialization failure", async (
await bridge.stop();
}
});

test("production bridge source stays on the public main SDK export", () => {
const sourceDirectory = resolve(dirname(fileURLToPath(import.meta.url)), "../src");
const forbiddenDeepImport = /@anthropic-ai\/claude-agent-sdk\/(?:browser|bridge)/;
const forbiddenFactory = /\bcreateSdkMcpServer\b/;

for (const path of productionTypeScriptFiles(sourceDirectory)) {
const source = readFileSync(path, "utf8");
assert.doesNotMatch(source, forbiddenDeepImport, path);
assert.doesNotMatch(source, forbiddenFactory, path);
}
});
Loading
Loading