History

test(mcp): use pending request service namespace

Julius Marminge committed 2 months ago

Commit 37acbc61 parent e22bffb1 file · +22 −22Browse files

Unified · Split

apps/server/src/mcp/PendingRequestMcpService.test.ts+22−22
@@ -28,7 +28,7 @@ import { · 27 unmodified lines
28 ThreadManagementService,28 ThreadManagementService,
29} from "../orchestration-v2/ThreadManagementService.ts";29} from "../orchestration-v2/ThreadManagementService.ts";
30import type { McpInvocationScope } from "./McpInvocationContext.ts";30import type { McpInvocationScope } from "./McpInvocationContext.ts";
31import { layer, PendingRequestMcpService } from "./PendingRequestMcpService.ts";31import * as PendingRequestMcpService from "./PendingRequestMcpService.ts";
32 32
33const parentThreadId = ThreadId.make("thread:pending-request-parent");33const parentThreadId = ThreadId.make("thread:pending-request-parent");
34const childThreadId = ThreadId.make("thread:pending-request-child");34const childThreadId = ThreadId.make("thread:pending-request-child");
@@ -225,7 +225,7 @@ function serviceLayer(input: { · 190 unmodified lines
225 readonly getReceipt?: ThreadManagementService["Service"]["getCommandReceipt"];225 readonly getReceipt?: ThreadManagementService["Service"]["getCommandReceipt"];
226 readonly dispatch?: ThreadManagementService["Service"]["dispatch"];226 readonly dispatch?: ThreadManagementService["Service"]["dispatch"];
227}) {227}) {
228 return layer.pipe(228 return PendingRequestMcpService.layer.pipe(
229 Layer.provide(229 Layer.provide(
230 Layer.mergeAll(230 Layer.mergeAll(
231 NodeServices.layer,231 NodeServices.layer,
@@ -254,7 +254,7 @@ describe("PendingRequestMcpService", () => { · 22 unmodified lines
254 "lists and reads only structured user-input questions on direct app-owned children",254 "lists and reads only structured user-input questions on direct app-owned children",
255 () =>255 () =>
256 Effect.gen(function* () {256 Effect.gen(function* () {
257 const service = yield* PendingRequestMcpService;257 const service = yield* PendingRequestMcpService.PendingRequestMcpService;
258 const listed = yield* service.list(scope, {});258 const listed = yield* service.list(scope, {});
259 assert.equal(listed.requests.length, 1);259 assert.equal(listed.requests.length, 1);
260 assert.equal(listed.requests[0]?.taskId, taskId);260 assert.equal(listed.requests[0]?.taskId, taskId);
@@ -296,7 +296,7 @@ describe("PendingRequestMcpService", () => { · 35 unmodified lines
296 });296 });
297 297
298 yield* Effect.gen(function* () {298 yield* Effect.gen(function* () {
299 const service = yield* PendingRequestMcpService;299 const service = yield* PendingRequestMcpService.PendingRequestMcpService;
300 const first = yield* service.list(scope, { limit: 1 });300 const first = yield* service.list(scope, { limit: 1 });
301 assert.deepEqual(301 assert.deepEqual(
302 first.requests.map((request) => request.requestId),302 first.requests.map((request) => request.requestId),
@@ -356,7 +356,7 @@ describe("PendingRequestMcpService", () => { · 53 unmodified lines
356 );356 );
357 357
358 yield* Effect.gen(function* () {358 yield* Effect.gen(function* () {
359 const service = yield* PendingRequestMcpService;359 const service = yield* PendingRequestMcpService.PendingRequestMcpService;
360 const first = yield* service.list(scope, { limit: 50 });360 const first = yield* service.list(scope, { limit: 50 });
361 assert.deepEqual(first.requests, []);361 assert.deepEqual(first.requests, []);
362 assert.isNotNull(first.nextCursor);362 assert.isNotNull(first.nextCursor);
@@ -407,7 +407,7 @@ describe("PendingRequestMcpService", () => { · 44 unmodified lines
407 });407 });
408 408
409 yield* Effect.gen(function* () {409 yield* Effect.gen(function* () {
410 const service = yield* PendingRequestMcpService;410 const service = yield* PendingRequestMcpService.PendingRequestMcpService;
411 const listed = yield* service.list(scope, {});411 const listed = yield* service.list(scope, {});
412 assert.deepEqual(412 assert.deepEqual(
413 listed.requests.map((request) => request.requestId),413 listed.requests.map((request) => request.requestId),
@@ -432,7 +432,7 @@ describe("PendingRequestMcpService", () => { · 18 unmodified lines
432 );432 );
433 433
434 yield* Effect.gen(function* () {434 yield* Effect.gen(function* () {
435 const service = yield* PendingRequestMcpService;435 const service = yield* PendingRequestMcpService.PendingRequestMcpService;
436 const failed = yield* service.list(scope, {}).pipe(Effect.flip);436 const failed = yield* service.list(scope, {}).pipe(Effect.flip);
437 assert.equal(failed.code, "orchestration_error");437 assert.equal(failed.code, "orchestration_error");
438 assert.notInclude(failed.message, "sqlite credentials leaked");438 assert.notInclude(failed.message, "sqlite credentials leaked");
@@ -466,7 +466,7 @@ describe("PendingRequestMcpService", () => { · 27 unmodified lines
466 });466 });
467 467
468 return Effect.gen(function* () {468 return Effect.gen(function* () {
469 const service = yield* PendingRequestMcpService;469 const service = yield* PendingRequestMcpService.PendingRequestMcpService;
470 const read = yield* service.read(scope, { childThreadId, requestId });470 const read = yield* service.read(scope, { childThreadId, requestId });
471 assert.equal(read.questionPayloadStatus, "complete");471 assert.equal(read.questionPayloadStatus, "complete");
472 assert.isTrue(read.answerable);472 assert.isTrue(read.answerable);
@@ -488,7 +488,7 @@ describe("PendingRequestMcpService", () => { · 15 unmodified lines
488 });488 });
489 489
490 return Effect.gen(function* () {490 return Effect.gen(function* () {
491 const service = yield* PendingRequestMcpService;491 const service = yield* PendingRequestMcpService.PendingRequestMcpService;
492 const read = yield* service.read(scope, { childThreadId, requestId });492 const read = yield* service.read(scope, { childThreadId, requestId });
493 assert.equal(read.questionPayloadStatus, "too_large");493 assert.equal(read.questionPayloadStatus, "too_large");
494 assert.equal(read.questionCount, 1);494 assert.equal(read.questionCount, 1);
@@ -524,7 +524,7 @@ describe("PendingRequestMcpService", () => { · 29 unmodified lines
524 });524 });
525 525
526 return Effect.gen(function* () {526 return Effect.gen(function* () {
527 const service = yield* PendingRequestMcpService;527 const service = yield* PendingRequestMcpService.PendingRequestMcpService;
528 const read = yield* service.read(scope, { childThreadId, requestId });528 const read = yield* service.read(scope, { childThreadId, requestId });
529 assert.equal(read.questionPayloadStatus, "invalid");529 assert.equal(read.questionPayloadStatus, "invalid");
530 assert.equal(read.questionCount, 2);530 assert.equal(read.questionCount, 2);
@@ -547,7 +547,7 @@ describe("PendingRequestMcpService", () => { · 16 unmodified lines
547 547
548 it.effect("keeps projection defects out of MCP failure messages", () =>548 it.effect("keeps projection defects out of MCP failure messages", () =>
549 Effect.gen(function* () {549 Effect.gen(function* () {
550 const service = yield* PendingRequestMcpService;550 const service = yield* PendingRequestMcpService.PendingRequestMcpService;
551 const failure = yield* service.list(scope, {}).pipe(Effect.flip);551 const failure = yield* service.list(scope, {}).pipe(Effect.flip);
552 assert.equal(failure.code, "orchestration_error");552 assert.equal(failure.code, "orchestration_error");
553 assert.equal(553 assert.equal(
@@ -573,7 +573,7 @@ describe("PendingRequestMcpService", () => { · 19 unmodified lines
573 573
574 it.effect("rejects provider-native children and non-user-input request kinds", () =>574 it.effect("rejects provider-native children and non-user-input request kinds", () =>
575 Effect.gen(function* () {575 Effect.gen(function* () {
576 const providerOwnedService = yield* PendingRequestMcpService;576 const providerOwnedService = yield* PendingRequestMcpService.PendingRequestMcpService;
577 const wrongChild = yield* providerOwnedService577 const wrongChild = yield* providerOwnedService
578 .read(scope, { childThreadId, requestId })578 .read(scope, { childThreadId, requestId })
579 .pipe(Effect.flip);579 .pipe(Effect.flip);
@@ -587,7 +587,7 @@ describe("PendingRequestMcpService", () => { · 7 unmodified lines
587 ),587 ),
588 Effect.andThen(588 Effect.andThen(
589 Effect.gen(function* () {589 Effect.gen(function* () {
590 const service = yield* PendingRequestMcpService;590 const service = yield* PendingRequestMcpService.PendingRequestMcpService;
591 const wrongKind = yield* service591 const wrongKind = yield* service
592 .read(scope, { childThreadId, requestId })592 .read(scope, { childThreadId, requestId })
593 .pipe(Effect.flip);593 .pipe(Effect.flip);
@@ -634,7 +634,7 @@ describe("PendingRequestMcpService", () => { · 40 unmodified lines
634 });634 });
635 635
636 yield* Effect.gen(function* () {636 yield* Effect.gen(function* () {
637 const service = yield* PendingRequestMcpService;637 const service = yield* PendingRequestMcpService.PendingRequestMcpService;
638 const input = {638 const input = {
639 childThreadId,639 childThreadId,
640 requestId,640 requestId,
@@ -673,7 +673,7 @@ describe("PendingRequestMcpService", () => { · 32 unmodified lines
673 };673 };
674 674
675 yield* Effect.gen(function* () {675 yield* Effect.gen(function* () {
676 const service = yield* PendingRequestMcpService;676 const service = yield* PendingRequestMcpService.PendingRequestMcpService;
677 const replay = yield* service.respond(scope, {677 const replay = yield* service.respond(scope, {
678 childThreadId,678 childThreadId,
679 requestId,679 requestId,
@@ -699,7 +699,7 @@ describe("PendingRequestMcpService", () => { · 19 unmodified lines
699 699
700 it.effect("rejects incomplete answers, stale requests, and ended provider sessions", () =>700 it.effect("rejects incomplete answers, stale requests, and ended provider sessions", () =>
701 Effect.gen(function* () {701 Effect.gen(function* () {
702 const service = yield* PendingRequestMcpService;702 const service = yield* PendingRequestMcpService.PendingRequestMcpService;
703 const invalid = yield* service703 const invalid = yield* service
704 .respond(scope, {704 .respond(scope, {
705 childThreadId,705 childThreadId,
@@ -713,7 +713,7 @@ describe("PendingRequestMcpService", () => { · 7 unmodified lines
713 Effect.provide(serviceLayer({ getChild: () => childProjection() })),713 Effect.provide(serviceLayer({ getChild: () => childProjection() })),
714 Effect.andThen(714 Effect.andThen(
715 Effect.gen(function* () {715 Effect.gen(function* () {
716 const service = yield* PendingRequestMcpService;716 const service = yield* PendingRequestMcpService.PendingRequestMcpService;
717 const stale = yield* service717 const stale = yield* service
718 .respond(scope, {718 .respond(scope, {
719 childThreadId,719 childThreadId,
@@ -729,7 +729,7 @@ describe("PendingRequestMcpService", () => { · 9 unmodified lines
729 ),729 ),
730 Effect.andThen(730 Effect.andThen(
731 Effect.gen(function* () {731 Effect.gen(function* () {
732 const service = yield* PendingRequestMcpService;732 const service = yield* PendingRequestMcpService.PendingRequestMcpService;
733 const unavailable = yield* service733 const unavailable = yield* service
734 .respond(scope, {734 .respond(scope, {
735 childThreadId,735 childThreadId,
@@ -759,7 +759,7 @@ describe("PendingRequestMcpService", () => { · 23 unmodified lines
759 });759 });
760 760
761 return Effect.gen(function* () {761 return Effect.gen(function* () {
762 const service = yield* PendingRequestMcpService;762 const service = yield* PendingRequestMcpService.PendingRequestMcpService;
763 const rejected = yield* service763 const rejected = yield* service
764 .respond(scope, {764 .respond(scope, {
765 childThreadId,765 childThreadId,
@@ -783,7 +783,7 @@ describe("PendingRequestMcpService", () => { · 17 unmodified lines
783 783
784 it.effect("keeps delegated answers within the caller's runtime and interaction ceilings", () =>784 it.effect("keeps delegated answers within the caller's runtime and interaction ceilings", () =>
785 Effect.gen(function* () {785 Effect.gen(function* () {
786 const service = yield* PendingRequestMcpService;786 const service = yield* PendingRequestMcpService.PendingRequestMcpService;
787 const runtimeError = yield* service787 const runtimeError = yield* service
788 .respond(scope, {788 .respond(scope, {
789 childThreadId,789 childThreadId,
@@ -802,7 +802,7 @@ describe("PendingRequestMcpService", () => { · 12 unmodified lines
802 ),802 ),
803 Effect.andThen(803 Effect.andThen(
804 Effect.gen(function* () {804 Effect.gen(function* () {
805 const service = yield* PendingRequestMcpService;805 const service = yield* PendingRequestMcpService.PendingRequestMcpService;
806 const interactionError = yield* service806 const interactionError = yield* service
807 .respond(scope, {807 .respond(scope, {
808 childThreadId,808 childThreadId,
@@ -826,7 +826,7 @@ describe("PendingRequestMcpService", () => { · 17 unmodified lines
826 826
827 it.effect("never treats an unrelated thread id as an authorized child", () =>827 it.effect("never treats an unrelated thread id as an authorized child", () =>
828 Effect.gen(function* () {828 Effect.gen(function* () {
829 const service = yield* PendingRequestMcpService;829 const service = yield* PendingRequestMcpService.PendingRequestMcpService;
830 const error = yield* service830 const error = yield* service
831 .read(scope, { childThreadId: unrelatedThreadId, requestId })831 .read(scope, { childThreadId: unrelatedThreadId, requestId })
832 .pipe(Effect.flip);832 .pipe(Effect.flip);