Skip to content

Commit 3f48ad2

Browse files
Tighten thread activity schemas and context window usage
- Model orchestration activities with typed payloads - Drop obsolete provider runtime event mappings - Improve context window snapshot derivation
1 parent f71015a commit 3f48ad2

File tree

12 files changed

+293
-789
lines changed

12 files changed

+293
-789
lines changed

apps/server/src/orchestration/Layers/ProjectionSnapshotQuery.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,9 @@ projectionSnapshotLayer("ProjectionSnapshotQuery", (it) => {
141141
'thread-1',
142142
'turn-1',
143143
'info',
144-
'runtime.note',
145-
'provider started',
146-
'{"stage":"start"}',
144+
'runtime.warning',
145+
'Runtime warning',
146+
'{"message":"provider started"}',
147147
'2026-02-24T00:00:06.000Z'
148148
)
149149
`;
@@ -300,9 +300,9 @@ projectionSnapshotLayer("ProjectionSnapshotQuery", (it) => {
300300
{
301301
id: asEventId("activity-1"),
302302
tone: "info",
303-
kind: "runtime.note",
304-
summary: "provider started",
305-
payload: { stage: "start" },
303+
kind: "runtime.warning",
304+
summary: "Runtime warning",
305+
payload: { message: "provider started" },
306306
turnId: asTurnId("turn-1"),
307307
createdAt: "2026-02-24T00:00:06.000Z",
308308
},

apps/server/src/orchestration/Layers/ProjectionSnapshotQuery.ts

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
OrchestrationCheckpointFile,
77
OrchestrationProposedPlanId,
88
OrchestrationReadModel,
9+
OrchestrationThreadActivity,
910
ProjectScript,
1011
ThreadId,
1112
TurnId,
@@ -16,7 +17,6 @@ import {
1617
type OrchestrationProject,
1718
type OrchestrationSession,
1819
type OrchestrationThread,
19-
type OrchestrationThreadActivity,
2020
} from "@t3tools/contracts";
2121
import { Effect, Layer, Schema, Struct } from "effect";
2222
import * as SqlClient from "effect/unstable/sql/SqlClient";
@@ -454,16 +454,18 @@ const makeProjectionSnapshotQuery = Effect.gen(function* () {
454454
for (const row of activityRows) {
455455
updatedAt = maxIso(updatedAt, row.createdAt);
456456
const threadActivities = activitiesByThread.get(row.threadId) ?? [];
457-
threadActivities.push({
458-
id: row.activityId,
459-
tone: row.tone,
460-
kind: row.kind,
461-
summary: row.summary,
462-
payload: row.payload,
463-
turnId: row.turnId,
464-
...(row.sequence !== null ? { sequence: row.sequence } : {}),
465-
createdAt: row.createdAt,
466-
});
457+
threadActivities.push(
458+
Schema.decodeUnknownSync(OrchestrationThreadActivity)({
459+
id: row.activityId,
460+
tone: row.tone,
461+
kind: row.kind,
462+
summary: row.summary,
463+
payload: row.payload,
464+
turnId: row.turnId,
465+
...(row.sequence !== null ? { sequence: row.sequence } : {}),
466+
createdAt: row.createdAt,
467+
}),
468+
);
467469
activitiesByThread.set(row.threadId, threadActivities);
468470
}
469471

apps/server/src/orchestration/Layers/ProviderCommandReactor.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,7 @@ const make = Effect.gen(function* () {
166166
| "provider.turn.start.failed"
167167
| "provider.turn.interrupt.failed"
168168
| "provider.approval.respond.failed"
169-
| "provider.user-input.respond.failed"
170-
| "provider.session.stop.failed";
169+
| "provider.user-input.respond.failed";
171170
readonly summary: string;
172171
readonly detail: string;
173172
readonly turnId: TurnId | null;

apps/server/src/provider/Layers/ClaudeAdapter.test.ts

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -719,7 +719,6 @@ describe("ClaudeAdapterLive", () => {
719719
runtimeEvents.map((event) => event.type),
720720
[
721721
"session.started",
722-
"session.configured",
723722
"session.state.changed",
724723
"turn.started",
725724
"thread.started",
@@ -885,7 +884,6 @@ describe("ClaudeAdapterLive", () => {
885884
runtimeEvents.map((event) => event.type),
886885
[
887886
"session.started",
888-
"session.configured",
889887
"session.state.changed",
890888
"turn.started",
891889
"thread.started",
@@ -1066,7 +1064,6 @@ describe("ClaudeAdapterLive", () => {
10661064
runtimeEvents.map((event) => event.type),
10671065
[
10681066
"session.started",
1069-
"session.configured",
10701067
"session.state.changed",
10711068
"turn.started",
10721069
"thread.started",
@@ -1124,23 +1121,22 @@ describe("ClaudeAdapterLive", () => {
11241121
runtimeEvents.map((event) => event.type),
11251122
[
11261123
"session.started",
1127-
"session.configured",
11281124
"session.state.changed",
11291125
"turn.started",
11301126
"turn.completed",
11311127
"session.exited",
11321128
],
11331129
);
11341130

1135-
const turnCompleted = runtimeEvents[4];
1131+
const turnCompleted = runtimeEvents.find((event) => event.type === "turn.completed");
11361132
assert.equal(turnCompleted?.type, "turn.completed");
11371133
if (turnCompleted?.type === "turn.completed") {
11381134
assert.equal(String(turnCompleted.turnId), String(turn.turnId));
11391135
assert.equal(turnCompleted.payload.state, "interrupted");
11401136
assert.equal(turnCompleted.payload.errorMessage, "Claude runtime interrupted.");
11411137
}
11421138

1143-
const sessionExited = runtimeEvents[5];
1139+
const sessionExited = runtimeEvents.find((event) => event.type === "session.exited");
11441140
assert.equal(sessionExited?.type, "session.exited");
11451141

11461142
assert.equal(yield* adapter.hasSession(THREAD_ID), false);
@@ -1454,7 +1450,6 @@ describe("ClaudeAdapterLive", () => {
14541450
runtimeEvents.map((event) => event.type),
14551451
[
14561452
"session.started",
1457-
"session.configured",
14581453
"session.state.changed",
14591454
"turn.started",
14601455
"thread.started",
@@ -1599,14 +1594,14 @@ describe("ClaudeAdapterLive", () => {
15991594
runtimeEvents.map((event) => event.type),
16001595
[
16011596
"session.started",
1602-
"session.configured",
16031597
"session.state.changed",
16041598
"turn.started",
16051599
"thread.started",
16061600
"content.delta",
16071601
"item.completed",
16081602
"content.delta",
16091603
"item.completed",
1604+
"turn.completed",
16101605
],
16111606
);
16121607

@@ -1694,7 +1689,6 @@ describe("ClaudeAdapterLive", () => {
16941689
runtimeEvents.map((event) => event.type),
16951690
[
16961691
"session.started",
1697-
"session.configured",
16981692
"session.state.changed",
16991693
"turn.started",
17001694
"thread.started",
@@ -1882,7 +1876,6 @@ describe("ClaudeAdapterLive", () => {
18821876
runtimeEvents.map((event) => event.type),
18831877
[
18841878
"session.started",
1885-
"session.configured",
18861879
"session.state.changed",
18871880
"turn.started",
18881881
"thread.started",
@@ -1989,10 +1982,10 @@ describe("ClaudeAdapterLive", () => {
19891982
runtimeEvents.map((event) => event.type),
19901983
[
19911984
"session.started",
1992-
"session.configured",
19931985
"session.state.changed",
19941986
"turn.started",
19951987
"thread.started",
1988+
"turn.completed",
19961989
],
19971990
);
19981991

@@ -2002,7 +1995,7 @@ describe("ClaudeAdapterLive", () => {
20021995
assert.equal(sessionStarted.threadId, THREAD_ID);
20031996
}
20041997

2005-
const threadStarted = runtimeEvents[4];
1998+
const threadStarted = runtimeEvents.find((event) => event.type === "thread.started");
20061999
assert.equal(threadStarted?.type, "thread.started");
20072000
if (threadStarted?.type === "thread.started") {
20082001
assert.equal(threadStarted.threadId, THREAD_ID);

apps/server/src/provider/Layers/ClaudeAdapter.ts

Lines changed: 3 additions & 162 deletions
Original file line numberDiff line numberDiff line change
@@ -1966,15 +1966,6 @@ function makeClaudeAdapter(options?: ClaudeAdapterLiveOptions) {
19661966
};
19671967

19681968
switch (message.subtype) {
1969-
case "init":
1970-
yield* offerRuntimeEvent({
1971-
...base,
1972-
type: "session.configured",
1973-
payload: {
1974-
config: message as Record<string, unknown>,
1975-
},
1976-
});
1977-
return;
19781969
case "status":
19791970
yield* offerRuntimeEvent({
19801971
...base,
@@ -1996,43 +1987,6 @@ function makeClaudeAdapter(options?: ClaudeAdapterLiveOptions) {
19961987
},
19971988
});
19981989
return;
1999-
case "hook_started":
2000-
yield* offerRuntimeEvent({
2001-
...base,
2002-
type: "hook.started",
2003-
payload: {
2004-
hookId: message.hook_id,
2005-
hookName: message.hook_name,
2006-
hookEvent: message.hook_event,
2007-
},
2008-
});
2009-
return;
2010-
case "hook_progress":
2011-
yield* offerRuntimeEvent({
2012-
...base,
2013-
type: "hook.progress",
2014-
payload: {
2015-
hookId: message.hook_id,
2016-
output: message.output,
2017-
stdout: message.stdout,
2018-
stderr: message.stderr,
2019-
},
2020-
});
2021-
return;
2022-
case "hook_response":
2023-
yield* offerRuntimeEvent({
2024-
...base,
2025-
type: "hook.completed",
2026-
payload: {
2027-
hookId: message.hook_id,
2028-
outcome: message.outcome,
2029-
output: message.output,
2030-
stdout: message.stdout,
2031-
stderr: message.stderr,
2032-
...(typeof message.exit_code === "number" ? { exitCode: message.exit_code } : {}),
2033-
},
2034-
});
2035-
return;
20361990
case "task_started":
20371991
yield* offerRuntimeEvent({
20381992
...base,
@@ -2105,28 +2059,6 @@ function makeClaudeAdapter(options?: ClaudeAdapterLiveOptions) {
21052059
},
21062060
});
21072061
return;
2108-
case "files_persisted":
2109-
yield* offerRuntimeEvent({
2110-
...base,
2111-
type: "files.persisted",
2112-
payload: {
2113-
files: Array.isArray(message.files)
2114-
? message.files.map((file: { filename: string; file_id: string }) => ({
2115-
filename: file.filename,
2116-
fileId: file.file_id,
2117-
}))
2118-
: [],
2119-
...(Array.isArray(message.failed)
2120-
? {
2121-
failed: message.failed.map((entry: { filename: string; error: string }) => ({
2122-
filename: entry.filename,
2123-
error: entry.error,
2124-
})),
2125-
}
2126-
: {}),
2127-
},
2128-
});
2129-
return;
21302062
default:
21312063
yield* emitRuntimeWarning(
21322064
context,
@@ -2138,78 +2070,9 @@ function makeClaudeAdapter(options?: ClaudeAdapterLiveOptions) {
21382070
});
21392071

21402072
const handleSdkTelemetryMessage = (
2141-
context: ClaudeSessionContext,
2142-
message: SDKMessage,
2143-
): Effect.Effect<void> =>
2144-
Effect.gen(function* () {
2145-
const stamp = yield* makeEventStamp();
2146-
const base = {
2147-
eventId: stamp.eventId,
2148-
provider: PROVIDER,
2149-
createdAt: stamp.createdAt,
2150-
threadId: context.session.threadId,
2151-
...(context.turnState ? { turnId: asCanonicalTurnId(context.turnState.turnId) } : {}),
2152-
providerRefs: nativeProviderRefs(context),
2153-
raw: {
2154-
source: "claude.sdk.message" as const,
2155-
method: sdkNativeMethod(message),
2156-
messageType: message.type,
2157-
payload: message,
2158-
},
2159-
};
2160-
2161-
if (message.type === "tool_progress") {
2162-
yield* offerRuntimeEvent({
2163-
...base,
2164-
type: "tool.progress",
2165-
payload: {
2166-
toolUseId: message.tool_use_id,
2167-
toolName: message.tool_name,
2168-
elapsedSeconds: message.elapsed_time_seconds,
2169-
...(message.task_id ? { summary: `task:${message.task_id}` } : {}),
2170-
},
2171-
});
2172-
return;
2173-
}
2174-
2175-
if (message.type === "tool_use_summary") {
2176-
yield* offerRuntimeEvent({
2177-
...base,
2178-
type: "tool.summary",
2179-
payload: {
2180-
summary: message.summary,
2181-
...(message.preceding_tool_use_ids.length > 0
2182-
? { precedingToolUseIds: message.preceding_tool_use_ids }
2183-
: {}),
2184-
},
2185-
});
2186-
return;
2187-
}
2188-
2189-
if (message.type === "auth_status") {
2190-
yield* offerRuntimeEvent({
2191-
...base,
2192-
type: "auth.status",
2193-
payload: {
2194-
isAuthenticating: message.isAuthenticating,
2195-
output: message.output,
2196-
...(message.error ? { error: message.error } : {}),
2197-
},
2198-
});
2199-
return;
2200-
}
2201-
2202-
if (message.type === "rate_limit_event") {
2203-
yield* offerRuntimeEvent({
2204-
...base,
2205-
type: "account.rate-limits.updated",
2206-
payload: {
2207-
rateLimits: message,
2208-
},
2209-
});
2210-
return;
2211-
}
2212-
});
2073+
_context: ClaudeSessionContext,
2074+
_message: SDKMessage,
2075+
): Effect.Effect<void> => Effect.void;
22132076

22142077
const handleSdkMessage = (
22152078
context: ClaudeSessionContext,
@@ -2812,28 +2675,6 @@ function makeClaudeAdapter(options?: ClaudeAdapterLiveOptions) {
28122675
providerRefs: {},
28132676
});
28142677

2815-
const configuredStamp = yield* makeEventStamp();
2816-
yield* offerRuntimeEvent({
2817-
type: "session.configured",
2818-
eventId: configuredStamp.eventId,
2819-
provider: PROVIDER,
2820-
createdAt: configuredStamp.createdAt,
2821-
threadId,
2822-
payload: {
2823-
config: {
2824-
...(input.model ? { model: input.model } : {}),
2825-
...(input.cwd ? { cwd: input.cwd } : {}),
2826-
...(effectiveEffort ? { effort: effectiveEffort } : {}),
2827-
...(permissionMode ? { permissionMode } : {}),
2828-
...(providerOptions?.maxThinkingTokens !== undefined
2829-
? { maxThinkingTokens: providerOptions.maxThinkingTokens }
2830-
: {}),
2831-
...(fastMode ? { fastMode: true } : {}),
2832-
},
2833-
},
2834-
providerRefs: {},
2835-
});
2836-
28372678
const readyStamp = yield* makeEventStamp();
28382679
yield* offerRuntimeEvent({
28392680
type: "session.state.changed",

0 commit comments

Comments
 (0)