@ccdd/project 4.2.0 → 5.0.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/monitor-ui/assets/{GraphView-6yzqBOLv.js → GraphView-BDrRFY2b.js} +3 -3
- package/dist/monitor-ui/assets/ValidationView-CznEpoWz.js +1 -0
- package/dist/monitor-ui/assets/ValidationView-DBRoun_B.css +1 -0
- package/dist/monitor-ui/assets/{elk-api-BwZQovT5.js → elk-api-BJkhNJwW.js} +1 -1
- package/dist/monitor-ui/assets/{elk.bundled-CQowIhI8.js → elk.bundled-uROSxMms.js} +1 -1
- package/dist/monitor-ui/assets/{index-D0yfhUlt.css → index-CRKnM9pk.css} +1 -1
- package/dist/monitor-ui/assets/index-CTW1fvAj.js +6 -0
- package/dist/monitor-ui/index.html +2 -2
- package/dist/src/artifacts/tool-check.js +1 -3
- package/dist/src/artifacts/tool-check.js.map +1 -1
- package/dist/src/broker/config.js +22 -3
- package/dist/src/broker/config.js.map +1 -1
- package/dist/src/broker/index.d.ts +45 -84
- package/dist/src/broker/index.js +176 -51
- package/dist/src/broker/index.js.map +1 -1
- package/dist/src/broker/polling.d.ts +11 -0
- package/dist/src/broker/polling.js +27 -0
- package/dist/src/broker/polling.js.map +1 -0
- package/dist/src/cli-cancellation.d.ts +2 -0
- package/dist/src/cli-cancellation.js +15 -0
- package/dist/src/cli-cancellation.js.map +1 -0
- package/dist/src/contracts.d.ts +4 -4
- package/dist/src/definitions.d.ts +8 -1
- package/dist/src/executors/index.js +6 -21
- package/dist/src/executors/index.js.map +1 -1
- package/dist/src/executors/pi.d.ts +3 -1
- package/dist/src/executors/pi.js +2 -0
- package/dist/src/executors/pi.js.map +1 -1
- package/dist/src/executors/telemetry.d.ts +2 -0
- package/dist/src/executors/telemetry.js +12 -0
- package/dist/src/executors/telemetry.js.map +1 -1
- package/dist/src/monitor/actions.d.ts +1 -1
- package/dist/src/monitor/actions.js +3 -3
- package/dist/src/monitor/actions.js.map +1 -1
- package/dist/src/monitor/server.js +10 -5
- package/dist/src/monitor/server.js.map +1 -1
- package/dist/src/monitor/store.js +10 -6
- package/dist/src/monitor/store.js.map +1 -1
- package/dist/src/monitor/types.d.ts +5 -7
- package/dist/src/project/cli.js +76 -38
- package/dist/src/project/cli.js.map +1 -1
- package/dist/src/project/identity.d.ts +7 -2
- package/dist/src/project/identity.js +57 -8
- package/dist/src/project/identity.js.map +1 -1
- package/dist/src/project/index.d.ts +21 -6
- package/dist/src/project/index.js +19 -8
- package/dist/src/project/index.js.map +1 -1
- package/dist/src/project/owner-identity.d.ts +7 -0
- package/dist/src/project/owner-identity.js +43 -0
- package/dist/src/project/owner-identity.js.map +1 -0
- package/dist/src/project/prune.d.ts +12 -0
- package/dist/src/project/prune.js +132 -0
- package/dist/src/project/prune.js.map +1 -0
- package/dist/src/project/query.d.ts +3 -3
- package/dist/src/project/query.js +14 -13
- package/dist/src/project/query.js.map +1 -1
- package/dist/src/project/store.d.ts +4 -3
- package/dist/src/project/store.js +12 -7
- package/dist/src/project/store.js.map +1 -1
- package/dist/src/project/types.d.ts +16 -6
- package/dist/src/requester/index.js +1 -1
- package/dist/src/requester/index.js.map +1 -1
- package/dist/src/response-schema.d.ts +13 -0
- package/dist/src/response-schema.js +33 -0
- package/dist/src/response-schema.js.map +1 -0
- package/dist/src/result-view.d.ts +72 -0
- package/dist/src/result-view.js +44 -0
- package/dist/src/result-view.js.map +1 -0
- package/dist/src/review/local-claim.d.ts +1 -1
- package/dist/src/review/local-claim.js +4 -11
- package/dist/src/review/local-claim.js.map +1 -1
- package/dist/src/review-result.d.ts +2 -1
- package/dist/src/review-result.js +9 -8
- package/dist/src/review-result.js.map +1 -1
- package/dist/src/state-format.d.ts +8 -0
- package/dist/src/state-format.js +18 -0
- package/dist/src/state-format.js.map +1 -0
- package/dist/src/tools/environment-host.js +1 -1
- package/dist/src/tools/environment-host.js.map +1 -1
- package/dist/src/tools/environment.d.ts +17 -0
- package/dist/src/tools/environment.js +20 -17
- package/dist/src/tools/environment.js.map +1 -1
- package/dist/src/tools/runner.d.ts +2 -0
- package/dist/src/tools/runner.js +41 -11
- package/dist/src/tools/runner.js.map +1 -1
- package/dist/src/worker-client.d.ts +3 -2
- package/dist/src/worker-client.js +7 -4
- package/dist/src/worker-client.js.map +1 -1
- package/dist/src/worker.js +1 -1
- package/dist/src/worker.js.map +1 -1
- package/package.json +2 -2
- package/dist/monitor-ui/assets/ValidationView-BMqI2XQ5.css +0 -1
- package/dist/monitor-ui/assets/ValidationView-BwHWjMUI.js +0 -1
- package/dist/monitor-ui/assets/index-CoJ9_gC3.js +0 -7
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { JsonSchema } from './tools/contracts.js';
|
|
2
|
+
export interface ResponseSchemas {
|
|
3
|
+
passSchema?: JsonSchema;
|
|
4
|
+
failSchema?: JsonSchema;
|
|
5
|
+
}
|
|
6
|
+
export declare const auditFields: Set<string>;
|
|
7
|
+
/** Owner schemas describe extra top-level result fields, never transport or audit fields. */
|
|
8
|
+
export declare function validateResponseSchema(schema: unknown): asserts schema is JsonSchema;
|
|
9
|
+
export declare function finalResultSchema(schemas?: ResponseSchemas): JsonSchema;
|
|
10
|
+
export declare function semanticResult(result: Record<string, unknown>): Record<string, unknown>;
|
|
11
|
+
export declare function validateFinalResult(value: unknown, schemas?: ResponseSchemas): Record<string, unknown> & {
|
|
12
|
+
verdict: 'GREEN' | 'RED';
|
|
13
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Compile } from 'typebox/compile';
|
|
2
|
+
import { jsonCopy, object, validateSchema } from './tools/schema.js';
|
|
3
|
+
export const auditFields = new Set(['provider', 'model', 'stdout', 'stderr', 'durationMs', 'exitCode', 'toolCalls']);
|
|
4
|
+
const reserved = new Set(['verdict', 'reference', 'reusedFrom', ...auditFields]);
|
|
5
|
+
/** Owner schemas describe extra top-level result fields, never transport or audit fields. */
|
|
6
|
+
export function validateResponseSchema(schema) {
|
|
7
|
+
validateSchema(schema);
|
|
8
|
+
if (['allOf', 'anyOf', 'oneOf', 'not'].some(key => Object.hasOwn(schema, key)))
|
|
9
|
+
throw new Error('Response schemas cannot use top-level composition; compose schemas inside owner fields instead.');
|
|
10
|
+
if (Object.keys(schema.properties ?? {}).some(key => reserved.has(key)))
|
|
11
|
+
throw new Error('Response schemas cannot declare reserved result fields.');
|
|
12
|
+
if ((schema.required ?? []).some(key => reserved.has(key)))
|
|
13
|
+
throw new Error('Response schemas cannot require reserved result fields.');
|
|
14
|
+
if (schema.additionalProperties !== undefined && schema.additionalProperties !== false)
|
|
15
|
+
throw new Error('Response schemas must forbid undeclared top-level fields.');
|
|
16
|
+
}
|
|
17
|
+
export function finalResultSchema(schemas = {}) {
|
|
18
|
+
const branch = (verdict, schema) => ({
|
|
19
|
+
...schema, type: 'object', additionalProperties: false,
|
|
20
|
+
properties: { ...schema?.properties, verdict: { const: verdict, type: 'string' } },
|
|
21
|
+
required: ['verdict', ...(schema?.required ?? [])],
|
|
22
|
+
});
|
|
23
|
+
return { type: 'object', oneOf: [branch('GREEN', schemas.passSchema), branch('RED', schemas.failSchema)] };
|
|
24
|
+
}
|
|
25
|
+
export function semanticResult(result) {
|
|
26
|
+
return Object.fromEntries(Object.entries(result).filter(([key]) => !auditFields.has(key)));
|
|
27
|
+
}
|
|
28
|
+
export function validateFinalResult(value, schemas = {}) {
|
|
29
|
+
if (!object(value) || !Compile(finalResultSchema(schemas)).Check(value))
|
|
30
|
+
throw new Error('Review result does not match the verdict and owner response schema.');
|
|
31
|
+
return jsonCopy(value);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=response-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-schema.js","sourceRoot":"","sources":["../../src/response-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { ReviewRequest } from './contracts.js';
|
|
2
|
+
import type { RunView } from './broker/index.js';
|
|
3
|
+
import type { CriticValidation, ProjectPlan, ProjectQuery, ValidationEvidence } from './project/types.js';
|
|
4
|
+
export type ResultDetail = 'compact' | 'full';
|
|
5
|
+
export interface ResultOptions<D extends ResultDetail = 'compact'> {
|
|
6
|
+
detail?: D;
|
|
7
|
+
}
|
|
8
|
+
export type ResultView<D extends ResultDetail, Full, Compact> = D extends 'full' ? Full : Compact;
|
|
9
|
+
export interface ReviewReference {
|
|
10
|
+
runId: string;
|
|
11
|
+
requestId: string | null;
|
|
12
|
+
stateDir: string;
|
|
13
|
+
}
|
|
14
|
+
export interface RequesterResult {
|
|
15
|
+
verdict: 'GREEN' | 'RED';
|
|
16
|
+
reference: ReviewReference;
|
|
17
|
+
reusedFrom?: ReviewReference;
|
|
18
|
+
[field: string]: unknown;
|
|
19
|
+
}
|
|
20
|
+
export interface RequesterRequest {
|
|
21
|
+
id: string;
|
|
22
|
+
runId: string;
|
|
23
|
+
criticId: string;
|
|
24
|
+
target: string;
|
|
25
|
+
status: ReviewRequest['status'];
|
|
26
|
+
inputKey: string | null;
|
|
27
|
+
reference: ReviewReference;
|
|
28
|
+
result: RequesterResult | null;
|
|
29
|
+
error?: string | null;
|
|
30
|
+
errorCode?: string | null;
|
|
31
|
+
blockedReason?: string | null;
|
|
32
|
+
}
|
|
33
|
+
export interface ResultReference {
|
|
34
|
+
requestId: string;
|
|
35
|
+
}
|
|
36
|
+
export type RequesterCritic = Omit<CriticValidation, 'input' | 'result'> & {
|
|
37
|
+
inputKey: string;
|
|
38
|
+
result: ResultReference | null;
|
|
39
|
+
};
|
|
40
|
+
export type RequesterQuery = Omit<ProjectQuery, 'critics'> & {
|
|
41
|
+
critics: RequesterCritic[];
|
|
42
|
+
results: RequesterResult[];
|
|
43
|
+
};
|
|
44
|
+
export type RequesterPlan = Omit<ProjectPlan, 'critics' | 'items'> & {
|
|
45
|
+
critics: RequesterCritic[];
|
|
46
|
+
items: (RequesterCritic & {
|
|
47
|
+
action: ProjectPlan['items'][number]['action'];
|
|
48
|
+
})[];
|
|
49
|
+
results: RequesterResult[];
|
|
50
|
+
};
|
|
51
|
+
export interface RequesterRun {
|
|
52
|
+
id: string;
|
|
53
|
+
status: RunView['status'];
|
|
54
|
+
workspaceIntegrity: 'content' | 'metadata';
|
|
55
|
+
reference: ReviewReference;
|
|
56
|
+
results: RequesterResult[];
|
|
57
|
+
requests: (Omit<RequesterRequest, 'result'> & {
|
|
58
|
+
result: ResultReference | null;
|
|
59
|
+
})[];
|
|
60
|
+
validation?: Omit<RequesterPlan, 'results'>;
|
|
61
|
+
error?: string;
|
|
62
|
+
}
|
|
63
|
+
export declare const reviewReference: (stateDir: string, runId: string, requestId: string | null) => ReviewReference;
|
|
64
|
+
/** Whitelists deliberately keep new audit fields out of requester output. Never mutate stored evidence. */
|
|
65
|
+
export declare function requesterEvidence(evidence: ValidationEvidence, stateDir: string): RequesterResult;
|
|
66
|
+
export declare function requesterRequest(request: ReviewRequest, stateDir: string): RequesterRequest;
|
|
67
|
+
export declare function requesterQuery(query: ProjectQuery, stateDir: string): RequesterQuery;
|
|
68
|
+
export declare function requesterPlan(plan: ProjectPlan, stateDir: string): RequesterPlan;
|
|
69
|
+
export declare function requesterRun(run: Pick<RunView, 'id' | 'status' | 'workspace' | 'requests' | 'error'> & {
|
|
70
|
+
validation?: ProjectPlan;
|
|
71
|
+
}, stateDir: string): RequesterRun;
|
|
72
|
+
export declare function resultView<D extends ResultDetail, Full, Compact>(options: ResultOptions<D>, full: Full, compact: () => Compact): ResultView<D, Full, Compact>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { semanticResult } from './response-schema.js';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
export const reviewReference = (stateDir, runId, requestId) => ({ runId, requestId, stateDir: resolve(stateDir) });
|
|
4
|
+
/** Whitelists deliberately keep new audit fields out of requester output. Never mutate stored evidence. */
|
|
5
|
+
export function requesterEvidence(evidence, stateDir) {
|
|
6
|
+
return { ...semanticResult(evidence.result), verdict: evidence.verdict,
|
|
7
|
+
reference: reviewReference(stateDir, evidence.runId, evidence.requestId) };
|
|
8
|
+
}
|
|
9
|
+
export function requesterRequest(request, stateDir) {
|
|
10
|
+
const reference = reviewReference(stateDir, request.runId, request.id), inputKey = request.validationInput?.key ?? null;
|
|
11
|
+
return { id: request.id, runId: request.runId, criticId: request.criticId, target: request.target, status: request.status,
|
|
12
|
+
inputKey, reference, error: request.error, errorCode: request.errorCode, blockedReason: request.blockedReason,
|
|
13
|
+
result: request.result ? { ...semanticResult(request.result), verdict: request.result.verdict, reference } : null };
|
|
14
|
+
}
|
|
15
|
+
function requesterCritic(critic) {
|
|
16
|
+
const { input, result, ...rest } = critic;
|
|
17
|
+
return { ...rest, inputKey: input.key, result: result ? { requestId: result.requestId } : null };
|
|
18
|
+
}
|
|
19
|
+
export function requesterQuery(query, stateDir) {
|
|
20
|
+
return { ...query, critics: query.critics.map(critic => requesterCritic(critic)),
|
|
21
|
+
results: uniqueResults(query.critics.flatMap(critic => critic.result ? [requesterEvidence(critic.result, stateDir)] : [])) };
|
|
22
|
+
}
|
|
23
|
+
export function requesterPlan(plan, stateDir) {
|
|
24
|
+
return { ...plan, ...requesterQuery(plan, stateDir), items: plan.items.map(critic => requesterCritic(critic)) };
|
|
25
|
+
}
|
|
26
|
+
export function requesterRun(run, stateDir) {
|
|
27
|
+
const requests = run.requests.map(request => requesterRequest(request, stateDir));
|
|
28
|
+
const plan = run.validation ? requesterPlan(run.validation, stateDir) : undefined;
|
|
29
|
+
const { results: validationResults = [], ...validation } = plan ?? {};
|
|
30
|
+
return { id: run.id, status: run.status, workspaceIntegrity: run.workspace?.integrity ?? 'content',
|
|
31
|
+
reference: reviewReference(stateDir, run.id, null), error: run.error,
|
|
32
|
+
results: uniqueResults([...requests.flatMap(request => request.result ? [request.result] : []), ...validationResults]).map(result => result.reference.runId === run.id ? result : { ...result, reusedFrom: result.reference }),
|
|
33
|
+
requests: requests.map(({ result, ...request }) => ({ ...request, result: result ? { requestId: request.id } : null })),
|
|
34
|
+
...(plan ? { validation: validation } : {}) };
|
|
35
|
+
}
|
|
36
|
+
function uniqueResults(results) {
|
|
37
|
+
return [...new Map(results.map(result => [result.reference.requestId, result])).values()];
|
|
38
|
+
}
|
|
39
|
+
export function resultView(options, full, compact) {
|
|
40
|
+
if (options.detail !== undefined && options.detail !== 'compact' && options.detail !== 'full')
|
|
41
|
+
throw new Error('detail must be compact or full.');
|
|
42
|
+
return (options.detail === 'full' ? full : compact());
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=result-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result-view.js","sourceRoot":"","sources":["../../src/result-view.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Broker } from '../broker/index.js';
|
|
2
2
|
/** Keep the local CLI alive long enough to release Try Claim and stop its checks. */
|
|
3
|
-
export declare function claimHumanFromCli(broker: Broker
|
|
3
|
+
export declare function claimHumanFromCli(broker: Broker<'full'>, requestId: string, reviewerId: string, stderr: {
|
|
4
4
|
write(value: string): unknown;
|
|
5
5
|
}): Promise<import("../contracts.js").ReviewRequest>;
|
|
@@ -1,16 +1,9 @@
|
|
|
1
|
+
import { withCliCancellation } from '../cli-cancellation.js';
|
|
1
2
|
/** Keep the local CLI alive long enough to release Try Claim and stop its checks. */
|
|
2
3
|
export async function claimHumanFromCli(broker, requestId, reviewerId, stderr) {
|
|
3
|
-
|
|
4
|
-
const cancel = () => controller.abort(new Error('Human claim preparation cancelled.'));
|
|
5
|
-
process.once('SIGINT', cancel);
|
|
6
|
-
process.once('SIGTERM', cancel);
|
|
7
|
-
try {
|
|
4
|
+
return withCliCancellation('Human claim preparation cancelled.', async (signal) => {
|
|
8
5
|
stderr.write('Try Claim: preparing the review input and checking the local environment.\n');
|
|
9
|
-
return
|
|
10
|
-
}
|
|
11
|
-
finally {
|
|
12
|
-
process.off('SIGINT', cancel);
|
|
13
|
-
process.off('SIGTERM', cancel);
|
|
14
|
-
}
|
|
6
|
+
return broker.claimHuman(requestId, reviewerId, { signal });
|
|
7
|
+
});
|
|
15
8
|
}
|
|
16
9
|
//# sourceMappingURL=local-claim.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-claim.js","sourceRoot":"","sources":["../../../src/review/local-claim.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"local-claim.js","sourceRoot":"","sources":["../../../src/review/local-claim.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAsB,EAAE,SAAiB,EAAE,UAAkB,EAAE,MAAyC;IAC9I,OAAO,mBAAmB,CAAC,oCAAoC,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QAC9E,MAAM,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAC;QAC5F,OAAO,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { type ResponseSchemas } from './response-schema.js';
|
|
1
2
|
import type { ReviewResult, ReviewToolCall } from './contracts.js';
|
|
2
3
|
export declare function storedObservation(value: unknown, isError?: boolean): ReviewToolCall['observation'];
|
|
3
|
-
export declare function normalizeReviewResult(value: unknown): ReviewResult;
|
|
4
|
+
export declare function normalizeReviewResult(value: unknown, schemas?: ResponseSchemas): ReviewResult;
|
|
4
5
|
/** Cache immutable metadata normalization/serialization across final-response candidates. */
|
|
5
6
|
export declare function createReviewResultSizeCheck(metadata: Pick<ReviewResult, 'provider' | 'model' | 'toolCalls'>): (value: unknown) => ReviewResult;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { semanticResult, validateFinalResult } from './response-schema.js';
|
|
1
2
|
const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
2
3
|
const copy = (value) => JSON.parse(JSON.stringify(value));
|
|
3
4
|
export function storedObservation(value, isError = false) {
|
|
@@ -18,11 +19,9 @@ export function storedObservation(value, isError = false) {
|
|
|
18
19
|
return observation;
|
|
19
20
|
}
|
|
20
21
|
function measureReviewResult(value) {
|
|
21
|
-
if (!object(value) ||
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
const result = { verdict: value.verdict, summary: value.summary.slice(0, 12_000), evidence: value.evidence.slice(0, 100).map(item => item.slice(0, 4000)) };
|
|
22
|
+
if (!object(value) || !['GREEN', 'RED'].includes(String(value.verdict)))
|
|
23
|
+
throw new Error('Review result requires a GREEN/RED verdict.');
|
|
24
|
+
const result = copy(semanticResult(value));
|
|
26
25
|
for (const key of ['provider', 'model', 'stdout', 'stderr']) {
|
|
27
26
|
const field = value[key];
|
|
28
27
|
if (typeof field === 'string')
|
|
@@ -34,7 +33,7 @@ function measureReviewResult(value) {
|
|
|
34
33
|
result[key] = field;
|
|
35
34
|
}
|
|
36
35
|
if (Array.isArray(value.toolCalls))
|
|
37
|
-
result.toolCalls = value.toolCalls.
|
|
36
|
+
result.toolCalls = value.toolCalls.filter((item) => object(item) && typeof item.name === 'string').map(item => {
|
|
38
37
|
const call = { name: item.name, ...(item.arguments === undefined ? {} : { arguments: copy(item.arguments) }) };
|
|
39
38
|
const observation = storedObservation(item.observation, item.isError === true);
|
|
40
39
|
if (item.isError === true)
|
|
@@ -45,7 +44,9 @@ function measureReviewResult(value) {
|
|
|
45
44
|
});
|
|
46
45
|
return { result, length: JSON.stringify(result).length };
|
|
47
46
|
}
|
|
48
|
-
export function normalizeReviewResult(value) {
|
|
47
|
+
export function normalizeReviewResult(value, schemas) {
|
|
48
|
+
if (schemas)
|
|
49
|
+
validateFinalResult(object(value) ? semanticResult(value) : value, schemas);
|
|
49
50
|
const measured = measureReviewResult(value);
|
|
50
51
|
assertResultSize(measured.length);
|
|
51
52
|
return measured.result;
|
|
@@ -56,7 +57,7 @@ function assertResultSize(length) {
|
|
|
56
57
|
}
|
|
57
58
|
/** Cache immutable metadata normalization/serialization across final-response candidates. */
|
|
58
59
|
export function createReviewResultSizeCheck(metadata) {
|
|
59
|
-
const placeholder = { verdict: 'GREEN'
|
|
60
|
+
const placeholder = { verdict: 'GREEN' };
|
|
60
61
|
// Measure without rejecting here: even an over-limit size must stay cached.
|
|
61
62
|
const metadataSize = measureReviewResult({ ...placeholder, ...metadata }).length - JSON.stringify(placeholder).length;
|
|
62
63
|
return (value) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-result.js","sourceRoot":"","sources":["../../src/review-result.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"review-result.js","sourceRoot":"","sources":["../../src/review-result.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
2
|
+
export declare class StateFormatError extends Error {
|
|
3
|
+
constructor();
|
|
4
|
+
}
|
|
5
|
+
/** No legacy reads or migrations: all entry points use the same format gate. */
|
|
6
|
+
export declare function assertStateFormat(database: DatabaseSync): void;
|
|
7
|
+
/** Called inside the initialization transaction, before creating any tables. */
|
|
8
|
+
export declare function initializeStateFormat(database: DatabaseSync): void;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export class StateFormatError extends Error {
|
|
2
|
+
constructor() { super('This state directory was created by an earlier CCDD major or an unsupported format; use a new state directory.'); }
|
|
3
|
+
}
|
|
4
|
+
/** No legacy reads or migrations: all entry points use the same format gate. */
|
|
5
|
+
export function assertStateFormat(database) {
|
|
6
|
+
if (database.prepare('PRAGMA user_version').get()?.user_version !== 5)
|
|
7
|
+
throw new StateFormatError();
|
|
8
|
+
}
|
|
9
|
+
/** Called inside the initialization transaction, before creating any tables. */
|
|
10
|
+
export function initializeStateFormat(database) {
|
|
11
|
+
const version = database.prepare('PRAGMA user_version').get()?.user_version;
|
|
12
|
+
const existing = database.prepare("SELECT 1 FROM sqlite_master WHERE type='table' LIMIT 1").get();
|
|
13
|
+
if (version === 0 && !existing)
|
|
14
|
+
database.exec('PRAGMA user_version=5');
|
|
15
|
+
else
|
|
16
|
+
assertStateFormat(database);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=state-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-format.js","sourceRoot":"","sources":["../../src/state-format.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,gBAAgB,KAAK,CAAC,gHAAgH,CAAC,CAAC,CAAC,CAAC;CAC3I;AAED,gFAAgF;AAChF,MAAM,UAAU,iBAAiB,CAAC,QAAsB;IACtD,IAAI,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,GAAG,EAAE,EAAE,YAAY,KAAK,CAAC;QAAE,MAAM,IAAI,gBAAgB,EAAE,CAAC;AACtG,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,qBAAqB,CAAC,QAAsB;IAC1D,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC;IAC5E,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC,GAAG,EAAE,CAAC;IAClG,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ;QAAE,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;;QAClE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment-host.js","sourceRoot":"","sources":["../../../src/tools/environment-host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC;IAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;AACnG,aAAa,CAAC;IACZ,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI;QAC9B,IAAI,MAAM,CAAC;QACX,IAAI,CAAC;YAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAAC,CAAC;QAC1C,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC;gBAAE,MAAM,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;;gBACxJ,MAAM,KAAK,CAAC;QACnB,CAAC;QACD,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAC9I,CAAC;aAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACrI,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC,CAAC;AACH,OAAO,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"environment-host.js","sourceRoot":"","sources":["../../../src/tools/environment-host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC;IAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;AACnG,aAAa,CAAC;IACZ,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI;QAC9B,IAAI,MAAM,CAAC;QACX,IAAI,CAAC;YAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAAC,CAAC;QAC1C,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC;gBAAE,MAAM,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;;gBACxJ,MAAM,KAAK,CAAC;QACnB,CAAC;QACD,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAC9I,CAAC;aAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACrI,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC,CAAC;AACH,OAAO,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACpE,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -15,5 +15,22 @@ export interface EnvironmentCheckOptions {
|
|
|
15
15
|
signal?: AbortSignal;
|
|
16
16
|
artifactIds?: readonly string[];
|
|
17
17
|
}
|
|
18
|
+
export declare function environmentOutputDirectory(root: string, directory: string): Promise<string>;
|
|
19
|
+
/** Shared bounded executor for readiness and owner identity scripts. Callers enforce workspace integrity. */
|
|
20
|
+
export declare function runEnvironmentScript({ command, args, cwd, outputDir, tmpDir, signal, timeoutMs, label, description }: {
|
|
21
|
+
command: string;
|
|
22
|
+
args: string[];
|
|
23
|
+
cwd: string;
|
|
24
|
+
outputDir: string;
|
|
25
|
+
tmpDir: string;
|
|
26
|
+
signal?: AbortSignal;
|
|
27
|
+
timeoutMs?: number;
|
|
28
|
+
label?: string;
|
|
29
|
+
description?: string;
|
|
30
|
+
}): Promise<{
|
|
31
|
+
ok: boolean;
|
|
32
|
+
message: string;
|
|
33
|
+
stdout: string;
|
|
34
|
+
}>;
|
|
18
35
|
/** Explicit Human claim preparation only. The caller owns workspace integrity checks and the Try Claim lease. */
|
|
19
36
|
export declare function checkEnvironmentRequirements(options: EnvironmentCheckOptions): Promise<EnvironmentCheckResult>;
|
|
@@ -5,7 +5,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
5
5
|
import { matchesToolManifest } from './manifest.js';
|
|
6
6
|
import { readWorkspaceConfig } from '../broker/config.js';
|
|
7
7
|
import { scopedPath, within } from './paths.js';
|
|
8
|
-
async function
|
|
8
|
+
export async function environmentOutputDirectory(root, directory) {
|
|
9
9
|
const target = resolve(directory);
|
|
10
10
|
let ancestor = target;
|
|
11
11
|
while (true) {
|
|
@@ -30,14 +30,14 @@ function checkEnvironment(outputDir, tmpDir) {
|
|
|
30
30
|
XDG_CACHE_HOME: join(tmpDir, 'cache'), CARGO_TARGET_DIR: join(outputDir, 'cargo-target'),
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
|
-
|
|
33
|
+
/** Shared bounded executor for readiness and owner identity scripts. Callers enforce workspace integrity. */
|
|
34
|
+
export function runEnvironmentScript({ command, args, cwd, outputDir, tmpDir, signal, timeoutMs = 30000, label = 'Environment check', description = 'Environment check passed.' }) {
|
|
34
35
|
signal?.throwIfAborted();
|
|
35
|
-
const timeoutMs = requirement.timeoutMs ?? 30000;
|
|
36
36
|
return new Promise(resolveCheck => {
|
|
37
|
-
const child = spawn(
|
|
38
|
-
cwd
|
|
37
|
+
const child = spawn(command, args, {
|
|
38
|
+
cwd, env: checkEnvironment(outputDir, tmpDir), shell: false, detached: process.platform !== 'win32', stdio: ['ignore', 'pipe', 'pipe'], windowsHide: true,
|
|
39
39
|
});
|
|
40
|
-
const chunks = [];
|
|
40
|
+
const chunks = [], stdout = [];
|
|
41
41
|
let bytes = 0, retained = 0, settled = false, failure, killTimer;
|
|
42
42
|
const kill = (kind) => { try {
|
|
43
43
|
if (process.platform !== 'win32' && child.pid)
|
|
@@ -54,7 +54,7 @@ function runCheck(root, script, requirement, outputDir, tmpDir, signal) {
|
|
|
54
54
|
clearTimeout(killTimer);
|
|
55
55
|
signal?.removeEventListener('abort', abort);
|
|
56
56
|
const diagnostic = Buffer.concat(chunks).toString('utf8').replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, '').trim();
|
|
57
|
-
resolveCheck({ ok, message: `${message}${diagnostic ? `\n${diagnostic}` : ''}`.slice(0, 4000) });
|
|
57
|
+
resolveCheck({ ok, message: `${message}${label === 'Environment check' && diagnostic ? `\n${diagnostic}` : ''}`.slice(0, 4000), stdout: Buffer.concat(stdout).toString('utf8') });
|
|
58
58
|
};
|
|
59
59
|
const stop = (message) => {
|
|
60
60
|
if (settled || failure)
|
|
@@ -63,8 +63,8 @@ function runCheck(root, script, requirement, outputDir, tmpDir, signal) {
|
|
|
63
63
|
kill('SIGTERM');
|
|
64
64
|
killTimer = setTimeout(() => { kill('SIGKILL'); finish(false, message); }, 500);
|
|
65
65
|
};
|
|
66
|
-
const abort = () => stop(
|
|
67
|
-
const timer = setTimeout(() => stop(
|
|
66
|
+
const abort = () => stop(`${label} was cancelled.`);
|
|
67
|
+
const timer = setTimeout(() => stop(`${label} timed out after ${timeoutMs} ms.`), timeoutMs);
|
|
68
68
|
const capture = (chunk) => {
|
|
69
69
|
bytes += chunk.length;
|
|
70
70
|
if (retained < 8192) {
|
|
@@ -73,15 +73,16 @@ function runCheck(root, script, requirement, outputDir, tmpDir, signal) {
|
|
|
73
73
|
retained += part.length;
|
|
74
74
|
}
|
|
75
75
|
if (bytes > 65536)
|
|
76
|
-
stop(
|
|
76
|
+
stop(`${label} output exceeded 64 KiB.`);
|
|
77
77
|
};
|
|
78
|
-
child.stdout.on('data',
|
|
78
|
+
child.stdout.on('data', (chunk) => { if (bytes < 65536)
|
|
79
|
+
stdout.push(chunk.subarray(0, 65536 - bytes)); capture(chunk); });
|
|
79
80
|
child.stderr.on('data', capture);
|
|
80
81
|
signal?.addEventListener('abort', abort, { once: true });
|
|
81
|
-
child.on('error', () => { kill('SIGKILL'); finish(false, failure ??
|
|
82
|
+
child.on('error', () => { kill('SIGKILL'); finish(false, failure ?? `${label} could not be started.`); });
|
|
82
83
|
// A readiness check may not leave a background process after its script exits.
|
|
83
84
|
child.on('exit', () => kill('SIGKILL'));
|
|
84
|
-
child.on('close', code => finish(!failure && code === 0, failure ?? (code === 0 ?
|
|
85
|
+
child.on('close', code => finish(!failure && code === 0, failure ?? (code === 0 ? description : `${label} failed (exit ${code ?? 'signal'}): ${description}`)));
|
|
85
86
|
if (signal?.aborted)
|
|
86
87
|
abort();
|
|
87
88
|
});
|
|
@@ -97,15 +98,17 @@ export async function checkEnvironmentRequirements(options) {
|
|
|
97
98
|
const { config } = await readWorkspaceConfig(root, options.signal);
|
|
98
99
|
if (!matchesToolManifest(config, options.configManifest))
|
|
99
100
|
throw Object.assign(new Error('Recorded environment requirements do not match this snapshot configuration.'), { code: 'WORKSPACE_ARTIFACT_MISMATCH' });
|
|
100
|
-
const base = await
|
|
101
|
+
const base = await environmentOutputDirectory(root, options.outputDir), checks = [];
|
|
101
102
|
for (const [id, requirement] of Object.entries(requirements)) {
|
|
102
103
|
if (options.artifactIds && !options.artifactIds.includes(id.split('/')[0]))
|
|
103
104
|
continue;
|
|
104
105
|
options.signal?.throwIfAborted();
|
|
105
|
-
const outputDir = await
|
|
106
|
-
const
|
|
106
|
+
const outputDir = await environmentOutputDirectory(root, join(base, id)), tmpDir = await environmentOutputDirectory(root, join(outputDir, '.tmp'));
|
|
107
|
+
const { ok, message } = await runEnvironmentScript({ command: process.execPath,
|
|
108
|
+
args: [fileURLToPath(new URL('./environment-host.js', import.meta.url)), root, await scopedPath(root, requirement.script)],
|
|
109
|
+
cwd: root, outputDir, tmpDir, signal: options.signal, timeoutMs: requirement.timeoutMs, description: requirement.description });
|
|
107
110
|
options.signal?.throwIfAborted();
|
|
108
|
-
checks.push({ id,
|
|
111
|
+
checks.push({ id, ok, message });
|
|
109
112
|
}
|
|
110
113
|
return { ok: checks.every(check => check.ok), checks };
|
|
111
114
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../src/tools/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAMhD,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../src/tools/environment.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,6 +35,8 @@ export interface ToolExecutionDiagnostic {
|
|
|
35
35
|
startedAt: string;
|
|
36
36
|
durationMs: number;
|
|
37
37
|
outcome: 'success' | 'error';
|
|
38
|
+
contentBytes: number;
|
|
39
|
+
contentBytesByType: Record<'text' | 'json' | 'image' | 'launch', number>;
|
|
38
40
|
}
|
|
39
41
|
export interface ReviewToolsOptions {
|
|
40
42
|
worktreePath: string;
|
package/dist/src/tools/runner.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { constants } from 'node:fs';
|
|
2
|
-
import { access, lstat, mkdir, mkdtemp, readFile, realpath } from 'node:fs/promises';
|
|
2
|
+
import { access, lstat, mkdir, mkdtemp, readFile, realpath, rm } from 'node:fs/promises';
|
|
3
3
|
import { tmpdir } from 'node:os';
|
|
4
4
|
import { delimiter, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
5
5
|
import { isDeepStrictEqual } from 'node:util';
|
|
@@ -11,6 +11,15 @@ import { metadata, object, jsonCopy, validateArguments } from './schema.js';
|
|
|
11
11
|
import { matchesToolManifest } from './manifest.js';
|
|
12
12
|
import { scopedPath, within } from './paths.js';
|
|
13
13
|
import { safeToolFailure, ToolResultError } from './diagnostics.js';
|
|
14
|
+
/** Payload bytes, not transport framing: UTF-8 text/JSON, decoded images and launch JSON. */
|
|
15
|
+
function responseBytes(result) {
|
|
16
|
+
const contentBytesByType = { text: 0, json: 0, image: 0, launch: 0 };
|
|
17
|
+
for (const block of result?.content ?? []) {
|
|
18
|
+
contentBytesByType[block.type] += block.type === 'image' ? Buffer.from('data' in block ? block.data : '', 'base64').length
|
|
19
|
+
: Buffer.byteLength(block.type === 'text' ? block.text : JSON.stringify(block.type === 'json' ? block.data : { kind: 'launch', launched: block.launched }));
|
|
20
|
+
}
|
|
21
|
+
return { contentBytes: Object.values(contentBytesByType).reduce((sum, bytes) => sum + bytes, 0), contentBytesByType };
|
|
22
|
+
}
|
|
14
23
|
export function describeReviewTools({ artifacts, configManifest, audience }) {
|
|
15
24
|
if (configManifest.version !== 2 || !/^[a-f0-9]{64}$/.test(configManifest.configHash))
|
|
16
25
|
throw new Error('Unsupported stored tool manifest.');
|
|
@@ -174,17 +183,38 @@ export async function createReviewTools(options) {
|
|
|
174
183
|
throw mismatch();
|
|
175
184
|
}
|
|
176
185
|
const tools = describeReviewTools({ artifacts, configManifest, audience }), recorded = [];
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
186
|
+
let ownedBase, outputDir;
|
|
187
|
+
let scope;
|
|
188
|
+
try {
|
|
189
|
+
if (options.runDir === undefined)
|
|
190
|
+
ownedBase = await mkdtemp(join(tmpdir(), 'ccdd-tools-'));
|
|
191
|
+
const base = await externalDirectory(root, options.runDir ?? ownedBase);
|
|
192
|
+
outputDir = await mkdtemp(join(base, 'tool-output-'));
|
|
193
|
+
scope = Object.fromEntries(await Promise.all(artifacts.map(async (artifact) => [artifact.id, {
|
|
194
|
+
path: await scopedPath(root, artifact.path), children: structuredClone(artifact.children), mounts: structuredClone(artifact.mounts),
|
|
195
|
+
}])));
|
|
196
|
+
signal?.throwIfAborted();
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
if (ownedBase ?? outputDir)
|
|
200
|
+
await rm((ownedBase ?? outputDir), { recursive: true, force: true });
|
|
201
|
+
throw error;
|
|
202
|
+
}
|
|
182
203
|
const controller = new AbortController(), active = new Set();
|
|
183
|
-
|
|
204
|
+
let closed = false, closing;
|
|
205
|
+
const close = () => {
|
|
206
|
+
closed = true;
|
|
207
|
+
controller.abort(signal?.reason);
|
|
208
|
+
signal?.removeEventListener('abort', abort);
|
|
209
|
+
return closing ??= (async () => {
|
|
210
|
+
await Promise.allSettled([...active]);
|
|
211
|
+
await rm(ownedBase ?? outputDir, { recursive: true, force: true });
|
|
212
|
+
})();
|
|
213
|
+
};
|
|
214
|
+
const abort = () => { void close().catch(() => { }); };
|
|
184
215
|
signal?.addEventListener('abort', abort, { once: true });
|
|
185
216
|
if (signal?.aborted)
|
|
186
217
|
abort();
|
|
187
|
-
let closed = false;
|
|
188
218
|
const find = (name) => { const tool = tools.find(value => value.name === name); if (!tool)
|
|
189
219
|
throw new Error('Unknown registered Artifact tool.'); return tool; };
|
|
190
220
|
const args = (name, value) => validateArguments(find(name).inputSchema, value);
|
|
@@ -221,7 +251,7 @@ export async function createReviewTools(options) {
|
|
|
221
251
|
await onCall?.(structuredClone(call));
|
|
222
252
|
return { result, call };
|
|
223
253
|
};
|
|
224
|
-
return { tools, get toolCalls() { return structuredClone(recorded); }, outputDir, validateArguments: args,
|
|
254
|
+
return { tools, get toolCalls() { return structuredClone(recorded); }, outputDir: outputDir, validateArguments: args,
|
|
225
255
|
async call(name, value = {}) {
|
|
226
256
|
if (closed)
|
|
227
257
|
return Promise.reject(new Error('Artifact tool registry is closed.'));
|
|
@@ -229,7 +259,7 @@ export async function createReviewTools(options) {
|
|
|
229
259
|
const startedAt = new Date().toISOString(), started = performance.now();
|
|
230
260
|
const task = (async () => {
|
|
231
261
|
const attempt = await invoke(tool, actual).then(value => ({ ok: true, ...value }), error => ({ ok: false, error: error }));
|
|
232
|
-
const diagnostic = { name: tool.name, artifactId: tool.artifactId, operation: tool.operation, startedAt, durationMs: performance.now() - started, outcome: attempt.ok && !attempt.result.isError ? 'success' : 'error' };
|
|
262
|
+
const diagnostic = { name: tool.name, artifactId: tool.artifactId, operation: tool.operation, startedAt, durationMs: performance.now() - started, outcome: attempt.ok && !attempt.result.isError ? 'success' : 'error', ...responseBytes(attempt.ok ? attempt.result : undefined) };
|
|
233
263
|
if (options.onExecution)
|
|
234
264
|
await bestEffortDiagnostic(() => options.onExecution(diagnostic));
|
|
235
265
|
if (!attempt.ok)
|
|
@@ -257,6 +287,6 @@ export async function createReviewTools(options) {
|
|
|
257
287
|
}
|
|
258
288
|
}));
|
|
259
289
|
},
|
|
260
|
-
|
|
290
|
+
close, };
|
|
261
291
|
}
|
|
262
292
|
//# sourceMappingURL=runner.js.map
|