@claudexor/control-api 3.1.2 → 3.2.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 (110) hide show
  1. package/dist/authorization.d.ts +3 -0
  2. package/dist/authorization.d.ts.map +1 -0
  3. package/dist/authorization.js +15 -0
  4. package/dist/authorization.js.map +1 -0
  5. package/dist/binary-response.d.ts +5 -0
  6. package/dist/binary-response.d.ts.map +1 -0
  7. package/dist/binary-response.js +31 -0
  8. package/dist/binary-response.js.map +1 -0
  9. package/dist/catalog-query.d.ts +310 -0
  10. package/dist/catalog-query.d.ts.map +1 -0
  11. package/dist/catalog-query.js +36 -0
  12. package/dist/catalog-query.js.map +1 -0
  13. package/dist/daemon-server.d.ts +28 -17
  14. package/dist/daemon-server.d.ts.map +1 -1
  15. package/dist/daemon-server.js +115 -223
  16. package/dist/daemon-server.js.map +1 -1
  17. package/dist/decision-accept-risk.d.ts +36 -0
  18. package/dist/decision-accept-risk.d.ts.map +1 -0
  19. package/dist/decision-accept-risk.js +79 -0
  20. package/dist/decision-accept-risk.js.map +1 -0
  21. package/dist/decision-rerun.d.ts +2 -1
  22. package/dist/decision-rerun.d.ts.map +1 -1
  23. package/dist/decision-rerun.js +72 -48
  24. package/dist/decision-rerun.js.map +1 -1
  25. package/dist/index.d.ts +1 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +1 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/maintenance-routes.d.ts +2 -2
  30. package/dist/maintenance-routes.d.ts.map +1 -1
  31. package/dist/maintenance-routes.js +11 -10
  32. package/dist/maintenance-routes.js.map +1 -1
  33. package/dist/operation-catalog.d.ts +9 -9
  34. package/dist/operation-catalog.d.ts.map +1 -1
  35. package/dist/operation-catalog.js +22 -79
  36. package/dist/operation-catalog.js.map +1 -1
  37. package/dist/operation-draft.d.ts +3 -0
  38. package/dist/operation-draft.d.ts.map +1 -0
  39. package/dist/operation-draft.js +2 -0
  40. package/dist/operation-draft.js.map +1 -0
  41. package/dist/operation-parameters.d.ts.map +1 -1
  42. package/dist/operation-summaries.d.ts +3 -0
  43. package/dist/operation-summaries.d.ts.map +1 -0
  44. package/dist/operation-summaries.js +75 -0
  45. package/dist/operation-summaries.js.map +1 -0
  46. package/dist/primary-output.d.ts +3 -3
  47. package/dist/primary-output.d.ts.map +1 -1
  48. package/dist/primary-output.js +70 -19
  49. package/dist/primary-output.js.map +1 -1
  50. package/dist/problem-response.d.ts.map +1 -1
  51. package/dist/problem-response.js +14 -9
  52. package/dist/problem-response.js.map +1 -1
  53. package/dist/project-routes.d.ts +21 -13
  54. package/dist/project-routes.d.ts.map +1 -1
  55. package/dist/project-routes.js +80 -34
  56. package/dist/project-routes.js.map +1 -1
  57. package/dist/remote-operation-descriptors.d.ts +36 -0
  58. package/dist/remote-operation-descriptors.d.ts.map +1 -0
  59. package/dist/remote-operation-descriptors.js +35 -0
  60. package/dist/remote-operation-descriptors.js.map +1 -0
  61. package/dist/resource-routes.d.ts +4 -3
  62. package/dist/resource-routes.d.ts.map +1 -1
  63. package/dist/resource-routes.js +63 -39
  64. package/dist/resource-routes.js.map +1 -1
  65. package/dist/route-stages.d.ts +15 -0
  66. package/dist/route-stages.d.ts.map +1 -0
  67. package/dist/route-stages.js +24 -0
  68. package/dist/route-stages.js.map +1 -0
  69. package/dist/run-facts-projection.d.ts +35 -0
  70. package/dist/run-facts-projection.d.ts.map +1 -0
  71. package/dist/run-facts-projection.js +133 -0
  72. package/dist/run-facts-projection.js.map +1 -0
  73. package/dist/run-list-fingerprint.d.ts +7 -0
  74. package/dist/run-list-fingerprint.d.ts.map +1 -0
  75. package/dist/run-list-fingerprint.js +68 -0
  76. package/dist/run-list-fingerprint.js.map +1 -0
  77. package/dist/run-record.d.ts +4 -0
  78. package/dist/run-record.d.ts.map +1 -1
  79. package/dist/run-record.js.map +1 -1
  80. package/dist/run-retry-routes.d.ts +3 -2
  81. package/dist/run-retry-routes.d.ts.map +1 -1
  82. package/dist/run-retry-routes.js +103 -47
  83. package/dist/run-retry-routes.js.map +1 -1
  84. package/dist/run-start.d.ts +13 -1
  85. package/dist/run-start.d.ts.map +1 -1
  86. package/dist/run-start.js +85 -18
  87. package/dist/run-start.js.map +1 -1
  88. package/dist/run-timeline.d.ts.map +1 -1
  89. package/dist/run-timeline.js +16 -9
  90. package/dist/run-timeline.js.map +1 -1
  91. package/dist/thread-lifecycle-routes.d.ts +1 -1
  92. package/dist/thread-lifecycle-routes.d.ts.map +1 -1
  93. package/dist/thread-lifecycle-routes.js +3 -4
  94. package/dist/thread-lifecycle-routes.js.map +1 -1
  95. package/dist/thread-mutation.d.ts +6 -0
  96. package/dist/thread-mutation.d.ts.map +1 -1
  97. package/dist/thread-mutation.js +23 -0
  98. package/dist/thread-mutation.js.map +1 -1
  99. package/dist/thread-projection.d.ts.map +1 -1
  100. package/dist/thread-projection.js +9 -0
  101. package/dist/thread-projection.js.map +1 -1
  102. package/dist/thread-recovery.d.ts +54 -0
  103. package/dist/thread-recovery.d.ts.map +1 -0
  104. package/dist/thread-recovery.js +71 -0
  105. package/dist/thread-recovery.js.map +1 -0
  106. package/dist/thread-turn-routes.d.ts +22 -8
  107. package/dist/thread-turn-routes.d.ts.map +1 -1
  108. package/dist/thread-turn-routes.js +73 -49
  109. package/dist/thread-turn-routes.js.map +1 -1
  110. package/package.json +6 -6
@@ -0,0 +1,35 @@
1
+ import { queryParam } from "./operation-parameters.js";
2
+ export const REMOTE_OPERATION_DRAFTS = [
3
+ {
4
+ method: "GET",
5
+ path: "/v2/filesystem/directories",
6
+ mutability: "read_only",
7
+ requestSchema: null,
8
+ responseSchema: "ControlDirectoryListing",
9
+ responseKind: "json",
10
+ summary: "List the visible subdirectories of a directory contained by the server user's home; served only by the remote runtime (a local daemon answers 501).",
11
+ parameters: [
12
+ queryParam({
13
+ name: "path",
14
+ description: "Absolute visible (non-hidden) directory under the server user's home; omit to start at HOME.",
15
+ }),
16
+ ],
17
+ },
18
+ {
19
+ method: "GET",
20
+ path: "/v2/projects/:id/file",
21
+ mutability: "read_only",
22
+ requestSchema: null,
23
+ responseSchema: null,
24
+ responseKind: "binary",
25
+ summary: "Fetch one bounded raster image contained by a registered project; served only by the remote runtime (a local daemon answers 501).",
26
+ parameters: [
27
+ queryParam({
28
+ name: "path",
29
+ required: true,
30
+ description: "Relative path contained by the registered project; the content must be a raster image (magic-byte validated).",
31
+ }),
32
+ ],
33
+ },
34
+ ];
35
+ //# sourceMappingURL=remote-operation-descriptors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-operation-descriptors.js","sourceRoot":"","sources":["../src/remote-operation-descriptors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC;QACE,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,4BAA4B;QAClC,UAAU,EAAE,WAAW;QACvB,aAAa,EAAE,IAAI;QACnB,cAAc,EAAE,yBAAyB;QACzC,YAAY,EAAE,MAAM;QACpB,OAAO,EACL,qJAAqJ;QACvJ,UAAU,EAAE;YACV,UAAU,CAAC;gBACT,IAAI,EAAE,MAAM;gBACZ,WAAW,EACT,8FAA8F;aACjG,CAAC;SACH;KACF;IACD;QACE,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,uBAAuB;QAC7B,UAAU,EAAE,WAAW;QACvB,aAAa,EAAE,IAAI;QACnB,cAAc,EAAE,IAAI;QACpB,YAAY,EAAE,QAAQ;QACtB,OAAO,EACL,mIAAmI;QACrI,UAAU,EAAE;YACV,UAAU,CAAC;gBACT,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,IAAI;gBACd,WAAW,EACT,+GAA+G;aAClH,CAAC;SACH;KACF;CAC2C,CAAC"}
@@ -1,17 +1,18 @@
1
1
  import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import { ControlUploadCreateRequest, type ResourceAttachmentRef } from "@claudexor/schema";
2
3
  export interface ResourceRouteServices {
3
- createUpload(input: unknown, idempotencyKey: string): Promise<unknown>;
4
+ createUpload(input: ControlUploadCreateRequest, idempotencyKey: string): Promise<unknown>;
4
5
  writeUpload(uploadId: string, chunks: AsyncIterable<Uint8Array>): Promise<unknown>;
5
6
  uploadStatus(uploadId: string): Promise<unknown>;
6
7
  cancelUpload(uploadId: string): Promise<unknown>;
7
8
  finalizeUpload(uploadId: string, expectedSha256: string | undefined, idempotencyKey: string): Promise<unknown>;
8
- validateResources(refs: import("@claudexor/schema").ResourceAttachmentRef[]): Promise<void>;
9
+ validateResources(refs: ResourceAttachmentRef[]): Promise<void>;
9
10
  }
10
11
  export interface ResourceRouteContext {
11
12
  services?: Partial<ResourceRouteServices>;
12
13
  readBody(req: IncomingMessage): Promise<unknown>;
13
14
  json(res: ServerResponse, status: number, body: unknown): void;
14
- requestError(res: ServerResponse, error: unknown): void;
15
+ requestError(res: ServerResponse, error: unknown, fallbackStatus?: 400 | 500): void;
15
16
  }
16
17
  export declare function handleResourceRoute(ctx: ResourceRouteContext, method: string, path: string, req: IncomingMessage, res: ServerResponse): Promise<boolean>;
17
18
  //# sourceMappingURL=resource-routes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resource-routes.d.ts","sourceRoot":"","sources":["../src/resource-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGjE,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvE,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnF,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,cAAc,CACZ,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,iBAAiB,CAAC,IAAI,EAAE,OAAO,mBAAmB,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7F;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC1C,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/D,YAAY,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CACzD;AAED,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,oBAAoB,EACzB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,OAAO,CAAC,CAiDlB"}
1
+ {"version":3,"file":"resource-routes.d.ts","sourceRoot":"","sources":["../src/resource-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAEL,0BAA0B,EAG1B,KAAK,qBAAqB,EAC3B,MAAM,mBAAmB,CAAC;AAI3B,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,KAAK,EAAE,0BAA0B,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1F,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnF,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,cAAc,CACZ,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC1C,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/D,YAAY,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;CACrF;AAED,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,oBAAoB,EACzB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,OAAO,CAAC,CAmFlB"}
@@ -1,58 +1,82 @@
1
- import { ControlUploadFinalizeRequest } from "@claudexor/schema";
1
+ import { ControlResource, ControlUploadCreateRequest, ControlUploadFinalizeRequest, ControlUploadStatus, } from "@claudexor/schema";
2
+ import { requiredIdempotencyKey } from "./run-start.js";
3
+ import { routeValue, serviceResponse } from "./route-stages.js";
2
4
  export async function handleResourceRoute(ctx, method, path, req, res) {
3
5
  const services = ctx.services;
4
6
  if (method === "POST" && path === "/uploads") {
5
- if (!services?.createUpload)
7
+ const service = services?.createUpload;
8
+ if (!service)
6
9
  return false;
7
- try {
8
- ctx.json(res, 201, await services.createUpload(await ctx.readBody(req), requiredIdempotencyKey(req)));
9
- }
10
- catch (error) {
11
- ctx.requestError(res, error);
12
- }
13
- return true;
10
+ const input = await routeValue(ctx, res, 400, async () => ({
11
+ idempotencyKey: requiredIdempotencyKey(req),
12
+ request: ControlUploadCreateRequest.parse(await ctx.readBody(req)),
13
+ }));
14
+ if (!input.ok)
15
+ return true;
16
+ const result = await routeValue(ctx, res, 500, () => service(input.value.request, input.value.idempotencyKey));
17
+ if (!result.ok)
18
+ return true;
19
+ return serviceResponse(ctx, res, "createUpload", () => ctx.json(res, 201, ControlUploadStatus.parse(result.value)));
14
20
  }
15
21
  const uploadBytesMatch = /^\/uploads\/([^/]+)\/bytes$/.exec(path);
16
22
  const uploadFinalizeMatch = /^\/uploads\/([^/]+)\/finalize$/.exec(path);
17
23
  const uploadMatch = /^\/uploads\/([^/]+)$/.exec(path);
18
- try {
19
- if (method === "PUT" && uploadBytesMatch && services?.writeUpload) {
20
- const uploadId = decodeURIComponent(uploadBytesMatch[1]);
21
- ctx.json(res, 200, await services.writeUpload(uploadId, req));
24
+ if (method === "PUT" && uploadBytesMatch) {
25
+ const service = services?.writeUpload;
26
+ if (!service)
27
+ return false;
28
+ const uploadId = await routeValue(ctx, res, 400, () => decodeURIComponent(uploadBytesMatch[1]));
29
+ if (!uploadId.ok)
30
+ return true;
31
+ const result = await routeValue(ctx, res, 500, () => service(uploadId.value, req));
32
+ if (!result.ok)
22
33
  return true;
23
- }
24
- if (method === "POST" && uploadFinalizeMatch && services?.finalizeUpload) {
34
+ return serviceResponse(ctx, res, "writeUpload", () => ctx.json(res, 200, ControlUploadStatus.parse(result.value)));
35
+ }
36
+ if (method === "POST" && uploadFinalizeMatch) {
37
+ const service = services?.finalizeUpload;
38
+ if (!service)
39
+ return false;
40
+ const input = await routeValue(ctx, res, 400, async () => {
25
41
  const uploadId = decodeURIComponent(uploadFinalizeMatch[1]);
26
42
  const body = ControlUploadFinalizeRequest.parse(await ctx.readBody(req));
27
- ctx.json(res, 201, await services.finalizeUpload(uploadId, body.expectedSha256, requiredIdempotencyKey(req)));
43
+ return {
44
+ uploadId,
45
+ expectedSha256: body.expectedSha256,
46
+ idempotencyKey: requiredIdempotencyKey(req),
47
+ };
48
+ });
49
+ if (!input.ok)
50
+ return true;
51
+ const result = await routeValue(ctx, res, 500, () => service(input.value.uploadId, input.value.expectedSha256, input.value.idempotencyKey));
52
+ if (!result.ok)
28
53
  return true;
29
- }
30
- if (method === "GET" && uploadMatch && services?.uploadStatus) {
31
- const uploadId = decodeURIComponent(uploadMatch[1]);
32
- ctx.json(res, 200, await services.uploadStatus(uploadId));
54
+ return serviceResponse(ctx, res, "finalizeUpload", () => ctx.json(res, 201, ControlResource.parse(result.value)));
55
+ }
56
+ if (method === "GET" && uploadMatch) {
57
+ const service = services?.uploadStatus;
58
+ if (!service)
59
+ return false;
60
+ const uploadId = await routeValue(ctx, res, 400, () => decodeURIComponent(uploadMatch[1]));
61
+ if (!uploadId.ok)
33
62
  return true;
34
- }
35
- if (method === "DELETE" && uploadMatch && services?.cancelUpload) {
36
- const uploadId = decodeURIComponent(uploadMatch[1]);
37
- ctx.json(res, 200, await services.cancelUpload(uploadId));
63
+ const result = await routeValue(ctx, res, 500, () => service(uploadId.value));
64
+ if (!result.ok)
38
65
  return true;
39
- }
66
+ return serviceResponse(ctx, res, "uploadStatus", () => ctx.json(res, 200, ControlUploadStatus.parse(result.value)));
40
67
  }
41
- catch (error) {
42
- ctx.requestError(res, error);
43
- return true;
68
+ if (method === "DELETE" && uploadMatch) {
69
+ const service = services?.cancelUpload;
70
+ if (!service)
71
+ return false;
72
+ const uploadId = await routeValue(ctx, res, 400, () => decodeURIComponent(uploadMatch[1]));
73
+ if (!uploadId.ok)
74
+ return true;
75
+ const result = await routeValue(ctx, res, 500, () => service(uploadId.value));
76
+ if (!result.ok)
77
+ return true;
78
+ return serviceResponse(ctx, res, "cancelUpload", () => ctx.json(res, 200, ControlUploadStatus.parse(result.value)));
44
79
  }
45
80
  return false;
46
81
  }
47
- function requiredIdempotencyKey(req) {
48
- const raw = req.headers["idempotency-key"];
49
- const value = Array.isArray(raw) ? raw[0] : raw;
50
- if (!value || value.length > 256) {
51
- throw Object.assign(new Error("Idempotency-Key is required for this create operation"), {
52
- status: 400,
53
- code: value ? "invalid_idempotency_key" : "idempotency_key_required",
54
- });
55
- }
56
- return value;
57
- }
58
82
  //# sourceMappingURL=resource-routes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resource-routes.js","sourceRoot":"","sources":["../src/resource-routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resource-routes.js","sourceRoot":"","sources":["../src/resource-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ServerResponse } from "node:http";
2
+ export interface RouteStageContext {
3
+ requestError(res: ServerResponse, error: unknown, fallbackStatus?: 400 | 500): void;
4
+ }
5
+ export type RouteValue<T> = {
6
+ ok: true;
7
+ value: T;
8
+ } | {
9
+ ok: false;
10
+ };
11
+ /** Keep request/service failures distinct before a response is written. */
12
+ export declare function routeValue<T>(ctx: RouteStageContext, res: ServerResponse, fallbackStatus: 400 | 500, load: () => T | Promise<T>): Promise<RouteValue<T>>;
13
+ /** Fail closed when a service returns a value outside its public contract. */
14
+ export declare function serviceResponse(ctx: RouteStageContext, res: ServerResponse, service: string, send: () => void): true;
15
+ //# sourceMappingURL=route-stages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-stages.d.ts","sourceRoot":"","sources":["../src/route-stages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;CACrF;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC;AAEnE,2EAA2E;AAC3E,wBAAsB,UAAU,CAAC,CAAC,EAChC,GAAG,EAAE,iBAAiB,EACtB,GAAG,EAAE,cAAc,EACnB,cAAc,EAAE,GAAG,GAAG,GAAG,EACzB,IAAI,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAOxB;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAC7B,GAAG,EAAE,iBAAiB,EACtB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,IAAI,GACf,IAAI,CAcN"}
@@ -0,0 +1,24 @@
1
+ /** Keep request/service failures distinct before a response is written. */
2
+ export async function routeValue(ctx, res, fallbackStatus, load) {
3
+ try {
4
+ return { ok: true, value: await load() };
5
+ }
6
+ catch (error) {
7
+ ctx.requestError(res, error, fallbackStatus);
8
+ return { ok: false };
9
+ }
10
+ }
11
+ /** Fail closed when a service returns a value outside its public contract. */
12
+ export function serviceResponse(ctx, res, service, send) {
13
+ try {
14
+ send();
15
+ }
16
+ catch {
17
+ ctx.requestError(res, Object.assign(new Error(`${service} returned a response that violates its schema`), {
18
+ status: 500,
19
+ code: "invalid_service_response",
20
+ }), 500);
21
+ }
22
+ return true;
23
+ }
24
+ //# sourceMappingURL=route-stages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-stages.js","sourceRoot":"","sources":["../src/route-stages.ts"],"names":[],"mappings":"AAQA,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAsB,EACtB,GAAmB,EACnB,cAAyB,EACzB,IAA0B;IAE1B,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;QAC7C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,eAAe,CAC7B,GAAsB,EACtB,GAAmB,EACnB,OAAe,EACf,IAAgB;IAEhB,IAAI,CAAC;QACH,IAAI,EAAE,CAAC;IACT,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,YAAY,CACd,GAAG,EACH,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,OAAO,+CAA+C,CAAC,EAAE;YAClF,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,0BAA0B;SACjC,CAAC,EACF,GAAG,CACJ,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { type ApplyEligibility, type DecisionRecord, type ExpectedRunFactsIdentity, type RequiredAction, type RunFacts, type RunOutcomeFacts } from "@claudexor/schema";
2
+ export interface RunFactsDetailProjection {
3
+ runFacts: RunFacts | null;
4
+ outcomeFacts: RunOutcomeFacts | null;
5
+ applyEligibility: ApplyEligibility | null;
6
+ requiredActions: RequiredAction[];
7
+ }
8
+ export interface EffectiveTerminalFacts {
9
+ runFacts: RunFacts | null;
10
+ outcomeFacts: RunOutcomeFacts | null;
11
+ decision: DecisionRecord | null;
12
+ }
13
+ /** The shared pure identity contract lives in @claudexor/schema (S2: one
14
+ * validation owner); this alias keeps the control-api surface name stable. */
15
+ export type ExpectedRunFacts = ExpectedRunFactsIdentity;
16
+ /** Bind a canonical receipt to its daemon record without asserting a racy active lifecycle. */
17
+ export declare function expectedRunFacts(record: {
18
+ id: string;
19
+ state: string;
20
+ runId?: string;
21
+ taskId?: string;
22
+ }): ExpectedRunFacts;
23
+ /**
24
+ * Single terminal-facts accessor: a cross-field-valid RunFacts receipt wins;
25
+ * old/in-flight runs with no receipt retain legacy projections. A receipt that
26
+ * is present but invalid fails loudly and can never reopen legacy apply truth.
27
+ */
28
+ export declare function effectiveTerminalFacts(runDir: string | undefined, legacyOutcomeFacts: RunOutcomeFacts | null, legacyDecision?: DecisionRecord | null, expected?: ExpectedRunFacts): EffectiveTerminalFacts;
29
+ /**
30
+ * Project terminal compatibility fields from one canonical receipt read.
31
+ * Missing receipts use legacy derivations for in-flight and pre-RunFacts runs.
32
+ * Present-but-invalid receipts fail loudly.
33
+ */
34
+ export declare function projectRunFactsForDetail(runDir: string | undefined, legacyOutcomeFacts: RunOutcomeFacts | null, hasValidOperatorDecision: boolean, legacyApplyEligibility: () => ApplyEligibility | null, expected?: ExpectedRunFacts): RunFactsDetailProjection;
35
+ //# sourceMappingURL=run-facts-projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-facts-projection.d.ts","sourceRoot":"","sources":["../src/run-facts-projection.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAI3B,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC1C,eAAe,EAAE,cAAc,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;CACjC;AAED;8EAC8E;AAC9E,MAAM,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAExD,+FAA+F;AAC/F,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,gBAAgB,CAQnB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,kBAAkB,EAAE,eAAe,GAAG,IAAI,EAC1C,cAAc,GAAE,cAAc,GAAG,IAAW,EAC5C,QAAQ,GAAE,gBAAqB,GAC9B,sBAAsB,CASxB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,kBAAkB,EAAE,eAAe,GAAG,IAAI,EAC1C,wBAAwB,EAAE,OAAO,EACjC,sBAAsB,EAAE,MAAM,gBAAgB,GAAG,IAAI,EACrD,QAAQ,GAAE,gBAAqB,GAC9B,wBAAwB,CA4B1B"}
@@ -0,0 +1,133 @@
1
+ import { lstatSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { isTerminalLifecycle, RunFactsInvalidError, validateRunFactsReceipt, requiredActionsFor, } from "@claudexor/schema";
4
+ import { parse as parseYaml } from "yaml";
5
+ import { safeArtifactPath, safeArtifactRoot } from "./artifact-paths.js";
6
+ /** Bind a canonical receipt to its daemon record without asserting a racy active lifecycle. */
7
+ export function expectedRunFacts(record) {
8
+ return {
9
+ runId: record.runId ?? record.id,
10
+ ...(record.taskId ? { taskId: record.taskId } : {}),
11
+ ...(isTerminalLifecycle(record.state)
12
+ ? { lifecycle: record.state }
13
+ : {}),
14
+ };
15
+ }
16
+ /**
17
+ * Single terminal-facts accessor: a cross-field-valid RunFacts receipt wins;
18
+ * old/in-flight runs with no receipt retain legacy projections. A receipt that
19
+ * is present but invalid fails loudly and can never reopen legacy apply truth.
20
+ */
21
+ export function effectiveTerminalFacts(runDir, legacyOutcomeFacts, legacyDecision = null, expected = {}) {
22
+ const runFacts = readRunFacts(runDir, expected);
23
+ const outcomeFacts = runFacts?.outcome ?? legacyOutcomeFacts;
24
+ return {
25
+ runFacts,
26
+ outcomeFacts,
27
+ decision: legacyDecision && outcomeFacts ? { ...legacyDecision, facts: outcomeFacts } : legacyDecision,
28
+ };
29
+ }
30
+ /**
31
+ * Project terminal compatibility fields from one canonical receipt read.
32
+ * Missing receipts use legacy derivations for in-flight and pre-RunFacts runs.
33
+ * Present-but-invalid receipts fail loudly.
34
+ */
35
+ export function projectRunFactsForDetail(runDir, legacyOutcomeFacts, hasValidOperatorDecision, legacyApplyEligibility, expected = {}) {
36
+ const { runFacts, outcomeFacts } = effectiveTerminalFacts(runDir, legacyOutcomeFacts, null, expected);
37
+ if (runFacts) {
38
+ // Delivery state and operator decisions are the two legitimate
39
+ // post-terminal overlays. Re-derive only their mutable compatibility
40
+ // fields while keeping the receipt's terminal outcome authoritative.
41
+ const hasMutableOverlay = hasValidOperatorDecision || artifactExists(runDir, "final/delivery_state.yaml");
42
+ return {
43
+ runFacts,
44
+ outcomeFacts,
45
+ applyEligibility: hasMutableOverlay ? legacyApplyEligibility() : runFacts.apply.eligibility,
46
+ requiredActions: hasMutableOverlay
47
+ ? requiredActionsFor(runFacts.outcome, hasValidOperatorDecision)
48
+ : runFacts.required_actions,
49
+ };
50
+ }
51
+ return {
52
+ runFacts: null,
53
+ outcomeFacts: legacyOutcomeFacts,
54
+ applyEligibility: legacyApplyEligibility(),
55
+ requiredActions: requiredActionsFor(legacyOutcomeFacts, hasValidOperatorDecision),
56
+ };
57
+ }
58
+ /** RunFacts is already redacted; avoid a second presentation-redaction pass. */
59
+ function readRunFacts(runDir, expected) {
60
+ if (!runDir)
61
+ return null;
62
+ const root = safeArtifactRoot(runDir);
63
+ if (!root) {
64
+ try {
65
+ lstatSync(runDir);
66
+ }
67
+ catch (error) {
68
+ if (error.code === "ENOENT")
69
+ return null;
70
+ }
71
+ throw invalidRunFacts();
72
+ }
73
+ const finalDir = join(root, "final");
74
+ let finalStat;
75
+ try {
76
+ finalStat = lstatSync(finalDir);
77
+ }
78
+ catch (error) {
79
+ if (error.code === "ENOENT")
80
+ return null;
81
+ throw invalidRunFacts();
82
+ }
83
+ if (finalStat.isSymbolicLink() || !finalStat.isDirectory()) {
84
+ throw invalidRunFacts();
85
+ }
86
+ const path = join(finalDir, "run_facts.yaml");
87
+ let stat;
88
+ try {
89
+ stat = lstatSync(path);
90
+ }
91
+ catch (error) {
92
+ if (error.code === "ENOENT")
93
+ return null;
94
+ throw invalidRunFacts();
95
+ }
96
+ if (stat.isSymbolicLink() || stat.isDirectory() || !stat.isFile()) {
97
+ throw invalidRunFacts();
98
+ }
99
+ try {
100
+ // Shape + cross-axis invariants + identity binding live in the ONE shared
101
+ // pure owner (@claudexor/schema); only YAML/file reading and the HTTP
102
+ // problem mapping below are control-api's own.
103
+ return validateRunFactsReceipt(parseYaml(readFileSync(path, "utf8")), expected);
104
+ }
105
+ catch {
106
+ throw invalidRunFacts();
107
+ }
108
+ }
109
+ /** Transport mapping of the shared refusal: the HTTP status and typed unblock
110
+ * action are control-api's own; message/code/retryable/evidenceRefs come from
111
+ * the ONE shared class in @claudexor/schema — never duplicated here. */
112
+ class RunFactsInvalidHttpError extends RunFactsInvalidError {
113
+ status = 500;
114
+ requiredActions = ["inspect_run_artifacts"];
115
+ }
116
+ function invalidRunFacts() {
117
+ return new RunFactsInvalidHttpError();
118
+ }
119
+ function artifactExists(runDir, relativePath) {
120
+ try {
121
+ if (!runDir)
122
+ return false;
123
+ const path = safeArtifactPath(runDir, relativePath);
124
+ if (!path)
125
+ return false;
126
+ const stat = lstatSync(path);
127
+ return !stat.isSymbolicLink() && !stat.isDirectory();
128
+ }
129
+ catch {
130
+ return false;
131
+ }
132
+ }
133
+ //# sourceMappingURL=run-facts-projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-facts-projection.js","sourceRoot":"","sources":["../src/run-facts-projection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { DaemonRunRecord } from "./run-record.js";
2
+ export declare function runListFingerprintProbeCountForTests(): number;
3
+ export declare function resetRunListFingerprintProbeCountForTests(): void;
4
+ /** Fingerprint only the mutable delivery overlay for settled runs; all other
5
+ * terminal artifacts are immutable. Active runs retain the complete set. */
6
+ export declare function summaryFingerprint(rec: DaemonRunRecord): string;
7
+ //# sourceMappingURL=run-list-fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-list-fingerprint.d.ts","sourceRoot":"","sources":["../src/run-list-fingerprint.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAMvD,wBAAgB,oCAAoC,IAAI,MAAM,CAE7D;AAED,wBAAgB,yCAAyC,IAAI,IAAI,CAEhE;AAED;4EAC4E;AAC5E,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAyC/D"}
@@ -0,0 +1,68 @@
1
+ import { statSync } from "node:fs";
2
+ import { sha256 } from "@claudexor/util";
3
+ import { safeArtifactPath } from "./artifact-paths.js";
4
+ import { TERMINAL_STATES } from "./sse-shared.js";
5
+ /** Number of artifact-path probes performed by the run-list fingerprinter. */
6
+ let fingerprintProbeCount = 0;
7
+ export function runListFingerprintProbeCountForTests() {
8
+ return fingerprintProbeCount;
9
+ }
10
+ export function resetRunListFingerprintProbeCountForTests() {
11
+ fingerprintProbeCount = 0;
12
+ }
13
+ /** Fingerprint only the mutable delivery overlay for settled runs; all other
14
+ * terminal artifacts are immutable. Active runs retain the complete set. */
15
+ export function summaryFingerprint(rec) {
16
+ const fileIdentity = (rel) => {
17
+ fingerprintProbeCount++;
18
+ if (!rec.runDir)
19
+ return "0";
20
+ const path = safeArtifactPath(rec.runDir, rel);
21
+ if (!path)
22
+ return "0";
23
+ try {
24
+ const stat = statSync(path, { bigint: true });
25
+ return [stat.dev, stat.ino, stat.size, stat.mtimeNs, stat.ctimeNs].join(":");
26
+ }
27
+ catch {
28
+ return "0";
29
+ }
30
+ };
31
+ const identity = [rec.state, paramsFingerprint(rec), rec.finishedAt ?? "", rec.error ?? ""];
32
+ if (TERMINAL_STATES.has(rec.state)) {
33
+ // Delivery is the only ordinary mutable terminal overlay. Retention is the
34
+ // other sanctioned transition: it atomically replaces the whole run tree
35
+ // with tombstone.yaml, so that marker must invalidate a previously cached
36
+ // ready summary without re-statting every immutable terminal artifact.
37
+ return [
38
+ ...identity,
39
+ fileIdentity("final/delivery_state.yaml"),
40
+ fileIdentity("tombstone.yaml"),
41
+ ].join("|");
42
+ }
43
+ return [
44
+ ...identity,
45
+ fileIdentity("events.jsonl"),
46
+ fileIdentity("arbitration/decision.yaml"),
47
+ fileIdentity("final/telemetry.yaml"),
48
+ fileIdentity("final/run_facts.yaml"),
49
+ fileIdentity("final/failure.yaml"),
50
+ fileIdentity("final/summary.md"),
51
+ fileIdentity("final/answer.md"),
52
+ fileIdentity("final/plan.md"),
53
+ fileIdentity("final/explore.md"),
54
+ fileIdentity("final/report.md"),
55
+ fileIdentity("final/patch.diff"),
56
+ fileIdentity("final/work_product.yaml"),
57
+ fileIdentity("final/delivery_state.yaml"),
58
+ ].join("|");
59
+ }
60
+ function paramsFingerprint(rec) {
61
+ try {
62
+ return sha256(JSON.stringify(rec.params ?? null));
63
+ }
64
+ catch {
65
+ return "unserializable-params";
66
+ }
67
+ }
68
+ //# sourceMappingURL=run-list-fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-list-fingerprint.js","sourceRoot":"","sources":["../src/run-list-fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,8EAA8E;AAC9E,IAAI,qBAAqB,GAAG,CAAC,CAAC;AAE9B,MAAM,UAAU,oCAAoC;IAClD,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,yCAAyC;IACvD,qBAAqB,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED;4EAC4E;AAC5E,MAAM,UAAU,kBAAkB,CAAC,GAAoB;IACrD,MAAM,YAAY,GAAG,CAAC,GAAW,EAAU,EAAE;QAC3C,qBAAqB,EAAE,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,OAAO,GAAG,CAAC;QAC5B,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI;YAAE,OAAO,GAAG,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5F,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,2EAA2E;QAC3E,yEAAyE;QACzE,0EAA0E;QAC1E,uEAAuE;QACvE,OAAO;YACL,GAAG,QAAQ;YACX,YAAY,CAAC,2BAA2B,CAAC;YACzC,YAAY,CAAC,gBAAgB,CAAC;SAC/B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACd,CAAC;IACD,OAAO;QACL,GAAG,QAAQ;QACX,YAAY,CAAC,cAAc,CAAC;QAC5B,YAAY,CAAC,2BAA2B,CAAC;QACzC,YAAY,CAAC,sBAAsB,CAAC;QACpC,YAAY,CAAC,sBAAsB,CAAC;QACpC,YAAY,CAAC,oBAAoB,CAAC;QAClC,YAAY,CAAC,kBAAkB,CAAC;QAChC,YAAY,CAAC,iBAAiB,CAAC;QAC/B,YAAY,CAAC,eAAe,CAAC;QAC7B,YAAY,CAAC,kBAAkB,CAAC;QAChC,YAAY,CAAC,iBAAiB,CAAC;QAC/B,YAAY,CAAC,kBAAkB,CAAC;QAChC,YAAY,CAAC,yBAAyB,CAAC;QACvC,YAAY,CAAC,2BAA2B,CAAC;KAC1C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAoB;IAC7C,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,uBAAuB,CAAC;IACjC,CAAC;AACH,CAAC"}
@@ -8,6 +8,8 @@ export interface DaemonRunRecord {
8
8
  errorCode?: string;
9
9
  errorStatus?: number;
10
10
  errorRetryable?: boolean;
11
+ errorRequiredActions?: string[];
12
+ errorContext?: Record<string, unknown>;
11
13
  params?: unknown;
12
14
  createdAt?: string;
13
15
  startedAt?: string;
@@ -22,11 +24,13 @@ export interface DaemonFacadeClient {
22
24
  }): Promise<{
23
25
  id: string;
24
26
  state: string;
27
+ reused?: boolean;
25
28
  }>;
26
29
  findAccepted?(params: unknown, options: {
27
30
  idempotencyKey: string;
28
31
  clientId?: string;
29
32
  operation?: string;
33
+ idempotencyRequest?: unknown;
30
34
  }): Promise<DaemonRunRecord | null>;
31
35
  status(id: string): Promise<DaemonRunRecord>;
32
36
  list(): Promise<DaemonRunRecord[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"run-record.d.ts","sourceRoot":"","sources":["../src/run-record.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CACL,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE;QACR,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GACA,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1C,YAAY,CAAC,CACX,MAAM,EAAE,OAAO,EACf,OAAO,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GACzE,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7C,IAAI,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,qBAAqB,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,aAAa,GAAG,sBAAsB,CAAC;IAC/C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAI7E;AAED;kEACkE;AAClE,wBAAgB,kCAAkC,CAChD,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,SAAS,eAAe,EAAE,EAChC,KAAK,SAAyB,GAC7B,eAAe,EAAE,CAwBnB;AAED,iFAAiF;AACjF,wBAAgB,+BAA+B,CAC7C,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,SAAS,eAAe,EAAE,GAC/B,eAAe,EAAE,CAuBnB"}
1
+ {"version":3,"file":"run-record.d.ts","sourceRoot":"","sources":["../src/run-record.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CACL,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE;QACR,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GACA,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC5D,YAAY,CAAC,CACX,MAAM,EAAE,OAAO,EACf,OAAO,EAAE;QACP,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,GACA,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7C,IAAI,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,qBAAqB,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,aAAa,GAAG,sBAAsB,CAAC;IAC/C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAI7E;AAED;kEACkE;AAClE,wBAAgB,kCAAkC,CAChD,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,SAAS,eAAe,EAAE,EAChC,KAAK,SAAyB,GAC7B,eAAe,EAAE,CAwBnB;AAED,iFAAiF;AACjF,wBAAgB,+BAA+B,CAC7C,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,SAAS,eAAe,EAAE,GAC/B,eAAe,EAAE,CAuBnB"}
@@ -1 +1 @@
1
- {"version":3,"file":"run-record.js","sourceRoot":"","sources":["../src/run-record.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AA8C3D,MAAM,UAAU,YAAY,CAAC,MAAuB;IAClD,OAAO,MAAM,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;QACxF,CAAC,CAAE,MAAM,CAAC,MAAkC;QAC5C,CAAC,CAAC,EAAE,CAAC;AACT,CAAC;AAED;kEACkE;AAClE,MAAM,UAAU,kCAAkC,CAChD,WAAmB,EACnB,IAAgC,EAChC,KAAK,GAAG,sBAAsB;IAE9B,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxC,IAAI,YAAY,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI;SACjB,MAAM,CACL,CAAC,GAAG,EAAE,EAAE,CACN,YAAY,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,KAAK,WAAW;QACvD,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE,CAAC,KAAK,WAAW,CACxC;SACA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC;QACjF,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/D,OAAO,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IACL,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QAC9B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACd,IAAI,GAAG,CAAC,MAAM,IAAI,YAAY;YAAE,MAAM;IACxC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,+BAA+B,CAC7C,WAAmB,EACnB,IAAgC;IAEhC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;IACtD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,CAAC;QACvD,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,SAAS;QACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,CAAC,WAAW,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/C,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;gBAAE,SAAS;YACnC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"run-record.js","sourceRoot":"","sources":["../src/run-record.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,14 @@
1
1
  import type { IncomingMessage, ServerResponse } from "node:http";
2
2
  import type { DaemonControlApiOptions, DaemonFacadeClient, DaemonRunRecord } from "./daemon-server.js";
3
- type RetryServices = Pick<NonNullable<DaemonControlApiOptions["services"]>, "createThreadTurn" | "setTurnEnqueueError" | "threadDetail" | "validateResources" | "preflightRunRequirements">;
3
+ type RetryServices = Pick<NonNullable<DaemonControlApiOptions["services"]>, "createThreadTurn" | "findThreadTurnByIdempotency" | "setTurnEnqueueError" | "threadDetail" | "validateResources" | "preflightRunRequirements">;
4
4
  export interface RunRetryRouteContext {
5
5
  daemon: DaemonFacadeClient;
6
6
  services?: RetryServices;
7
7
  findRun(id: string): Promise<DaemonRunRecord | null>;
8
8
  waitForRunStart(jobId: string): Promise<DaemonRunRecord>;
9
+ serializeThreadMutation<T>(threadId: string, work: () => Promise<T>): Promise<T>;
9
10
  json(response: ServerResponse, status: number, body: unknown): void;
10
- requestError(response: ServerResponse, error: unknown): void;
11
+ requestError(response: ServerResponse, error: unknown, fallbackStatus?: 400 | 500): void;
11
12
  }
12
13
  export declare function handleRunRetryRoute(ctx: RunRetryRouteContext, method: string, path: string, req: IncomingMessage, res: ServerResponse): Promise<boolean>;
13
14
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"run-retry-routes.d.ts","sourceRoot":"","sources":["../src/run-retry-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAWjE,OAAO,KAAK,EACV,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAK5B,KAAK,aAAa,GAAG,IAAI,CACvB,WAAW,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC,EAC9C,kBAAkB,GAClB,qBAAqB,GACrB,cAAc,GACd,mBAAmB,GACnB,0BAA0B,CAC7B,CAAC;AAEF,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACrD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACzD,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACpE,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9D;AAED,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,oBAAoB,EACzB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,OAAO,CAAC,CAYlB"}
1
+ {"version":3,"file":"run-retry-routes.d.ts","sourceRoot":"","sources":["../src/run-retry-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAWjE,OAAO,KAAK,EACV,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAM5B,KAAK,aAAa,GAAG,IAAI,CACvB,WAAW,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC,EAC9C,kBAAkB,GAClB,6BAA6B,GAC7B,qBAAqB,GACrB,cAAc,GACd,mBAAmB,GACnB,0BAA0B,CAC7B,CAAC;AAEF,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACrD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACzD,uBAAuB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACjF,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACpE,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;CAC1F;AAED,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,oBAAoB,EACzB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,OAAO,CAAC,CAYlB"}