@polpo-ai/server 0.15.59 → 0.15.61
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.
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/routes/completions/chat-handler.d.ts +5 -0
- package/dist/routes/completions/chat-handler.d.ts.map +1 -1
- package/dist/routes/completions/chat-handler.js +42 -13
- package/dist/routes/completions/chat-handler.js.map +1 -1
- package/dist/routes/completions/chat-via-run-handler.d.ts +6 -1
- package/dist/routes/completions/chat-via-run-handler.d.ts.map +1 -1
- package/dist/routes/completions/chat-via-run-handler.js +95 -32
- package/dist/routes/completions/chat-via-run-handler.js.map +1 -1
- package/dist/routes/completions/chat-via-run-handler.test.js +62 -0
- package/dist/routes/completions/chat-via-run-handler.test.js.map +1 -1
- package/dist/routes/completions/conversation-turn.d.ts.map +1 -1
- package/dist/routes/completions/conversation-turn.js +5 -0
- package/dist/routes/completions/conversation-turn.js.map +1 -1
- package/dist/routes/completions/runtime-plan-hook.test.js +43 -0
- package/dist/routes/completions/runtime-plan-hook.test.js.map +1 -1
- package/dist/routes/completions/schemas.d.ts +41 -0
- package/dist/routes/completions/schemas.d.ts.map +1 -1
- package/dist/routes/completions/schemas.js +24 -0
- package/dist/routes/completions/schemas.js.map +1 -1
- package/dist/routes/completions/schemas.test.js +43 -0
- package/dist/routes/completions/schemas.test.js.map +1 -1
- package/dist/routes/completions/sse.d.ts +7 -1
- package/dist/routes/completions/sse.d.ts.map +1 -1
- package/dist/routes/completions/sse.js +17 -0
- package/dist/routes/completions/sse.js.map +1 -1
- package/dist/routes/completions/structured-output.d.ts +20 -0
- package/dist/routes/completions/structured-output.d.ts.map +1 -0
- package/dist/routes/completions/structured-output.js +82 -0
- package/dist/routes/completions/structured-output.js.map +1 -0
- package/dist/routes/completions/structured-output.test.d.ts +2 -0
- package/dist/routes/completions/structured-output.test.d.ts.map +1 -0
- package/dist/routes/completions/structured-output.test.js +54 -0
- package/dist/routes/completions/structured-output.test.js.map +1 -0
- package/dist/routes/completions.d.ts +16 -0
- package/dist/routes/completions.d.ts.map +1 -1
- package/dist/routes/completions.js +1 -0
- package/dist/routes/completions.js.map +1 -1
- package/dist/routes/run-steering.d.ts +7 -0
- package/dist/routes/run-steering.d.ts.map +1 -0
- package/dist/routes/run-steering.js +133 -0
- package/dist/routes/run-steering.js.map +1 -0
- package/dist/routes/run-steering.test.d.ts +2 -0
- package/dist/routes/run-steering.test.d.ts.map +1 -0
- package/dist/routes/run-steering.test.js +95 -0
- package/dist/routes/run-steering.test.js.map +1 -0
- package/package.json +6 -6
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Output, jsonSchema } from "ai";
|
|
2
|
+
import { validateJsonSchema } from "@polpo-ai/llm";
|
|
3
|
+
export class CompletionStructuredOutputError extends Error {
|
|
4
|
+
code = "invalid_response_format_output";
|
|
5
|
+
param = "response_format";
|
|
6
|
+
constructor(message, options) {
|
|
7
|
+
super(message, options);
|
|
8
|
+
this.name = "CompletionStructuredOutputError";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function isStructuredResponseFormat(format) {
|
|
12
|
+
return format?.type === "json_object" || format?.type === "json_schema";
|
|
13
|
+
}
|
|
14
|
+
function schemaValidator(schema) {
|
|
15
|
+
return async (value) => {
|
|
16
|
+
const result = await validateJsonSchema(schema, value);
|
|
17
|
+
return result.success
|
|
18
|
+
? result
|
|
19
|
+
: {
|
|
20
|
+
success: false,
|
|
21
|
+
error: new CompletionStructuredOutputError(`Model output does not match response_format: ${result.error.message}`, { cause: result.error }),
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/** Translate the OpenAI wire format into the provider-neutral AI SDK output contract. */
|
|
26
|
+
export function modelOutputForResponseFormat(format) {
|
|
27
|
+
if (!format || format.type === "text")
|
|
28
|
+
return undefined;
|
|
29
|
+
if (format.type === "json_object") {
|
|
30
|
+
return Output.json();
|
|
31
|
+
}
|
|
32
|
+
return Output.object({
|
|
33
|
+
schema: jsonSchema(format.json_schema.schema, {
|
|
34
|
+
validate: schemaValidator(format.json_schema.schema),
|
|
35
|
+
}),
|
|
36
|
+
name: format.json_schema.name,
|
|
37
|
+
description: format.json_schema.description,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Canonicalize and revalidate the final assistant text after output policies.
|
|
42
|
+
* OpenAI chat completions expose structured output as a JSON string in
|
|
43
|
+
* `message.content`, not as a second proprietary response field.
|
|
44
|
+
*/
|
|
45
|
+
export async function finalizeResponseFormatText(format, text) {
|
|
46
|
+
if (!isStructuredResponseFormat(format))
|
|
47
|
+
return text;
|
|
48
|
+
let value;
|
|
49
|
+
try {
|
|
50
|
+
value = JSON.parse(text);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
throw new CompletionStructuredOutputError("Model output is not valid JSON for response_format.", { cause: error });
|
|
54
|
+
}
|
|
55
|
+
if (format?.type === "json_object") {
|
|
56
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
57
|
+
throw new CompletionStructuredOutputError("Model output must be a JSON object for response_format type json_object.");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else if (format?.type === "json_schema") {
|
|
61
|
+
const validation = await validateJsonSchema(format.json_schema.schema, value);
|
|
62
|
+
if (!validation.success) {
|
|
63
|
+
throw new CompletionStructuredOutputError(`Model output does not match response_format: ${validation.error.message}`, { cause: validation.error });
|
|
64
|
+
}
|
|
65
|
+
value = validation.value;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
return JSON.stringify(value);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
throw new CompletionStructuredOutputError("Model output could not be serialized as JSON.", { cause: error });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export async function serializeModelOutput(format, output, rawText) {
|
|
75
|
+
if (!isStructuredResponseFormat(format))
|
|
76
|
+
return rawText;
|
|
77
|
+
if (output === undefined) {
|
|
78
|
+
throw new CompletionStructuredOutputError("The model completed without producing the requested structured output.");
|
|
79
|
+
}
|
|
80
|
+
return await finalizeResponseFormatText(format, JSON.stringify(output));
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=structured-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-output.js","sourceRoot":"","sources":["../../../src/routes/completions/structured-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-output.test.d.ts","sourceRoot":"","sources":["../../../src/routes/completions/structured-output.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { CompletionStructuredOutputError, finalizeResponseFormatText, modelOutputForResponseFormat, } from "./structured-output.js";
|
|
3
|
+
const profileFormat = {
|
|
4
|
+
type: "json_schema",
|
|
5
|
+
json_schema: {
|
|
6
|
+
name: "user_profile",
|
|
7
|
+
strict: true,
|
|
8
|
+
schema: {
|
|
9
|
+
type: "object",
|
|
10
|
+
properties: {
|
|
11
|
+
name: { type: "string" },
|
|
12
|
+
plan: { type: "string", enum: ["free", "pro"] },
|
|
13
|
+
},
|
|
14
|
+
required: ["name", "plan"],
|
|
15
|
+
additionalProperties: false,
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
describe("OpenAI response_format translation", () => {
|
|
20
|
+
it("keeps text generation on the legacy path", () => {
|
|
21
|
+
expect(modelOutputForResponseFormat(undefined)).toBeUndefined();
|
|
22
|
+
expect(modelOutputForResponseFormat({ type: "text" })).toBeUndefined();
|
|
23
|
+
});
|
|
24
|
+
it("builds a named provider-neutral JSON Schema output", async () => {
|
|
25
|
+
const output = modelOutputForResponseFormat(profileFormat);
|
|
26
|
+
expect(await output?.responseFormat).toEqual({
|
|
27
|
+
type: "json",
|
|
28
|
+
schema: profileFormat.json_schema.schema,
|
|
29
|
+
name: "user_profile",
|
|
30
|
+
description: undefined,
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
it("uses provider-native JSON mode for json_object", async () => {
|
|
34
|
+
const output = modelOutputForResponseFormat({ type: "json_object" });
|
|
35
|
+
expect(await output?.responseFormat).toEqual({ type: "json" });
|
|
36
|
+
});
|
|
37
|
+
it("canonicalizes a valid schema output", async () => {
|
|
38
|
+
await expect(finalizeResponseFormatText(profileFormat, '{ "name": "Ada", "plan": "pro" }')).resolves.toBe('{"name":"Ada","plan":"pro"}');
|
|
39
|
+
});
|
|
40
|
+
it.each([
|
|
41
|
+
'{"name":"Ada"}',
|
|
42
|
+
'{"name":"Ada","plan":"enterprise"}',
|
|
43
|
+
'{"name":"Ada","plan":"pro","extra":true}',
|
|
44
|
+
"not-json",
|
|
45
|
+
])("rejects output that violates json_schema: %s", async (text) => {
|
|
46
|
+
await expect(finalizeResponseFormatText(profileFormat, text))
|
|
47
|
+
.rejects.toBeInstanceOf(CompletionStructuredOutputError);
|
|
48
|
+
});
|
|
49
|
+
it("requires json_object to have an object root", async () => {
|
|
50
|
+
await expect(finalizeResponseFormatText({ type: "json_object" }, "[]"))
|
|
51
|
+
.rejects.toMatchObject({ code: "invalid_response_format_output" });
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=structured-output.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-output.test.js","sourceRoot":"","sources":["../../../src/routes/completions/structured-output.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,+BAA+B,EAC/B,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC;AAEhC,MAAM,aAAa,GAAG;IACpB,IAAI,EAAE,aAAsB;IAC5B,WAAW,EAAE;QACX,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACxB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;aAChD;YACD,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;YAC1B,oBAAoB,EAAE,KAAK;SAC5B;KACF;CACF,CAAC;AAEF,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,4BAA4B,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAChE,MAAM,CAAC,4BAA4B,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,MAAM,GAAG,4BAA4B,CAAC,aAAa,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,MAAM,EAAE,cAAc,CAAC,CAAC,OAAO,CAAC;YAC3C,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,MAAM;YACxC,IAAI,EAAE,cAAc;YACpB,WAAW,EAAE,SAAS;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,MAAM,GAAG,4BAA4B,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,MAAM,MAAM,EAAE,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,MAAM,CAAC,0BAA0B,CACrC,aAAa,EACb,kCAAkC,CACnC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,gBAAgB;QAChB,oCAAoC;QACpC,0CAA0C;QAC1C,UAAU;KACX,CAAC,CAAC,8CAA8C,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAChE,MAAM,MAAM,CAAC,0BAA0B,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;aAC1D,OAAO,CAAC,cAAc,CAAC,+BAA+B,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,MAAM,CAAC,0BAA0B,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,IAAI,CAAC,CAAC;aACpE,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -32,6 +32,7 @@ import { OpenAPIHono } from "@hono/zod-openapi";
|
|
|
32
32
|
import { type ExecutionRouteClassifier, type ExecutionRouteClassifierResolverContext, type LoopRunStore, type ProfiledModelSelection, type ProjectLoopConfig, type RuntimeDecisionSource, type RuntimeContextProvider, type RuntimeInvocationSource, type RuntimePlan, type RunToolMiddleware, type RuntimeSurface, type RuntimeSandboxOptions } from "@polpo-ai/core";
|
|
33
33
|
import type { ApprovalStore } from "@polpo-ai/core/approval-store";
|
|
34
34
|
import type { ChatSessionInjection } from "@polpo-ai/core";
|
|
35
|
+
import type { SteeringController } from "@polpo-ai/core/steering";
|
|
35
36
|
import type { CompletionResolvedModelInfo, ResolvedModelInfo } from "./completions/agent-step-runner.js";
|
|
36
37
|
import type { RunOutputPolicy, RunPreflightPolicy, RuntimeGuardrailRequestPolicy, RuntimeOutputEnforcementMode } from "@polpo-ai/core/guardrails";
|
|
37
38
|
import type { CompletionToolExecutor } from "./completions/tool-guardrails.js";
|
|
@@ -199,6 +200,10 @@ export interface CompletionRouteDeps {
|
|
|
199
200
|
runChatViaRun?: (inject: ChatSessionInjection, hooks: {
|
|
200
201
|
onEvent: (e: Record<string, unknown>) => void;
|
|
201
202
|
signal?: AbortSignal;
|
|
203
|
+
/** Stable public run id used by steering and observability adapters. */
|
|
204
|
+
runId?: string;
|
|
205
|
+
/** Host-created controller already registered before response headers. */
|
|
206
|
+
steering?: SteeringController;
|
|
202
207
|
}) => Promise<{
|
|
203
208
|
status: string;
|
|
204
209
|
result: {
|
|
@@ -207,6 +212,17 @@ export interface CompletionRouteDeps {
|
|
|
207
212
|
stderr: string;
|
|
208
213
|
};
|
|
209
214
|
}>;
|
|
215
|
+
/**
|
|
216
|
+
* Register an active run before a streaming response becomes visible.
|
|
217
|
+
* Distributed hosts can back this with a durable command transport.
|
|
218
|
+
*/
|
|
219
|
+
createRunSteeringScope?: (runId: string) => {
|
|
220
|
+
steering: SteeringController;
|
|
221
|
+
release: () => void | Promise<void>;
|
|
222
|
+
} | Promise<{
|
|
223
|
+
steering: SteeringController;
|
|
224
|
+
release: () => void | Promise<void>;
|
|
225
|
+
}>;
|
|
210
226
|
/** Orchestrator mode support (optional — returns 501 if not provided). */
|
|
211
227
|
resolveOrchestratorContext?: () => Promise<{
|
|
212
228
|
systemPrompt: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completions.d.ts","sourceRoot":"","sources":["../../src/routes/completions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,uCAAuC,EAC5C,KAAK,YAAY,EAEjB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"completions.d.ts","sourceRoot":"","sources":["../../src/routes/completions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,uCAAuC,EAC5C,KAAK,YAAY,EAEjB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,KAAK,EACV,2BAA2B,EAC3B,iBAAiB,EAClB,MAAM,oCAAoC,CAAC;AAQ5C,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,6BAA6B,EAC7B,4BAA4B,EAC7B,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,kCAAkC,CAAC;AAE5F,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,KAAK,oBAAoB,GAC1B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,8BAA8B,EAC9B,mBAAmB,EACnB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,GAC9B,MAAM,oCAAoC,CAAC;AAI5C;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,GAAG,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,GAAG,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,CAAC;IACpB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IACzC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,CACnB,KAAK,EAAE,0BAA0B,KAC9B,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACxC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC;;;OAGG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,iFAAiF;IACjF,sBAAsB,CAAC,EAAE,4BAA4B,CAAC;IACtD;;;OAGG;IACH,wBAAwB,CAAC,EAAE,mCAAmC,CAAC;IAC/D;;;OAGG;IACH,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC;;;OAGG;IACH,+BAA+B,CAAC,EAAE,CAChC,OAAO,EAAE,uCAAuC,KAE7C,wBAAwB,GACxB,SAAS,GACT,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAAC;IACnD,wIAAwI;IACxI,iBAAiB,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE,iBAAiB,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;QAC3E,KAAK,EAAE,iBAAiB,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACvC,CAAC,CAAC;IACH,yDAAyD;IACzD,gBAAgB,EAAE,CAAC,WAAW,EAAE,GAAG,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjE;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,CACnB,WAAW,EAAE,GAAG,EAChB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAC3B,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,kBAAkB,EAAE,OAAO,CAAC;QAC5B,mBAAmB,EAAE,OAAO,CAAC;KAC9B,KACE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B;;;;;;;;;gEAS4D;IAC5D,iBAAiB,EAAE,CACjB,WAAW,EAAE,GAAG,EAChB,QAAQ,CAAC,EAAE,sBAAsB,KAC9B,OAAO,CAAC;QACX,KAAK,EAAE,GAAG,EAAE,CAAC;QACb;;;;WAIG;QACH,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC;QACrB,QAAQ,EAAE,sBAAsB,CAAC;QACjC;;;;WAIG;QACH,eAAe,CAAC,EAAE,sBAAsB,CAAC;QACzC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACnC;;;WAGG;QACH,UAAU,CAAC,EAAE,mCAAmC,CAAC;KAClD,CAAC,CAAC;IACH;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,CACnB,KAAK,EAAE,2BAA2B,KAC/B,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC9D,uHAAuH;IACvH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IACrE,8DAA8D;IAC9D,eAAe,CAAC,EAAE,MAAM,YAAY,GAAG,SAAS,CAAC;IACjD,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,MAAM,aAAa,GAAG,SAAS,CAAC;IACnD,4KAA4K;IAC5K,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE;QAC5B,KAAK,EAAE;YAAE,WAAW,CAAC,EAAE,MAAM,CAAC;YAAC,YAAY,CAAC,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7E,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,CAAC,EAAE,2BAA2B,CAAC;QAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB;mFAC2E;QAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC5C,KAAK,IAAI,CAAC;IACX;;;;oCAIgC;IAChC,aAAa,CAAC,EAAE,CACd,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE;QACL,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;QAC9C,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,wEAAwE;QACxE,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,0EAA0E;QAC1E,QAAQ,CAAC,EAAE,kBAAkB,CAAC;KAC/B,KACE,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC,CAAC;IAC/F;;;OAGG;IACH,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK;QAC1C,QAAQ,EAAE,kBAAkB,CAAC;QAC7B,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACrC,GAAG,OAAO,CAAC;QACV,QAAQ,EAAE,kBAAkB,CAAC;QAC7B,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACrC,CAAC,CAAC;IACH,0EAA0E;IAC1E,0BAA0B,CAAC,EAAE,MAAM,OAAO,CAAC;QACzC,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,iBAAiB,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACtC,KAAK,EAAE,GAAG,EAAE,CAAC;QACb,QAAQ,EAAE,sBAAsB,CAAC;QACjC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;KAC1C,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAC9C,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IAChD,QAAQ,CAAC,sBAAsB,CAAC,EAAE,4BAA4B,CAAC;CAChE;AAED,MAAM,MAAM,mCAAmC,GAAG,CAChD,OAAO,EAAE,6BAA6B,KAEpC,2BAA2B,GAC3B,OAAO,CAAC,2BAA2B,CAAC,CAAC;AAEzC,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;QAC3B,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,qBAAqB,CAAC;KAC/B,CAAC,CAAC;IACH,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;QACzB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,qBAAqB,CAAC;KACjC,CAAC,CAAC;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,sBAAsB,CAAC;QAC/B,OAAO,CAAC,EAAE,qBAAqB,CAAC;QAChC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;KAClC,CAAC,CAAC;CACJ;AAED;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,mBAAmB,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,WAAW,CAwEpG"}
|
|
@@ -87,6 +87,7 @@ export function completionRoutes(getDeps, apiKeys) {
|
|
|
87
87
|
}
|
|
88
88
|
const { execution, viaRun } = prepared;
|
|
89
89
|
if (viaRun) {
|
|
90
|
+
c.header("x-polpo-run-id", execution.completionId);
|
|
90
91
|
return (body.stream
|
|
91
92
|
? await streamChatViaRun(c, execution)
|
|
92
93
|
: await runNonStreamingChatViaRun(c, execution));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completions.js","sourceRoot":"","sources":["../../src/routes/completions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"completions.js","sourceRoot":"","sources":["../../src/routes/completions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { OpenAPIHono } from "@hono/zod-openapi";
|
|
2
|
+
import { type SteeringRunRegistry } from "@polpo-ai/core/steering";
|
|
3
|
+
export interface RunSteeringRouteDeps {
|
|
4
|
+
steeringRegistry?: SteeringRunRegistry;
|
|
5
|
+
}
|
|
6
|
+
export declare function runSteeringRoutes(getDeps: () => RunSteeringRouteDeps): OpenAPIHono;
|
|
7
|
+
//# sourceMappingURL=run-steering.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-steering.d.ts","sourceRoot":"","sources":["../../src/routes/run-steering.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAChE,OAAO,EASL,KAAK,mBAAmB,EACzB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;CACxC;AA+ED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,oBAAoB,GAAG,WAAW,CAsClF"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
|
|
2
|
+
import { SteeringAbortError, SteeringClosedError, SteeringQueueFullError, SteeringRunConflictError, SteeringRunNotFoundError, SteeringValidationError, } from "@polpo-ai/core/steering";
|
|
3
|
+
const attachmentSchema = z.object({
|
|
4
|
+
type: z.enum(["image", "audio", "file"]),
|
|
5
|
+
url: z.string().min(1),
|
|
6
|
+
mediaType: z.string().min(1).max(127).optional(),
|
|
7
|
+
name: z.string().min(1).max(255).optional(),
|
|
8
|
+
}).strict();
|
|
9
|
+
const steeringBodySchema = z.object({
|
|
10
|
+
id: z.string().min(1).max(128),
|
|
11
|
+
mode: z.enum(["steer", "follow_up"]),
|
|
12
|
+
content: z.object({
|
|
13
|
+
text: z.string().optional(),
|
|
14
|
+
attachments: z.array(attachmentSchema).max(16).optional(),
|
|
15
|
+
}).strict(),
|
|
16
|
+
metadata: z.record(z.string(), z.unknown()).optional(),
|
|
17
|
+
}).strict();
|
|
18
|
+
const abortBodySchema = z.object({
|
|
19
|
+
reason: z.unknown().optional(),
|
|
20
|
+
}).strict();
|
|
21
|
+
const successSchema = z.object({
|
|
22
|
+
ok: z.literal(true),
|
|
23
|
+
data: z.object({
|
|
24
|
+
runId: z.string(),
|
|
25
|
+
id: z.string().optional(),
|
|
26
|
+
accepted: z.boolean().optional(),
|
|
27
|
+
duplicate: z.boolean().optional(),
|
|
28
|
+
aborted: z.boolean().optional(),
|
|
29
|
+
}),
|
|
30
|
+
});
|
|
31
|
+
const errorSchema = z.object({
|
|
32
|
+
ok: z.literal(false),
|
|
33
|
+
error: z.string(),
|
|
34
|
+
code: z.string(),
|
|
35
|
+
});
|
|
36
|
+
const steeringRoute = createRoute({
|
|
37
|
+
method: "post",
|
|
38
|
+
path: "/{runId}/steering",
|
|
39
|
+
tags: ["Runs"],
|
|
40
|
+
summary: "Steer an active run",
|
|
41
|
+
description: "Queue a user message for the next model/tool safe boundary. follow_up messages wait until the run would otherwise finish.",
|
|
42
|
+
request: {
|
|
43
|
+
params: z.object({ runId: z.string().min(1).max(128) }),
|
|
44
|
+
body: { content: { "application/json": { schema: steeringBodySchema } } },
|
|
45
|
+
},
|
|
46
|
+
responses: {
|
|
47
|
+
200: { content: { "application/json": { schema: successSchema } }, description: "Duplicate message already accepted" },
|
|
48
|
+
202: { content: { "application/json": { schema: successSchema } }, description: "Message accepted" },
|
|
49
|
+
400: { content: { "application/json": { schema: errorSchema } }, description: "Invalid steering message" },
|
|
50
|
+
404: { content: { "application/json": { schema: errorSchema } }, description: "Active run not found" },
|
|
51
|
+
409: { content: { "application/json": { schema: errorSchema } }, description: "Run is no longer accepting messages" },
|
|
52
|
+
429: { content: { "application/json": { schema: errorSchema } }, description: "Run steering queue is full" },
|
|
53
|
+
501: { content: { "application/json": { schema: errorSchema } }, description: "Host does not support steering" },
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
const abortRoute = createRoute({
|
|
57
|
+
method: "post",
|
|
58
|
+
path: "/{runId}/abort",
|
|
59
|
+
tags: ["Runs"],
|
|
60
|
+
summary: "Abort an active run",
|
|
61
|
+
request: {
|
|
62
|
+
params: z.object({ runId: z.string().min(1).max(128) }),
|
|
63
|
+
body: { content: { "application/json": { schema: abortBodySchema } } },
|
|
64
|
+
},
|
|
65
|
+
responses: {
|
|
66
|
+
202: { content: { "application/json": { schema: successSchema } }, description: "Abort accepted" },
|
|
67
|
+
400: { content: { "application/json": { schema: errorSchema } }, description: "Invalid abort reason" },
|
|
68
|
+
404: { content: { "application/json": { schema: errorSchema } }, description: "Active run not found" },
|
|
69
|
+
501: { content: { "application/json": { schema: errorSchema } }, description: "Host does not support steering" },
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
export function runSteeringRoutes(getDeps) {
|
|
73
|
+
const app = new OpenAPIHono();
|
|
74
|
+
app.openapi(steeringRoute, async (c) => {
|
|
75
|
+
const registry = getDeps().steeringRegistry;
|
|
76
|
+
if (!registry)
|
|
77
|
+
return unavailable(c);
|
|
78
|
+
const runId = c.req.valid("param").runId;
|
|
79
|
+
const input = c.req.valid("json");
|
|
80
|
+
try {
|
|
81
|
+
const result = await registry.enqueue(runId, input);
|
|
82
|
+
return c.json({
|
|
83
|
+
ok: true,
|
|
84
|
+
data: {
|
|
85
|
+
runId,
|
|
86
|
+
id: input.id,
|
|
87
|
+
accepted: result.accepted,
|
|
88
|
+
duplicate: result.duplicate,
|
|
89
|
+
},
|
|
90
|
+
}, result.duplicate ? 200 : 202);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
return steeringError(c, error);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
app.openapi(abortRoute, async (c) => {
|
|
97
|
+
const registry = getDeps().steeringRegistry;
|
|
98
|
+
if (!registry)
|
|
99
|
+
return unavailable(c);
|
|
100
|
+
const runId = c.req.valid("param").runId;
|
|
101
|
+
const body = c.req.valid("json");
|
|
102
|
+
try {
|
|
103
|
+
await registry.abort(runId, body.reason);
|
|
104
|
+
return c.json({ ok: true, data: { runId, aborted: true } }, 202);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
return steeringError(c, error);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
return app;
|
|
111
|
+
}
|
|
112
|
+
function unavailable(c) {
|
|
113
|
+
return c.json({ ok: false, error: "Run steering is not configured", code: "STEERING_UNAVAILABLE" }, 501);
|
|
114
|
+
}
|
|
115
|
+
function steeringError(c, error) {
|
|
116
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
117
|
+
if (error instanceof SteeringRunNotFoundError) {
|
|
118
|
+
return c.json({ ok: false, error: message, code: "RUN_NOT_ACTIVE" }, 404);
|
|
119
|
+
}
|
|
120
|
+
if (error instanceof SteeringQueueFullError) {
|
|
121
|
+
return c.json({ ok: false, error: message, code: "STEERING_QUEUE_FULL" }, 429);
|
|
122
|
+
}
|
|
123
|
+
if (error instanceof SteeringClosedError
|
|
124
|
+
|| error instanceof SteeringAbortError
|
|
125
|
+
|| error instanceof SteeringRunConflictError) {
|
|
126
|
+
return c.json({ ok: false, error: message, code: "RUN_NOT_ACCEPTING_STEERING" }, 409);
|
|
127
|
+
}
|
|
128
|
+
if (error instanceof SteeringValidationError) {
|
|
129
|
+
return c.json({ ok: false, error: message, code: "INVALID_STEERING_MESSAGE" }, 400);
|
|
130
|
+
}
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=run-steering.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-steering.js","sourceRoot":"","sources":["../../src/routes/run-steering.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-steering.test.d.ts","sourceRoot":"","sources":["../../src/routes/run-steering.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { InMemorySteeringController, InMemorySteeringRunRegistry, } from "@polpo-ai/core/steering";
|
|
3
|
+
import { runSteeringRoutes } from "./run-steering.js";
|
|
4
|
+
function request(path, body) {
|
|
5
|
+
return new Request(`http://localhost${path}`, {
|
|
6
|
+
method: "POST",
|
|
7
|
+
headers: { "content-type": "application/json" },
|
|
8
|
+
body: JSON.stringify(body),
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
describe("runSteeringRoutes", () => {
|
|
12
|
+
it("returns 501 when the host does not provide a steering registry", async () => {
|
|
13
|
+
const response = await runSteeringRoutes(() => ({})).request(request("/run-1/steering", {
|
|
14
|
+
id: "message-1",
|
|
15
|
+
mode: "steer",
|
|
16
|
+
content: { text: "change direction" },
|
|
17
|
+
}));
|
|
18
|
+
expect(response.status).toBe(501);
|
|
19
|
+
expect(await response.json()).toMatchObject({ code: "STEERING_UNAVAILABLE" });
|
|
20
|
+
});
|
|
21
|
+
it("accepts and deduplicates steering messages for an active run", async () => {
|
|
22
|
+
const registry = new InMemorySteeringRunRegistry();
|
|
23
|
+
const controller = new InMemorySteeringController();
|
|
24
|
+
registry.register("run-1", controller);
|
|
25
|
+
const app = runSteeringRoutes(() => ({ steeringRegistry: registry }));
|
|
26
|
+
const body = {
|
|
27
|
+
id: "message-1",
|
|
28
|
+
mode: "steer",
|
|
29
|
+
content: { text: "change direction" },
|
|
30
|
+
metadata: { channel: "telegram" },
|
|
31
|
+
};
|
|
32
|
+
const accepted = await app.request(request("/run-1/steering", body));
|
|
33
|
+
const duplicate = await app.request(request("/run-1/steering", body));
|
|
34
|
+
expect(accepted.status).toBe(202);
|
|
35
|
+
expect(await accepted.json()).toMatchObject({
|
|
36
|
+
ok: true,
|
|
37
|
+
data: { runId: "run-1", id: "message-1", accepted: true, duplicate: false },
|
|
38
|
+
});
|
|
39
|
+
expect(duplicate.status).toBe(200);
|
|
40
|
+
expect(await duplicate.json()).toMatchObject({
|
|
41
|
+
data: { accepted: false, duplicate: true },
|
|
42
|
+
});
|
|
43
|
+
expect(controller.snapshot().pending).toHaveLength(1);
|
|
44
|
+
});
|
|
45
|
+
it("maps validation, missing-run, closed-run, and queue pressure errors", async () => {
|
|
46
|
+
const registry = new InMemorySteeringRunRegistry();
|
|
47
|
+
const full = new InMemorySteeringController({ maxPending: 1 });
|
|
48
|
+
full.enqueue({ id: "first", mode: "steer", content: { text: "first" } });
|
|
49
|
+
registry.register("full", full);
|
|
50
|
+
const closed = new InMemorySteeringController();
|
|
51
|
+
closed.close();
|
|
52
|
+
registry.register("closed", closed);
|
|
53
|
+
const app = runSteeringRoutes(() => ({ steeringRegistry: registry }));
|
|
54
|
+
const malformed = await app.request(request("/full/steering", {
|
|
55
|
+
id: "bad",
|
|
56
|
+
mode: "steer",
|
|
57
|
+
content: {},
|
|
58
|
+
}));
|
|
59
|
+
const missing = await app.request(request("/missing/steering", {
|
|
60
|
+
id: "new",
|
|
61
|
+
mode: "steer",
|
|
62
|
+
content: { text: "hello" },
|
|
63
|
+
}));
|
|
64
|
+
const noCapacity = await app.request(request("/full/steering", {
|
|
65
|
+
id: "second",
|
|
66
|
+
mode: "steer",
|
|
67
|
+
content: { text: "second" },
|
|
68
|
+
}));
|
|
69
|
+
const inactive = await app.request(request("/closed/steering", {
|
|
70
|
+
id: "late",
|
|
71
|
+
mode: "steer",
|
|
72
|
+
content: { text: "late" },
|
|
73
|
+
}));
|
|
74
|
+
expect(malformed.status).toBe(400);
|
|
75
|
+
expect(missing.status).toBe(404);
|
|
76
|
+
expect(noCapacity.status).toBe(429);
|
|
77
|
+
expect(inactive.status).toBe(409);
|
|
78
|
+
});
|
|
79
|
+
it("aborts an active run and rejects later messages", async () => {
|
|
80
|
+
const registry = new InMemorySteeringRunRegistry();
|
|
81
|
+
const controller = new InMemorySteeringController();
|
|
82
|
+
registry.register("run-1", controller);
|
|
83
|
+
const app = runSteeringRoutes(() => ({ steeringRegistry: registry }));
|
|
84
|
+
const aborted = await app.request(request("/run-1/abort", { reason: "user cancelled" }));
|
|
85
|
+
const late = await app.request(request("/run-1/steering", {
|
|
86
|
+
id: "late",
|
|
87
|
+
mode: "steer",
|
|
88
|
+
content: { text: "late" },
|
|
89
|
+
}));
|
|
90
|
+
expect(aborted.status).toBe(202);
|
|
91
|
+
expect(controller.signal).toMatchObject({ aborted: true, reason: "user cancelled" });
|
|
92
|
+
expect(late.status).toBe(409);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=run-steering.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-steering.test.js","sourceRoot":"","sources":["../../src/routes/run-steering.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.
|
|
3
|
+
"version": "0.15.61",
|
|
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,11 +20,11 @@
|
|
|
20
20
|
"hono": ">=4.0.0",
|
|
21
21
|
"nanoid": ">=5.0.0",
|
|
22
22
|
"typescript": "^5.7.3",
|
|
23
|
-
"@polpo-ai/connect": "0.15.
|
|
24
|
-
"@polpo-ai/
|
|
25
|
-
"@polpo-ai/
|
|
26
|
-
"@polpo-ai/
|
|
27
|
-
"@polpo-ai/tools": "0.15.
|
|
23
|
+
"@polpo-ai/connect-server": "0.15.61",
|
|
24
|
+
"@polpo-ai/connect": "0.15.61",
|
|
25
|
+
"@polpo-ai/core": "0.15.61",
|
|
26
|
+
"@polpo-ai/llm": "0.15.61",
|
|
27
|
+
"@polpo-ai/tools": "0.15.61"
|
|
28
28
|
},
|
|
29
29
|
"peerDependencies": {
|
|
30
30
|
"ai": ">=6.0.0",
|