@polpo-ai/server 0.17.2 → 0.18.0
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/project-environment.d.ts +9 -0
- package/dist/project-environment.d.ts.map +1 -0
- package/dist/project-environment.js +31 -0
- package/dist/project-environment.js.map +1 -0
- package/dist/project-environment.test.d.ts +2 -0
- package/dist/project-environment.test.d.ts.map +1 -0
- package/dist/project-environment.test.js +62 -0
- package/dist/project-environment.test.js.map +1 -0
- package/dist/routes/completions/agent-step-runner.d.ts +2 -0
- package/dist/routes/completions/agent-step-runner.d.ts.map +1 -1
- package/dist/routes/completions/agent-step-runner.js +196 -96
- package/dist/routes/completions/agent-step-runner.js.map +1 -1
- package/dist/routes/completions/agent-step-runner.test.js +34 -14
- package/dist/routes/completions/agent-step-runner.test.js.map +1 -1
- package/dist/routes/completions/chat-handler.d.ts +3 -1
- package/dist/routes/completions/chat-handler.d.ts.map +1 -1
- package/dist/routes/completions/chat-handler.js +203 -49
- package/dist/routes/completions/chat-handler.js.map +1 -1
- package/dist/routes/completions/conversation-turn.d.ts.map +1 -1
- package/dist/routes/completions/conversation-turn.js +28 -0
- package/dist/routes/completions/conversation-turn.js.map +1 -1
- package/dist/routes/completions/production-tool-replay.test.d.ts +2 -0
- package/dist/routes/completions/production-tool-replay.test.d.ts.map +1 -0
- package/dist/routes/completions/production-tool-replay.test.js +232 -0
- package/dist/routes/completions/production-tool-replay.test.js.map +1 -0
- package/dist/routes/completions/project-loop-runner.d.ts.map +1 -1
- package/dist/routes/completions/project-loop-runner.js +5 -1
- package/dist/routes/completions/project-loop-runner.js.map +1 -1
- package/dist/routes/completions/schemas.d.ts +2 -2
- package/dist/routes/completions/sse.d.ts.map +1 -1
- package/dist/routes/completions/sse.js +3 -1
- package/dist/routes/completions/sse.js.map +1 -1
- package/dist/routes/completions/structured-output-phases.test.d.ts +2 -0
- package/dist/routes/completions/structured-output-phases.test.d.ts.map +1 -0
- package/dist/routes/completions/structured-output-phases.test.js +255 -0
- package/dist/routes/completions/structured-output-phases.test.js.map +1 -0
- package/dist/routes/completions/tool-guardrails.d.ts +21 -3
- package/dist/routes/completions/tool-guardrails.d.ts.map +1 -1
- package/dist/routes/completions/tool-guardrails.js +95 -14
- package/dist/routes/completions/tool-guardrails.js.map +1 -1
- package/dist/routes/completions/tool-guardrails.test.js +215 -5
- package/dist/routes/completions/tool-guardrails.test.js.map +1 -1
- package/dist/routes/completions/tool-mapping.d.ts +1 -0
- package/dist/routes/completions/tool-mapping.d.ts.map +1 -1
- package/dist/routes/completions/tool-mapping.js +8 -4
- package/dist/routes/completions/tool-mapping.js.map +1 -1
- package/dist/routes/completions/tool-mapping.test.js +59 -38
- package/dist/routes/completions/tool-mapping.test.js.map +1 -1
- package/dist/routes/completions-loop-runtime.test.js +45 -3
- package/dist/routes/completions-loop-runtime.test.js.map +1 -1
- package/dist/routes/completions-provider-tools.test.js +21 -2
- package/dist/routes/completions-provider-tools.test.js.map +1 -1
- package/dist/routes/completions.d.ts +2 -0
- package/dist/routes/completions.d.ts.map +1 -1
- package/dist/routes/completions.js.map +1 -1
- package/dist/routes/connect.d.ts.map +1 -1
- package/dist/routes/connect.js +40 -0
- package/dist/routes/connect.js.map +1 -1
- package/dist/routes/connect.test.js +48 -1
- package/dist/routes/connect.test.js.map +1 -1
- package/dist/routes/custom-tools.d.ts.map +1 -1
- package/dist/routes/custom-tools.js +77 -57
- package/dist/routes/custom-tools.js.map +1 -1
- package/dist/routes/custom-tools.test.js +110 -1
- package/dist/routes/custom-tools.test.js.map +1 -1
- package/dist/routes/files.d.ts +2 -0
- package/dist/routes/files.d.ts.map +1 -1
- package/dist/routes/files.js +1 -1
- package/dist/routes/files.js.map +1 -1
- package/dist/routes/files.test.js +11 -0
- package/dist/routes/files.test.js.map +1 -1
- package/dist/schemas.d.ts +5 -5
- package/package.json +7 -7
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* For routes that require Node.js (completions, files, agents avatar),
|
|
8
8
|
* import from "polpo-ai" instead.
|
|
9
9
|
*/
|
|
10
|
+
export { routeProjectEnvironment } from "./project-environment.js";
|
|
10
11
|
export { dataRoutes, type DataServiceResolver } from "./routes/data.js";
|
|
11
12
|
export { taskRoutes } from "./routes/tasks.js";
|
|
12
13
|
export { missionRoutes } from "./routes/missions.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* import from "polpo-ai" instead.
|
|
9
9
|
*/
|
|
10
10
|
// Route factories
|
|
11
|
+
export { routeProjectEnvironment } from "./project-environment.js";
|
|
11
12
|
export { dataRoutes } from "./routes/data.js";
|
|
12
13
|
export { taskRoutes } from "./routes/tasks.js";
|
|
13
14
|
export { missionRoutes } from "./routes/missions.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,kBAAkB;AAClB,OAAO,EAAE,UAAU,EAA4B,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EACL,eAAe,EACf,oBAAoB,GAIrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAO9B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,WAAW,GAEZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,8BAA8B,EAC9B,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,GAYvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,wBAAwB,EACxB,oCAAoC,GAWrC,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAsB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAyB,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EACL,iBAAiB,GAElB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,iBAAiB,GAGlB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAsC,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAsB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAuB,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EACL,gBAAgB,GAMjB,MAAM,0BAA0B,CAAC;AAoBlC,uEAAuE;AACvE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAC1I,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EACL,4BAA4B,GAI7B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,mDAAmD;AACnD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,kBAAkB;AAClB,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,UAAU,EAA4B,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EACL,eAAe,EACf,oBAAoB,GAIrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAO9B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,WAAW,GAEZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,8BAA8B,EAC9B,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,GAYvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,wBAAwB,EACxB,oCAAoC,GAWrC,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAsB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAyB,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EACL,iBAAiB,GAElB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,iBAAiB,GAGlB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAsC,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAsB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAuB,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EACL,gBAAgB,GAMjB,MAAM,0BAA0B,CAAC;AAoBlC,uEAAuE;AACvE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAC1I,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EACL,4BAA4B,GAI7B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,mDAAmD;AACnD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ProjectEnvironment } from "@polpo-ai/core/project-environment";
|
|
2
|
+
/**
|
|
3
|
+
* Route explicit selectors to ONE operator-bound runtime. This does not grant
|
|
4
|
+
* access or select stores: downstream authentication remains mandatory, and
|
|
5
|
+
* the host must give each process its own resources. An unbound legacy runtime
|
|
6
|
+
* cannot accept an explicit target by silently using its default instance.
|
|
7
|
+
*/
|
|
8
|
+
export declare function routeProjectEnvironment(request: Request, environment: ProjectEnvironment | undefined, forward: (request: Request) => Response | Promise<Response>): Promise<Response>;
|
|
9
|
+
//# sourceMappingURL=project-environment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-environment.d.ts","sourceRoot":"","sources":["../src/project-environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,oCAAoC,CAAC;AAE5C;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,kBAAkB,GAAG,SAAS,EAC3C,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAC1D,OAAO,CAAC,QAAQ,CAAC,CAmBnB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { parseProjectEnvironment, readProjectEnvironmentPath, } from "@polpo-ai/core/project-environment";
|
|
2
|
+
/**
|
|
3
|
+
* Route explicit selectors to ONE operator-bound runtime. This does not grant
|
|
4
|
+
* access or select stores: downstream authentication remains mandatory, and
|
|
5
|
+
* the host must give each process its own resources. An unbound legacy runtime
|
|
6
|
+
* cannot accept an explicit target by silently using its default instance.
|
|
7
|
+
*/
|
|
8
|
+
export async function routeProjectEnvironment(request, environment, forward) {
|
|
9
|
+
if (environment !== undefined)
|
|
10
|
+
parseProjectEnvironment(environment);
|
|
11
|
+
const url = new URL(request.url);
|
|
12
|
+
const apiPrefix = url.pathname === "/api/environments" || url.pathname.startsWith("/api/environments/") ? "/api" : "";
|
|
13
|
+
let target;
|
|
14
|
+
try {
|
|
15
|
+
target = readProjectEnvironmentPath(url.pathname.slice(apiPrefix.length));
|
|
16
|
+
if (target?.path.startsWith("/api/environments/")) {
|
|
17
|
+
throw new TypeError("Nested project environment selection is not allowed");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return Response.json({ ok: false, error: "Invalid project environment selector", code: "INVALID_ENVIRONMENT" }, { status: 400 });
|
|
22
|
+
}
|
|
23
|
+
if (!target)
|
|
24
|
+
return forward(request);
|
|
25
|
+
if (environment === undefined || target.environment !== environment) {
|
|
26
|
+
return Response.json({ ok: false, error: "Environment is not available on this runtime", code: "ENVIRONMENT_NOT_FOUND" }, { status: 404 });
|
|
27
|
+
}
|
|
28
|
+
url.pathname = `${apiPrefix}${target.path}`;
|
|
29
|
+
return forward(new Request(url, request));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=project-environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-environment.js","sourceRoot":"","sources":["../src/project-environment.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,0BAA0B,GAE3B,MAAM,oCAAoC,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAgB,EAChB,WAA2C,EAC3C,OAA2D;IAE3D,IAAI,WAAW,KAAK,SAAS;QAAE,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,KAAK,mBAAmB,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACtH,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,0BAA0B,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1E,IAAI,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,SAAS,CAAC,qDAAqD,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sCAAsC,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACnI,CAAC;IACD,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,WAAW,KAAK,SAAS,IAAI,MAAM,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;QACpE,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,8CAA8C,EAAE,IAAI,EAAE,uBAAuB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7I,CAAC;IACD,GAAG,CAAC,QAAQ,GAAG,GAAG,SAAS,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC5C,OAAO,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-environment.test.d.ts","sourceRoot":"","sources":["../src/project-environment.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { routeProjectEnvironment } from "./project-environment.js";
|
|
3
|
+
describe("fixed runtime environment", () => {
|
|
4
|
+
it.each(["development", "production"])("unwraps %s without changing body, auth, query or abort", async (environment) => {
|
|
5
|
+
const controller = new AbortController();
|
|
6
|
+
const request = new Request(`https://local.test/environments/${environment}/api/v1/files/upload?x=1`, {
|
|
7
|
+
method: "POST", body: new Uint8Array([0, 1, 255]),
|
|
8
|
+
headers: { authorization: "Bearer own-key", "content-type": "application/octet-stream" },
|
|
9
|
+
signal: controller.signal,
|
|
10
|
+
});
|
|
11
|
+
const forward = vi.fn(async (inner) => {
|
|
12
|
+
expect(inner.url).toBe("https://local.test/api/v1/files/upload?x=1");
|
|
13
|
+
expect(inner.method).toBe("POST");
|
|
14
|
+
expect(inner.headers.get("authorization")).toBe("Bearer own-key");
|
|
15
|
+
expect(new Uint8Array(await inner.arrayBuffer())).toEqual(new Uint8Array([0, 1, 255]));
|
|
16
|
+
controller.abort();
|
|
17
|
+
expect(inner.signal.aborted).toBe(true);
|
|
18
|
+
return new Response("uploaded", { status: 201 });
|
|
19
|
+
});
|
|
20
|
+
expect((await routeProjectEnvironment(request, environment, forward)).status).toBe(201);
|
|
21
|
+
expect(forward).toHaveBeenCalledOnce();
|
|
22
|
+
});
|
|
23
|
+
it("supports the /api origin prefix used by CLI self-hosted URLs", async () => {
|
|
24
|
+
const forward = vi.fn(async (request) => Response.json({ url: request.url }));
|
|
25
|
+
const response = await routeProjectEnvironment(new Request("http://local/api/environments/development/v1/data"), "development", forward);
|
|
26
|
+
expect(await response.json()).toEqual({ url: "http://local/api/v1/data" });
|
|
27
|
+
});
|
|
28
|
+
it.each([
|
|
29
|
+
["/environments", "development", 400],
|
|
30
|
+
["/environments/", "development", 400],
|
|
31
|
+
["/api/environments", "development", 400],
|
|
32
|
+
["/environments/production/v1/tasks", "development", 404],
|
|
33
|
+
["/environments/development/v1/tasks", undefined, 404],
|
|
34
|
+
["/environments/test/v1/tasks", "development", 400],
|
|
35
|
+
["/environments/development/environments/production/v1/tasks", "development", 400],
|
|
36
|
+
["/environments/development/api/environments/development/v1/tasks", "development", 400],
|
|
37
|
+
])("rejects %s on a runtime bound to %s before dispatch", async (path, environment, status) => {
|
|
38
|
+
const forward = vi.fn();
|
|
39
|
+
expect((await routeProjectEnvironment(new Request(`http://local${path}`, { method: "POST" }), environment, forward)).status).toBe(status);
|
|
40
|
+
expect(forward).not.toHaveBeenCalled();
|
|
41
|
+
});
|
|
42
|
+
it("preserves existing unscoped endpoints and the downstream authorization response", async () => {
|
|
43
|
+
const request = new Request("http://local/api/v1/tasks");
|
|
44
|
+
const forward = vi.fn(async (inner) => {
|
|
45
|
+
expect(inner).toBe(request);
|
|
46
|
+
return new Response("unauthorized", { status: 401 });
|
|
47
|
+
});
|
|
48
|
+
expect((await routeProjectEnvironment(request, "development", forward)).status).toBe(401);
|
|
49
|
+
});
|
|
50
|
+
it("returns the original streaming response without waiting for it to finish", async () => {
|
|
51
|
+
let source;
|
|
52
|
+
const body = new ReadableStream({ start(controller) { source = controller; } });
|
|
53
|
+
const response = new Response(body, { headers: { "content-type": "text/event-stream" } });
|
|
54
|
+
const result = await routeProjectEnvironment(new Request("http://local/environments/development/v1/runs/run-1/events?after=7"), "development", async () => response);
|
|
55
|
+
expect(result).toBe(response);
|
|
56
|
+
source.enqueue(new TextEncoder().encode("id: 8\ndata: {}\n\n"));
|
|
57
|
+
const reader = result.body.getReader();
|
|
58
|
+
expect(new TextDecoder().decode((await reader.read()).value)).toContain("id: 8");
|
|
59
|
+
await reader.cancel();
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=project-environment.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-environment.test.js","sourceRoot":"","sources":["../src/project-environment.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,8 @@ export interface ResolvedModelInfo {
|
|
|
30
30
|
runtimeMode?: "provider" | "gateway";
|
|
31
31
|
contextWindow: number;
|
|
32
32
|
maxTokens: number;
|
|
33
|
+
/** Capability proof for the concrete provider/model/adapter/endpoint. */
|
|
34
|
+
capabilities?: import("@polpo-ai/llm").ModelRuntimeCapabilities;
|
|
33
35
|
}
|
|
34
36
|
export interface CompletionResolvedModelInfo {
|
|
35
37
|
id?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-step-runner.d.ts","sourceRoot":"","sources":["../../../src/routes/completions/agent-step-runner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAOL,KAAK,sBAAsB,EAS3B,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAE7B,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAChB,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,
|
|
1
|
+
{"version":3,"file":"agent-step-runner.d.ts","sourceRoot":"","sources":["../../../src/routes/completions/agent-step-runner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAOL,KAAK,sBAAsB,EAS3B,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAE7B,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAChB,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAO/B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAgB,KAAK,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,IAAI,CAAC;AAS/E,OAAO,KAAK,EACV,mBAAmB,EACnB,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EASL,KAAK,mBAAmB,EACzB,MAAM,mBAAmB,CAAC;AAiB3B,eAAO,MAAM,SAAS,KAAK,CAAC;AAK5B,qBAAa,gCAAiC,SAAQ,KAAK;IAG7C,QAAQ,CAAC,QAAQ,EAAE,MAAM;IAFrC,QAAQ,CAAC,IAAI,qCAAqC;gBAE7B,QAAQ,EAAE,MAAM;CAItC;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,mFAAmF;IACnF,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,WAAW,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,YAAY,CAAC,EAAE,OAAO,eAAe,EAAE,wBAAwB,CAAC;CACjE;AAED,MAAM,WAAW,2BAA2B;IAC1C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CACtC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,2BAA2B,CAAC;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,SAAS,EAAE,GAAG,EAAE,CAAC;CAClB;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,iBAAiB,GAAG,2BAA2B,CAOjG;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAG/E;AAED,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,GAAG,EAChB,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,GAC3C,cAAc,GAAG,SAAS,CAO5B;AAED,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,GAAG,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAChC,cAAc,CAEhB;AAED,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,GAAG,EAChB,QAAQ,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAChC,GAAG,CAOL;AAED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CAK/E;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,kBAAkB,GAAG,kBAAkB,CAMzF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,iBAAiB,EACpB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACpC,WAAW,CAUb;AAED,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,mBAAmB,EACzB,WAAW,EAAE,GAAG,EAChB,gBAAgB,EAAE,MAAM,EAAE,EAC1B,eAAe,CAAC,EAAE,MAAM,EACxB,YAAY,GAAE,uBAA+B,EAC7C,cAAc,CAAC,EAAE,wBAAwB,EACzC,eAAe,GAAE,SAAS,MAAM,EAAO,EACvC,mBAAmB,UAAQ,GAC1B,OAAO,CAAC,MAAM,CAAC,CAuDjB;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,IAAI,EAAE,mBAAmB,CAAC;IAC1B,WAAW,EAAE,GAAG,CAAC;IACjB,UAAU,EAAE,GAAG,EAAE,CAAC;IAClB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,uBAAuB,CAAC;IACvC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,yBAAyB,CAAC;IACvC,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC,iEAAiE;IACjE,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAspB9B"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* step's overlay-merged agent config — used by the project loop runtime
|
|
6
6
|
* to execute `loop:` steps inside a deterministic pipeline.
|
|
7
7
|
*/
|
|
8
|
-
import { agentMemoryScope, compactIfNeeded, createRuntimePromptContextSegment, loopContextPrompt, loopAgentInputPrompt, loopUserVisibleContext, maybeParseJson, normalizeRuntimeContextTrustMode, protectRuntimeToolResultMessages, renderRuntimePromptContextSegment, renderRuntimeToolResult, renderRuntimeContextPrompt, replacesLegacyAgentMemory, replacesLegacySharedMemory, resolveConfiguredModelSelection, isClientInteractionToolName, LoopInteractiveToolUnsupportedError, LoopAgentOutputError, prepareLoopAgentOutput, assertToolNameAllowedByPolicy, } from "@polpo-ai/core";
|
|
8
|
+
import { agentMemoryScope, compactIfNeeded, createRuntimePromptContextSegment, loopContextPrompt, loopAgentInputPrompt, loopUserVisibleContext, maybeParseJson, normalizeRuntimeContextTrustMode, protectRuntimeToolResultMessages, renderRuntimePromptContextSegment, renderRuntimeToolResult, renderRuntimeContextPrompt, replacesLegacyAgentMemory, replacesLegacySharedMemory, resolveConfiguredModelSelection, isClientInteractionToolName, LoopInteractiveToolUnsupportedError, LoopAgentOutputError, ToolProgressTracker, prepareLoopAgentOutput, assertToolNameAllowedByPolicy, } from "@polpo-ai/core";
|
|
9
9
|
import { generateText } from "ai";
|
|
10
10
|
import { classifyRuntimeError, prepareModelMessagesForProvider, prepareModelMessagesForTransport, isStructuredModelOutputError, modelOutputForJsonSchema, runModelPolicyTurn, } from "@polpo-ai/llm";
|
|
11
11
|
import { appendModelResponseMessages } from "./message-mapping.js";
|
|
@@ -231,7 +231,62 @@ export async function runAgentStepCompletion(options) {
|
|
|
231
231
|
runId: options.runId,
|
|
232
232
|
sessionId: options.sessionId,
|
|
233
233
|
},
|
|
234
|
+
receiptStore: options.toolRunScope?.receiptStore,
|
|
234
235
|
});
|
|
236
|
+
const progressTracker = new ToolProgressTracker();
|
|
237
|
+
const toolAnnotations = new Map(loopTools
|
|
238
|
+
.filter((tool) => tool && typeof tool.name === "string")
|
|
239
|
+
.map((tool) => [tool.name, tool.annotations]));
|
|
240
|
+
let stalledToolLoop;
|
|
241
|
+
const guardedExecuteTool = executeTool;
|
|
242
|
+
executeTool = async (name, args, execution) => {
|
|
243
|
+
const call = {
|
|
244
|
+
name,
|
|
245
|
+
args,
|
|
246
|
+
annotations: toolAnnotations.get(name),
|
|
247
|
+
};
|
|
248
|
+
const progress = progressTracker.inspect(call);
|
|
249
|
+
if (progress.action === "reuse") {
|
|
250
|
+
deps.emit("runtime:tool-progress", {
|
|
251
|
+
action: "reuse",
|
|
252
|
+
tool: name,
|
|
253
|
+
fingerprint: progress.fingerprint,
|
|
254
|
+
observation: progress.observation,
|
|
255
|
+
step: stepName,
|
|
256
|
+
agent: agentConfig.name,
|
|
257
|
+
runId: options.runId,
|
|
258
|
+
sessionId: options.sessionId,
|
|
259
|
+
});
|
|
260
|
+
return progress.result;
|
|
261
|
+
}
|
|
262
|
+
if (progress.action === "stall") {
|
|
263
|
+
stalledToolLoop = {
|
|
264
|
+
toolName: name,
|
|
265
|
+
fingerprint: progress.fingerprint,
|
|
266
|
+
observation: progress.observation,
|
|
267
|
+
message: progress.message,
|
|
268
|
+
};
|
|
269
|
+
deps.emit("runtime:tool-progress", {
|
|
270
|
+
action: "stall",
|
|
271
|
+
code: progress.code,
|
|
272
|
+
tool: name,
|
|
273
|
+
fingerprint: progress.fingerprint,
|
|
274
|
+
observation: progress.observation,
|
|
275
|
+
step: stepName,
|
|
276
|
+
agent: agentConfig.name,
|
|
277
|
+
runId: options.runId,
|
|
278
|
+
sessionId: options.sessionId,
|
|
279
|
+
});
|
|
280
|
+
return `Error: ${progress.message}`;
|
|
281
|
+
}
|
|
282
|
+
const result = await guardedExecuteTool(name, args, execution);
|
|
283
|
+
progressTracker.record({
|
|
284
|
+
...call,
|
|
285
|
+
result,
|
|
286
|
+
isError: result.startsWith("Error:"),
|
|
287
|
+
});
|
|
288
|
+
return result;
|
|
289
|
+
};
|
|
235
290
|
const modelToolChoice = toAIToolChoice(agentConfig.toolChoice);
|
|
236
291
|
let modelTools = loopTools;
|
|
237
292
|
let activeToolNames;
|
|
@@ -285,96 +340,137 @@ export async function runAgentStepCompletion(options) {
|
|
|
285
340
|
let totalUsage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };
|
|
286
341
|
let lastProviderMetadata;
|
|
287
342
|
const toolCallsAccum = [];
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
contextWindow: m.contextWindow ?? 200_000,
|
|
297
|
-
maxOutputTokens: m.maxTokens ?? 8192,
|
|
298
|
-
},
|
|
299
|
-
summarize: buildSummarizeFn(m, providerOpts),
|
|
300
|
-
mode: "chat",
|
|
301
|
-
});
|
|
302
|
-
if (compactionResult.compacted) {
|
|
303
|
-
const compacted = contextTrust === "enforce"
|
|
304
|
-
? protectRuntimeToolResultMessages(compactionResult.messages)
|
|
305
|
-
: compactionResult.messages;
|
|
306
|
-
messages.splice(0, messages.length, ...compacted);
|
|
307
|
-
}
|
|
308
|
-
const toolCallNames = new Map();
|
|
309
|
-
const resolvedAttempts = new Map();
|
|
310
|
-
const recoverTerminalStructuredOutput = async (originalError) => {
|
|
311
|
-
const originalClassification = classifyRuntimeError(originalError);
|
|
312
|
-
const hasCompletedOperationalTool = toolCallsAccum.some((toolCall) => toolCall?.state === "completed");
|
|
313
|
-
if (structuredOutputRecoveryUsed
|
|
314
|
-
|| modelOutput === undefined
|
|
315
|
-
|| !hasCompletedOperationalTool
|
|
316
|
-
|| originalClassification.providerCode === "provider_stream_event_invalid") {
|
|
317
|
-
return undefined;
|
|
318
|
-
}
|
|
319
|
-
structuredOutputRecoveryUsed = true;
|
|
320
|
-
const { raw: _originalRaw, ...originalDiagnostic } = originalClassification;
|
|
343
|
+
const completeTerminalStructuredOutput = async () => {
|
|
344
|
+
if (modelOutput === undefined)
|
|
345
|
+
return;
|
|
346
|
+
let originalDiagnostic;
|
|
347
|
+
for (let attemptIndex = 0; attemptIndex < 2; attemptIndex += 1) {
|
|
348
|
+
const isRecovery = attemptIndex === 1;
|
|
349
|
+
if (isRecovery) {
|
|
350
|
+
const { raw: _raw, ...original } = originalDiagnostic;
|
|
321
351
|
deps.emit("runtime:structured-output-recovery", {
|
|
322
352
|
phase: "started",
|
|
323
353
|
step: stepName,
|
|
324
354
|
agent: agentConfig.name,
|
|
325
355
|
runId: options.runId,
|
|
326
356
|
sessionId: options.sessionId,
|
|
327
|
-
original
|
|
357
|
+
original,
|
|
328
358
|
});
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
359
|
+
}
|
|
360
|
+
const resolvedAttempts = new Map();
|
|
361
|
+
try {
|
|
362
|
+
const terminalResult = await runModelPolicyTurn({
|
|
363
|
+
selection: modelSelection,
|
|
364
|
+
resolveAttempt: async (attempt) => {
|
|
365
|
+
const resolvedAttempt = attempt.index === 0
|
|
366
|
+
? initialResolved
|
|
367
|
+
: await deps.resolveAgentModel(agentConfigForModelAttempt(agentConfig, attempt.model), reasoning);
|
|
368
|
+
resolvedAttempts.set(attempt.index, resolvedAttempt);
|
|
369
|
+
return {
|
|
370
|
+
model: resolvedAttempt.model.aiModel,
|
|
371
|
+
maxOutputTokens: resolvedAttempt.model.maxTokens,
|
|
372
|
+
providerOptions: resolvedAttempt.providerOptions,
|
|
373
|
+
capabilities: resolvedAttempt.model.capabilities,
|
|
374
|
+
};
|
|
375
|
+
},
|
|
376
|
+
preserveSingleAttemptError: true,
|
|
377
|
+
allowCommittedFallback: true,
|
|
378
|
+
maxRecoverableStreamRetries: 0,
|
|
379
|
+
system: isRecovery
|
|
380
|
+
? `${fullSystemPrompt}\n\n## Terminal structured output recovery\n\nAll operational work is already complete. Produce only the terminal JSON matching the requested schema from the canonical tool results. Do not call tools, modify files, reinterpret the requested scope, or claim work not evidenced by those results.`
|
|
381
|
+
: `${fullSystemPrompt}\n\n## Terminal structured output\n\nOperational work is complete. Produce only the terminal result matching the requested schema from the canonical conversation and tool results.`,
|
|
382
|
+
messages,
|
|
383
|
+
output: modelOutput,
|
|
384
|
+
...(options.signal ? { abortSignal: options.signal } : {}),
|
|
385
|
+
});
|
|
386
|
+
if (terminalResult.toolCalls.length > 0 || terminalResult.output === undefined) {
|
|
387
|
+
throw new Error(terminalResult.toolCalls.length > 0
|
|
388
|
+
? "Terminal structured-output phase returned a tool call"
|
|
389
|
+
: "Terminal structured-output phase completed without structured output");
|
|
390
|
+
}
|
|
391
|
+
for (const warning of terminalResult.warnings ?? []) {
|
|
392
|
+
deps.emit("runtime:model-warning", {
|
|
393
|
+
source: "loop-step-terminal-output",
|
|
352
394
|
step: stepName,
|
|
353
395
|
agent: agentConfig.name,
|
|
354
396
|
runId: options.runId,
|
|
355
397
|
sessionId: options.sessionId,
|
|
398
|
+
warning,
|
|
356
399
|
});
|
|
357
|
-
return recoveryResult;
|
|
358
400
|
}
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
401
|
+
const prepared = prepareLoopAgentOutput(stepName, terminalResult.output, outputSchema);
|
|
402
|
+
const selectedResolved = resolvedAttempts.get(terminalResult.selectedAttempt.index);
|
|
403
|
+
if (selectedResolved) {
|
|
404
|
+
m = selectedResolved.model;
|
|
405
|
+
providerOpts = selectedResolved.providerOptions;
|
|
406
|
+
}
|
|
407
|
+
totalUsage = addUsage(totalUsage, terminalResult.usage);
|
|
408
|
+
finalReasoning = appendReasoningSummary(finalReasoning, terminalResult.reasoning);
|
|
409
|
+
lastProviderMetadata = terminalResult.providerMetadata;
|
|
410
|
+
finalOutput = prepared.value;
|
|
411
|
+
finalText = prepared.serialized;
|
|
412
|
+
completedStructuredOutput = true;
|
|
413
|
+
if (isRecovery) {
|
|
362
414
|
deps.emit("runtime:structured-output-recovery", {
|
|
363
|
-
phase: "
|
|
415
|
+
phase: "succeeded",
|
|
364
416
|
step: stepName,
|
|
365
417
|
agent: agentConfig.name,
|
|
366
418
|
runId: options.runId,
|
|
367
419
|
sessionId: options.sessionId,
|
|
368
|
-
original: originalDiagnostic,
|
|
369
|
-
recovery: recoveryDiagnostic,
|
|
370
420
|
});
|
|
371
|
-
throw new LoopAgentOutputError("loop_agent_output_invalid", stepName, `Agent step ${JSON.stringify(stepName)} did not produce valid structured output after one terminal recovery attempt`, {
|
|
372
|
-
phase: "terminal_output_recovery",
|
|
373
|
-
original: originalDiagnostic,
|
|
374
|
-
recovery: recoveryDiagnostic,
|
|
375
|
-
}, { cause: recoveryError });
|
|
376
421
|
}
|
|
377
|
-
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
catch (error) {
|
|
425
|
+
const diagnostic = classifyRuntimeError(error);
|
|
426
|
+
if (!isRecovery) {
|
|
427
|
+
originalDiagnostic = diagnostic;
|
|
428
|
+
continue;
|
|
429
|
+
}
|
|
430
|
+
const { raw: _originalRaw, ...original } = originalDiagnostic;
|
|
431
|
+
const { raw: _recoveryRaw, ...recovery } = diagnostic;
|
|
432
|
+
deps.emit("runtime:structured-output-recovery", {
|
|
433
|
+
phase: "failed",
|
|
434
|
+
step: stepName,
|
|
435
|
+
agent: agentConfig.name,
|
|
436
|
+
runId: options.runId,
|
|
437
|
+
sessionId: options.sessionId,
|
|
438
|
+
original,
|
|
439
|
+
recovery,
|
|
440
|
+
});
|
|
441
|
+
throw new LoopAgentOutputError("loop_agent_output_invalid", stepName, `Agent step ${JSON.stringify(stepName)} did not produce valid structured output after one terminal recovery attempt`, {
|
|
442
|
+
phase: "terminal_output_recovery",
|
|
443
|
+
original,
|
|
444
|
+
recovery,
|
|
445
|
+
}, { cause: error });
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
};
|
|
449
|
+
try {
|
|
450
|
+
const hasOperationalTools = Object.keys(aiTools).length > 0;
|
|
451
|
+
if (outputSchema !== undefined && !hasOperationalTools) {
|
|
452
|
+
await completeTerminalStructuredOutput();
|
|
453
|
+
}
|
|
454
|
+
for (let turn = 0; !completedStructuredOutput && turn < (agentConfig.maxTurns ?? MAX_TURNS); turn++) {
|
|
455
|
+
const compactionResult = await compactIfNeeded({
|
|
456
|
+
systemPrompt: fullSystemPrompt,
|
|
457
|
+
messages,
|
|
458
|
+
tools: activeCompactionTools?.() ?? modelTools,
|
|
459
|
+
config: {
|
|
460
|
+
contextWindow: m.contextWindow ?? 200_000,
|
|
461
|
+
maxOutputTokens: m.maxTokens ?? 8192,
|
|
462
|
+
},
|
|
463
|
+
summarize: buildSummarizeFn(m, providerOpts),
|
|
464
|
+
mode: "chat",
|
|
465
|
+
});
|
|
466
|
+
if (compactionResult.compacted) {
|
|
467
|
+
const compacted = contextTrust === "enforce"
|
|
468
|
+
? protectRuntimeToolResultMessages(compactionResult.messages)
|
|
469
|
+
: compactionResult.messages;
|
|
470
|
+
messages.splice(0, messages.length, ...compacted);
|
|
471
|
+
}
|
|
472
|
+
const toolCallNames = new Map();
|
|
473
|
+
const resolvedAttempts = new Map();
|
|
378
474
|
let turnResult;
|
|
379
475
|
try {
|
|
380
476
|
turnResult = await runModelPolicyTurn({
|
|
@@ -388,6 +484,7 @@ export async function runAgentStepCompletion(options) {
|
|
|
388
484
|
model: resolvedAttempt.model.aiModel,
|
|
389
485
|
maxOutputTokens: resolvedAttempt.model.maxTokens,
|
|
390
486
|
providerOptions: resolvedAttempt.providerOptions,
|
|
487
|
+
capabilities: resolvedAttempt.model.capabilities,
|
|
391
488
|
};
|
|
392
489
|
},
|
|
393
490
|
preserveSingleAttemptError: true,
|
|
@@ -399,10 +496,19 @@ export async function runAgentStepCompletion(options) {
|
|
|
399
496
|
...(options.parallelToolCalls !== undefined
|
|
400
497
|
? { parallelToolCalls: options.parallelToolCalls }
|
|
401
498
|
: {}),
|
|
402
|
-
...(modelOutput ? { output: modelOutput } : {}),
|
|
403
499
|
...(options.signal ? { abortSignal: options.signal } : {}),
|
|
404
500
|
}, async (event) => {
|
|
405
|
-
if (event.type === "
|
|
501
|
+
if (event.type === "warning") {
|
|
502
|
+
deps.emit("runtime:model-warning", {
|
|
503
|
+
source: "loop-step",
|
|
504
|
+
step: stepName,
|
|
505
|
+
agent: agentConfig.name,
|
|
506
|
+
runId: options.runId,
|
|
507
|
+
sessionId: options.sessionId,
|
|
508
|
+
warning: event.warning,
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
else if (event.type === "tool-input-start") {
|
|
406
512
|
toolCallNames.set(event.id, event.name);
|
|
407
513
|
await onToolCall?.({
|
|
408
514
|
id: event.id,
|
|
@@ -434,27 +540,12 @@ export async function runAgentStepCompletion(options) {
|
|
|
434
540
|
}
|
|
435
541
|
catch (error) {
|
|
436
542
|
if (outputSchema !== undefined && isStructuredModelOutputError(error)) {
|
|
437
|
-
|
|
438
|
-
if (recoveryResult) {
|
|
439
|
-
turnResult = recoveryResult;
|
|
440
|
-
}
|
|
441
|
-
else {
|
|
442
|
-
throw new LoopAgentOutputError("loop_agent_output_invalid", stepName, `Agent step ${JSON.stringify(stepName)} did not produce valid structured output`, { phase: "model_output" }, { cause: error });
|
|
443
|
-
}
|
|
543
|
+
throw new LoopAgentOutputError("loop_agent_output_invalid", stepName, `Agent step ${JSON.stringify(stepName)} failed during the operational phase`, { phase: "operational" }, { cause: error });
|
|
444
544
|
}
|
|
445
545
|
else {
|
|
446
546
|
throw error;
|
|
447
547
|
}
|
|
448
548
|
}
|
|
449
|
-
if (outputSchema !== undefined
|
|
450
|
-
&& turnResult.toolCalls.length === 0
|
|
451
|
-
&& turnResult.output === undefined) {
|
|
452
|
-
const recoveryResult = await recoverTerminalStructuredOutput(new Error("Model completed without structured output"));
|
|
453
|
-
if (recoveryResult) {
|
|
454
|
-
totalUsage = addUsage(totalUsage, turnResult.usage);
|
|
455
|
-
turnResult = recoveryResult;
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
549
|
const turnText = turnResult.text;
|
|
459
550
|
finalReasoning = appendReasoningSummary(finalReasoning, turnResult.reasoning);
|
|
460
551
|
const selectedResolved = resolvedAttempts.get(turnResult.selectedAttempt.index);
|
|
@@ -469,13 +560,7 @@ export async function runAgentStepCompletion(options) {
|
|
|
469
560
|
finalText += turnText;
|
|
470
561
|
if (turnResult.toolCalls.length === 0) {
|
|
471
562
|
if (outputSchema !== undefined) {
|
|
472
|
-
|
|
473
|
-
throw new LoopAgentOutputError("loop_agent_output_invalid", stepName, `Agent step ${JSON.stringify(stepName)} completed without structured output`, { phase: "model_output" });
|
|
474
|
-
}
|
|
475
|
-
const prepared = prepareLoopAgentOutput(stepName, turnResult.output, outputSchema);
|
|
476
|
-
finalOutput = prepared.value;
|
|
477
|
-
finalText = prepared.serialized;
|
|
478
|
-
completedStructuredOutput = true;
|
|
563
|
+
await completeTerminalStructuredOutput();
|
|
479
564
|
}
|
|
480
565
|
break;
|
|
481
566
|
}
|
|
@@ -569,6 +654,21 @@ export async function runAgentStepCompletion(options) {
|
|
|
569
654
|
await appendLocalResult(call, callArgs, result, result.startsWith("Error:"));
|
|
570
655
|
}
|
|
571
656
|
}
|
|
657
|
+
if (stalledToolLoop)
|
|
658
|
+
break;
|
|
659
|
+
}
|
|
660
|
+
if (stalledToolLoop) {
|
|
661
|
+
throw new LoopAgentOutputError("tool_loop_stalled", stepName, stalledToolLoop.message, {
|
|
662
|
+
phase: "tool_progress",
|
|
663
|
+
tool: stalledToolLoop.toolName,
|
|
664
|
+
fingerprint: stalledToolLoop.fingerprint,
|
|
665
|
+
observation: stalledToolLoop.observation,
|
|
666
|
+
});
|
|
667
|
+
}
|
|
668
|
+
if (outputSchema !== undefined
|
|
669
|
+
&& !completedStructuredOutput
|
|
670
|
+
&& toolCallsAccum.some((toolCall) => toolCall?.state === "completed")) {
|
|
671
|
+
await completeTerminalStructuredOutput();
|
|
572
672
|
}
|
|
573
673
|
if (outputSchema !== undefined && !completedStructuredOutput) {
|
|
574
674
|
throw new LoopAgentOutputError("loop_agent_output_invalid", stepName, `Agent step ${JSON.stringify(stepName)} exhausted maxTurns before producing structured output`, { phase: "max_turns" });
|