@polpo-ai/server 0.15.76 → 0.15.77

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/routes/completions/chat-handler.d.ts +10 -0
  6. package/dist/routes/completions/chat-handler.d.ts.map +1 -1
  7. package/dist/routes/completions/chat-handler.js +436 -436
  8. package/dist/routes/completions/chat-handler.js.map +1 -1
  9. package/dist/routes/completions/chat-via-run-handler.d.ts +2 -1
  10. package/dist/routes/completions/chat-via-run-handler.d.ts.map +1 -1
  11. package/dist/routes/completions/chat-via-run-handler.js +102 -91
  12. package/dist/routes/completions/chat-via-run-handler.js.map +1 -1
  13. package/dist/routes/completions/durable-stream.d.ts +39 -0
  14. package/dist/routes/completions/durable-stream.d.ts.map +1 -0
  15. package/dist/routes/completions/durable-stream.js +83 -0
  16. package/dist/routes/completions/durable-stream.js.map +1 -0
  17. package/dist/routes/completions/durable-stream.test.d.ts +2 -0
  18. package/dist/routes/completions/durable-stream.test.d.ts.map +1 -0
  19. package/dist/routes/completions/durable-stream.test.js +140 -0
  20. package/dist/routes/completions/durable-stream.test.js.map +1 -0
  21. package/dist/routes/completions/project-loop-runner.d.ts +6 -2
  22. package/dist/routes/completions/project-loop-runner.d.ts.map +1 -1
  23. package/dist/routes/completions/project-loop-runner.js +121 -113
  24. package/dist/routes/completions/project-loop-runner.js.map +1 -1
  25. package/dist/routes/completions/schemas.d.ts +12 -0
  26. package/dist/routes/completions/schemas.d.ts.map +1 -1
  27. package/dist/routes/completions/schemas.js +5 -0
  28. package/dist/routes/completions/schemas.js.map +1 -1
  29. package/dist/routes/completions/schemas.test.js +20 -0
  30. package/dist/routes/completions/schemas.test.js.map +1 -1
  31. package/dist/routes/completions-durable-delivery.test.d.ts +2 -0
  32. package/dist/routes/completions-durable-delivery.test.d.ts.map +1 -0
  33. package/dist/routes/completions-durable-delivery.test.js +154 -0
  34. package/dist/routes/completions-durable-delivery.test.js.map +1 -0
  35. package/dist/routes/completions.d.ts +13 -0
  36. package/dist/routes/completions.d.ts.map +1 -1
  37. package/dist/routes/completions.js +107 -5
  38. package/dist/routes/completions.js.map +1 -1
  39. package/dist/routes/run-delivery.d.ts +15 -0
  40. package/dist/routes/run-delivery.d.ts.map +1 -0
  41. package/dist/routes/run-delivery.js +202 -0
  42. package/dist/routes/run-delivery.js.map +1 -0
  43. package/dist/routes/run-delivery.test.d.ts +2 -0
  44. package/dist/routes/run-delivery.test.d.ts.map +1 -0
  45. package/dist/routes/run-delivery.test.js +124 -0
  46. package/dist/routes/run-delivery.test.js.map +1 -0
  47. package/package.json +7 -7
@@ -29,10 +29,12 @@
29
29
  * - chat-handler.ts — streaming/non-streaming multi-turn chat loop
30
30
  */
31
31
  import { OpenAPIHono } from "@hono/zod-openapi";
32
+ import { streamSSE } from "hono/streaming";
32
33
  import { chatCompletionsRoute } from "./completions/schemas.js";
33
- import { handleProjectLoopCompletion } from "./completions/project-loop-runner.js";
34
- import { runNonStreamingChatCompletion, streamChatCompletion, } from "./completions/chat-handler.js";
35
- import { streamChatViaRun, runNonStreamingChatViaRun } from "./completions/chat-via-run-handler.js";
34
+ import { executeStreamingProjectLoopCompletion, handleProjectLoopCompletion, } from "./completions/project-loop-runner.js";
35
+ import { executeStreamingChatCompletion, runNonStreamingChatCompletion, streamChatCompletion, } from "./completions/chat-handler.js";
36
+ import { startDurableCompletion, streamDurableCompletionFrames, } from "./completions/durable-stream.js";
37
+ import { executeStreamingChatViaRun, streamChatViaRun, runNonStreamingChatViaRun, } from "./completions/chat-via-run-handler.js";
36
38
  import { prepareChatCompletionExecution } from "./completions/conversation-turn.js";
37
39
  export { resumeProjectLoopRun } from "./completions/project-loop-runner.js";
38
40
  export { buildChatRunInjection, runChatTurnViaRun, } from "./completions/chat-via-run-handler.js";
@@ -51,6 +53,15 @@ export function completionRoutes(getDeps, apiKeys) {
51
53
  }
52
54
  // ── Parse body ──
53
55
  const body = c.req.valid("json");
56
+ if (durableDeliveryRequested(body) && !body.stream) {
57
+ return c.json({
58
+ error: {
59
+ message: "polpo.delivery.onDisconnect=continue requires stream=true.",
60
+ type: "invalid_request_error",
61
+ code: "durable_delivery_requires_streaming",
62
+ },
63
+ }, 400);
64
+ }
54
65
  const rawSessionHeader = c.req.header("x-session-id") ?? null;
55
66
  const prepared = await prepareChatCompletionExecution(deps, body, {
56
67
  sessionId: rawSessionHeader === "new" ? null : rawSessionHeader,
@@ -68,7 +79,7 @@ export function completionRoutes(getDeps, apiKeys) {
68
79
  c.header("x-session-id", sessionId);
69
80
  }
70
81
  if (prepared.kind === "project-loop") {
71
- return await handleProjectLoopCompletion(c, {
82
+ const loopOptions = {
72
83
  deps: prepared.deps,
73
84
  body: prepared.body,
74
85
  completionId: prepared.completionId,
@@ -84,17 +95,50 @@ export function completionRoutes(getDeps, apiKeys) {
84
95
  runtimePlan: prepared.runtimePlan,
85
96
  executionRoute: prepared.executionRoute,
86
97
  activatedSkills: prepared.activatedSkills,
87
- });
98
+ };
99
+ if (body.stream && durableDeliveryRequested(body)) {
100
+ const scope = await resolveRunDeliveryScope(deps, {
101
+ runId: prepared.completionId,
102
+ sessionId: prepared.sessionId,
103
+ agent: body.agent,
104
+ });
105
+ if ("response" in scope)
106
+ return scope.response(c);
107
+ c.header("x-polpo-run-id", prepared.completionId);
108
+ return streamDurableCompletion(c, prepared.completionId, scope.value, ({ writer, signal }) => executeStreamingProjectLoopCompletion(writer, loopOptions, signal));
109
+ }
110
+ return await handleProjectLoopCompletion(c, loopOptions);
88
111
  }
89
112
  const { execution, viaRun } = prepared;
90
113
  if (viaRun) {
91
114
  c.header("x-polpo-run-id", execution.completionId);
115
+ if (body.stream && durableDeliveryRequested(body)) {
116
+ const scope = await resolveRunDeliveryScope(deps, {
117
+ runId: execution.completionId,
118
+ sessionId: execution.sessionId,
119
+ agent: body.agent,
120
+ });
121
+ if ("response" in scope)
122
+ return scope.response(c);
123
+ return streamDurableCompletion(c, execution.completionId, scope.value, ({ writer, signal }) => executeStreamingChatViaRun(writer, execution, signal));
124
+ }
92
125
  return (body.stream
93
126
  ? await streamChatViaRun(c, execution)
94
127
  : await runNonStreamingChatViaRun(c, execution));
95
128
  }
96
129
  if (body.stream) {
97
130
  // ── Streaming mode ──
131
+ if (durableDeliveryRequested(body)) {
132
+ const scope = await resolveRunDeliveryScope(deps, {
133
+ runId: execution.completionId,
134
+ sessionId: execution.sessionId,
135
+ agent: body.agent,
136
+ });
137
+ if ("response" in scope)
138
+ return scope.response(c);
139
+ c.header("x-polpo-run-id", execution.completionId);
140
+ return streamDurableCompletion(c, execution.completionId, scope.value, ({ writer, signal }) => executeStreamingChatCompletion(writer, execution, signal));
141
+ }
98
142
  return streamChatCompletion(c, execution);
99
143
  }
100
144
  // ── Non-streaming mode ──
@@ -102,4 +146,62 @@ export function completionRoutes(getDeps, apiKeys) {
102
146
  });
103
147
  return app;
104
148
  }
149
+ function streamDurableCompletion(c, runId, scope, producer) {
150
+ return streamSSE(c, async (stream) => {
151
+ const follower = new AbortController();
152
+ stream.onAbort(() => follower.abort());
153
+ const heartbeat = setInterval(() => {
154
+ if (follower.signal.aborted)
155
+ return;
156
+ stream.write(": ping\n\n").catch(() => follower.abort());
157
+ }, 20_000);
158
+ const owner = startDurableCompletion({
159
+ runId,
160
+ scope,
161
+ producer,
162
+ });
163
+ owner.catch(() => { });
164
+ try {
165
+ await streamDurableCompletionFrames({
166
+ runId,
167
+ scope,
168
+ signal: follower.signal,
169
+ write: async (frame) => {
170
+ await stream.writeSSE({
171
+ data: frame.data,
172
+ id: frame.cursor,
173
+ ...(frame.event ? { event: frame.event } : {}),
174
+ });
175
+ },
176
+ });
177
+ }
178
+ finally {
179
+ clearInterval(heartbeat);
180
+ }
181
+ });
182
+ }
183
+ function durableDeliveryRequested(body) {
184
+ return body.polpo?.delivery?.onDisconnect === "continue";
185
+ }
186
+ async function resolveRunDeliveryScope(deps, input) {
187
+ if (!deps.createRunDeliveryScope) {
188
+ return {
189
+ response: (c) => c.json({
190
+ error: {
191
+ message: "Durable run delivery is not configured by this host.",
192
+ type: "invalid_request_error",
193
+ code: "run_delivery_unavailable",
194
+ },
195
+ }, 501),
196
+ };
197
+ }
198
+ return {
199
+ value: await deps.createRunDeliveryScope({
200
+ runId: input.runId,
201
+ ...(input.sessionId ? { sessionId: input.sessionId } : {}),
202
+ ...(input.agent ? { agent: input.agent } : {}),
203
+ onDisconnect: "continue",
204
+ }),
205
+ };
206
+ }
105
207
  //# sourceMappingURL=completions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"completions.js","sourceRoot":"","sources":["../../src/routes/completions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"completions.js","sourceRoot":"","sources":["../../src/routes/completions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { OpenAPIHono } from "@hono/zod-openapi";
2
+ import { type RunCancellationStore, type RunEventStore } from "@polpo-ai/core/run-delivery";
3
+ import { type RunEventNotifier } from "@polpo-ai/core/run-delivery-follower";
4
+ export interface ResolvedRunDelivery {
5
+ eventStore: RunEventStore;
6
+ cancellationStore: RunCancellationStore;
7
+ notifier?: RunEventNotifier;
8
+ }
9
+ export interface RunDeliveryRouteDeps {
10
+ /** Host-authorized resolver. Return null for missing or inaccessible runs. */
11
+ resolveRunDelivery?: (runId: string) => Promise<ResolvedRunDelivery | null>;
12
+ now?: () => Date;
13
+ }
14
+ export declare function runDeliveryRoutes(getDeps: () => RunDeliveryRouteDeps, apiKeys?: string[]): OpenAPIHono;
15
+ //# sourceMappingURL=run-delivery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-delivery.d.ts","sourceRoot":"","sources":["../../src/routes/run-delivery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EAKL,KAAK,oBAAoB,EACzB,KAAK,aAAa,EACnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,sCAAsC,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,aAAa,CAAC;IAC1B,iBAAiB,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,8EAA8E;IAC9E,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IAC5E,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AA0DD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,oBAAoB,EACnC,OAAO,CAAC,EAAE,MAAM,EAAE,GACjB,WAAW,CAwHb"}
@@ -0,0 +1,202 @@
1
+ import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
2
+ import { streamSSE } from "hono/streaming";
3
+ import { RunDeliveryValidationError, RunEventCursorAheadError, RunEventCursorExpiredError, parseRunEventCursor, } from "@polpo-ai/core/run-delivery";
4
+ import { followRunEvents, inspectRunEventCursor, isTerminalRunStreamEvent, } from "@polpo-ai/core/run-delivery-follower";
5
+ const paramsSchema = z.object({ runId: z.string().min(1).max(200) });
6
+ const errorSchema = z.object({ ok: z.literal(false), error: z.string(), code: z.string() });
7
+ const eventsRoute = createRoute({
8
+ method: "get",
9
+ path: "/{runId}/events",
10
+ tags: ["Runs"],
11
+ summary: "Resume a durable run event stream",
12
+ request: {
13
+ params: paramsSchema,
14
+ query: z.object({
15
+ cursor: z.string().optional(),
16
+ }),
17
+ },
18
+ responses: {
19
+ 200: {
20
+ content: { "text/event-stream": { schema: z.string() } },
21
+ description: "Versioned run events, replayed after the supplied cursor and followed live",
22
+ },
23
+ 400: { content: { "application/json": { schema: errorSchema } }, description: "Invalid or conflicting cursor" },
24
+ 410: { content: { "application/json": { schema: errorSchema } }, description: "Cursor history expired" },
25
+ 404: { content: { "application/json": { schema: errorSchema } }, description: "Run not found" },
26
+ 501: { content: { "application/json": { schema: errorSchema } }, description: "Durable run delivery unavailable" },
27
+ },
28
+ });
29
+ const cancelBodySchema = z.object({
30
+ reason: z.string().trim().min(1).max(500).optional(),
31
+ }).strict();
32
+ const cancelRoute = createRoute({
33
+ method: "post",
34
+ path: "/{runId}/cancel",
35
+ tags: ["Runs"],
36
+ summary: "Cancel a durable run",
37
+ request: {
38
+ params: paramsSchema,
39
+ body: { content: { "application/json": { schema: cancelBodySchema } } },
40
+ },
41
+ responses: {
42
+ 202: {
43
+ content: {
44
+ "application/json": {
45
+ schema: z.object({
46
+ ok: z.literal(true),
47
+ data: z.object({ runId: z.string(), accepted: z.boolean() }),
48
+ }),
49
+ },
50
+ },
51
+ description: "Cancellation accepted or already pending",
52
+ },
53
+ 404: { content: { "application/json": { schema: errorSchema } }, description: "Run not found" },
54
+ 501: { content: { "application/json": { schema: errorSchema } }, description: "Durable run delivery unavailable" },
55
+ },
56
+ });
57
+ export function runDeliveryRoutes(getDeps, apiKeys) {
58
+ const app = new OpenAPIHono();
59
+ if (apiKeys && apiKeys.length > 0) {
60
+ app.use("*", async (c, next) => {
61
+ const auth = c.req.header("Authorization");
62
+ const token = auth?.startsWith("Bearer ") ? auth.slice(7) : null;
63
+ if (!token || !apiKeys.includes(token)) {
64
+ return c.json({
65
+ ok: false,
66
+ error: "Invalid API key",
67
+ code: "invalid_api_key",
68
+ }, 401);
69
+ }
70
+ await next();
71
+ });
72
+ }
73
+ app.openapi(eventsRoute, async (c) => {
74
+ const deps = getDeps();
75
+ if (!deps.resolveRunDelivery)
76
+ return unavailable(c);
77
+ const runId = c.req.valid("param").runId;
78
+ const resolved = await deps.resolveRunDelivery(runId);
79
+ if (!resolved)
80
+ return notFound(c);
81
+ const queryCursor = c.req.valid("query").cursor;
82
+ const headerCursor = c.req.header("Last-Event-ID");
83
+ if (queryCursor !== undefined && headerCursor !== undefined && queryCursor !== headerCursor) {
84
+ return c.json({
85
+ ok: false,
86
+ error: "cursor and Last-Event-ID must match when both are supplied",
87
+ code: "RUN_CURSOR_CONFLICT",
88
+ }, 400);
89
+ }
90
+ const cursor = queryCursor ?? headerCursor;
91
+ c.header("Cache-Control", "no-cache, no-transform");
92
+ c.header("X-Accel-Buffering", "no");
93
+ try {
94
+ parseRunEventCursor(cursor);
95
+ const availability = await inspectRunEventCursor(resolved.eventStore, runId, cursor);
96
+ if (availability === "terminal")
97
+ c.header("x-polpo-run-terminal", "true");
98
+ }
99
+ catch (error) {
100
+ if (error instanceof RunEventCursorExpiredError) {
101
+ return c.json({
102
+ ok: false,
103
+ error: error.message,
104
+ code: "RUN_CURSOR_EXPIRED",
105
+ }, 410);
106
+ }
107
+ if (error instanceof RunEventCursorAheadError) {
108
+ return c.json({
109
+ ok: false,
110
+ error: error.message,
111
+ code: "RUN_CURSOR_AHEAD",
112
+ }, 400);
113
+ }
114
+ if (error instanceof RunDeliveryValidationError) {
115
+ return c.json({
116
+ ok: false,
117
+ error: error.message,
118
+ code: "INVALID_RUN_CURSOR",
119
+ }, 400);
120
+ }
121
+ throw error;
122
+ }
123
+ return streamSSE(c, async (stream) => {
124
+ const followerController = new AbortController();
125
+ stream.onAbort(() => followerController.abort());
126
+ const heartbeat = setInterval(() => {
127
+ if (followerController.signal.aborted)
128
+ return;
129
+ stream.write(": ping\n\n").catch(() => followerController.abort());
130
+ }, 20_000);
131
+ try {
132
+ for await (const event of followRunEvents({
133
+ runId,
134
+ store: resolved.eventStore,
135
+ notifier: resolved.notifier,
136
+ cursor,
137
+ signal: followerController.signal,
138
+ })) {
139
+ await stream.writeSSE({
140
+ id: String(event.sequence),
141
+ event: "run.event",
142
+ data: JSON.stringify(event),
143
+ });
144
+ }
145
+ }
146
+ finally {
147
+ clearInterval(heartbeat);
148
+ }
149
+ });
150
+ });
151
+ app.openapi(cancelRoute, async (c) => {
152
+ const deps = getDeps();
153
+ if (!deps.resolveRunDelivery)
154
+ return unavailable(c);
155
+ const runId = c.req.valid("param").runId;
156
+ const resolved = await deps.resolveRunDelivery(runId);
157
+ if (!resolved)
158
+ return notFound(c);
159
+ const body = c.req.valid("json");
160
+ if (await hasTerminalRunEvent(resolved.eventStore, runId)) {
161
+ await resolved.cancellationStore.clear(runId);
162
+ return c.json({ ok: true, data: { runId, accepted: false } }, 202);
163
+ }
164
+ const existing = await resolved.cancellationStore.get(runId);
165
+ const now = deps.now?.() ?? new Date();
166
+ if (!(now instanceof Date) || !Number.isFinite(now.getTime())) {
167
+ throw new RunDeliveryValidationError("Run delivery clock returned an invalid date");
168
+ }
169
+ await resolved.cancellationStore.request(runId, {
170
+ requestedAt: now.toISOString(),
171
+ ...(body.reason ? { reason: body.reason } : {}),
172
+ });
173
+ if (await hasTerminalRunEvent(resolved.eventStore, runId)) {
174
+ await resolved.cancellationStore.clear(runId);
175
+ return c.json({ ok: true, data: { runId, accepted: false } }, 202);
176
+ }
177
+ return c.json({ ok: true, data: { runId, accepted: existing === null } }, 202);
178
+ });
179
+ return app;
180
+ }
181
+ async function hasTerminalRunEvent(eventStore, runId) {
182
+ const bounds = await eventStore.bounds(runId);
183
+ if (!bounds)
184
+ return false;
185
+ const lastSequence = Number(bounds.lastCursor);
186
+ if (!Number.isSafeInteger(lastSequence) || lastSequence < 1)
187
+ return false;
188
+ const page = await eventStore.listAfter(runId, String(lastSequence - 1), 1);
189
+ const lastEvent = page.events[0];
190
+ return lastEvent ? isTerminalRunStreamEvent(lastEvent) : false;
191
+ }
192
+ function unavailable(c) {
193
+ return c.json({
194
+ ok: false,
195
+ error: "Durable run delivery is not configured",
196
+ code: "RUN_DELIVERY_UNAVAILABLE",
197
+ }, 501);
198
+ }
199
+ function notFound(c) {
200
+ return c.json({ ok: false, error: "Run not found", code: "RUN_NOT_FOUND" }, 404);
201
+ }
202
+ //# sourceMappingURL=run-delivery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-delivery.js","sourceRoot":"","sources":["../../src/routes/run-delivery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=run-delivery.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-delivery.test.d.ts","sourceRoot":"","sources":["../../src/routes/run-delivery.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,124 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { InMemoryRunCancellationStore, InMemoryRunEventStore, } from "@polpo-ai/core/run-delivery";
3
+ import { InMemoryRunEventNotifier, RunEventJournal, } from "@polpo-ai/core/run-delivery-follower";
4
+ import { runDeliveryRoutes } from "./run-delivery.js";
5
+ function cancelRequest(runId, body = {}) {
6
+ return new Request(`http://localhost/${runId}/cancel`, {
7
+ method: "POST",
8
+ headers: { "content-type": "application/json" },
9
+ body: JSON.stringify(body),
10
+ });
11
+ }
12
+ describe("runDeliveryRoutes", () => {
13
+ it("requires the configured bearer API key", async () => {
14
+ const app = runDeliveryRoutes(() => ({ resolveRunDelivery: async () => null }), ["secret"]);
15
+ const denied = await app.request("/run-a/events");
16
+ expect(denied.status).toBe(401);
17
+ const allowed = await app.request("/run-a/events", {
18
+ headers: { Authorization: "Bearer secret" },
19
+ });
20
+ expect(allowed.status).toBe(404);
21
+ });
22
+ it("returns 501 when the host has no durable run resolver", async () => {
23
+ const response = await runDeliveryRoutes(() => ({})).request("http://localhost/run-a/events");
24
+ expect(response.status).toBe(501);
25
+ expect(await response.json()).toMatchObject({ code: "RUN_DELIVERY_UNAVAILABLE" });
26
+ });
27
+ it("returns 404 without leaking an inaccessible run", async () => {
28
+ const app = runDeliveryRoutes(() => ({ resolveRunDelivery: async () => null }));
29
+ const events = await app.request("http://localhost/private/events");
30
+ const cancel = await app.request(cancelRequest("private"));
31
+ expect(events.status).toBe(404);
32
+ expect(cancel.status).toBe(404);
33
+ });
34
+ it("replays canonical events after a query cursor and ends at terminal", async () => {
35
+ const eventStore = new InMemoryRunEventStore();
36
+ const cancellationStore = new InMemoryRunCancellationStore();
37
+ const notifier = new InMemoryRunEventNotifier();
38
+ const journal = new RunEventJournal(eventStore, notifier);
39
+ await journal.append("run-a", { type: "run.started", data: {} });
40
+ await journal.append("run-a", {
41
+ type: "output.text.delta",
42
+ data: { text: "hello" },
43
+ });
44
+ await journal.append("run-a", { type: "run.completed", data: {} });
45
+ const app = runDeliveryRoutes(() => ({
46
+ resolveRunDelivery: async (runId) => runId === "run-a"
47
+ ? { eventStore, cancellationStore, notifier }
48
+ : null,
49
+ }));
50
+ const response = await app.request("http://localhost/run-a/events?cursor=1");
51
+ const body = await response.text();
52
+ expect(response.status).toBe(200);
53
+ expect(response.headers.get("content-type")).toContain("text/event-stream");
54
+ expect(body).not.toContain('"sequence":1');
55
+ expect(body).toContain('"sequence":2');
56
+ expect(body).toContain('"sequence":3');
57
+ expect(body).toContain("id: 2");
58
+ expect(body).toContain("id: 3");
59
+ });
60
+ it("accepts Last-Event-ID and rejects a conflicting query cursor", async () => {
61
+ const eventStore = new InMemoryRunEventStore();
62
+ const cancellationStore = new InMemoryRunCancellationStore();
63
+ await eventStore.append("run-a", { type: "run.completed", data: {} });
64
+ const app = runDeliveryRoutes(() => ({
65
+ resolveRunDelivery: async () => ({ eventStore, cancellationStore }),
66
+ }));
67
+ const resumed = await app.request(new Request("http://localhost/run-a/events", {
68
+ headers: { "last-event-id": "0" },
69
+ }));
70
+ expect(resumed.status).toBe(200);
71
+ expect(await resumed.text()).toContain('"sequence":1');
72
+ const conflict = await app.request(new Request("http://localhost/run-a/events?cursor=1", {
73
+ headers: { "last-event-id": "2" },
74
+ }));
75
+ expect(conflict.status).toBe(400);
76
+ expect(await conflict.json()).toMatchObject({ code: "RUN_CURSOR_CONFLICT" });
77
+ });
78
+ it("closes an already-acknowledged terminal stream and rejects ahead cursors", async () => {
79
+ const eventStore = new InMemoryRunEventStore();
80
+ const cancellationStore = new InMemoryRunCancellationStore();
81
+ await eventStore.append("run-a", { type: "run.completed", data: {} });
82
+ const app = runDeliveryRoutes(() => ({
83
+ resolveRunDelivery: async () => ({ eventStore, cancellationStore }),
84
+ }));
85
+ const terminal = await app.request("http://localhost/run-a/events?cursor=1");
86
+ expect(terminal.status).toBe(200);
87
+ expect(terminal.headers.get("x-polpo-run-terminal")).toBe("true");
88
+ expect(await terminal.text()).toBe("");
89
+ const ahead = await app.request("http://localhost/run-a/events?cursor=2");
90
+ expect(ahead.status).toBe(400);
91
+ expect(await ahead.json()).toMatchObject({ code: "RUN_CURSOR_AHEAD" });
92
+ });
93
+ it("persists explicit cancellation idempotently", async () => {
94
+ const eventStore = new InMemoryRunEventStore();
95
+ const cancellationStore = new InMemoryRunCancellationStore();
96
+ const app = runDeliveryRoutes(() => ({
97
+ resolveRunDelivery: async () => ({ eventStore, cancellationStore }),
98
+ }));
99
+ const first = await app.request(cancelRequest("run-a", { reason: "user_request" }));
100
+ const duplicate = await app.request(cancelRequest("run-a", { reason: "duplicate" }));
101
+ expect(first.status).toBe(202);
102
+ expect(duplicate.status).toBe(202);
103
+ const persisted = await cancellationStore.get("run-a");
104
+ expect(persisted?.reason).toBe("user_request");
105
+ expect(await first.json()).toMatchObject({ ok: true, data: { runId: "run-a", accepted: true } });
106
+ expect(await duplicate.json()).toMatchObject({ ok: true, data: { runId: "run-a", accepted: false } });
107
+ });
108
+ it("does not persist cancellation for an already terminal run", async () => {
109
+ const eventStore = new InMemoryRunEventStore();
110
+ const cancellationStore = new InMemoryRunCancellationStore();
111
+ await eventStore.append("run-a", { type: "run.completed", data: {} });
112
+ const app = runDeliveryRoutes(() => ({
113
+ resolveRunDelivery: async () => ({ eventStore, cancellationStore }),
114
+ }));
115
+ const response = await app.request(cancelRequest("run-a", { reason: "too late" }));
116
+ expect(response.status).toBe(202);
117
+ expect(await response.json()).toMatchObject({
118
+ ok: true,
119
+ data: { runId: "run-a", accepted: false },
120
+ });
121
+ expect(await cancellationStore.get("run-a")).toBeNull();
122
+ });
123
+ });
124
+ //# sourceMappingURL=run-delivery.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-delivery.test.js","sourceRoot":"","sources":["../../src/routes/run-delivery.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polpo-ai/server",
3
- "version": "0.15.76",
3
+ "version": "0.15.77",
4
4
  "description": "Polpo API route factories — edge-compatible Hono routes for tasks, agents, missions, vault, and more",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -20,12 +20,12 @@
20
20
  "hono": ">=4.0.0",
21
21
  "nanoid": ">=5.0.0",
22
22
  "typescript": "^5.7.3",
23
- "@polpo-ai/connect": "0.15.76",
24
- "@polpo-ai/channels": "0.15.76",
25
- "@polpo-ai/core": "0.15.76",
26
- "@polpo-ai/llm": "0.15.76",
27
- "@polpo-ai/connect-server": "0.15.76",
28
- "@polpo-ai/tools": "0.15.76"
23
+ "@polpo-ai/channels": "0.15.77",
24
+ "@polpo-ai/connect": "0.15.77",
25
+ "@polpo-ai/connect-server": "0.15.77",
26
+ "@polpo-ai/core": "0.15.77",
27
+ "@polpo-ai/llm": "0.15.77",
28
+ "@polpo-ai/tools": "0.15.77"
29
29
  },
30
30
  "peerDependencies": {
31
31
  "ai": ">=6.0.182 <7",