@polpo-ai/server 0.15.60 → 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/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 +5 -0
- package/dist/routes/completions/chat-via-run-handler.d.ts.map +1 -1
- package/dist/routes/completions/chat-via-run-handler.js +36 -14
- package/dist/routes/completions/chat-via-run-handler.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/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../../src/routes/completions/sse.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../../src/routes/completions/sse.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,IAAI,CAAC;AAGrE,wBAAgB,QAAQ,CACtB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAC1C,YAAY,GAAE,MAAM,GAAG,IAAW,EAClC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAaR;AAgCD,wFAAwF;AACxF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAStD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,sBAAsB,CAAC;CAC9B,CAMA;AAED,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,OAAO,EACZ,yBAAyB,UAAQ,GAChC;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,uBAAuB,CAAC;IAC9B,IAAI,EAAE,gCAAgC,CAAC;IACvC,KAAK,EAAE,iBAAiB,CAAC;CAC1B,GAAG,IAAI,CAeP;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,OAAO,EACZ,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,IAAI,CAYjG;AAED,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,OAAO,GACX;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,oBAAoB,CAAC;IAAC,IAAI,EAAE,qBAAqB,GAAG,yBAAyB,GAAG,wBAAwB,GAAG,kBAAkB,GAAG,sBAAsB,GAAG,sBAAsB,GAAG,uBAAuB,GAAG,yBAAyB,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgCzT;AAED,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,OAAO,GACX;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,mBAAmB,GAAG,6BAA6B,CAAC;CAC3D,GAAG,IAAI,CAkCP;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;;;;EAkBzH"}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { GuardrailApprovalRequiredError, GuardrailBlockedError, LoopApprovalRequiredError, LoopPermissionApprovalRequiredError, LoopPermissionDeniedError, LoopPolicyDeniedError, LoopContextBindingError, } from "@polpo-ai/core";
|
|
6
6
|
import { classifyGatewayError, extractGatewayModelNotFoundDetails } from "@polpo-ai/llm";
|
|
7
|
+
import { NoObjectGeneratedError } from "ai";
|
|
8
|
+
import { CompletionStructuredOutputError } from "./structured-output.js";
|
|
7
9
|
export function sseChunk(id, delta, finishReason = null, extra) {
|
|
8
10
|
return JSON.stringify({
|
|
9
11
|
id,
|
|
@@ -68,6 +70,21 @@ export function modelErrorEnvelope(err) {
|
|
|
68
70
|
code: "model_request_failed",
|
|
69
71
|
};
|
|
70
72
|
}
|
|
73
|
+
export function structuredOutputErrorEnvelope(err, structuredOutputRequested = false) {
|
|
74
|
+
const directError = err instanceof CompletionStructuredOutputError ? err : null;
|
|
75
|
+
const noObject = structuredOutputRequested && (NoObjectGeneratedError.isInstance(err)
|
|
76
|
+
|| errorObjects(err).some((candidate) => candidate.name === "AI_NoObjectGeneratedError"));
|
|
77
|
+
if (!directError && !noObject)
|
|
78
|
+
return null;
|
|
79
|
+
return {
|
|
80
|
+
message: directError
|
|
81
|
+
? directError.message
|
|
82
|
+
: "Model output did not satisfy the requested response_format.",
|
|
83
|
+
type: "invalid_request_error",
|
|
84
|
+
code: "invalid_response_format_output",
|
|
85
|
+
param: "response_format",
|
|
86
|
+
};
|
|
87
|
+
}
|
|
71
88
|
export function modelNotFoundEnvelope(err, fallbackModelId, agent) {
|
|
72
89
|
const normalized = classifyGatewayError(err);
|
|
73
90
|
if (normalized.class !== "model-not-found")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../src/routes/completions/sse.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,8BAA8B,EAC9B,qBAAqB,EACrB,yBAAyB,EACzB,mCAAmC,EACnC,yBAAyB,EACzB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,kCAAkC,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../src/routes/completions/sse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Output } from "ai";
|
|
2
|
+
import type { CompletionResponseFormat } from "./schemas.js";
|
|
3
|
+
export declare class CompletionStructuredOutputError extends Error {
|
|
4
|
+
readonly code = "invalid_response_format_output";
|
|
5
|
+
readonly param = "response_format";
|
|
6
|
+
constructor(message: string, options?: {
|
|
7
|
+
cause?: unknown;
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
export declare function isStructuredResponseFormat(format: CompletionResponseFormat | undefined): boolean;
|
|
11
|
+
/** Translate the OpenAI wire format into the provider-neutral AI SDK output contract. */
|
|
12
|
+
export declare function modelOutputForResponseFormat(format: CompletionResponseFormat | undefined): Output.Output<unknown, unknown, never> | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* Canonicalize and revalidate the final assistant text after output policies.
|
|
15
|
+
* OpenAI chat completions expose structured output as a JSON string in
|
|
16
|
+
* `message.content`, not as a second proprietary response field.
|
|
17
|
+
*/
|
|
18
|
+
export declare function finalizeResponseFormatText(format: CompletionResponseFormat | undefined, text: string): Promise<string>;
|
|
19
|
+
export declare function serializeModelOutput(format: CompletionResponseFormat | undefined, output: unknown, rawText: string): Promise<string>;
|
|
20
|
+
//# sourceMappingURL=structured-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-output.d.ts","sourceRoot":"","sources":["../../../src/routes/completions/structured-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAc,MAAM,IAAI,CAAC;AAExC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAE7D,qBAAa,+BAAgC,SAAQ,KAAK;IACxD,QAAQ,CAAC,IAAI,oCAAoC;IACjD,QAAQ,CAAC,KAAK,qBAAqB;gBAEvB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAI3D;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,wBAAwB,GAAG,SAAS,GAC3C,OAAO,CAET;AAiBD,yFAAyF;AACzF,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,wBAAwB,GAAG,SAAS,GAC3C,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,SAAS,CAcpD;AAED;;;;GAIG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,wBAAwB,GAAG,SAAS,EAC5C,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAsCjB;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,wBAAwB,GAAG,SAAS,EAC5C,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAQjB"}
|
|
@@ -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"}
|
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-server": "0.15.
|
|
24
|
-
"@polpo-ai/connect": "0.15.
|
|
25
|
-
"@polpo-ai/core": "0.15.
|
|
26
|
-
"@polpo-ai/llm": "0.15.
|
|
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",
|