@claudexor/control-api 3.1.1 → 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.
- package/dist/authorization.d.ts +3 -0
- package/dist/authorization.d.ts.map +1 -0
- package/dist/authorization.js +15 -0
- package/dist/authorization.js.map +1 -0
- package/dist/binary-response.d.ts +5 -0
- package/dist/binary-response.d.ts.map +1 -0
- package/dist/binary-response.js +31 -0
- package/dist/binary-response.js.map +1 -0
- package/dist/budget-valuation.d.ts +23 -0
- package/dist/budget-valuation.d.ts.map +1 -0
- package/dist/budget-valuation.js +90 -0
- package/dist/budget-valuation.js.map +1 -0
- package/dist/catalog-query.d.ts +310 -0
- package/dist/catalog-query.d.ts.map +1 -0
- package/dist/catalog-query.js +36 -0
- package/dist/catalog-query.js.map +1 -0
- package/dist/daemon-server.d.ts +33 -79
- package/dist/daemon-server.d.ts.map +1 -1
- package/dist/daemon-server.js +175 -281
- package/dist/daemon-server.js.map +1 -1
- package/dist/decision-accept-risk.d.ts +36 -0
- package/dist/decision-accept-risk.d.ts.map +1 -0
- package/dist/decision-accept-risk.js +79 -0
- package/dist/decision-accept-risk.js.map +1 -0
- package/dist/decision-rerun.d.ts +2 -1
- package/dist/decision-rerun.d.ts.map +1 -1
- package/dist/decision-rerun.js +79 -48
- package/dist/decision-rerun.js.map +1 -1
- package/dist/delegation-control.d.ts +23 -0
- package/dist/delegation-control.d.ts.map +1 -0
- package/dist/delegation-control.js +81 -0
- package/dist/delegation-control.js.map +1 -0
- 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/maintenance-routes.d.ts +2 -2
- package/dist/maintenance-routes.d.ts.map +1 -1
- package/dist/maintenance-routes.js +11 -10
- package/dist/maintenance-routes.js.map +1 -1
- package/dist/operation-catalog.d.ts +9 -9
- package/dist/operation-catalog.d.ts.map +1 -1
- package/dist/operation-catalog.js +22 -79
- package/dist/operation-catalog.js.map +1 -1
- package/dist/operation-draft.d.ts +3 -0
- package/dist/operation-draft.d.ts.map +1 -0
- package/dist/operation-draft.js +2 -0
- package/dist/operation-draft.js.map +1 -0
- package/dist/operation-parameters.d.ts.map +1 -1
- package/dist/operation-summaries.d.ts +3 -0
- package/dist/operation-summaries.d.ts.map +1 -0
- package/dist/operation-summaries.js +75 -0
- package/dist/operation-summaries.js.map +1 -0
- package/dist/primary-output.d.ts +3 -3
- package/dist/primary-output.d.ts.map +1 -1
- package/dist/primary-output.js +70 -19
- package/dist/primary-output.js.map +1 -1
- package/dist/problem-response.d.ts.map +1 -1
- package/dist/problem-response.js +14 -9
- package/dist/problem-response.js.map +1 -1
- package/dist/project-routes.d.ts +21 -13
- package/dist/project-routes.d.ts.map +1 -1
- package/dist/project-routes.js +80 -34
- package/dist/project-routes.js.map +1 -1
- package/dist/remote-operation-descriptors.d.ts +36 -0
- package/dist/remote-operation-descriptors.d.ts.map +1 -0
- package/dist/remote-operation-descriptors.js +35 -0
- package/dist/remote-operation-descriptors.js.map +1 -0
- package/dist/resource-routes.d.ts +4 -3
- package/dist/resource-routes.d.ts.map +1 -1
- package/dist/resource-routes.js +63 -39
- package/dist/resource-routes.js.map +1 -1
- package/dist/route-stages.d.ts +15 -0
- package/dist/route-stages.d.ts.map +1 -0
- package/dist/route-stages.js +24 -0
- package/dist/route-stages.js.map +1 -0
- package/dist/run-facts-projection.d.ts +35 -0
- package/dist/run-facts-projection.d.ts.map +1 -0
- package/dist/run-facts-projection.js +133 -0
- package/dist/run-facts-projection.js.map +1 -0
- package/dist/run-list-fingerprint.d.ts +7 -0
- package/dist/run-list-fingerprint.d.ts.map +1 -0
- package/dist/run-list-fingerprint.js +68 -0
- package/dist/run-list-fingerprint.js.map +1 -0
- package/dist/run-record.d.ts +53 -0
- package/dist/run-record.d.ts.map +1 -0
- package/dist/run-record.js +61 -0
- package/dist/run-record.js.map +1 -0
- package/dist/run-retry-routes.d.ts +3 -2
- package/dist/run-retry-routes.d.ts.map +1 -1
- package/dist/run-retry-routes.js +129 -48
- package/dist/run-retry-routes.js.map +1 -1
- package/dist/run-start.d.ts +13 -1
- package/dist/run-start.d.ts.map +1 -1
- package/dist/run-start.js +90 -18
- package/dist/run-start.js.map +1 -1
- package/dist/run-timeline.d.ts.map +1 -1
- package/dist/run-timeline.js +17 -9
- package/dist/run-timeline.js.map +1 -1
- package/dist/thread-lifecycle-routes.d.ts +1 -1
- package/dist/thread-lifecycle-routes.d.ts.map +1 -1
- package/dist/thread-lifecycle-routes.js +3 -4
- package/dist/thread-lifecycle-routes.js.map +1 -1
- package/dist/thread-mutation.d.ts +6 -0
- package/dist/thread-mutation.d.ts.map +1 -1
- package/dist/thread-mutation.js +23 -0
- package/dist/thread-mutation.js.map +1 -1
- package/dist/thread-projection.d.ts +6 -1
- package/dist/thread-projection.d.ts.map +1 -1
- package/dist/thread-projection.js +28 -1
- package/dist/thread-projection.js.map +1 -1
- package/dist/thread-recovery.d.ts +54 -0
- package/dist/thread-recovery.d.ts.map +1 -0
- package/dist/thread-recovery.js +71 -0
- package/dist/thread-recovery.js.map +1 -0
- package/dist/thread-turn-routes.d.ts +22 -8
- package/dist/thread-turn-routes.d.ts.map +1 -1
- package/dist/thread-turn-routes.js +73 -49
- package/dist/thread-turn-routes.js.map +1 -1
- package/package.json +6 -6
package/dist/project-routes.js
CHANGED
|
@@ -1,53 +1,100 @@
|
|
|
1
|
-
import { ControlProject, ControlProjectListResponse, ControlProjectRegisterRequest, ControlProjectRelinkRequest, ControlProjectRemoveReceipt, } from "@claudexor/schema";
|
|
1
|
+
import { ControlProject, ControlProjectListResponse, ControlProjectRegisterRequest, ControlProjectRelinkRequest, ControlProjectRemoveReceipt, ControlDirectoryListing, } from "@claudexor/schema";
|
|
2
2
|
import { assertNoInlineSecretValues } from "@claudexor/util";
|
|
3
3
|
import { requiredIdempotencyKey } from "./run-start.js";
|
|
4
|
+
import { routeValue, serviceResponse } from "./route-stages.js";
|
|
4
5
|
export async function handleProjectRoute(ctx, method, path, req, res) {
|
|
6
|
+
if (method === "GET" && path === "/filesystem/directories") {
|
|
7
|
+
const service = ctx.services?.listDirectory;
|
|
8
|
+
if (!service)
|
|
9
|
+
return unsupported(ctx, res);
|
|
10
|
+
const requestedPath = await routeValue(ctx, res, 400, () => {
|
|
11
|
+
const url = new URL(req.url ?? "", "http://localhost");
|
|
12
|
+
for (const key of url.searchParams.keys()) {
|
|
13
|
+
if (key !== "path")
|
|
14
|
+
throw new Error(`unexpected query parameter: ${key}`);
|
|
15
|
+
}
|
|
16
|
+
if (url.searchParams.getAll("path").length > 1) {
|
|
17
|
+
throw new Error("path may be specified only once");
|
|
18
|
+
}
|
|
19
|
+
return url.searchParams.get("path") ?? undefined;
|
|
20
|
+
});
|
|
21
|
+
if (!requestedPath.ok)
|
|
22
|
+
return true;
|
|
23
|
+
const listing = await routeValue(ctx, res, 500, () => service(requestedPath.value));
|
|
24
|
+
if (!listing.ok)
|
|
25
|
+
return true;
|
|
26
|
+
return serviceResponse(ctx, res, "listDirectory", () => ctx.json(res, 200, ControlDirectoryListing.parse(listing.value)));
|
|
27
|
+
}
|
|
5
28
|
if (method === "GET" && path === "/projects") {
|
|
6
29
|
const service = ctx.services?.listProjects;
|
|
7
30
|
if (!service)
|
|
8
31
|
return unsupported(ctx, res);
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
return true;
|
|
32
|
+
const response = await routeValue(ctx, res, 500, service);
|
|
33
|
+
if (!response.ok)
|
|
34
|
+
return true;
|
|
35
|
+
return serviceResponse(ctx, res, "listProjects", () => ctx.json(res, 200, ControlProjectListResponse.parse({
|
|
36
|
+
projects: response.value.projects.map(projectWire),
|
|
37
|
+
})));
|
|
17
38
|
}
|
|
18
39
|
if (method === "POST" && path === "/projects") {
|
|
19
40
|
const service = ctx.services?.registerProject;
|
|
20
41
|
if (!service)
|
|
21
42
|
return unsupported(ctx, res);
|
|
22
|
-
|
|
43
|
+
const input = await routeValue(ctx, res, 400, async () => {
|
|
23
44
|
const idempotencyKey = requiredIdempotencyKey(req);
|
|
24
45
|
const raw = await ctx.readBody(req);
|
|
25
46
|
assertNoInlineSecretValues(raw);
|
|
26
47
|
const body = ControlProjectRegisterRequest.parse(raw);
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
48
|
+
return { root: body.root, idempotencyKey, clientId: "control-api" };
|
|
49
|
+
});
|
|
50
|
+
if (!input.ok)
|
|
51
|
+
return true;
|
|
52
|
+
const project = await routeValue(ctx, res, 500, () => service(input.value));
|
|
53
|
+
if (!project.ok)
|
|
54
|
+
return true;
|
|
55
|
+
return serviceResponse(ctx, res, "registerProject", () => ctx.json(res, 200, projectWire(project.value)));
|
|
34
56
|
}
|
|
35
57
|
const projectRelinkMatch = /^\/projects\/([^/]+)\/relink$/.exec(path);
|
|
36
58
|
if (method === "POST" && projectRelinkMatch) {
|
|
37
59
|
const service = ctx.services?.relinkProject;
|
|
38
60
|
if (!service)
|
|
39
61
|
return unsupported(ctx, res);
|
|
40
|
-
|
|
62
|
+
const input = await routeValue(ctx, res, 400, async () => {
|
|
63
|
+
const projectId = decodeURIComponent(projectRelinkMatch[1]);
|
|
41
64
|
const raw = await ctx.readBody(req);
|
|
42
65
|
assertNoInlineSecretValues(raw);
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
return
|
|
66
|
+
return { projectId, root: ControlProjectRelinkRequest.parse(raw).root };
|
|
67
|
+
});
|
|
68
|
+
if (!input.ok)
|
|
69
|
+
return true;
|
|
70
|
+
const project = await routeValue(ctx, res, 500, () => service(input.value.projectId, input.value.root));
|
|
71
|
+
if (!project.ok)
|
|
72
|
+
return true;
|
|
73
|
+
return serviceResponse(ctx, res, "relinkProject", () => ctx.json(res, 200, projectWire(project.value)));
|
|
74
|
+
}
|
|
75
|
+
const projectFileMatch = /^\/projects\/([^/]+)\/file$/.exec(path);
|
|
76
|
+
if (method === "GET" && projectFileMatch) {
|
|
77
|
+
const service = ctx.services?.fetchProjectFile;
|
|
78
|
+
if (!service)
|
|
79
|
+
return unsupported(ctx, res);
|
|
80
|
+
const input = await routeValue(ctx, res, 400, () => {
|
|
81
|
+
const projectId = decodeURIComponent(projectFileMatch[1]);
|
|
82
|
+
const url = new URL(req.url ?? "", "http://localhost");
|
|
83
|
+
for (const key of url.searchParams.keys()) {
|
|
84
|
+
if (key !== "path")
|
|
85
|
+
throw new Error(`unexpected query parameter: ${key}`);
|
|
86
|
+
}
|
|
87
|
+
if (url.searchParams.getAll("path").length !== 1) {
|
|
88
|
+
throw new Error("one path query parameter is required");
|
|
89
|
+
}
|
|
90
|
+
return { projectId, requestedPath: url.searchParams.get("path") ?? "" };
|
|
91
|
+
});
|
|
92
|
+
if (!input.ok)
|
|
93
|
+
return true;
|
|
94
|
+
const file = await routeValue(ctx, res, 500, () => service(input.value.projectId, input.value.requestedPath));
|
|
95
|
+
if (!file.ok)
|
|
96
|
+
return true;
|
|
97
|
+
return serviceResponse(ctx, res, "fetchProjectFile", () => ctx.binary(res, 200, file.value.data, file.value.contentType, file.value.fileName));
|
|
51
98
|
}
|
|
52
99
|
// QA-049: DELETE /projects/:id — retire a durable project (registry entry +
|
|
53
100
|
// journal-partition archival), typed-fenced against non-purged threads and
|
|
@@ -57,14 +104,13 @@ export async function handleProjectRoute(ctx, method, path, req, res) {
|
|
|
57
104
|
const service = ctx.services?.removeProject;
|
|
58
105
|
if (!service)
|
|
59
106
|
return unsupported(ctx, res);
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
return true;
|
|
107
|
+
const projectId = await routeValue(ctx, res, 400, () => decodeURIComponent(projectDeleteMatch[1]));
|
|
108
|
+
if (!projectId.ok)
|
|
109
|
+
return true;
|
|
110
|
+
const receipt = await routeValue(ctx, res, 500, () => service(projectId.value));
|
|
111
|
+
if (!receipt.ok)
|
|
112
|
+
return true;
|
|
113
|
+
return serviceResponse(ctx, res, "removeProject", () => ctx.json(res, 200, ControlProjectRemoveReceipt.parse(receipt.value)));
|
|
68
114
|
}
|
|
69
115
|
return false;
|
|
70
116
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-routes.js","sourceRoot":"","sources":["../src/project-routes.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,0BAA0B,EAC1B,6BAA6B,EAC7B,2BAA2B,EAC3B,2BAA2B,
|
|
1
|
+
{"version":3,"file":"project-routes.js","sourceRoot":"","sources":["../src/project-routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export declare const REMOTE_OPERATION_DRAFTS: readonly [{
|
|
2
|
+
readonly method: "GET";
|
|
3
|
+
readonly path: "/v2/filesystem/directories";
|
|
4
|
+
readonly mutability: "read_only";
|
|
5
|
+
readonly requestSchema: null;
|
|
6
|
+
readonly responseSchema: "ControlDirectoryListing";
|
|
7
|
+
readonly responseKind: "json";
|
|
8
|
+
readonly 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).";
|
|
9
|
+
readonly parameters: [{
|
|
10
|
+
name: string;
|
|
11
|
+
location: "header" | "query";
|
|
12
|
+
required: boolean;
|
|
13
|
+
repeatable: boolean;
|
|
14
|
+
enum: string[] | null;
|
|
15
|
+
schemaRef: string | null;
|
|
16
|
+
description: string;
|
|
17
|
+
}];
|
|
18
|
+
}, {
|
|
19
|
+
readonly method: "GET";
|
|
20
|
+
readonly path: "/v2/projects/:id/file";
|
|
21
|
+
readonly mutability: "read_only";
|
|
22
|
+
readonly requestSchema: null;
|
|
23
|
+
readonly responseSchema: null;
|
|
24
|
+
readonly responseKind: "binary";
|
|
25
|
+
readonly summary: "Fetch one bounded raster image contained by a registered project; served only by the remote runtime (a local daemon answers 501).";
|
|
26
|
+
readonly parameters: [{
|
|
27
|
+
name: string;
|
|
28
|
+
location: "header" | "query";
|
|
29
|
+
required: boolean;
|
|
30
|
+
repeatable: boolean;
|
|
31
|
+
enum: string[] | null;
|
|
32
|
+
schemaRef: string | null;
|
|
33
|
+
description: string;
|
|
34
|
+
}];
|
|
35
|
+
}];
|
|
36
|
+
//# sourceMappingURL=remote-operation-descriptors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-operation-descriptors.d.ts","sourceRoot":"","sources":["../src/remote-operation-descriptors.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,uBAAuB;qBAExB,KAAK;mBACP,4BAA4B;yBACtB,WAAW;;6BAEP,yBAAyB;2BAC3B,MAAM;sBAElB,qJAAqJ;;;;;;;;;;;qBAU/I,KAAK;mBACP,uBAAuB;yBACjB,WAAW;;;2BAGT,QAAQ;sBAEpB,mIAAmI;;;;;;;;;;EAU3F,CAAC"}
|
|
@@ -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:
|
|
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:
|
|
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;
|
|
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"}
|
package/dist/resource-routes.js
CHANGED
|
@@ -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
|
-
|
|
7
|
+
const service = services?.createUpload;
|
|
8
|
+
if (!service)
|
|
6
9
|
return false;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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 (
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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":"AACA,OAAO,
|
|
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"}
|