@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
@@ -1,23 +1,34 @@
1
1
  import { readWorkspaceConfig } from '../broker/config.js';
2
2
  import { prepareWorkspace } from '../workspaces/index.js';
3
- import { createProjectSnapshot } from './identity.js';
4
- import { planProject } from './query.js';
3
+ import { createProjectSnapshot, DEFAULT_IDENTITY_CONCURRENCY, positiveConcurrency } from './identity.js';
4
+ import { planProject as fullPlan, queryProject as fullQuery } from './query.js';
5
+ import { requesterPlan, requesterQuery, resultView } from '../result-view.js';
5
6
  import { projectHistory } from './store.js';
6
7
  export { createProjectSnapshot } from './identity.js';
7
- export { queryProject, planProject } from './query.js';
8
+ /** Pure requester queries need the evidence store location to produce resolvable references. */
9
+ export function queryProject(snapshot, history, options) {
10
+ const query = fullQuery(snapshot, history, options);
11
+ return resultView(options, query, () => requesterQuery(query, options.stateDir));
12
+ }
13
+ export function planProject(snapshot, history, options) {
14
+ const plan = fullPlan(snapshot, history, options);
15
+ return resultView(options, plan, () => requesterPlan(plan, options.stateDir));
16
+ }
8
17
  export { projectHistory, projectRun, projectRuns, projectRequests } from './store.js';
18
+ export { pruneProject } from './prune.js';
9
19
  export { createBroker } from '../broker/index.js';
10
20
  export { createExecutorRegistry } from '../executors/index.js';
11
21
  /** Explicit CLI query: briefly observe the current workspace without creating a store. */
12
- export async function inspectProject({ repoPath, stateDir, selection, recursive = false, force = false, signal, workspaceIntegrity = 'content' }) {
22
+ export async function inspectProject({ detail, repoPath, stateDir, selection, recursive = false, force = false, signal, identityConcurrency = DEFAULT_IDENTITY_CONCURRENCY, workspaceIntegrity = 'content' }) {
23
+ positiveConcurrency(identityConcurrency, 'identityConcurrency');
13
24
  const workspace = await prepareWorkspace({ repoPath, stateDir, signal, integrity: workspaceIntegrity });
14
25
  try {
15
26
  const { config } = await readWorkspaceConfig(workspace.descriptor.path, workspace.signal);
16
- const snapshot = await createProjectSnapshot(config, workspace.descriptor.path, workspace.descriptor.hash, workspace.signal, workspace.descriptor.integrity);
17
- const history = projectHistory(stateDir);
18
- const plan = planProject(snapshot, history, { selection, recursive, force });
27
+ const snapshot = await createProjectSnapshot(config, workspace.descriptor.path, workspace.descriptor.hash, workspace.signal, workspace.descriptor.integrity, selection, { identityConcurrency });
28
+ const history = projectHistory(stateDir, { detail: 'full' });
29
+ const plan = fullPlan(snapshot, history, { selection, recursive, force });
19
30
  await workspace.assertUnchanged();
20
- return { snapshot, plan };
31
+ return resultView({ detail }, { snapshot, plan }, () => ({ plan: requesterPlan(plan, stateDir) }));
21
32
  }
22
33
  finally {
23
34
  await workspace.close();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/project/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAA2B,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAI5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,MAAM,EAAE,kBAAkB,GAAG,SAAS,EAA6K;IACzT,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACxG,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1F,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC7J,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7E,MAAM,SAAS,CAAC,eAAe,EAAE,CAAC;QAClC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;YAAS,CAAC;QAAC,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/project/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { StaleStrategy } from '../definitions.js';
2
+ /** Identity scripts use the readiness executor; the snapshot caller owns the read-only workspace lease. */
3
+ export declare function ownerIdentity(root: string, owner: string, id: string, strategy: Extract<StaleStrategy, {
4
+ kind: 'identity';
5
+ }>, signal?: AbortSignal): Promise<{
6
+ value: string;
7
+ }>;
@@ -0,0 +1,43 @@
1
+ import { lstat, mkdtemp, rm } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { environmentOutputDirectory, runEnvironmentScript } from '../tools/environment.js';
6
+ import { scopedPath } from '../tools/paths.js';
7
+ /** Identity scripts use the readiness executor; the snapshot caller owns the read-only workspace lease. */
8
+ export async function ownerIdentity(root, owner, id, strategy, signal) {
9
+ const label = `Identity script for Artifact ${id}`;
10
+ const cwd = await scopedPath(root, owner);
11
+ const entry = strategy.script.command === 'node' ? strategy.script.args[0] : strategy.script.command;
12
+ const script = await scopedPath(cwd, entry);
13
+ if (!(await lstat(script)).isFile())
14
+ throw new Error(`${label} requires a regular entry file.`);
15
+ for (const input of strategy.inputs ?? []) {
16
+ signal?.throwIfAborted();
17
+ await lstat(await scopedPath(cwd, input));
18
+ }
19
+ // Temporary output is never state and is removed even on invalid output, timeout or cancellation.
20
+ const base = await environmentOutputDirectory(root, tmpdir());
21
+ const outputDir = await mkdtemp(join(base, 'ccdd-identity-'));
22
+ try {
23
+ const temporary = await environmentOutputDirectory(root, join(outputDir, '.tmp'));
24
+ const node = strategy.script.command === 'node';
25
+ const result = await runEnvironmentScript({
26
+ command: node ? process.execPath : script,
27
+ args: node ? [fileURLToPath(new URL('../tools/environment-host.js', import.meta.url)), root, script, ...strategy.script.args.slice(1)] : strategy.script.args,
28
+ cwd, outputDir, tmpDir: temporary, signal, timeoutMs: strategy.timeoutMs, label, description: 'Identity validation failed.',
29
+ });
30
+ signal?.throwIfAborted();
31
+ if (!result.ok)
32
+ throw new Error(result.message);
33
+ // Do not trim: whitespace, extra lines, carriage returns and invalid bytes are authoring errors.
34
+ const value = result.stdout.endsWith('\n') ? result.stdout.slice(0, -1) : result.stdout;
35
+ if (value.length < 1 || value.length > 128 || /[^A-Za-z0-9._:-]/.test(value))
36
+ throw new Error(`${label} stdout must be one line of 1–128 characters from [A-Za-z0-9._:-], with only one optional trailing newline.`);
37
+ return { value };
38
+ }
39
+ finally {
40
+ await rm(outputDir, { recursive: true, force: true });
41
+ }
42
+ }
43
+ //# sourceMappingURL=owner-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner-identity.js","sourceRoot":"","sources":["../../../src/project/owner-identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface PruneResult {
2
+ removed: string[];
3
+ skippedRequests: string[];
4
+ }
5
+ /** Internal deterministic test seam; not exported by the project SDK. */
6
+ export declare const pruneTestHooks: {
7
+ beforeMove?: (path: string) => void;
8
+ beforeDelete?: () => void;
9
+ removeQuarantine?: (path: string) => void;
10
+ };
11
+ /** Explicit Linux-only pruning with descriptor-anchored moves and private deletion. */
12
+ export declare function pruneProject(stateDir: string): PruneResult;
@@ -0,0 +1,132 @@
1
+ import { assertStateFormat } from '../state-format.js';
2
+ import { DatabaseSync } from 'node:sqlite';
3
+ import { constants, openSync, closeSync, lstatSync, readdirSync, rmSync, renameSync, mkdtempSync, chmodSync } from 'node:fs';
4
+ import { join, relative, sep } from 'node:path';
5
+ import { readStateContext } from '../broker/index.js';
6
+ /** Internal deterministic test seam; not exported by the project SDK. */
7
+ export const pruneTestHooks = {};
8
+ const terminal = new Set(['GREEN', 'RED', 'ERROR', 'INCOMPLETE']);
9
+ const segment = (value) => value !== '.' && value !== '..' && /^[A-Za-z0-9_-]+$/.test(value);
10
+ const transient = (name) => ['output', 'tmp', 'home', 'cache', 'human-tools', 'preparation'].includes(name) || /^tool-output-[A-Za-z0-9]+$/.test(name);
11
+ const anchor = (fd) => `/proc/self/fd/${fd}`;
12
+ const openDirectory = (path) => openSync(path, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
13
+ const missing = (error) => ['ENOENT', 'ENOTDIR', 'ELOOP'].includes(error.code ?? '');
14
+ /** Explicit Linux-only pruning with descriptor-anchored moves and private deletion. */
15
+ export function pruneProject(stateDir) {
16
+ if (process.platform !== 'linux')
17
+ throw new Error('Explicit prune requires Linux /proc/self/fd for race-safe deletion. No files were removed.');
18
+ const context = readStateContext(stateDir), root = context.stateDir;
19
+ const relation = relative(context.repoPath, root);
20
+ if (!relation || (!relation.startsWith(`..${sep}`) && relation !== '..'))
21
+ throw new Error('Pruning requires state outside the reviewed repository.');
22
+ const rootFd = openDirectory(root);
23
+ let db, quarantineFd, quarantineName;
24
+ const result = { removed: [], skippedRequests: [] };
25
+ const staged = [];
26
+ let preserveQuarantine = false, failed = false;
27
+ try {
28
+ db = new DatabaseSync(join(anchor(rootFd), 'broker.sqlite'), { timeout: 5000 });
29
+ assertStateFormat(db);
30
+ db.exec('CREATE TABLE IF NOT EXISTS prune_claims (id TEXT PRIMARY KEY, created_at TEXT NOT NULL)');
31
+ const quarantine = mkdtempSync(join(anchor(rootFd), '.prune-'));
32
+ chmodSync(quarantine, 0o700);
33
+ quarantineName = quarantine.split('/').at(-1);
34
+ quarantineFd = openDirectory(quarantine);
35
+ const candidates = db.prepare('SELECT id, run_id FROM requests').all();
36
+ for (const row of candidates) {
37
+ const id = String(row.id), runId = String(row.run_id), fds = [];
38
+ db.exec('BEGIN IMMEDIATE');
39
+ try {
40
+ const eligible = db.prepare('SELECT q.status, r.status AS run_status, o.run_id AS owned FROM requests q JOIN runs r ON r.id = q.run_id LEFT JOIN run_owners o ON o.run_id = r.id WHERE q.id = ?').get(id);
41
+ if (!eligible || !terminal.has(String(eligible.status)) || !terminal.has(String(eligible.run_status)) || eligible.owned != null || !segment(id) || !segment(runId)) {
42
+ result.skippedRequests.push(id);
43
+ }
44
+ else {
45
+ // The private quarantine is the exclusive physical claim. Terminal runs
46
+ // cannot reacquire a worker; active/owned runs are excluded under lock.
47
+ db.prepare('INSERT OR IGNORE INTO prune_claims VALUES (?,?)').run(quarantineName, new Date().toISOString());
48
+ try {
49
+ let parent = rootFd;
50
+ for (const part of ['runs', runId, id]) {
51
+ parent = openDirectory(join(anchor(parent), part));
52
+ fds.push(parent);
53
+ }
54
+ for (const name of readdirSync(anchor(parent))) {
55
+ if (!transient(name))
56
+ continue;
57
+ const source = join(anchor(parent), name), before = lstatSync(source);
58
+ const movedName = String(staged.length), destination = join(anchor(quarantineFd), movedName);
59
+ pruneTestHooks.beforeMove?.(join(root, 'runs', runId, id, name));
60
+ renameSync(source, destination);
61
+ const moved = lstatSync(destination);
62
+ if (before.dev !== moved.dev || before.ino !== moved.ino) {
63
+ // Never overwrite a replacement at source or delete suspect data.
64
+ preserveQuarantine = true;
65
+ throw new Error(`Scratch entry changed during prune; preserved in ${join(root, quarantineName, movedName)}.`);
66
+ }
67
+ staged.push({ name: movedName, original: join('runs', runId, id, name) });
68
+ }
69
+ }
70
+ catch (error) {
71
+ if (!missing(error))
72
+ throw error;
73
+ }
74
+ }
75
+ db.exec('COMMIT');
76
+ }
77
+ catch (error) {
78
+ db.exec('ROLLBACK');
79
+ throw error;
80
+ }
81
+ finally {
82
+ for (const fd of fds.reverse())
83
+ closeSync(fd);
84
+ }
85
+ }
86
+ // Recursive deletion holds no write transaction or broker lock.
87
+ pruneTestHooks.beforeDelete?.();
88
+ for (const entry of staged) {
89
+ rmSync(join(anchor(quarantineFd), entry.name), { recursive: true, force: true });
90
+ result.removed.push(entry.original);
91
+ }
92
+ return result;
93
+ }
94
+ catch (error) {
95
+ failed = true;
96
+ preserveQuarantine = true;
97
+ throw error;
98
+ }
99
+ finally {
100
+ let cleanupFailed = false, cleanupError;
101
+ const cleanup = (action) => {
102
+ try {
103
+ action();
104
+ }
105
+ catch (error) {
106
+ if (!cleanupFailed)
107
+ cleanupError = error;
108
+ cleanupFailed = true;
109
+ preserveQuarantine = true;
110
+ }
111
+ };
112
+ // Each resource gets its own attempt. A cleanup error must neither strand
113
+ // later resources nor replace an error from the operation itself.
114
+ cleanup(() => { if (quarantineFd !== undefined)
115
+ closeSync(quarantineFd); });
116
+ cleanup(() => {
117
+ if (!quarantineName || preserveQuarantine)
118
+ return;
119
+ const directory = join(anchor(rootFd), quarantineName);
120
+ if (pruneTestHooks.removeQuarantine)
121
+ pruneTestHooks.removeQuarantine(directory);
122
+ else
123
+ rmSync(directory, { recursive: true, force: true });
124
+ db?.prepare('DELETE FROM prune_claims WHERE id = ?').run(quarantineName);
125
+ });
126
+ cleanup(() => { db?.close(); });
127
+ cleanup(() => { closeSync(rootFd); });
128
+ if (!failed && cleanupFailed)
129
+ throw cleanupError;
130
+ }
131
+ }
132
+ //# sourceMappingURL=prune.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.js","sourceRoot":"","sources":["../../../src/project/prune.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { ProjectSnapshot, ProjectSelection, QueryOptions, ValidationEvidence, ProjectQuery, ProjectPlan } from './types.js';
2
- export declare function selectedCritics(snapshot: ProjectSnapshot, selection: ProjectSelection): string[];
3
- export declare function requiredArtifacts(snapshot: ProjectSnapshot, selection: ProjectSelection): string[];
4
- export declare function includedCritics(snapshot: ProjectSnapshot, selection: ProjectSelection, recursive: boolean): string[];
2
+ export declare function selectedCritics(snapshot: Pick<ProjectSnapshot, 'config'>, selection: ProjectSelection): string[];
3
+ export declare function requiredArtifacts(snapshot: Pick<ProjectSnapshot, 'config'>, selection: ProjectSelection): string[];
4
+ export declare function includedCritics(snapshot: Pick<ProjectSnapshot, 'config'>, selection: ProjectSelection, recursive: boolean): string[];
5
5
  /** Pull actual evidence once; dependency traversal never calls back into Critic evaluation. */
6
6
  export declare function queryProject(snapshot: ProjectSnapshot, history: readonly ValidationEvidence[], options?: QueryOptions): ProjectQuery;
7
7
  export declare function planProject(snapshot: ProjectSnapshot, history: readonly ValidationEvidence[], options?: QueryOptions & {
@@ -27,22 +27,23 @@ export function includedCritics(snapshot, selection, recursive) {
27
27
  }
28
28
  /** Pull actual evidence once; dependency traversal never calls back into Critic evaluation. */
29
29
  export function queryProject(snapshot, history, options = {}) {
30
- if (snapshot.version !== 2)
31
- throw new Error('Historical validation inputs are available for result lookup only.');
30
+ if (snapshot.version !== 3)
31
+ throw new Error('Invalid validation input format.');
32
32
  createGraphDefinition(snapshot.config);
33
33
  const selection = options.selection ?? { kind: 'all' }, required = requiredArtifacts(snapshot, selection);
34
34
  const byKey = new Map(), byRunKey = new Map(), byCritic = new Map();
35
- for (const evidence of [...history].filter(e => e.input.version === 2).sort((a, b) => a.completedAt.localeCompare(b.completedAt))) {
35
+ for (const evidence of [...history].filter(e => e.input.version === 3).sort((a, b) => a.completedAt.localeCompare(b.completedAt))) {
36
36
  const key = `${evidence.criticId}:${evidence.input.key}`;
37
37
  byKey.set(key, evidence);
38
38
  byCritic.set(evidence.criticId, evidence);
39
- if (evidence.runId === options.runId)
39
+ if (evidence.runId === options.runId || options.coalescedRequestIds?.includes(evidence.requestId))
40
40
  byRunKey.set(key, evidence);
41
41
  }
42
42
  const attempts = new Map(options.attempts?.map(request => [request.criticId, request])), forced = new Set(options.forceCriticIds ?? []);
43
- const critics = snapshot.config.critics.map(definition => {
43
+ const requiredSet = new Set(required);
44
+ const critics = snapshot.config.critics.filter(definition => requiredSet.has(definition.target)).map(definition => {
44
45
  const id = definition.id, input = snapshot.inputs[id];
45
- if (!input || input.version !== 2)
46
+ if (!input || input.version !== 3)
46
47
  throw new Error(`Missing current validation input: ${id}`);
47
48
  const key = `${id}:${input.key}`, evidence = (input.reusable && !forced.has(id) ? byKey : byRunKey).get(key) ?? null;
48
49
  const attempt = attempts.get(id), ownPass = evidence?.verdict === 'GREEN';
@@ -61,7 +62,7 @@ export function queryProject(snapshot, history, options = {}) {
61
62
  }
62
63
  else if (evidence?.verdict === 'RED') {
63
64
  status = 'RED';
64
- reason = evidence.summary;
65
+ reason = `Actual RED evidence ${evidence.requestId} matches this input.`;
65
66
  }
66
67
  else if (forced.has(id)) {
67
68
  status = 'STALE';
@@ -79,19 +80,19 @@ export function queryProject(snapshot, history, options = {}) {
79
80
  status = 'UNREVIEWED';
80
81
  reason = 'No actual review has been recorded for this input.';
81
82
  }
82
- return { id, title: definition.title, target: definition.target, deps: [...definition.deps], status, isStale: status !== 'PASS', needsReview: !ownPass,
83
- canExecute: !ownPass && !attempt, blockedBy: [], reason, input, result: evidence, requestId: attempt?.id ?? null };
83
+ return { id, title: definition.title, target: definition.target, deps: [...definition.deps], status, isStale: status !== 'PASS', needsReview: !evidence,
84
+ canExecute: !evidence && !attempt, blockedBy: [], reason, input, result: evidence, requestId: attempt?.id ?? null };
84
85
  });
85
- const own = new Map(Object.keys(snapshot.config.artifacts).map(id => [id, critics.filter(c => c.target === id)]));
86
+ const own = new Map(required.map(id => [id, critics.filter(c => c.target === id)]));
86
87
  const ownSatisfied = (id) => snapshot.config.artifacts[id].basis === true || own.get(id).length > 0 && own.get(id).every(c => c.status === 'PASS');
87
88
  const scopeMemo = new Map();
88
89
  const scope = (id) => { if (!scopeMemo.has(id))
89
90
  scopeMemo.set(id, dependencyClosure(snapshot.config.relations, [id])); return scopeMemo.get(id); };
90
- const artifacts = Object.keys(snapshot.config.artifacts).map((id) => {
91
+ const artifacts = Object.keys(snapshot.config.artifacts).filter(id => requiredSet.has(id)).map((id) => {
91
92
  const evaluations = own.get(id), satisfied = scope(id).every(ownSatisfied);
92
93
  const status = satisfied ? snapshot.config.artifacts[id].basis ? 'BASIS' : 'PASS' :
93
94
  ['RUNNING', 'QUEUED', 'WAITING_HUMAN', 'ERROR', 'RED', 'STALE', 'UNREVIEWED'].find(s => evaluations.some(c => c.status === s)) ?? (ownSatisfied(id) ? 'INCOMPLETE' : 'UNREVIEWED');
94
- return { id, hash: snapshot.artifactHashes[id], status, isStale: !satisfied, criticIds: evaluations.map(c => c.id), passed: evaluations.filter(c => c.status === 'PASS').length, total: evaluations.length };
95
+ return { id, hash: snapshot.artifactHashes[id], ...snapshot.artifactIdentities?.[id], status, isStale: !satisfied, criticIds: evaluations.map(c => c.id), passed: evaluations.filter(c => c.status === 'PASS').length, total: evaluations.length };
95
96
  });
96
97
  // These are unmet final obligations, not reasons to delay executing a Critic.
97
98
  for (const critic of critics)
@@ -102,7 +103,7 @@ export function planProject(snapshot, history, options = {}) {
102
103
  const selection = options.selection ?? { kind: 'all' }, selectedCriticIds = selectedCritics(snapshot, selection), includedCriticIds = includedCritics(snapshot, selection, Boolean(options.recursive));
103
104
  const query = queryProject(snapshot, history, { ...options, selection, forceCriticIds: options.force ? selectedCriticIds : options.forceCriticIds });
104
105
  const items = query.critics.filter(c => includedCriticIds.includes(c.id)).map(c => {
105
- const action = (c.status === 'PASS' ? 'REUSE' : ['QUEUED', 'RUNNING', 'WAITING_HUMAN'].includes(c.status) ? 'ACTIVE' : c.canExecute ? 'EXECUTE' : c.requestId ? 'FAILED' : 'WAIT');
106
+ const action = (c.result ? 'REUSE' : ['QUEUED', 'RUNNING', 'WAITING_HUMAN'].includes(c.status) ? 'ACTIVE' : c.canExecute ? 'EXECUTE' : c.requestId ? 'FAILED' : 'WAIT');
106
107
  return { ...c, action };
107
108
  });
108
109
  return { ...query, recursive: Boolean(options.recursive), force: Boolean(options.force), selectedCriticIds, includedCriticIds, items,
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/project/query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/project/query.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { type ResultDetail, type ResultOptions } from '../result-view.js';
1
2
  import { DatabaseSync } from 'node:sqlite';
2
3
  import type { ReviewRequest } from '../contracts.js';
3
4
  import type { RunView } from '../broker/index.js';
@@ -5,11 +6,11 @@ import type { ValidationEvidence, ProjectPlan } from './types.js';
5
6
  export declare function readEvidence(database: DatabaseSync): ValidationEvidence[];
6
7
  /** Existing databases only; no migrations, ownership reconciliation or write connection. */
7
8
  export declare function withProjectStore<T>(stateDir: string, read: (database: DatabaseSync) => T, empty: T): T;
8
- export declare function projectHistory(stateDir: string): ValidationEvidence[];
9
+ export declare function projectHistory<D extends ResultDetail = 'compact'>(stateDir: string, options?: ResultOptions<D>): import("../result-view.js").ResultView<D, ValidationEvidence, import("../result-view.js").RequesterResult>[];
9
10
  export type ProjectRunView = RunView & {
10
11
  validation?: ProjectPlan;
11
12
  };
12
13
  export declare function storedRun(database: DatabaseSync, id: string): ProjectRunView | null;
13
14
  export declare function projectRun(stateDir: string, id: string): ProjectRunView | null;
14
- export declare function projectRuns(stateDir: string): ProjectRunView[];
15
- export declare function projectRequests(stateDir: string, runId?: string): ReviewRequest[];
15
+ export declare function projectRuns<D extends ResultDetail = 'compact'>(stateDir: string, options?: ResultOptions<D>): import("../result-view.js").ResultView<D, ProjectRunView, import("../result-view.js").RequesterRun>[];
16
+ export declare function projectRequests<D extends ResultDetail = 'compact'>(stateDir: string, runId?: string, options?: ResultOptions<D>): import("../result-view.js").ResultView<D, ReviewRequest, import("../result-view.js").RequesterRequest>[];
@@ -1,14 +1,17 @@
1
+ import { assertStateFormat } from '../state-format.js';
2
+ import { semanticResult } from '../response-schema.js';
3
+ import { requesterRun, requesterRequest, requesterEvidence, resultView } from '../result-view.js';
1
4
  import { DatabaseSync } from 'node:sqlite';
2
5
  import { existsSync } from 'node:fs';
3
6
  import { join } from 'node:path';
4
7
  import { planProject } from './query.js';
5
8
  export function readEvidence(database) {
6
- const rows = database.prepare("SELECT data FROM requests WHERE status IN ('GREEN','RED') AND json_extract(data, '$.validationInput.version') = 2 ORDER BY json_extract(data, '$.completedAt'), rowid").all();
9
+ const rows = database.prepare("SELECT data FROM requests WHERE status IN ('GREEN','RED') AND json_extract(data, '$.validationInput.version') = 3 ORDER BY json_extract(data, '$.completedAt'), rowid").all();
7
10
  return rows.flatMap(row => {
8
11
  const request = JSON.parse(String(row.data));
9
12
  if (!request.validationInput || !/^[a-f0-9]{64}$/.test(request.validationInput.key) || !request.result || request.result.verdict !== request.status || !request.completedAt)
10
13
  return [];
11
- return [{ requestId: request.id, runId: request.runId, criticId: request.criticId, input: request.validationInput, completedAt: request.completedAt, verdict: request.result.verdict, summary: request.result.summary, evidence: request.result.evidence }];
14
+ return [{ requestId: request.id, runId: request.runId, criticId: request.criticId, input: request.validationInput, completedAt: request.completedAt, verdict: request.result.verdict, result: semanticResult(request.result) }];
12
15
  });
13
16
  }
14
17
  /** Existing databases only; no migrations, ownership reconciliation or write connection. */
@@ -20,6 +23,7 @@ export function withProjectStore(stateDir, read, empty) {
20
23
  const database = new DatabaseSync(filename, { readOnly: true, timeout: 5000 });
21
24
  try {
22
25
  database.exec('BEGIN');
26
+ assertStateFormat(database);
23
27
  const result = read(database);
24
28
  database.exec('COMMIT');
25
29
  return result;
@@ -28,21 +32,22 @@ export function withProjectStore(stateDir, read, empty) {
28
32
  database.close();
29
33
  }
30
34
  }
31
- export function projectHistory(stateDir) { return withProjectStore(stateDir, readEvidence, []); }
35
+ export function projectHistory(stateDir, options = {}) { return withProjectStore(stateDir, db => readEvidence(db).map(evidence => resultView(options, evidence, () => requesterEvidence(evidence, stateDir))), []); }
32
36
  export function storedRun(database, id) {
33
37
  const row = database.prepare('SELECT data FROM runs WHERE id = ?').get(id);
34
38
  if (!row)
35
39
  return null;
36
40
  const run = JSON.parse(String(row.data));
37
41
  const requests = database.prepare('SELECT data FROM requests WHERE run_id = ? ORDER BY ordinal').all(id).map(row => JSON.parse(String(row.data)));
42
+ const shared = (run.project?.coalescedRequestIds ?? []).flatMap(id => { const row = database.prepare('SELECT data FROM requests WHERE id = ?').get(id); return row ? [JSON.parse(String(row.data))] : []; });
38
43
  const events = database.prepare('SELECT * FROM (SELECT * FROM events WHERE run_id = ? ORDER BY id DESC LIMIT 500) ORDER BY id').all(id).map(event => ({ id: Number(event.id), runId: String(event.run_id), requestId: event.request_id === null ? null : String(event.request_id), createdAt: String(event.created_at), type: String(event.type), message: String(event.message), ...(event.data ? { data: JSON.parse(String(event.data)) } : {}) }));
39
44
  const owner = database.prepare('SELECT pid, claimed_at FROM run_owners WHERE run_id = ?').get(id);
40
45
  return { ...run, scope: run.scope ?? { kind: run.graph ? 'graph' : 'chain' }, requests, events, owner: owner ? { pid: Number(owner.pid), claimedAt: String(owner.claimed_at) } : null,
41
- ...(run.project?.version === 2 ? { validation: planProject(run.project.snapshot, readEvidence(database).filter(e => !run.project.evidenceRequestIds || run.project.evidenceRequestIds.includes(e.requestId)), { selection: run.project.selection, recursive: run.project.recursive, force: run.project.force, runId: id, attempts: requests }) } : {}) };
46
+ ...(run.project?.version === 3 ? { validation: planProject(run.project.snapshot, readEvidence(database).filter(e => !run.project.evidenceRequestIds || run.project.evidenceRequestIds.includes(e.requestId)), { selection: run.project.selection, recursive: run.project.recursive, force: run.project.force, runId: id, coalescedRequestIds: run.project.coalescedRequestIds, attempts: [...requests, ...shared] }) } : {}) };
42
47
  }
43
48
  export function projectRun(stateDir, id) { return withProjectStore(stateDir, db => storedRun(db, id), null); }
44
- export function projectRuns(stateDir) { return withProjectStore(stateDir, db => db.prepare('SELECT id FROM runs ORDER BY created_at DESC, rowid DESC').all().map(row => storedRun(db, String(row.id))), []); }
45
- export function projectRequests(stateDir, runId) {
46
- return withProjectStore(stateDir, db => (runId ? db.prepare('SELECT data FROM requests WHERE run_id = ? ORDER BY ordinal').all(runId) : db.prepare("SELECT data FROM requests ORDER BY json_extract(data, '$.createdAt') DESC, rowid DESC").all()).map(row => JSON.parse(String(row.data))), []);
49
+ export function projectRuns(stateDir, options = {}) { return withProjectStore(stateDir, db => db.prepare('SELECT id FROM runs ORDER BY created_at DESC, rowid DESC').all().map(row => { const run = storedRun(db, String(row.id)); return resultView(options, run, () => requesterRun(run, stateDir)); }), []); }
50
+ export function projectRequests(stateDir, runId, options = {}) {
51
+ return withProjectStore(stateDir, db => (runId ? db.prepare('SELECT data FROM requests WHERE run_id = ? ORDER BY ordinal').all(runId) : db.prepare("SELECT data FROM requests ORDER BY json_extract(data, '$.createdAt') DESC, rowid DESC").all()).map(row => { const request = JSON.parse(String(row.data)); return resultView(options, request, () => requesterRequest(request, stateDir)); }), []);
47
52
  }
48
53
  //# sourceMappingURL=store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/project/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/project/store.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ export type ProjectSelection = {
9
9
  criticId: string;
10
10
  };
11
11
  export interface ValidationInput {
12
- version: 2;
12
+ version: 3;
13
13
  key: string;
14
14
  criticHash: string;
15
15
  target: {
@@ -21,13 +21,19 @@ export interface ValidationInput {
21
21
  hash: string;
22
22
  }[];
23
23
  reusable: boolean;
24
- /** Omitted for historical/default content verification. Part of the effective Critic identity when nondefault. */
24
+ /** Omitted for default content verification. Included in default Artifact identity. */
25
25
  workspaceIntegrity?: WorkspaceIntegrity;
26
26
  }
27
+ export interface ArtifactIdentity {
28
+ identity: 'script';
29
+ value: string;
30
+ }
27
31
  export interface ProjectSnapshot {
28
- version: 2;
32
+ version: 3;
29
33
  config: RepoConfig;
30
34
  snapshotHash: string;
35
+ artifactIdentities?: Record<string, ArtifactIdentity>;
36
+ /** Prepared only for the selected dependency closure; config retains the full static graph. */
31
37
  artifactHashes: Record<string, string>;
32
38
  inputs: Record<string, ValidationInput>;
33
39
  workspaceIntegrity?: WorkspaceIntegrity;
@@ -39,11 +45,10 @@ export interface ValidationEvidence {
39
45
  input: ValidationInput;
40
46
  completedAt: string;
41
47
  verdict: ReviewResult['verdict'];
42
- summary: string;
43
- evidence: string[];
48
+ result: ReviewResult;
44
49
  }
45
50
  export interface ProjectRunDefinition {
46
- version: 2;
51
+ version: 3;
47
52
  snapshot: ProjectSnapshot;
48
53
  selection: ProjectSelection;
49
54
  recursive: boolean;
@@ -52,6 +57,8 @@ export interface ProjectRunDefinition {
52
57
  templates: ReviewEnvelope[];
53
58
  /** Original evidence consumed by a completed execution; never a cached stale flag. */
54
59
  evidenceRequestIds?: string[];
60
+ /** Existing active requests adopted by this Run; never duplicate executions. */
61
+ coalescedRequestIds?: string[];
55
62
  }
56
63
  export type ValidationStatus = 'PASS' | 'BASIS' | 'UNREVIEWED' | 'STALE' | 'RED' | 'ERROR' | 'INCOMPLETE' | 'QUEUED' | 'RUNNING' | 'WAITING_HUMAN';
57
64
  export interface CriticValidation {
@@ -70,6 +77,8 @@ export interface CriticValidation {
70
77
  requestId: string | null;
71
78
  }
72
79
  export interface ArtifactValidation {
80
+ identity?: 'script';
81
+ value?: string;
73
82
  id: string;
74
83
  hash: string;
75
84
  status: ValidationStatus;
@@ -106,5 +115,6 @@ export interface QueryOptions {
106
115
  selection?: ProjectSelection;
107
116
  forceCriticIds?: readonly string[];
108
117
  runId?: string;
118
+ coalescedRequestIds?: readonly string[];
109
119
  attempts?: readonly ReviewRequest[];
110
120
  }
@@ -17,7 +17,7 @@ export async function prepareReviewRequests({ repoPath, repoId = 'local', snapsh
17
17
  const request = structuredClone({ repoId, snapshotHash, criticId: critic.id, title: critic.title,
18
18
  ...resolveArtifactScope(config.artifacts, [critic.target, ...critic.deps]), configManifest: config.configManifest,
19
19
  references: critic.references, requiredObservations: [critic.target, ...critic.deps],
20
- payload: critic.payload, profile: critic.profile, target: critic.target, deps: critic.deps });
20
+ payload: critic.payload, ...(critic.passSchema ? { passSchema: critic.passSchema } : {}), ...(critic.failSchema ? { failSchema: critic.failSchema } : {}), profile: critic.profile, target: critic.target, deps: critic.deps });
21
21
  assertArtifactAudience(request);
22
22
  return request;
23
23
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/requester/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAkH;IAChO,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IACtJ,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IAC7J,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9J,MAAM,MAAM,GAAG,cAAc,IAAI,CAAC,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9E,MAAM,OAAO,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;IACxG,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IAC9F,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;QAC1B,MAAM,OAAO,GAAmB,eAAe,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK;YAC9G,GAAG,oBAAoB,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc;YACjH,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,oBAAoB,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;YACpF,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAChG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/requester/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAkH;IAChO,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IACtJ,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IAC7J,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9J,MAAM,MAAM,GAAG,cAAc,IAAI,CAAC,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9E,MAAM,OAAO,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;IACxG,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IAC9F,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;QAC1B,MAAM,OAAO,GAAmB,eAAe,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK;YAC9G,GAAG,oBAAoB,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc;YACjH,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,oBAAoB,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;YACpF,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAClO,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC"}