@polpo-ai/server 0.15.76 → 0.15.78

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 +41 -0
  14. package/dist/routes/completions/durable-stream.d.ts.map +1 -0
  15. package/dist/routes/completions/durable-stream.js +141 -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 +202 -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
@@ -0,0 +1,154 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { InMemoryRunCancellationStore, InMemoryRunEventStore, InMemoryRunExecutionLeaseStore, } from "@polpo-ai/core/run-delivery";
3
+ import { InMemoryRunEventNotifier } from "@polpo-ai/core/run-delivery-follower";
4
+ import { completionRoutes, } from "./completions.js";
5
+ function deliveryScope() {
6
+ return {
7
+ eventStore: new InMemoryRunEventStore(),
8
+ leaseStore: new InMemoryRunExecutionLeaseStore(),
9
+ cancellationStore: new InMemoryRunCancellationStore(),
10
+ notifier: new InMemoryRunEventNotifier(),
11
+ owner: "test-worker",
12
+ token: `attempt-${Math.random()}`,
13
+ };
14
+ }
15
+ function viaRunDeps(overrides = {}) {
16
+ return {
17
+ getAgents: async () => [{ name: "agent-1", role: "Test agent", model: "mock" }],
18
+ getConfig: () => ({ settings: { chatExecution: "run" } }),
19
+ getMemoryStore: () => null,
20
+ getSessionStore: () => null,
21
+ getStore: () => null,
22
+ emit: () => { },
23
+ resolveAgentModel: async () => ({
24
+ model: {
25
+ id: "mock-model",
26
+ provider: "mock",
27
+ runtimeMode: "provider",
28
+ aiModel: {},
29
+ contextWindow: 200_000,
30
+ maxTokens: 8192,
31
+ },
32
+ }),
33
+ buildAgentPrompt: () => "You are a test agent.",
34
+ resolveAgentTools: async () => ({ tools: [], executor: async () => "ok" }),
35
+ runChatViaRun: async (_inject, hooks) => {
36
+ hooks.onEvent({ type: "text-delta", text: "hello" });
37
+ return { status: "completed", result: { exitCode: 0, stdout: "hello", stderr: "" } };
38
+ },
39
+ ...overrides,
40
+ };
41
+ }
42
+ function loopDeps(scope) {
43
+ let time = 100;
44
+ return {
45
+ ...viaRunDeps(),
46
+ getConfig: () => ({}),
47
+ getAgents: async () => [{
48
+ name: "timer",
49
+ model: "mock",
50
+ assignedLoops: ["time-tracker"],
51
+ allowedTools: ["unix_time"],
52
+ }],
53
+ getProjectLoop: async (name) => ({
54
+ name,
55
+ start: "capture",
56
+ steps: {
57
+ capture: { type: "tool", tool: "unix_time", next: "end" },
58
+ },
59
+ }),
60
+ resolveAgentTools: async () => ({
61
+ tools: [{
62
+ name: "unix_time",
63
+ description: "Return the current time",
64
+ inputSchema: { type: "object", properties: {}, additionalProperties: false },
65
+ }],
66
+ executor: async () => String(time++),
67
+ }),
68
+ createRunDeliveryScope: async () => scope,
69
+ };
70
+ }
71
+ function request(body) {
72
+ return {
73
+ method: "POST",
74
+ headers: { "content-type": "application/json" },
75
+ body: JSON.stringify({
76
+ agent: "agent-1",
77
+ messages: [{ role: "user", content: "hello" }],
78
+ ...body,
79
+ }),
80
+ };
81
+ }
82
+ describe("completion durable delivery routing", () => {
83
+ it("rejects continue for non-streaming requests before execution", async () => {
84
+ const res = await completionRoutes(() => ({})).request("/", request({
85
+ stream: false,
86
+ polpo: { delivery: { onDisconnect: "continue" } },
87
+ }));
88
+ expect(res.status).toBe(400);
89
+ await expect(res.json()).resolves.toMatchObject({
90
+ error: { code: "durable_delivery_requires_streaming" },
91
+ });
92
+ });
93
+ it("fails explicitly when the host has no durable delivery scope", async () => {
94
+ const res = await completionRoutes(() => viaRunDeps()).request("/", request({
95
+ stream: true,
96
+ polpo: { delivery: { onDisconnect: "continue" } },
97
+ }));
98
+ expect(res.status).toBe(501);
99
+ await expect(res.json()).resolves.toMatchObject({
100
+ error: { code: "run_delivery_unavailable" },
101
+ });
102
+ });
103
+ it("journals and returns a via-run completion when continue is explicit", async () => {
104
+ const scope = deliveryScope();
105
+ const createRunDeliveryScope = vi.fn(async () => scope);
106
+ const res = await completionRoutes(() => viaRunDeps({ createRunDeliveryScope })).request("/", request({
107
+ stream: true,
108
+ polpo: { delivery: { onDisconnect: "continue" } },
109
+ }));
110
+ expect(res.status).toBe(200);
111
+ expect(res.headers.get("x-polpo-run-id")).toMatch(/^chatcmpl-/);
112
+ const body = await res.text();
113
+ expect(body).toContain("hello");
114
+ expect(body).toContain("[DONE]");
115
+ expect(createRunDeliveryScope).toHaveBeenCalledOnce();
116
+ const runId = res.headers.get("x-polpo-run-id");
117
+ expect((await scope.eventStore.listAfter(runId)).events.map((event) => event.type)).toEqual([
118
+ "run.started",
119
+ "response.chunk",
120
+ "response.chunk",
121
+ "response.chunk",
122
+ "response.done",
123
+ "run.completed",
124
+ ]);
125
+ });
126
+ it("keeps omitted delivery on the legacy attached path", async () => {
127
+ const createRunDeliveryScope = vi.fn(async () => deliveryScope());
128
+ const res = await completionRoutes(() => viaRunDeps({ createRunDeliveryScope })).request("/", request({
129
+ stream: true,
130
+ }));
131
+ expect(res.status).toBe(200);
132
+ expect(await res.text()).toContain("hello");
133
+ expect(createRunDeliveryScope).not.toHaveBeenCalled();
134
+ });
135
+ it("journals a deterministic project loop on the same delivery contract", async () => {
136
+ const scope = deliveryScope();
137
+ const res = await completionRoutes(() => loopDeps(scope)).request("/", request({
138
+ agent: "timer",
139
+ loop: "time-tracker",
140
+ stream: true,
141
+ polpo: { delivery: { onDisconnect: "continue" } },
142
+ }));
143
+ expect(res.status).toBe(200);
144
+ const body = await res.text();
145
+ expect(body).toContain("loop_trace");
146
+ expect(body).toContain("[DONE]");
147
+ const runId = res.headers.get("x-polpo-run-id");
148
+ const events = (await scope.eventStore.listAfter(runId)).events;
149
+ expect(events[0]?.type).toBe("run.started");
150
+ expect(events.at(-1)?.type).toBe("run.completed");
151
+ expect(events.some((event) => event.type === "response.done")).toBe(true);
152
+ });
153
+ });
154
+ //# sourceMappingURL=completions-durable-delivery.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completions-durable-delivery.test.js","sourceRoot":"","sources":["../../src/routes/completions-durable-delivery.test.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,7 @@ import type { ApprovalStore } from "@polpo-ai/core/approval-store";
34
34
  import type { ChatSessionInjection } from "@polpo-ai/core";
35
35
  import type { SteeringController } from "@polpo-ai/core/steering";
36
36
  import type { CompletionResolvedModelInfo, ResolvedModelInfo } from "./completions/agent-step-runner.js";
37
+ import { type CompletionRunDeliveryScope } from "./completions/durable-stream.js";
37
38
  import type { RunOutputPolicy, RunPreflightPolicy, RuntimeGuardrailRequestPolicy, RuntimeOutputEnforcementMode } from "@polpo-ai/core/guardrails";
38
39
  import type { CompletionToolExecutor } from "./completions/tool-guardrails.js";
39
40
  import type { ModelControlledToolDisclosureConfig } from "./completions/tool-disclosure.js";
@@ -57,6 +58,12 @@ export interface CompletionToolRunScopeInput {
57
58
  runtimePlan?: RuntimePlan;
58
59
  signal?: AbortSignal;
59
60
  }
61
+ export interface CompletionRunDeliveryScopeInput {
62
+ runId: string;
63
+ sessionId?: string;
64
+ agent?: string;
65
+ onDisconnect: "continue";
66
+ }
60
67
  /**
61
68
  * Completion route dependencies.
62
69
  *
@@ -179,6 +186,12 @@ export interface CompletionRouteDeps {
179
186
  * agent step, then cleaned exactly once after the outer loop finishes.
180
187
  */
181
188
  createToolRunScope?: (input: CompletionToolRunScopeInput) => CompletionToolRunScope | Promise<CompletionToolRunScope>;
189
+ /**
190
+ * Resolve durable, host-scoped stores for an explicitly detached completion.
191
+ * Omitted keeps the legacy cancel-on-disconnect path and rejects explicit
192
+ * continue requests rather than silently weakening their contract.
193
+ */
194
+ createRunDeliveryScope?: (input: CompletionRunDeliveryScopeInput) => CompletionRunDeliveryScope | Promise<CompletionRunDeliveryScope>;
182
195
  /** Optional project-level loop loader. When provided, assigned/default agent loops can run as deterministic graphs. */
183
196
  getProjectLoop?: (name: string) => Promise<ProjectLoopConfig | null>;
184
197
  /** Optional durable store for agentic loop runtime traces. */
@@ -1 +1 @@
1
- {"version":3,"file":"completions.d.ts","sourceRoot":"","sources":["../../src/routes/completions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"completions.d.ts","sourceRoot":"","sources":["../../src/routes/completions.ts"],"names":[],"mappings":"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"}
@@ -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