Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
5347a33
Added ACP support...
prem315 Sep 24, 2026
cf39091
fix(acp): replay conversation history on session/load
prem315 Sep 25, 2026
7c5aec1
chore: merge dev into feature/acp-support
claude Sep 26, 2026
9e6fc40
docs: add ACP integration review report
claude Sep 26, 2026
6972716
refactor: map Effect errors to ACP request errors and clean up module…
prem315 Sep 26, 2026
fce0eb8
Merge branch 'dev' into feature/acp-support
sanchitrk Sep 29, 2026
1988fe7
feat(harness): expose tool call input and plugin load failures as events
sanchitrk Sep 29, 2026
0546993
feat(acp): serve ACP v1 on a vendored Effect-native protocol
sanchitrk Sep 29, 2026
7c7c66c
feat(harness): title sessions from their first prompt
sanchitrk Sep 29, 2026
565a158
feat(acp): announce session titles to the editor
sanchitrk Sep 29, 2026
822db8f
feat(aikit): export getEnvApiKey
sanchitrk Sep 29, 2026
df6f84f
feat(harness): list models by credential with ModelCatalog.available
sanchitrk Sep 29, 2026
2d11b1a
fix(acp): offer models from the harness credential file
sanchitrk Sep 29, 2026
ac82cc6
feat(settings): read custom catalog entries from settings.models
sanchitrk Sep 29, 2026
d986339
feat(acp): offer settings-defined models
sanchitrk Sep 29, 2026
581ac92
feat(harness): persist session model and thinking level
sanchitrk Sep 29, 2026
296a0a0
refactor(acp): read session configuration from the harness
sanchitrk Sep 29, 2026
a5cd11d
fix(aikit): replace images with placeholders for non-vision models
sanchitrk Sep 29, 2026
94e99ce
docs: add @codeworksh/aikit@0.9.3 release notes
sanchitrk Sep 29, 2026
a5fdf9d
release: @codeworksh/aikit@0.9.3
sanchitrk Sep 29, 2026
4006c2a
rm
sanchitrk Sep 29, 2026
9b9a34c
chore
sanchitrk Sep 30, 2026
2607ca6
feat(harness): accept image parts in prompts
sanchitrk Sep 30, 2026
eadbc08
feat(acp): accept image prompts
sanchitrk Sep 30, 2026
2b4deec
test(acp): run live cases against six providers
sanchitrk Sep 30, 2026
c6234e9
test(harness): run live cases against six providers
sanchitrk Sep 30, 2026
2b9d1a3
test(aikit): run OpenRouter suites on three models and Codex from the…
sanchitrk Sep 30, 2026
a661cf4
chore: update AGENTS.md and CLAUDE.md
sanchitrk Sep 30, 2026
2db10a3
refactor(acp): serve over the official ACP SDK
sanchitrk Sep 30, 2026
6d3c55f
test(cli): load .env.local for the ACP live suites
sanchitrk Sep 30, 2026
c1aa54d
test(cli): move the test env loader to test/utils like aikit
sanchitrk Sep 30, 2026
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
Prev Previous commit
Next Next commit
test(cli): load .env.local for the ACP live suites
Move the Codex login token lookup into test/env.ts alongside it, mirroring
aikit's test env setup. Only the ACP suite imports it, so the other CLI
tests keep a key-free environment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
  • Loading branch information
sanchitrk and claude committed Sep 30, 2026
commit 6d3c55f25ef4c671b3e20060385f37878ffe8ad7
22 changes: 2 additions & 20 deletions packages/codework/test/acp.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,36 +5,18 @@ import { type Cause, Effect, Exit, Fiber, Option, Queue, type Scope, Stream } fr
import * as EffectCause from "effect/Cause";
import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process";
import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
import { homedir, tmpdir } from "node:os";
import { tmpdir } from "node:os";
import { crc32, deflateSync } from "node:zlib";
import { dirname, join } from "node:path";
import { fileURLToPath } from "node:url";
import { afterAll, describe, expect, it } from "vite-plus/test";
import "./env.ts";

const cli = fileURLToPath(new URL("../src/index.ts", import.meta.url));
const models = fileURLToPath(new URL("../../../models.gen.json", import.meta.url));
// Cheap, reliable with tools, and its id contains a slash, which the model selector must keep intact.
const LIVE_MODEL = "openrouter/openai/gpt-4.1-mini";

/**
* The Codex login's current access token, for `OPENAI_CODEX_API_KEY`. The login file itself is
* never copied into a test home: a refresh there would rotate the refresh token and sign the
* developer out. An expired token skips the Codex cases rather than refreshing.
*/
const codexToken = (): string | undefined => {
try {
const login = JSON.parse(readFileSync(join(homedir(), ".codework", "aikit", "auth.json"), "utf8"))[
"openai-codex"
];
// @effect-diagnostics-next-line globalDate:off -- module setup, outside any Effect.
return typeof login?.access === "string" && login.expires > Date.now() + 10 * 60_000 ? login.access : undefined;
} catch {
return undefined;
}
};
const codex = process.env.OPENAI_CODEX_API_KEY ?? codexToken();
if (codex !== undefined) process.env.OPENAI_CODEX_API_KEY = codex;

/** Every live case runs against each of these; `env` names the key that enables it. */
const LIVE = [
{ name: "openai", provider: "openai", id: "gpt-5.6-luna", env: "OPENAI_API_KEY" },
Expand Down
30 changes: 30 additions & 0 deletions packages/codework/test/env.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/* @effect-diagnostics nodeBuiltinImport:off -- test setup reads local credential files. */
import { existsSync, readFileSync } from "node:fs";
import { homedir } from "node:os";
import { join } from "node:path";
import { fileURLToPath } from "node:url";

const envPath = fileURLToPath(new URL("../.env.local", import.meta.url));

if (existsSync(envPath)) {
process.loadEnvFile(envPath);
}

/**
* The Codex login's current access token, for `OPENAI_CODEX_API_KEY`. The login file itself is
* never copied into a test home: a refresh there would rotate the refresh token and sign the
* developer out. An expired token skips the Codex cases rather than refreshing.
*/
const codexToken = (): string | undefined => {
try {
const login = JSON.parse(readFileSync(join(homedir(), ".codework", "aikit", "auth.json"), "utf8"))[
"openai-codex"
];
// @effect-diagnostics-next-line globalDate:off -- module setup, outside any Effect.
return typeof login?.access === "string" && login.expires > Date.now() + 10 * 60_000 ? login.access : undefined;
} catch {
return undefined;
}
};
const codex = process.env.OPENAI_CODEX_API_KEY ?? codexToken();
if (codex !== undefined) process.env.OPENAI_CODEX_API_KEY = codex;