Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
8698382
feat(auth): persist inert resource grants behind activation guard
alimek Oct 10, 2026
f9ec83a
feat(auth): preserve live device authority across transports
alimek Oct 10, 2026
7421492
fix(auth): validate pending invitation authority atomically
alimek Oct 10, 2026
2a848c2
fix(auth): filter project collections and streams
alimek Oct 10, 2026
653cd88
fix(server): enforce project access on direct thread reads (04a)
alimek Oct 10, 2026
8f3e913
fix(server): reject unresolved thread read owners
alimek Oct 10, 2026
7886075
feat(server): enforce 04b1 command and receipt admission
alimek Oct 11, 2026
f463b08
fix(server): hide historical rejection details from restricted callers
alimek Oct 11, 2026
81330da
fix(server): admit thread launches before effects
alimek Oct 11, 2026
46a884c
fix(server): release SQL before launch filesystem work
alimek Oct 11, 2026
9297cc3
fix(server): authorize project mutations and deletion cascades
alimek Oct 11, 2026
bae7674
fix(server): preserve admitted launch child workspaces
alimek Oct 11, 2026
ffe46fb
fix(server): carry launch admission into attachment claims
alimek Oct 11, 2026
051d281
fix(server): authorize registered workspace reads
alimek Oct 11, 2026
8bc0546
fix(server): preserve workspace read associations
alimek Oct 11, 2026
ba0ed65
fix(server): check current authority before git mutations
alimek Oct 11, 2026
34141ec
fix(server): preserve workspace denial through Git fallbacks
alimek Oct 11, 2026
6074a72
fix(server): guard worktree lifecycle mutations
alimek Oct 11, 2026
b4d2dda
fix(server): admit pull request reads at service boundaries
alimek Oct 11, 2026
0668bc7
fix(server): preserve typed denial in PR stats recovery
alimek Oct 11, 2026
1865da5
fix(server): retain current access through PR read effects
alimek Oct 11, 2026
3f02025
fix(server): preserve workflow read authorization denial
alimek Oct 11, 2026
c14c83d
test(server): use provider service namespace
alimek Oct 11, 2026
2c2b81e
fix(server): guard persisted PR cache continuations
alimek Oct 11, 2026
4825945
fix(server): deny extra tools for restricted connections
alimek Oct 11, 2026
03458d5
fix(server): close v1 OAuth approval race
alimek Oct 11, 2026
af71bd0
fix(server): bind files and assets to current connection access
alimek Oct 11, 2026
15a28aa
fix(server): retain current file owners through asset responses
alimek Oct 11, 2026
b66e06e
fix(server): recheck media capabilities across waits
alimek Oct 11, 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
24 changes: 21 additions & 3 deletions apps/server/integration/transferBudgetV2.integration.test.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import * as DateTime from "effect/DateTime";
import * as SessionStore from "../src/auth/SessionStore.ts";
import { trustedReadAuthority } from "../src/auth/ResourceAuthorization.ts";
// @effect-diagnostics nodeBuiltinImport:off - Measures real local HTTP/WebSocket sockets.
import * as NodeHttp from "node:http";
import { assert, it } from "@effect/vitest";
Expand All @@ -8,6 +11,7 @@ import {
ORCHESTRATION_PROTOCOL_HEADER,
ORCHESTRATION_PROTOCOL_VERSION,
AuthSessionId,
AuthAllResourceGrant,
AuthOrchestrationReadScope,
EnvironmentHttpApi,
EnvironmentAuthenticatedAuth,
Expand Down Expand Up @@ -83,8 +87,8 @@ const layerManagement = Layer.unwrap(
const sink = yield* EventSink.EventSinkV2;
return Layer.mock(ThreadManagementService.ThreadManagementService)({
ensureLegacyTranscript: () => Effect.void,
getThreadSnapshot: (id) => projections.getThreadSnapshot(id).pipe(Effect.orDie),
getThreadSnapshotWindow: (id, options) =>
getThreadSnapshot: (_authority, id) => projections.getThreadSnapshot(id).pipe(Effect.orDie),
getThreadSnapshotWindow: (_authority, id, options) =>
projections.getThreadSnapshotWindow(id, options).pipe(Effect.orDie),
getThreadShell: (id) => projections.getThreadShell(id).pipe(Effect.orDie),
getShellSnapshot: (options) => projections.getShellSnapshot(options).pipe(Effect.orDie),
Expand Down Expand Up @@ -145,13 +149,27 @@ const group = RpcGroup.make(
);
const layerHandlers = group.toLayer({
[ORCHESTRATION_V2_WS_METHODS.subscribeThread]: (input) =>
Stream.unwrap(subscribeOrchestrationV2Thread(input)),
Stream.unwrap(subscribeOrchestrationV2Thread(trustedReadAuthority, input)),
[ORCHESTRATION_V2_WS_METHODS.subscribeShell]: (input) =>
Stream.unwrap(subscribeOrchestrationV2Shell(input)),
});
const layerRoutes = Layer.mergeAll(
HttpApiBuilder.layer(TransferApi).pipe(
Layer.provide(OrchestrationHttp.layer),
Layer.provide(
Layer.mock(SessionStore.SessionStore)({
cookieName: "fixture",
legacyCookieName: undefined,
getAuthority: (_sid, session) =>
Effect.succeed({
deviceId: AuthSessionId.make("transport-fixture"),
authorityRevision: 0,
resourceGrant: AuthAllResourceGrant,
scopes: session?.scopes ?? [],
expiresAt: DateTime.makeUnsafe("2100-01-01T00:00:00Z"),
}),
}),
),
Layer.provide(layerAuth),
),
RpcServer.layerHttp({ group, path: "/ws", protocol: "websocket" }).pipe(
Expand Down
4 changes: 3 additions & 1 deletion apps/server/src/assets/AssetAccess.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ vi.mock("node:os", async (importOriginal) => {
return { ...actual, homedir: vi.fn(actual.homedir) };
});

const encodeAssetAccessError = Schema.encodeUnknownEffect(Schema.fromJsonString(AssetAccessError));

const layerConfig = ServerConfig.ServerConfig.layerTest(process.cwd(), {
prefix: "t3-asset-access-test-",
});
Expand Down Expand Up @@ -1361,7 +1363,7 @@ describe("AssetAccess", () => {
]) {
const error = yield* issue(url).pipe(Effect.flip);
expect(error._tag).toBe("AssetGitHubMediaUrlValidationError");
const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error);
const encoded = yield* encodeAssetAccessError(error);
expect(encoded).not.toContain(url);
}
}).pipe(Effect.provide(layerTest)),
Expand Down
Loading
Loading