@ccdd/project 3.3.0 → 4.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 (153) hide show
  1. package/README.md +9 -12
  2. package/dist/monitor-ui/assets/GraphView-CaxsIXtN.js +27 -0
  3. package/dist/monitor-ui/assets/ValidationView-BMqI2XQ5.css +1 -0
  4. package/dist/monitor-ui/assets/ValidationView-CGW6-Ljw.js +1 -0
  5. package/dist/monitor-ui/assets/{elk-api-D5d3gWoP.js → elk-api-DIQ2_nge.js} +1 -1
  6. package/dist/monitor-ui/assets/{elk.bundled-0eaKiuBP.js → elk.bundled-BRtnLd_M.js} +1 -1
  7. package/dist/monitor-ui/assets/{index-DDwx11D7.css → index-D0yfhUlt.css} +1 -1
  8. package/dist/monitor-ui/assets/index-LyUbXn5P.js +7 -0
  9. package/dist/monitor-ui/index.html +2 -2
  10. package/dist/scripts/prepare-demo.js +25 -44
  11. package/dist/scripts/prepare-demo.js.map +1 -1
  12. package/dist/src/artifact-scope.d.ts +6 -0
  13. package/dist/src/artifact-scope.js +27 -0
  14. package/dist/src/artifact-scope.js.map +1 -0
  15. package/dist/src/artifacts/index.d.ts +7 -155
  16. package/dist/src/artifacts/index.js +0 -354
  17. package/dist/src/artifacts/index.js.map +1 -1
  18. package/dist/src/artifacts/instruction.d.ts +6 -9
  19. package/dist/src/artifacts/instruction.js +28 -36
  20. package/dist/src/artifacts/instruction.js.map +1 -1
  21. package/dist/src/artifacts/mcp-server.js +5 -6
  22. package/dist/src/artifacts/mcp-server.js.map +1 -1
  23. package/dist/src/artifacts/scope.d.ts +12 -0
  24. package/dist/src/artifacts/scope.js +34 -0
  25. package/dist/src/artifacts/scope.js.map +1 -0
  26. package/dist/src/artifacts/tool-check.d.ts +2 -6
  27. package/dist/src/artifacts/tool-check.js +14 -18
  28. package/dist/src/artifacts/tool-check.js.map +1 -1
  29. package/dist/src/artifacts/types.d.ts +3 -37
  30. package/dist/src/artifacts/types.js +5 -89
  31. package/dist/src/artifacts/types.js.map +1 -1
  32. package/dist/src/broker/config.d.ts +5 -6
  33. package/dist/src/broker/config.js +183 -130
  34. package/dist/src/broker/config.js.map +1 -1
  35. package/dist/src/broker/graph.d.ts +14 -21
  36. package/dist/src/broker/graph.js +68 -70
  37. package/dist/src/broker/graph.js.map +1 -1
  38. package/dist/src/broker/index.d.ts +6 -28
  39. package/dist/src/broker/index.js +35 -221
  40. package/dist/src/broker/index.js.map +1 -1
  41. package/dist/src/cli.d.ts +1 -21
  42. package/dist/src/cli.js +2 -329
  43. package/dist/src/cli.js.map +1 -1
  44. package/dist/src/contracts.d.ts +12 -15
  45. package/dist/src/definitions.d.ts +33 -23
  46. package/dist/src/diagnostics-cli.d.ts +9 -0
  47. package/dist/src/diagnostics-cli.js +94 -0
  48. package/dist/src/diagnostics-cli.js.map +1 -0
  49. package/dist/src/doctor/index.d.ts +2 -4
  50. package/dist/src/doctor/index.js +17 -63
  51. package/dist/src/doctor/index.js.map +1 -1
  52. package/dist/src/executors/auth.d.ts +1 -1
  53. package/dist/src/executors/auth.js +2 -2
  54. package/dist/src/executors/auth.js.map +1 -1
  55. package/dist/src/executors/human-preparation.js +2 -10
  56. package/dist/src/executors/human-preparation.js.map +1 -1
  57. package/dist/src/executors/index.js +30 -29
  58. package/dist/src/executors/index.js.map +1 -1
  59. package/dist/src/executors/pi.js +2 -3
  60. package/dist/src/executors/pi.js.map +1 -1
  61. package/dist/src/executors/process.js +9 -0
  62. package/dist/src/executors/process.js.map +1 -1
  63. package/dist/src/monitor/actions.js +3 -3
  64. package/dist/src/monitor/actions.js.map +1 -1
  65. package/dist/src/monitor/server.js +12 -95
  66. package/dist/src/monitor/server.js.map +1 -1
  67. package/dist/src/monitor/store.js +6 -42
  68. package/dist/src/monitor/store.js.map +1 -1
  69. package/dist/src/monitor/types.d.ts +3 -13
  70. package/dist/src/monitor/ui/critic-presentation.js +1 -1
  71. package/dist/src/monitor/ui/critic-presentation.js.map +1 -1
  72. package/dist/src/monitor/ui/graph-layout.d.ts +0 -1
  73. package/dist/src/monitor/ui/graph-layout.js +1 -23
  74. package/dist/src/monitor/ui/graph-layout.js.map +1 -1
  75. package/dist/src/monitor/ui/tool-input.d.ts +1 -1
  76. package/dist/src/monitor/ui/tool-input.js +2 -3
  77. package/dist/src/monitor/ui/tool-input.js.map +1 -1
  78. package/dist/src/project/cli.js +18 -30
  79. package/dist/src/project/cli.js.map +1 -1
  80. package/dist/src/project/graph.js +2 -2
  81. package/dist/src/project/graph.js.map +1 -1
  82. package/dist/src/project/identity.js +83 -56
  83. package/dist/src/project/identity.js.map +1 -1
  84. package/dist/src/project/index.d.ts +0 -3
  85. package/dist/src/project/index.js +2 -6
  86. package/dist/src/project/index.js.map +1 -1
  87. package/dist/src/project/query.d.ts +2 -1
  88. package/dist/src/project/query.js +49 -74
  89. package/dist/src/project/query.js.map +1 -1
  90. package/dist/src/project/store.js +2 -2
  91. package/dist/src/project/store.js.map +1 -1
  92. package/dist/src/project/types.d.ts +4 -4
  93. package/dist/src/requester/index.d.ts +2 -9
  94. package/dist/src/requester/index.js +17 -96
  95. package/dist/src/requester/index.js.map +1 -1
  96. package/dist/src/sdk.d.ts +3 -8
  97. package/dist/src/sdk.js +2 -3
  98. package/dist/src/sdk.js.map +1 -1
  99. package/dist/src/tools/contracts.d.ts +34 -78
  100. package/dist/src/tools/diagnostics.js +1 -2
  101. package/dist/src/tools/diagnostics.js.map +1 -1
  102. package/dist/src/tools/environment.d.ts +1 -0
  103. package/dist/src/tools/environment.js +7 -11
  104. package/dist/src/tools/environment.js.map +1 -1
  105. package/dist/src/tools/manifest.d.ts +0 -1
  106. package/dist/src/tools/manifest.js +1 -25
  107. package/dist/src/tools/manifest.js.map +1 -1
  108. package/dist/src/tools/runner.d.ts +10 -14
  109. package/dist/src/tools/runner.js +144 -117
  110. package/dist/src/tools/runner.js.map +1 -1
  111. package/dist/src/tools/schema.js +1 -1
  112. package/dist/src/tools/schema.js.map +1 -1
  113. package/dist/src/workspaces/index.d.ts +5 -12
  114. package/dist/src/workspaces/index.js +33 -217
  115. package/dist/src/workspaces/index.js.map +1 -1
  116. package/package.json +38 -10
  117. package/dist/monitor-ui/assets/GraphView-BSZlEAs3.js +0 -27
  118. package/dist/monitor-ui/assets/ValidationView-DaEF78J-.js +0 -1
  119. package/dist/monitor-ui/assets/ValidationView-p5r8lX18.css +0 -1
  120. package/dist/monitor-ui/assets/index-BQlWbkpH.js +0 -8
  121. package/dist/src/artifacts/data.d.ts +0 -5
  122. package/dist/src/artifacts/data.js +0 -100
  123. package/dist/src/artifacts/data.js.map +0 -1
  124. package/dist/src/artifacts/groups.d.ts +0 -13
  125. package/dist/src/artifacts/groups.js +0 -93
  126. package/dist/src/artifacts/groups.js.map +0 -1
  127. package/dist/src/artifacts/human.d.ts +0 -38
  128. package/dist/src/artifacts/human.js +0 -156
  129. package/dist/src/artifacts/human.js.map +0 -1
  130. package/dist/src/artifacts/sources.d.ts +0 -11
  131. package/dist/src/artifacts/sources.js +0 -106
  132. package/dist/src/artifacts/sources.js.map +0 -1
  133. package/dist/src/review/cli.d.ts +0 -8
  134. package/dist/src/review/cli.js +0 -136
  135. package/dist/src/review/cli.js.map +0 -1
  136. package/dist/src/review/client.d.ts +0 -30
  137. package/dist/src/review/client.js +0 -193
  138. package/dist/src/review/client.js.map +0 -1
  139. package/dist/src/review/server.d.ts +0 -11
  140. package/dist/src/review/server.js +0 -249
  141. package/dist/src/review/server.js.map +0 -1
  142. package/dist/src/review/types.d.ts +0 -10
  143. package/dist/src/review/types.js +0 -17
  144. package/dist/src/review/types.js.map +0 -1
  145. package/dist/src/tools/host.d.ts +0 -7
  146. package/dist/src/tools/host.js +0 -98
  147. package/dist/src/tools/host.js.map +0 -1
  148. package/dist/src/tools/runtime-host.d.ts +0 -1
  149. package/dist/src/tools/runtime-host.js +0 -196
  150. package/dist/src/tools/runtime-host.js.map +0 -1
  151. package/dist/src/workspaces/transfer.d.ts +0 -52
  152. package/dist/src/workspaces/transfer.js +0 -372
  153. package/dist/src/workspaces/transfer.js.map +0 -1
@@ -1,93 +0,0 @@
1
- import { canonicalData } from './data.js';
2
- const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
3
- const identifier = /^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/;
4
- export function isArtifactGroup(value) {
5
- return object(value) && value.kind === 'group';
6
- }
7
- export function isGeneratedArtifact(value) {
8
- return object(value) && value.kind === 'generated';
9
- }
10
- /** Validate composition metadata without reading files or interpreting Critic dependencies. */
11
- export function validateArtifactDefinitions(value) {
12
- if (!object(value))
13
- throw new Error('Artifact definitions must be an object.');
14
- for (const [id, artifact] of Object.entries(value)) {
15
- if (!identifier.test(id) || !object(artifact) || (artifact.basis !== undefined && typeof artifact.basis !== 'boolean')) {
16
- throw new Error(`Invalid Artifact definition: ${id}`);
17
- }
18
- if (artifact.stale !== undefined) {
19
- const strategy = artifact.stale;
20
- if (!object(strategy) || !['file-hash', 'always'].includes(String(strategy.kind)) || Object.keys(strategy).some(key => !['kind', 'paths'].includes(key)))
21
- throw new Error(`Invalid stale strategy for Artifact ${id}.`);
22
- if (strategy.kind === 'always' && strategy.paths !== undefined)
23
- throw new Error('The always strategy does not accept paths.');
24
- if (strategy.paths !== undefined && (!Array.isArray(strategy.paths) || !strategy.paths.length || new Set(strategy.paths).size !== strategy.paths.length || strategy.paths.some(p => typeof p !== 'string' || !p || p.length > 1024 || /[\\\\:*?\[\]{}\x00-\x1f\x7f]/.test(p) || p.split('/').some(part => !part || part === '.' || part === '..'))))
25
- throw new Error(`Stale paths for ${id} must be unique literal repository-relative file or directory paths.`);
26
- }
27
- if (isArtifactGroup(artifact)) {
28
- if (Object.hasOwn(artifact, 'type') || Object.hasOwn(artifact, 'path'))
29
- throw new Error(`Artifact group ${id} cannot declare type or path; reference independent Artifacts in members.`);
30
- if (!Array.isArray(artifact.members) || artifact.members.length === 0 || new Set(artifact.members).size !== artifact.members.length || artifact.members.some(member => typeof member !== 'string' || !identifier.test(member) || !Object.hasOwn(value, member))) {
31
- throw new Error(`Artifact group ${id} requires nonempty, unique, known members.`);
32
- }
33
- }
34
- else if (isGeneratedArtifact(artifact)) {
35
- if (Object.keys(artifact).some(key => !['kind', 'type', 'source', 'params', 'basis', 'stale'].includes(key)) || typeof artifact.type !== 'string' || !identifier.test(artifact.type) || typeof artifact.source !== 'string' || !identifier.test(artifact.source) || artifact.stale && artifact.stale.kind !== 'always')
36
- throw new Error(`Invalid generated Artifact definition: ${id}`);
37
- if (artifact.params !== undefined)
38
- canonicalData(artifact.params);
39
- }
40
- else if (artifact.kind !== undefined || Object.hasOwn(artifact, 'members') || typeof artifact.type !== 'string' || !artifact.type || typeof artifact.path !== 'string' || !artifact.path) {
41
- throw new Error(`Invalid Artifact definition: ${id}`);
42
- }
43
- }
44
- const definitions = value;
45
- const visiting = new Set(), visited = new Set();
46
- const visit = (id) => {
47
- if (visiting.has(id))
48
- throw new Error(`Artifact group membership must be acyclic; cycle includes ${id}.`);
49
- if (visited.has(id))
50
- return;
51
- const artifact = definitions[id];
52
- if (isArtifactGroup(artifact)) {
53
- visiting.add(id);
54
- for (const member of artifact.members)
55
- visit(member);
56
- visiting.delete(id);
57
- }
58
- visited.add(id);
59
- };
60
- for (const id of Object.keys(definitions))
61
- visit(id);
62
- }
63
- /** Expand only explicitly selected entries and their members, in stable depth-first order. */
64
- export function resolveArtifactScope(definitions, ids, inputs) {
65
- validateArtifactDefinitions(definitions);
66
- const artifacts = [], artifactGroups = [];
67
- const visited = new Set();
68
- const visit = (id) => {
69
- if (!Object.hasOwn(definitions, id))
70
- throw new Error(`Unknown Artifact in review scope: ${id}`);
71
- if (visited.has(id))
72
- return;
73
- visited.add(id);
74
- const artifact = definitions[id];
75
- if (isArtifactGroup(artifact)) {
76
- artifactGroups.push({ id, members: [...artifact.members] });
77
- for (const member of artifact.members)
78
- visit(member);
79
- }
80
- else if (isGeneratedArtifact(artifact))
81
- artifacts.push({ id, type: artifact.type, kind: 'generated', source: artifact.source, ...(inputs?.[id] ? { input: inputs[id] } : {}) });
82
- else
83
- artifacts.push({ id, type: artifact.type, path: artifact.path });
84
- };
85
- for (const id of ids)
86
- visit(id);
87
- return { artifacts, ...(artifactGroups.length ? { artifactGroups } : {}) };
88
- }
89
- /** Safe metadata for prompts and scope matching; captured data stays behind tools. */
90
- export function artifactReferenceMetadata(artifacts) {
91
- return artifacts.map(artifact => artifact.kind === 'generated' ? { id: artifact.id, type: artifact.type, kind: 'generated', source: artifact.source } : { id: artifact.id, type: artifact.type, path: artifact.path });
92
- }
93
- //# sourceMappingURL=groups.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"groups.js","sourceRoot":"","sources":["../../../src/artifacts/groups.ts"],"names":[],"mappings":"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"}
@@ -1,38 +0,0 @@
1
- import { type ArtifactCallResult, type ArtifactToolDefinition, type ArtifactViewerOptions } from './index.js';
2
- export interface HumanToolDefinition extends Omit<ArtifactToolDefinition, 'operation' | 'annotations' | 'artifactId'> {
3
- artifactId: string;
4
- operation: 'read' | 'list' | 'command';
5
- annotations: {
6
- readOnlyHint: boolean;
7
- destructiveHint: boolean;
8
- idempotentHint: boolean;
9
- openWorldHint: boolean;
10
- };
11
- }
12
- export interface HumanLaunchResult {
13
- kind: 'launch';
14
- artifactId: string;
15
- toolName: string;
16
- launched: true;
17
- message: string;
18
- }
19
- export type HumanToolResult = ArtifactCallResult | HumanLaunchResult;
20
- export interface HumanToolCheck {
21
- toolName: string;
22
- artifactId: string;
23
- ok: boolean;
24
- message: string;
25
- }
26
- export interface HumanArtifactTools {
27
- readonly tools: HumanToolDefinition[];
28
- validateArguments(name: string, args: unknown): Record<string, unknown>;
29
- call(name: string, args?: unknown): Promise<HumanToolResult>;
30
- preflight(options?: {
31
- toolName?: string;
32
- }): Promise<HumanToolCheck[]>;
33
- }
34
- export interface HumanArtifactToolsOptions extends ArtifactViewerOptions {
35
- allowLegacy?: boolean;
36
- }
37
- /** Construct Human capabilities from the registered snapshot configuration; creating/listing never launches an app. */
38
- export declare function createHumanArtifactTools({ allowLegacy, ...options }: HumanArtifactToolsOptions): Promise<HumanArtifactTools>;
@@ -1,156 +0,0 @@
1
- import { constants } from 'node:fs';
2
- import { access, stat } from 'node:fs/promises';
3
- import { spawn } from 'node:child_process';
4
- import { delimiter, dirname, isAbsolute, join } from 'node:path';
5
- import { createArtifactViewer, createArtifactTools, validateToolArguments } from './index.js';
6
- import { artifactAudienceTools } from './types.js';
7
- function failure(code, message) { return Object.assign(new Error(message), { code }); }
8
- async function executablePath(command, signal) {
9
- signal?.throwIfAborted();
10
- const candidates = isAbsolute(command) ? [command] : (process.env.PATH ?? '').split(delimiter).filter(entry => isAbsolute(entry)).map(entry => join(entry, command));
11
- for (const candidate of candidates) {
12
- signal?.throwIfAborted();
13
- try {
14
- if (!(await stat(candidate)).isFile())
15
- continue;
16
- await access(candidate, constants.X_OK);
17
- signal?.throwIfAborted();
18
- return candidate;
19
- }
20
- catch {
21
- signal?.throwIfAborted();
22
- }
23
- }
24
- throw failure('HUMAN_TOOL_UNAVAILABLE', 'The registered Human tool executable is unavailable. Install it or update the registered type configuration.');
25
- }
26
- /** Do not forward Provider secrets as environment variables to desktop programs. */
27
- function desktopEnvironment() {
28
- const keys = ['PATH', 'HOME', 'USER', 'LOGNAME', 'TMPDIR', 'TMP', 'TEMP', 'DISPLAY', 'WAYLAND_DISPLAY', 'XDG_RUNTIME_DIR', 'DBUS_SESSION_BUS_ADDRESS', 'LANG', 'LC_ALL', 'SYSTEMROOT', 'WINDIR'];
29
- return Object.fromEntries(keys.flatMap(key => process.env[key] === undefined ? [] : [[key, process.env[key]]]));
30
- }
31
- /** Execute a trusted registered argv directly. Output and raw launch errors never leave this boundary. */
32
- function launch(command, args, cwd, timeoutMs, signal) {
33
- return new Promise((resolve, reject) => {
34
- if (signal?.aborted) {
35
- reject(failure('ABORTED', 'Human tool execution was cancelled.'));
36
- return;
37
- }
38
- const child = spawn(command, args, { cwd, env: desktopEnvironment(), shell: false, detached: process.platform !== 'win32', stdio: 'ignore', windowsHide: true });
39
- let terminal = false;
40
- let stopping;
41
- let killTimer;
42
- const kill = (sig) => { try {
43
- if (process.platform !== 'win32' && child.pid)
44
- process.kill(-child.pid, sig);
45
- else
46
- child.kill(sig);
47
- }
48
- catch { } };
49
- const finish = (error) => {
50
- if (terminal)
51
- return;
52
- terminal = true;
53
- clearTimeout(timer);
54
- clearTimeout(killTimer);
55
- signal?.removeEventListener('abort', abort);
56
- if (error)
57
- reject(error);
58
- else
59
- resolve();
60
- };
61
- const stop = (error) => {
62
- if (stopping || terminal)
63
- return;
64
- stopping = error;
65
- kill('SIGTERM');
66
- killTimer = setTimeout(() => { kill('SIGKILL'); finish(error); }, 500);
67
- killTimer.unref();
68
- };
69
- const abort = () => stop(failure('ABORTED', 'Human tool execution was cancelled.'));
70
- const timer = setTimeout(() => stop(failure('HUMAN_TOOL_TIMEOUT', `Human tool execution exceeded ${timeoutMs} ms.`)), timeoutMs);
71
- timer.unref();
72
- signal?.addEventListener('abort', abort, { once: true });
73
- child.on('error', () => { if (stopping)
74
- kill('SIGKILL'); finish(stopping ?? failure('HUMAN_TOOL_UNAVAILABLE', 'The registered Human tool could not be started.')); });
75
- // The launcher may exit on SIGTERM while descendants ignore it. Kill the remaining
76
- // group before clearing the escalation timer, including this early-close path.
77
- child.on('close', code => { if (stopping)
78
- kill('SIGKILL'); finish(stopping ?? (code === 0 ? undefined : failure('HUMAN_TOOL_FAILED', 'The registered Human tool did not finish successfully. Check the program and its registered arguments.'))); });
79
- // The signal may have changed while creating the process and registering the listener.
80
- if (signal?.aborted)
81
- abort();
82
- });
83
- }
84
- /** Construct Human capabilities from the registered snapshot configuration; creating/listing never launches an app. */
85
- export async function createHumanArtifactTools({ allowLegacy = false, ...options }) {
86
- const viewer = await createArtifactViewer(options);
87
- const builtins = createArtifactTools(viewer, { audience: 'human', allowLegacy });
88
- const definitions = [];
89
- const registered = new Map();
90
- const insert = (definition, command) => {
91
- if (registered.has(definition.name))
92
- throw failure('ARTIFACT_TOOL_NAME_COLLISION', 'Registered Human tool names collide across Artifacts. Rename the tool or Artifact.');
93
- definitions.push(definition);
94
- registered.set(definition.name, { definition, ...(command ? { command } : {}) });
95
- };
96
- for (const tool of builtins.tools)
97
- insert({ ...tool, artifactId: tool.artifactId, operation: tool.operation });
98
- for (const artifact of viewer.listArtifacts()) {
99
- const configured = artifactAudienceTools(viewer.getTypeDefinition(artifact.id), 'human', { allowLegacy });
100
- for (const [key, tool] of Object.entries(configured)) {
101
- if (!('command' in tool))
102
- continue;
103
- insert({
104
- artifactId: artifact.id, operation: 'command', name: `${key}_${artifact.id}`,
105
- description: tool.description.replaceAll('{artifactName}', () => artifact.id),
106
- inputSchema: { type: 'object', properties: artifact.directory ? { path: { type: 'string', description: 'Optional relative path inside this Artifact. Omit to open the Artifact root.' } } : {}, additionalProperties: false },
107
- annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
108
- }, structuredClone(tool));
109
- }
110
- }
111
- const entryFor = (name) => {
112
- const entry = registered.get(name);
113
- if (!entry)
114
- throw failure('UNKNOWN_ARTIFACT_TOOL', 'Unknown registered Human artifact tool.');
115
- return entry;
116
- };
117
- const validateArguments = (name, args) => validateToolArguments(entryFor(name).definition.inputSchema, args);
118
- return {
119
- get tools() { return structuredClone(definitions); },
120
- validateArguments,
121
- async call(name, args = {}) {
122
- const { definition, command } = entryFor(name);
123
- const actualArgs = structuredClone(validateArguments(name, args));
124
- viewer.signal?.throwIfAborted();
125
- if (!command)
126
- return builtins.call(name, actualArgs);
127
- const target = await viewer.resolveTarget(definition.artifactId, actualArgs.path);
128
- const executable = await executablePath(command.command, viewer.signal);
129
- await launch(executable, command.args.map(arg => arg === '{artifactPath}' ? target.absolutePath : arg), target.directory ? target.absolutePath : dirname(target.absolutePath), command.timeoutMs ?? 10_000, viewer.signal);
130
- viewer.signal?.throwIfAborted();
131
- return { kind: 'launch', artifactId: definition.artifactId, toolName: definition.name, launched: true, message: 'The registered program finished successfully. This does not confirm that a person read the Artifact or completed the review.' };
132
- },
133
- async preflight({ toolName } = {}) {
134
- if (toolName !== undefined)
135
- entryFor(toolName);
136
- const checks = [];
137
- for (const { definition, command } of registered.values()) {
138
- if (toolName !== undefined && definition.name !== toolName)
139
- continue;
140
- viewer.signal?.throwIfAborted();
141
- try {
142
- await viewer.resolveTarget(definition.artifactId);
143
- if (command)
144
- await executablePath(command.command, viewer.signal);
145
- checks.push({ toolName: definition.name, artifactId: definition.artifactId, ok: true, message: command ? 'The registered executable and Artifact are available. No program was launched.' : 'The registered Viewer operation and Artifact are available.' });
146
- }
147
- catch {
148
- viewer.signal?.throwIfAborted();
149
- checks.push({ toolName: definition.name, artifactId: definition.artifactId, ok: false, message: 'The registered tool or Artifact is unavailable. Check the type configuration and installed program.' });
150
- }
151
- }
152
- return checks;
153
- },
154
- };
155
- }
156
- //# sourceMappingURL=human.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"human.js","sourceRoot":"","sources":["../../../src/artifacts/human.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- import type { GeneratedArtifactDefinition, RepoConfig, ReviewEnvelope } from '../contracts.js';
2
- import type { ArtifactSourceContext, ArtifactSourceDefinition, ArtifactSourceMetadata, PreparedArtifactData } from '../tools/contracts.js';
3
- export declare function sourceMetadata(value: unknown): ArtifactSourceMetadata;
4
- /** One preparation binds the fingerprint and all possible observations to the same data. */
5
- export declare function captureArtifactData(source: ArtifactSourceDefinition, context: ArtifactSourceContext, purpose: 'inspect' | 'review'): Promise<PreparedArtifactData>;
6
- /** Reopening verifies serialized material without invoking source or identity callbacks. */
7
- export declare function assertPreparedArtifactData(input: unknown, metadata: ArtifactSourceMetadata): asserts input is PreparedArtifactData;
8
- export declare function preparedArtifact(config: RepoConfig, id: string, definition: GeneratedArtifactDefinition): PreparedArtifactData;
9
- export declare function assertGeneratedReviewInputs(request: Pick<ReviewEnvelope, 'artifacts' | 'configManifest'>): void;
10
- /** Only explicit current-input operations enter this preparation seam. */
11
- export declare function prepareArtifactInputs(config: RepoConfig, root: string, purpose: 'inspect' | 'review', signal?: AbortSignal): Promise<RepoConfig>;
@@ -1,106 +0,0 @@
1
- import { isDeepStrictEqual } from 'node:util';
2
- import { canonicalData, dataHash } from './data.js';
3
- import { isGeneratedArtifact } from './groups.js';
4
- import { openToolHost } from '../tools/host.js';
5
- import { matchesToolManifest } from '../tools/manifest.js';
6
- const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
7
- const text = (value, limit = 200) => typeof value === 'string' && value.trim().length > 0 && value.length <= limit;
8
- export function sourceMetadata(value) {
9
- if (!object(value) || Object.keys(value).some(key => !['identity', 'preparation', 'timeoutMs'].includes(key)) || !['read-only', 'explicit'].includes(String(value.preparation)))
10
- throw new Error('Artifact sources require an explicit preparation policy.');
11
- const identity = value.identity;
12
- if (!object(identity) || Object.keys(identity).some(key => !['kind', 'namespace', 'version'].includes(key)) || !['canonical-data', 'immutable-revision', 'custom'].includes(String(identity.kind)) || !text(identity.namespace) || !text(identity.version))
13
- throw new Error('Artifact identity requires a supported kind, namespace and version.');
14
- if (value.timeoutMs !== undefined && (!Number.isInteger(value.timeoutMs) || Number(value.timeoutMs) < 1 || Number(value.timeoutMs) > 900000))
15
- throw new Error('Artifact source timeoutMs must be 1–900000.');
16
- return structuredClone(value);
17
- }
18
- /** One preparation binds the fingerprint and all possible observations to the same data. */
19
- export async function captureArtifactData(source, context, purpose) {
20
- const metadata = sourceMetadata(source.metadata);
21
- if (purpose === 'inspect' && metadata.preparation !== 'read-only')
22
- throw Object.assign(new Error('This Artifact source requires explicit preparation through verification or tool diagnostics.'), { code: 'ARTIFACT_PREPARATION_REQUIRED' });
23
- context.signal.throwIfAborted();
24
- const result = await source.prepare(context);
25
- if (!object(result) || !Object.hasOwn(result, 'data') || Object.keys(result).some(key => !['data', 'revision'].includes(key)))
26
- throw new Error('Artifact preparation must return data and an optional immutable revision.');
27
- const data = JSON.parse(canonicalData(result.data));
28
- if (result.revision !== undefined && !text(result.revision, 4096))
29
- throw new Error('An immutable revision must be a nonempty bounded string.');
30
- const contentHash = dataHash(data);
31
- let fingerprint = contentHash;
32
- if (metadata.identity.kind === 'immutable-revision') {
33
- if (!text(result.revision, 4096))
34
- throw new Error('The immutable-revision strategy requires a source-scoped immutable revision.');
35
- fingerprint = dataHash(result.revision);
36
- }
37
- else if (metadata.identity.kind === 'custom') {
38
- if (!source.fingerprint)
39
- throw new Error('A custom identity strategy requires fingerprint(data).');
40
- const assertion = await source.fingerprint(structuredClone(data));
41
- if (!text(assertion, 4096))
42
- throw new Error('A custom fingerprint must be a nonempty bounded string.');
43
- fingerprint = dataHash(assertion);
44
- }
45
- context.signal.throwIfAborted();
46
- return { version: 1, identity: { ...metadata.identity, fingerprint }, contentHash, data, ...(result.revision === undefined ? {} : { revision: result.revision }) };
47
- }
48
- /** Reopening verifies serialized material without invoking source or identity callbacks. */
49
- export function assertPreparedArtifactData(input, metadata) {
50
- const strategy = sourceMetadata(metadata).identity;
51
- if (!object(input) || input.version !== 1 || Object.keys(input).some(key => !['version', 'identity', 'contentHash', 'data', 'revision'].includes(key)) || !object(input.identity))
52
- throw new Error('Missing or unsupported generated Artifact snapshot.');
53
- const { fingerprint, ...identity } = input.identity;
54
- if (!isDeepStrictEqual(identity, strategy) || typeof fingerprint !== 'string' || !/^[a-f0-9]{64}$/.test(fingerprint) || input.contentHash !== dataHash(input.data))
55
- throw new Error('Generated Artifact snapshot identity or content integrity does not match.');
56
- if (input.revision !== undefined && !text(input.revision, 4096))
57
- throw new Error('Invalid recorded immutable revision.');
58
- if (strategy.kind === 'canonical-data' && fingerprint !== input.contentHash || strategy.kind === 'immutable-revision' && (!text(input.revision, 4096) || fingerprint !== dataHash(input.revision)))
59
- throw new Error('Generated Artifact fingerprint does not match its recorded material.');
60
- }
61
- export function preparedArtifact(config, id, definition) {
62
- const metadata = config.configManifest?.sources?.[definition.source];
63
- if (!metadata)
64
- throw new Error(`Missing registered Artifact source: ${definition.source}`);
65
- const input = config.artifactInputs?.[id];
66
- assertPreparedArtifactData(input, metadata);
67
- return input;
68
- }
69
- export function assertGeneratedReviewInputs(request) {
70
- for (const artifact of request.artifacts) {
71
- if (artifact.kind !== 'generated')
72
- continue;
73
- const source = request.configManifest?.sources?.[artifact.source];
74
- if (!source)
75
- throw new Error('Missing recorded Artifact source.');
76
- assertPreparedArtifactData(artifact.input, source);
77
- }
78
- }
79
- /** Only explicit current-input operations enter this preparation seam. */
80
- export async function prepareArtifactInputs(config, root, purpose, signal) {
81
- const generated = Object.entries(config.artifacts).filter((entry) => isGeneratedArtifact(entry[1]));
82
- if (!generated.length)
83
- return config;
84
- const host = await openToolHost(root, signal);
85
- try {
86
- if (!config.configManifest || !matchesToolManifest(host.config, config.configManifest))
87
- throw new Error('Artifact source definitions do not match the captured configuration.');
88
- const artifactInputs = {};
89
- for (const [id, definition] of generated) {
90
- signal?.throwIfAborted();
91
- const metadata = config.configManifest.sources?.[definition.source];
92
- if (!metadata)
93
- throw new Error(`Missing registered Artifact source: ${definition.source}`);
94
- if (purpose === 'inspect' && metadata.preparation !== 'read-only')
95
- throw Object.assign(new Error('This Artifact source requires explicit preparation through verification or tool diagnostics.'), { code: 'ARTIFACT_PREPARATION_REQUIRED' });
96
- const input = await host.call({ action: 'prepare-artifact', artifactId: id, purpose }, metadata.timeoutMs ?? 120000);
97
- assertPreparedArtifactData(input, metadata);
98
- artifactInputs[id] = input;
99
- }
100
- return { ...config, artifactInputs };
101
- }
102
- finally {
103
- await host.close();
104
- }
105
- }
106
- //# sourceMappingURL=sources.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sources.js","sourceRoot":"","sources":["../../../src/artifacts/sources.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- type Output = {
2
- write(value: string): unknown;
3
- };
4
- export declare function reviewMain(argv: string[], { stdout, stderr }?: {
5
- stdout?: Output;
6
- stderr?: Output;
7
- }): Promise<number>;
8
- export {};
@@ -1,136 +0,0 @@
1
- import { readFile, realpath } from 'node:fs/promises';
2
- import { homedir } from 'node:os';
3
- import { join, resolve } from 'node:path';
4
- import { within } from '../tools/paths.js';
5
- import { readStateContext } from '../broker/index.js';
6
- import { startReviewServer } from './server.js';
7
- import { claimRemoteReview, executeRemoteHumanTool, listRemoteReviews, showRemoteReview, submitRemoteHumanReview } from './client.js';
8
- const help = `Remote Human review
9
-
10
- ccdd-project review serve --state-dir PATH --credentials-file PATH [--host HOST] [--port PORT]
11
- ccdd-project review list --server URL --token-file PATH [--limit N] [--offset N]
12
- ccdd-project review show REQUEST_ID --server URL --token-file PATH
13
- ccdd-project review claim REQUEST_ID --server URL --token-file PATH [--cache-dir PATH]
14
- ccdd-project review tool REQUEST_ID --tool NAME [--args JSON] --server URL --token-file PATH
15
- ccdd-project review submit REQUEST_ID --result-file PATH --server URL --token-file PATH
16
-
17
- Claim reserves the request while downloading its fixed snapshot and checking the
18
- local environment. Failed preparation releases the reservation and keeps cached files.
19
- Tools run on this computer. Verdicts are submitted to the original Broker.
20
- Client state defaults to ~/.local/state/ccdd-reviewer; override with --cache-dir.
21
- --timeout-ms sets each HTTP request budget (default 900000 ms), including file transfer.
22
- The server credentials file maps reviewer IDs to distinct random base64url tokens
23
- (at least 32 characters). Each client token file contains only its own token.
24
- Keep credential files outside reviewed projects. Use HTTPS or an authenticated
25
- tunnel when accessing a server across an untrusted network. The local monitor
26
- continues to listen only on loopback.
27
- `;
28
- function parse(argv) {
29
- const options = {}, positional = [];
30
- for (let index = 0; index < argv.length; index++) {
31
- const arg = argv[index];
32
- if (!arg.startsWith('--')) {
33
- positional.push(arg);
34
- continue;
35
- }
36
- if (Object.hasOwn(options, arg))
37
- throw new Error(`Duplicate option: ${arg}`);
38
- if (arg === '--help' || arg === '--json') {
39
- options[arg] = 'true';
40
- continue;
41
- }
42
- const value = argv[++index];
43
- if (!value || value.startsWith('--'))
44
- throw new Error(`${arg} requires a value.`);
45
- options[arg] = value;
46
- }
47
- return { options, positional };
48
- }
49
- async function credentialFile(filename, source) {
50
- const absolute = await realpath(resolve(filename));
51
- if (source && within(source, absolute))
52
- throw new Error('Reviewer credentials must stay outside the reviewed project.');
53
- const value = await readFile(absolute, 'utf8');
54
- if (Buffer.byteLength(value) > 65536)
55
- throw new Error('Credential file exceeds 64 KiB.');
56
- return value;
57
- }
58
- export async function reviewMain(argv, { stdout = process.stdout, stderr = process.stderr } = {}) {
59
- const controller = new AbortController();
60
- const interrupt = () => controller.abort(new Error('Review action cancelled.'));
61
- process.once('SIGINT', interrupt);
62
- process.once('SIGTERM', interrupt);
63
- try {
64
- const { options, positional } = parse(argv), [action, id] = positional;
65
- if (!action || action === 'help' || options['--help']) {
66
- stdout.write(help);
67
- return 0;
68
- }
69
- if (!['serve', 'list', 'show', 'claim', 'tool', 'submit'].includes(action))
70
- throw new Error('Use review serve, list, show, claim, tool, or submit.');
71
- if (positional.length !== (['show', 'claim', 'tool', 'submit'].includes(action) ? 2 : 1))
72
- throw new Error('Unexpected review command arguments.');
73
- const allowed = new Set(['--json', ...(action === 'serve' ? ['--state-dir', '--credentials-file', '--host', '--port'] : ['--server', '--token-file', '--cache-dir', '--timeout-ms']),
74
- ...(action === 'list' ? ['--limit', '--offset'] : []), ...(action === 'tool' ? ['--tool', '--args'] : []), ...(action === 'submit' ? ['--result-file'] : [])]);
75
- for (const key of Object.keys(options))
76
- if (!allowed.has(key))
77
- throw new Error(`${key} is not supported by review ${action}.`);
78
- const required = (key) => { if (!options[key])
79
- throw new Error(`${key} is required.`); return options[key]; };
80
- if (action === 'serve') {
81
- const context = readStateContext(resolve(required('--state-dir')));
82
- const reviewers = JSON.parse(await credentialFile(required('--credentials-file'), context.repoPath));
83
- const server = await startReviewServer({ stateDir: context.stateDir, reviewers, host: options['--host'], port: options['--port'] === undefined ? undefined : Number(options['--port']) });
84
- try {
85
- stdout.write(JSON.stringify({ url: server.url }) + '\n');
86
- if (!controller.signal.aborted)
87
- await new Promise(resolve => controller.signal.addEventListener('abort', () => resolve(), { once: true }));
88
- }
89
- finally {
90
- await server.close();
91
- }
92
- return 0;
93
- }
94
- let phase = '';
95
- const client = { server: required('--server'), token: (await credentialFile(required('--token-file'))).trim(),
96
- stateDir: resolve(options['--cache-dir'] ?? join(homedir(), '.local', 'state', 'ccdd-reviewer')), signal: controller.signal,
97
- timeoutMs: options['--timeout-ms'] === undefined ? undefined : Number(options['--timeout-ms']),
98
- onProgress: event => {
99
- if (options['--json'] || event.phase === phase)
100
- return;
101
- phase = event.phase;
102
- stderr.write(event.phase === 'download' ? 'Try Claim: preparing the snapshot and downloading missing files.\n' : event.phase === 'environment' ? 'Try Claim: checking the local review environment.\n' : 'Claim confirmed.\n');
103
- },
104
- };
105
- let result;
106
- if (action === 'list')
107
- result = await listRemoteReviews(client, { limit: options['--limit'] === undefined ? undefined : Number(options['--limit']), offset: options['--offset'] === undefined ? undefined : Number(options['--offset']) });
108
- else if (action === 'show')
109
- result = await showRemoteReview(id, client);
110
- else if (action === 'claim')
111
- result = await claimRemoteReview(id, client);
112
- else if (action === 'tool')
113
- result = await executeRemoteHumanTool(id, required('--tool'), JSON.parse(options['--args'] ?? '{}'), client);
114
- else {
115
- const content = await readFile(resolve(required('--result-file')), 'utf8');
116
- if (Buffer.byteLength(content) > 64 * 1024)
117
- throw new Error('Result file exceeds 64 KiB.');
118
- result = await submitRemoteHumanReview(id, JSON.parse(content), client);
119
- }
120
- stdout.write(JSON.stringify(result, null, 2) + '\n');
121
- return 0;
122
- }
123
- catch (error) {
124
- const message = error instanceof Error ? error.message : String(error);
125
- if (argv.includes('--json'))
126
- stdout.write(JSON.stringify({ error: message }) + '\n');
127
- else
128
- stderr.write(message + '\n');
129
- return 2;
130
- }
131
- finally {
132
- process.off('SIGINT', interrupt);
133
- process.off('SIGTERM', interrupt);
134
- }
135
- }
136
- //# sourceMappingURL=cli.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/review/cli.ts"],"names":[],"mappings":"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"}