@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.
Files changed (94) hide show
  1. package/dist/monitor-ui/assets/{GraphView-6yzqBOLv.js → GraphView-BDrRFY2b.js} +3 -3
  2. package/dist/monitor-ui/assets/ValidationView-CznEpoWz.js +1 -0
  3. package/dist/monitor-ui/assets/ValidationView-DBRoun_B.css +1 -0
  4. package/dist/monitor-ui/assets/{elk-api-BwZQovT5.js → elk-api-BJkhNJwW.js} +1 -1
  5. package/dist/monitor-ui/assets/{elk.bundled-CQowIhI8.js → elk.bundled-uROSxMms.js} +1 -1
  6. package/dist/monitor-ui/assets/{index-D0yfhUlt.css → index-CRKnM9pk.css} +1 -1
  7. package/dist/monitor-ui/assets/index-CTW1fvAj.js +6 -0
  8. package/dist/monitor-ui/index.html +2 -2
  9. package/dist/src/artifacts/tool-check.js +1 -3
  10. package/dist/src/artifacts/tool-check.js.map +1 -1
  11. package/dist/src/broker/config.js +22 -3
  12. package/dist/src/broker/config.js.map +1 -1
  13. package/dist/src/broker/index.d.ts +45 -84
  14. package/dist/src/broker/index.js +176 -51
  15. package/dist/src/broker/index.js.map +1 -1
  16. package/dist/src/broker/polling.d.ts +11 -0
  17. package/dist/src/broker/polling.js +27 -0
  18. package/dist/src/broker/polling.js.map +1 -0
  19. package/dist/src/cli-cancellation.d.ts +2 -0
  20. package/dist/src/cli-cancellation.js +15 -0
  21. package/dist/src/cli-cancellation.js.map +1 -0
  22. package/dist/src/contracts.d.ts +4 -4
  23. package/dist/src/definitions.d.ts +8 -1
  24. package/dist/src/executors/index.js +6 -21
  25. package/dist/src/executors/index.js.map +1 -1
  26. package/dist/src/executors/pi.d.ts +3 -1
  27. package/dist/src/executors/pi.js +2 -0
  28. package/dist/src/executors/pi.js.map +1 -1
  29. package/dist/src/executors/telemetry.d.ts +2 -0
  30. package/dist/src/executors/telemetry.js +12 -0
  31. package/dist/src/executors/telemetry.js.map +1 -1
  32. package/dist/src/monitor/actions.d.ts +1 -1
  33. package/dist/src/monitor/actions.js +3 -3
  34. package/dist/src/monitor/actions.js.map +1 -1
  35. package/dist/src/monitor/server.js +10 -5
  36. package/dist/src/monitor/server.js.map +1 -1
  37. package/dist/src/monitor/store.js +10 -6
  38. package/dist/src/monitor/store.js.map +1 -1
  39. package/dist/src/monitor/types.d.ts +5 -7
  40. package/dist/src/project/cli.js +76 -38
  41. package/dist/src/project/cli.js.map +1 -1
  42. package/dist/src/project/identity.d.ts +7 -2
  43. package/dist/src/project/identity.js +57 -8
  44. package/dist/src/project/identity.js.map +1 -1
  45. package/dist/src/project/index.d.ts +21 -6
  46. package/dist/src/project/index.js +19 -8
  47. package/dist/src/project/index.js.map +1 -1
  48. package/dist/src/project/owner-identity.d.ts +7 -0
  49. package/dist/src/project/owner-identity.js +43 -0
  50. package/dist/src/project/owner-identity.js.map +1 -0
  51. package/dist/src/project/prune.d.ts +12 -0
  52. package/dist/src/project/prune.js +132 -0
  53. package/dist/src/project/prune.js.map +1 -0
  54. package/dist/src/project/query.d.ts +3 -3
  55. package/dist/src/project/query.js +14 -13
  56. package/dist/src/project/query.js.map +1 -1
  57. package/dist/src/project/store.d.ts +4 -3
  58. package/dist/src/project/store.js +12 -7
  59. package/dist/src/project/store.js.map +1 -1
  60. package/dist/src/project/types.d.ts +16 -6
  61. package/dist/src/requester/index.js +1 -1
  62. package/dist/src/requester/index.js.map +1 -1
  63. package/dist/src/response-schema.d.ts +13 -0
  64. package/dist/src/response-schema.js +33 -0
  65. package/dist/src/response-schema.js.map +1 -0
  66. package/dist/src/result-view.d.ts +72 -0
  67. package/dist/src/result-view.js +44 -0
  68. package/dist/src/result-view.js.map +1 -0
  69. package/dist/src/review/local-claim.d.ts +1 -1
  70. package/dist/src/review/local-claim.js +4 -11
  71. package/dist/src/review/local-claim.js.map +1 -1
  72. package/dist/src/review-result.d.ts +2 -1
  73. package/dist/src/review-result.js +9 -8
  74. package/dist/src/review-result.js.map +1 -1
  75. package/dist/src/state-format.d.ts +8 -0
  76. package/dist/src/state-format.js +18 -0
  77. package/dist/src/state-format.js.map +1 -0
  78. package/dist/src/tools/environment-host.js +1 -1
  79. package/dist/src/tools/environment-host.js.map +1 -1
  80. package/dist/src/tools/environment.d.ts +17 -0
  81. package/dist/src/tools/environment.js +20 -17
  82. package/dist/src/tools/environment.js.map +1 -1
  83. package/dist/src/tools/runner.d.ts +2 -0
  84. package/dist/src/tools/runner.js +41 -11
  85. package/dist/src/tools/runner.js.map +1 -1
  86. package/dist/src/worker-client.d.ts +3 -2
  87. package/dist/src/worker-client.js +7 -4
  88. package/dist/src/worker-client.js.map +1 -1
  89. package/dist/src/worker.js +1 -1
  90. package/dist/src/worker.js.map +1 -1
  91. package/package.json +2 -2
  92. package/dist/monitor-ui/assets/ValidationView-BMqI2XQ5.css +0 -1
  93. package/dist/monitor-ui/assets/ValidationView-BwHWjMUI.js +0 -1
  94. 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, requestId: string, reviewerId: string, stderr: {
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
- const controller = new AbortController();
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 await broker.claimHuman(requestId, reviewerId, { signal: controller.signal });
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":"AAEA,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc,EAAE,SAAiB,EAAE,UAAkB,EAAE,MAAyC;IACtI,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;IACvF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAC;QAC5F,OAAO,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IACvF,CAAC;YAAS,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC;AAC9E,CAAC"}
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) || (value.verdict !== 'GREEN' && value.verdict !== 'RED') || typeof value.summary !== 'string' || !value.summary.trim() ||
22
- !Array.isArray(value.evidence) || value.evidence.some(item => typeof item !== 'string')) {
23
- throw new Error('Review result requires GREEN/RED verdict, a summary, and string evidence[].');
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.slice(0, 100).filter((item) => object(item) && typeof item.name === 'string').map(item => {
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', summary: '.', evidence: [] };
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":"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"}
1
+ {"version":3,"file":"review-result.js","sourceRoot":"","sources":["../../src/review-result.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAwB,MAAM,sBAAsB,CAAC;AAEjG,MAAM,MAAM,GAAG,CAAC,KAAc,EAAoC,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC1I,MAAM,IAAI,GAAG,CAAI,KAAQ,EAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAM,CAAC;AAExE,MAAM,UAAU,iBAAiB,CAAC,KAAc,EAAE,OAAO,GAAG,KAAK;IAC/D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,kCAAkC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IACjL,MAAM,WAAW,GAA+C,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;IAC1I,IAAI,OAAO;QAAE,OAAO,WAAW,CAAC;IAChC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;QAAE,WAAW,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACtF,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAAE,WAAW,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACvF,KAAK,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,CAAU,EAAE,CAAC;QAC/E,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC;YAAE,WAAW,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;IAChI,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACxI,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAiB,CAAC;IAC3D,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAU,EAAE,CAAC;QAAC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAAC,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC;IACxK,KAAK,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,UAAU,CAAU,EAAE,CAAC;QAAC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAAC,CAAC;IAClK,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAsD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACpM,MAAM,IAAI,GAAmB,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/H,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;YAC/E,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI;gBAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YAC/C,IAAI,WAAW;gBAAE,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;YAChD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc,EAAE,OAAyB;IAC7E,IAAI,OAAO;QAAE,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACzF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC5C,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,QAAQ,CAAC,MAAM,CAAC;AACzB,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc;IACtC,IAAI,MAAM,GAAG,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;AACrF,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,2BAA2B,CAAC,QAAgE;IAC1G,MAAM,WAAW,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IACzC,4EAA4E;IAC5E,MAAM,YAAY,GAAG,mBAAmB,CAAC,EAAE,GAAG,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;IACtH,OAAO,CAAC,KAAc,EAAgB,EAAE;QACtC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC5C,gBAAgB,CAAC,QAAQ,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC;QACjD,OAAO,QAAQ,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC;AACJ,CAAC"}
@@ -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"}
@@ -27,6 +27,6 @@ registerHooks({
27
27
  return result;
28
28
  },
29
29
  });
30
- process.argv = [process.execPath, script];
30
+ process.argv = [process.execPath, script, ...process.argv.slice(4)];
31
31
  await import(pathToFileURL(script).href);
32
32
  //# sourceMappingURL=environment-host.js.map
@@ -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;AAC1C,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,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 outputDirectory(root, directory) {
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
- function runCheck(root, script, requirement, outputDir, tmpDir, signal) {
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(process.execPath, [fileURLToPath(new URL('./environment-host.js', import.meta.url)), root, script], {
38
- cwd: root, env: checkEnvironment(outputDir, tmpDir), shell: false, detached: process.platform !== 'win32', stdio: ['ignore', 'pipe', 'pipe'], windowsHide: true,
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('Environment check was cancelled.');
67
- const timer = setTimeout(() => stop(`Environment check timed out after ${timeoutMs} ms.`), timeoutMs);
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('Environment check output exceeded 64 KiB.');
76
+ stop(`${label} output exceeded 64 KiB.`);
77
77
  };
78
- child.stdout.on('data', capture);
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 ?? 'The environment check could not be started.'); });
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 ? requirement.description : `Environment check failed (exit ${code ?? 'signal'}): ${requirement.description}`)));
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 outputDirectory(root, options.outputDir), checks = [];
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 outputDirectory(root, join(base, id)), tmpDir = await outputDirectory(root, join(outputDir, '.tmp'));
106
- const result = await runCheck(root, await scopedPath(root, requirement.script), requirement, outputDir, tmpDir, options.signal);
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, ...result });
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":"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"}
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;
@@ -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
- const base = await externalDirectory(root, options.runDir ?? await mkdtemp(join(tmpdir(), 'ccdd-tools-')));
178
- const outputDir = await mkdtemp(join(base, 'tool-output-'));
179
- const scope = Object.fromEntries(await Promise.all(artifacts.map(async (artifact) => [artifact.id, {
180
- path: await scopedPath(root, artifact.path), children: structuredClone(artifact.children), mounts: structuredClone(artifact.mounts),
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
- const abort = () => controller.abort(signal?.reason);
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
- async close() { closed = true; controller.abort(); signal?.removeEventListener('abort', abort); await Promise.allSettled([...active]); }, };
290
+ close, };
261
291
  }
262
292
  //# sourceMappingURL=runner.js.map