@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.
Files changed (77) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/project-environment.d.ts +9 -0
  6. package/dist/project-environment.d.ts.map +1 -0
  7. package/dist/project-environment.js +31 -0
  8. package/dist/project-environment.js.map +1 -0
  9. package/dist/project-environment.test.d.ts +2 -0
  10. package/dist/project-environment.test.d.ts.map +1 -0
  11. package/dist/project-environment.test.js +62 -0
  12. package/dist/project-environment.test.js.map +1 -0
  13. package/dist/routes/completions/agent-step-runner.d.ts +2 -0
  14. package/dist/routes/completions/agent-step-runner.d.ts.map +1 -1
  15. package/dist/routes/completions/agent-step-runner.js +196 -96
  16. package/dist/routes/completions/agent-step-runner.js.map +1 -1
  17. package/dist/routes/completions/agent-step-runner.test.js +34 -14
  18. package/dist/routes/completions/agent-step-runner.test.js.map +1 -1
  19. package/dist/routes/completions/chat-handler.d.ts +3 -1
  20. package/dist/routes/completions/chat-handler.d.ts.map +1 -1
  21. package/dist/routes/completions/chat-handler.js +203 -49
  22. package/dist/routes/completions/chat-handler.js.map +1 -1
  23. package/dist/routes/completions/conversation-turn.d.ts.map +1 -1
  24. package/dist/routes/completions/conversation-turn.js +28 -0
  25. package/dist/routes/completions/conversation-turn.js.map +1 -1
  26. package/dist/routes/completions/production-tool-replay.test.d.ts +2 -0
  27. package/dist/routes/completions/production-tool-replay.test.d.ts.map +1 -0
  28. package/dist/routes/completions/production-tool-replay.test.js +232 -0
  29. package/dist/routes/completions/production-tool-replay.test.js.map +1 -0
  30. package/dist/routes/completions/project-loop-runner.d.ts.map +1 -1
  31. package/dist/routes/completions/project-loop-runner.js +5 -1
  32. package/dist/routes/completions/project-loop-runner.js.map +1 -1
  33. package/dist/routes/completions/schemas.d.ts +2 -2
  34. package/dist/routes/completions/sse.d.ts.map +1 -1
  35. package/dist/routes/completions/sse.js +3 -1
  36. package/dist/routes/completions/sse.js.map +1 -1
  37. package/dist/routes/completions/structured-output-phases.test.d.ts +2 -0
  38. package/dist/routes/completions/structured-output-phases.test.d.ts.map +1 -0
  39. package/dist/routes/completions/structured-output-phases.test.js +255 -0
  40. package/dist/routes/completions/structured-output-phases.test.js.map +1 -0
  41. package/dist/routes/completions/tool-guardrails.d.ts +21 -3
  42. package/dist/routes/completions/tool-guardrails.d.ts.map +1 -1
  43. package/dist/routes/completions/tool-guardrails.js +95 -14
  44. package/dist/routes/completions/tool-guardrails.js.map +1 -1
  45. package/dist/routes/completions/tool-guardrails.test.js +215 -5
  46. package/dist/routes/completions/tool-guardrails.test.js.map +1 -1
  47. package/dist/routes/completions/tool-mapping.d.ts +1 -0
  48. package/dist/routes/completions/tool-mapping.d.ts.map +1 -1
  49. package/dist/routes/completions/tool-mapping.js +8 -4
  50. package/dist/routes/completions/tool-mapping.js.map +1 -1
  51. package/dist/routes/completions/tool-mapping.test.js +59 -38
  52. package/dist/routes/completions/tool-mapping.test.js.map +1 -1
  53. package/dist/routes/completions-loop-runtime.test.js +45 -3
  54. package/dist/routes/completions-loop-runtime.test.js.map +1 -1
  55. package/dist/routes/completions-provider-tools.test.js +21 -2
  56. package/dist/routes/completions-provider-tools.test.js.map +1 -1
  57. package/dist/routes/completions.d.ts +2 -0
  58. package/dist/routes/completions.d.ts.map +1 -1
  59. package/dist/routes/completions.js.map +1 -1
  60. package/dist/routes/connect.d.ts.map +1 -1
  61. package/dist/routes/connect.js +40 -0
  62. package/dist/routes/connect.js.map +1 -1
  63. package/dist/routes/connect.test.js +48 -1
  64. package/dist/routes/connect.test.js.map +1 -1
  65. package/dist/routes/custom-tools.d.ts.map +1 -1
  66. package/dist/routes/custom-tools.js +77 -57
  67. package/dist/routes/custom-tools.js.map +1 -1
  68. package/dist/routes/custom-tools.test.js +110 -1
  69. package/dist/routes/custom-tools.test.js.map +1 -1
  70. package/dist/routes/files.d.ts +2 -0
  71. package/dist/routes/files.d.ts.map +1 -1
  72. package/dist/routes/files.js +1 -1
  73. package/dist/routes/files.js.map +1 -1
  74. package/dist/routes/files.test.js +11 -0
  75. package/dist/routes/files.test.js.map +1 -1
  76. package/dist/schemas.d.ts +5 -5
  77. 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";
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=project-environment.test.d.ts.map
@@ -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":"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"}
1
+ {"version":3,"file":"agent-step-runner.d.ts","sourceRoot":"","sources":["../../../src/routes/completions/agent-step-runner.ts"],"names":[],"mappings":"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"}
@@ -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
- let structuredOutputRecoveryUsed = false;
289
- try {
290
- for (let turn = 0; turn < (agentConfig.maxTurns ?? MAX_TURNS); turn++) {
291
- const compactionResult = await compactIfNeeded({
292
- systemPrompt: fullSystemPrompt,
293
- messages,
294
- tools: activeCompactionTools?.() ?? modelTools,
295
- config: {
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: originalDiagnostic,
357
+ original,
328
358
  });
329
- try {
330
- const recoveryResult = await runModelPolicyTurn({
331
- selection: modelSelection,
332
- resolveAttempt: async (attempt) => {
333
- const resolvedAttempt = attempt.index === 0
334
- ? initialResolved
335
- : await deps.resolveAgentModel(agentConfigForModelAttempt(agentConfig, attempt.model), reasoning);
336
- resolvedAttempts.set(attempt.index, resolvedAttempt);
337
- return {
338
- model: resolvedAttempt.model.aiModel,
339
- maxOutputTokens: resolvedAttempt.model.maxTokens,
340
- providerOptions: resolvedAttempt.providerOptions,
341
- };
342
- },
343
- preserveSingleAttemptError: true,
344
- maxRecoverableStreamRetries: 0,
345
- system: `${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.`,
346
- messages,
347
- output: modelOutput,
348
- ...(options.signal ? { abortSignal: options.signal } : {}),
349
- });
350
- deps.emit("runtime:structured-output-recovery", {
351
- phase: "succeeded",
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
- catch (recoveryError) {
360
- const recoveryClassification = classifyRuntimeError(recoveryError);
361
- const { raw: _recoveryRaw, ...recoveryDiagnostic } = recoveryClassification;
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: "failed",
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 === "tool-input-start") {
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
- const recoveryResult = await recoverTerminalStructuredOutput(error);
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
- if (turnResult.output === undefined) {
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" });