@ccdd/project 3.3.1 → 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.
- package/README.md +9 -12
- package/dist/monitor-ui/assets/GraphView-CaxsIXtN.js +27 -0
- package/dist/monitor-ui/assets/ValidationView-BMqI2XQ5.css +1 -0
- package/dist/monitor-ui/assets/ValidationView-CGW6-Ljw.js +1 -0
- package/dist/monitor-ui/assets/{elk-api-D5d3gWoP.js → elk-api-DIQ2_nge.js} +1 -1
- package/dist/monitor-ui/assets/{elk.bundled-0eaKiuBP.js → elk.bundled-BRtnLd_M.js} +1 -1
- package/dist/monitor-ui/assets/{index-DDwx11D7.css → index-D0yfhUlt.css} +1 -1
- package/dist/monitor-ui/assets/index-LyUbXn5P.js +7 -0
- package/dist/monitor-ui/index.html +2 -2
- package/dist/scripts/prepare-demo.js +25 -44
- package/dist/scripts/prepare-demo.js.map +1 -1
- package/dist/src/artifact-scope.d.ts +6 -0
- package/dist/src/artifact-scope.js +27 -0
- package/dist/src/artifact-scope.js.map +1 -0
- package/dist/src/artifacts/index.d.ts +7 -155
- package/dist/src/artifacts/index.js +0 -354
- package/dist/src/artifacts/index.js.map +1 -1
- package/dist/src/artifacts/instruction.d.ts +6 -9
- package/dist/src/artifacts/instruction.js +28 -36
- package/dist/src/artifacts/instruction.js.map +1 -1
- package/dist/src/artifacts/mcp-server.js +5 -6
- package/dist/src/artifacts/mcp-server.js.map +1 -1
- package/dist/src/artifacts/scope.d.ts +12 -0
- package/dist/src/artifacts/scope.js +34 -0
- package/dist/src/artifacts/scope.js.map +1 -0
- package/dist/src/artifacts/tool-check.d.ts +2 -6
- package/dist/src/artifacts/tool-check.js +14 -18
- package/dist/src/artifacts/tool-check.js.map +1 -1
- package/dist/src/artifacts/types.d.ts +3 -37
- package/dist/src/artifacts/types.js +5 -89
- package/dist/src/artifacts/types.js.map +1 -1
- package/dist/src/broker/config.d.ts +5 -6
- package/dist/src/broker/config.js +183 -130
- package/dist/src/broker/config.js.map +1 -1
- package/dist/src/broker/graph.d.ts +14 -21
- package/dist/src/broker/graph.js +68 -70
- package/dist/src/broker/graph.js.map +1 -1
- package/dist/src/broker/index.d.ts +6 -28
- package/dist/src/broker/index.js +35 -221
- package/dist/src/broker/index.js.map +1 -1
- package/dist/src/cli.d.ts +1 -21
- package/dist/src/cli.js +2 -329
- package/dist/src/cli.js.map +1 -1
- package/dist/src/contracts.d.ts +12 -15
- package/dist/src/definitions.d.ts +33 -23
- package/dist/src/diagnostics-cli.d.ts +9 -0
- package/dist/src/diagnostics-cli.js +94 -0
- package/dist/src/diagnostics-cli.js.map +1 -0
- package/dist/src/doctor/index.d.ts +2 -4
- package/dist/src/doctor/index.js +17 -63
- package/dist/src/doctor/index.js.map +1 -1
- package/dist/src/executors/auth.d.ts +1 -1
- package/dist/src/executors/auth.js +2 -2
- package/dist/src/executors/auth.js.map +1 -1
- package/dist/src/executors/human-preparation.js +2 -10
- package/dist/src/executors/human-preparation.js.map +1 -1
- package/dist/src/executors/index.js +30 -29
- package/dist/src/executors/index.js.map +1 -1
- package/dist/src/executors/pi.js +2 -3
- package/dist/src/executors/pi.js.map +1 -1
- package/dist/src/executors/process.js +9 -0
- package/dist/src/executors/process.js.map +1 -1
- package/dist/src/monitor/actions.js +3 -3
- package/dist/src/monitor/actions.js.map +1 -1
- package/dist/src/monitor/server.js +12 -95
- package/dist/src/monitor/server.js.map +1 -1
- package/dist/src/monitor/store.js +6 -42
- package/dist/src/monitor/store.js.map +1 -1
- package/dist/src/monitor/types.d.ts +3 -13
- package/dist/src/monitor/ui/critic-presentation.js +1 -1
- package/dist/src/monitor/ui/critic-presentation.js.map +1 -1
- package/dist/src/monitor/ui/graph-layout.d.ts +0 -1
- package/dist/src/monitor/ui/graph-layout.js +1 -23
- package/dist/src/monitor/ui/graph-layout.js.map +1 -1
- package/dist/src/monitor/ui/tool-input.d.ts +1 -1
- package/dist/src/monitor/ui/tool-input.js +2 -3
- package/dist/src/monitor/ui/tool-input.js.map +1 -1
- package/dist/src/project/cli.js +18 -30
- package/dist/src/project/cli.js.map +1 -1
- package/dist/src/project/graph.js +2 -2
- package/dist/src/project/graph.js.map +1 -1
- package/dist/src/project/identity.js +83 -56
- package/dist/src/project/identity.js.map +1 -1
- package/dist/src/project/index.d.ts +0 -3
- package/dist/src/project/index.js +2 -6
- package/dist/src/project/index.js.map +1 -1
- package/dist/src/project/query.d.ts +2 -1
- package/dist/src/project/query.js +49 -74
- package/dist/src/project/query.js.map +1 -1
- package/dist/src/project/store.js +2 -2
- package/dist/src/project/store.js.map +1 -1
- package/dist/src/project/types.d.ts +4 -4
- package/dist/src/requester/index.d.ts +2 -9
- package/dist/src/requester/index.js +17 -96
- package/dist/src/requester/index.js.map +1 -1
- package/dist/src/sdk.d.ts +3 -8
- package/dist/src/sdk.js +2 -3
- package/dist/src/sdk.js.map +1 -1
- package/dist/src/tools/contracts.d.ts +34 -78
- package/dist/src/tools/diagnostics.js +1 -2
- package/dist/src/tools/diagnostics.js.map +1 -1
- package/dist/src/tools/environment.d.ts +1 -0
- package/dist/src/tools/environment.js +7 -11
- package/dist/src/tools/environment.js.map +1 -1
- package/dist/src/tools/manifest.d.ts +0 -1
- package/dist/src/tools/manifest.js +1 -25
- package/dist/src/tools/manifest.js.map +1 -1
- package/dist/src/tools/runner.d.ts +10 -14
- package/dist/src/tools/runner.js +144 -118
- package/dist/src/tools/runner.js.map +1 -1
- package/dist/src/tools/schema.js +1 -1
- package/dist/src/tools/schema.js.map +1 -1
- package/dist/src/workspaces/index.d.ts +5 -12
- package/dist/src/workspaces/index.js +33 -217
- package/dist/src/workspaces/index.js.map +1 -1
- package/package.json +38 -10
- package/dist/monitor-ui/assets/GraphView-BSZlEAs3.js +0 -27
- package/dist/monitor-ui/assets/ValidationView-DaEF78J-.js +0 -1
- package/dist/monitor-ui/assets/ValidationView-p5r8lX18.css +0 -1
- package/dist/monitor-ui/assets/index-BQlWbkpH.js +0 -8
- package/dist/src/artifacts/data.d.ts +0 -5
- package/dist/src/artifacts/data.js +0 -100
- package/dist/src/artifacts/data.js.map +0 -1
- package/dist/src/artifacts/groups.d.ts +0 -13
- package/dist/src/artifacts/groups.js +0 -93
- package/dist/src/artifacts/groups.js.map +0 -1
- package/dist/src/artifacts/human.d.ts +0 -38
- package/dist/src/artifacts/human.js +0 -156
- package/dist/src/artifacts/human.js.map +0 -1
- package/dist/src/artifacts/sources.d.ts +0 -11
- package/dist/src/artifacts/sources.js +0 -106
- package/dist/src/artifacts/sources.js.map +0 -1
- package/dist/src/review/cli.d.ts +0 -8
- package/dist/src/review/cli.js +0 -136
- package/dist/src/review/cli.js.map +0 -1
- package/dist/src/review/client.d.ts +0 -30
- package/dist/src/review/client.js +0 -193
- package/dist/src/review/client.js.map +0 -1
- package/dist/src/review/server.d.ts +0 -11
- package/dist/src/review/server.js +0 -249
- package/dist/src/review/server.js.map +0 -1
- package/dist/src/review/types.d.ts +0 -10
- package/dist/src/review/types.js +0 -17
- package/dist/src/review/types.js.map +0 -1
- package/dist/src/tools/host.d.ts +0 -7
- package/dist/src/tools/host.js +0 -98
- package/dist/src/tools/host.js.map +0 -1
- package/dist/src/tools/runtime-host.d.ts +0 -1
- package/dist/src/tools/runtime-host.js +0 -212
- package/dist/src/tools/runtime-host.js.map +0 -1
- package/dist/src/workspaces/transfer.d.ts +0 -52
- package/dist/src/workspaces/transfer.js +0 -372
- package/dist/src/workspaces/transfer.js.map +0 -1
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** Composition grants input access, while instruction dependencies govern verification. */
|
|
2
|
+
export function resolveArtifactScope(artifacts, roots) {
|
|
3
|
+
const visited = new Set();
|
|
4
|
+
const visit = (id) => {
|
|
5
|
+
if (visited.has(id))
|
|
6
|
+
return;
|
|
7
|
+
const artifact = artifacts[id];
|
|
8
|
+
if (!artifact)
|
|
9
|
+
throw new Error(`Unknown Artifact: ${id}`);
|
|
10
|
+
visited.add(id);
|
|
11
|
+
for (const next of [...Object.values(artifact.children), ...Object.values(artifact.mounts)])
|
|
12
|
+
visit(next);
|
|
13
|
+
};
|
|
14
|
+
roots.forEach(visit);
|
|
15
|
+
return { artifacts: [...visited].map(id => ({ id, ...structuredClone(artifacts[id]) })) };
|
|
16
|
+
}
|
|
17
|
+
/** A finite set of material and verification dependencies, including cycles. */
|
|
18
|
+
export function dependencyClosure(relations, roots) {
|
|
19
|
+
const result = new Set(), pending = [...roots];
|
|
20
|
+
while (pending.length) {
|
|
21
|
+
const id = pending.pop();
|
|
22
|
+
if (result.has(id))
|
|
23
|
+
continue;
|
|
24
|
+
result.add(id);
|
|
25
|
+
for (const edge of relations)
|
|
26
|
+
if (edge.target === id)
|
|
27
|
+
pending.push(edge.source);
|
|
28
|
+
}
|
|
29
|
+
return [...result].sort();
|
|
30
|
+
}
|
|
31
|
+
export function artifactReferenceMetadata(artifacts) {
|
|
32
|
+
return artifacts.map(({ id, path }) => ({ id, path }));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../../src/artifacts/scope.ts"],"names":[],"mappings":"AAGA,2FAA2F;AAC3F,MAAM,UAAU,oBAAoB,CAAC,SAA6C,EAAE,KAAwB;IAC1G,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAQ,EAAE;QACjC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO;QAC5B,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3G,CAAC,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,EAAE,SAAS,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC5F,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,iBAAiB,CAAC,SAAsC,EAAE,KAAwB;IAChG,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,EAAE,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACvD,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,EAAG,CAAC;QAC1B,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QAC7B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,SAAS;YAAE,IAAI,IAAI,CAAC,MAAM,KAAK,EAAE;gBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,SAAuC;IAC/E,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { type WorkspaceMode } from '../workspaces/index.js';
|
|
2
|
-
import type { HumanToolResult } from './human.js';
|
|
3
1
|
import { type ReviewToolDefinition } from '../tools/runner.js';
|
|
4
2
|
import type { ToolResult } from '../tools/contracts.js';
|
|
5
3
|
import { type ArtifactAudience } from './types.js';
|
|
@@ -16,7 +14,6 @@ export interface ArtifactToolCheck {
|
|
|
16
14
|
export interface ArtifactToolCheckReport {
|
|
17
15
|
ok: boolean;
|
|
18
16
|
status: 'READY' | 'NOT_READY';
|
|
19
|
-
mode: WorkspaceMode;
|
|
20
17
|
checkedAt: string;
|
|
21
18
|
snapshotHash?: string;
|
|
22
19
|
workspacePath?: string;
|
|
@@ -25,12 +22,11 @@ export interface ArtifactToolCheckReport {
|
|
|
25
22
|
tools: Array<ReviewToolDefinition & {
|
|
26
23
|
audience: ArtifactAudience;
|
|
27
24
|
}>;
|
|
28
|
-
result?:
|
|
25
|
+
result?: ToolResult;
|
|
29
26
|
}
|
|
30
27
|
export interface DiagnoseArtifactToolsOptions {
|
|
31
28
|
repoPath: string;
|
|
32
29
|
repoId?: string;
|
|
33
|
-
mode?: WorkspaceMode;
|
|
34
30
|
stateDir?: string;
|
|
35
31
|
artifactId?: string;
|
|
36
32
|
audience?: ArtifactAudience;
|
|
@@ -40,4 +36,4 @@ export interface DiagnoseArtifactToolsOptions {
|
|
|
40
36
|
signal?: AbortSignal;
|
|
41
37
|
}
|
|
42
38
|
/** Diagnose registered tools without creating a Broker, Run, request, alarm, Agent session or verdict. */
|
|
43
|
-
export declare function diagnoseArtifactTools({ repoPath,
|
|
39
|
+
export declare function diagnoseArtifactTools({ repoPath, stateDir, artifactId, audience, toolName, arguments: args, execute, signal, ...removed }: DiagnoseArtifactToolsOptions): Promise<ArtifactToolCheckReport>;
|
|
@@ -5,12 +5,13 @@ import { readWorkspaceConfig } from '../broker/config.js';
|
|
|
5
5
|
import { prepareWorkspace } from '../workspaces/index.js';
|
|
6
6
|
import { createReviewTools } from '../tools/runner.js';
|
|
7
7
|
import { assertArtifactAudience } from './types.js';
|
|
8
|
-
import {
|
|
9
|
-
import { prepareArtifactInputs } from './sources.js';
|
|
8
|
+
import { resolveArtifactScope } from './scope.js';
|
|
10
9
|
import { safeToolFailure, toolFailureStage } from '../tools/diagnostics.js';
|
|
11
10
|
/** Diagnose registered tools without creating a Broker, Run, request, alarm, Agent session or verdict. */
|
|
12
|
-
export async function diagnoseArtifactTools({ repoPath,
|
|
13
|
-
|
|
11
|
+
export async function diagnoseArtifactTools({ repoPath, stateDir, artifactId, audience, toolName, arguments: args, execute = false, signal, ...removed }) {
|
|
12
|
+
if ('mode' in removed)
|
|
13
|
+
throw new Error('Workspace modes are no longer supported; supply an unchanged workspace.');
|
|
14
|
+
const report = { ok: false, status: 'NOT_READY', checkedAt: new Date().toISOString(), checks: [], tools: [] };
|
|
14
15
|
let workspace;
|
|
15
16
|
let stage = 'preflight';
|
|
16
17
|
try {
|
|
@@ -19,29 +20,24 @@ export async function diagnoseArtifactTools({ repoPath, mode = 'copy', stateDir,
|
|
|
19
20
|
signal?.throwIfAborted();
|
|
20
21
|
stage = 'snapshot';
|
|
21
22
|
const context = await localContext({ repoPath, stateDir });
|
|
22
|
-
workspace = await prepareWorkspace({ repoPath: context.repoPath, stateDir: context.stateDir,
|
|
23
|
+
workspace = await prepareWorkspace({ repoPath: context.repoPath, stateDir: context.stateDir, signal });
|
|
23
24
|
const worktreePath = workspace.descriptor.path;
|
|
24
25
|
report.snapshotHash = workspace.descriptor.hash;
|
|
25
|
-
//
|
|
26
|
+
// A desktop viewer opens this supplied workspace; keep it unchanged while inspecting it.
|
|
26
27
|
report.workspacePath = worktreePath;
|
|
27
28
|
stage = 'preflight';
|
|
28
|
-
const
|
|
29
|
-
const config = await prepareArtifactInputs(loaded.config, worktreePath, 'review', workspace.signal);
|
|
29
|
+
const { config } = await readWorkspaceConfig(worktreePath, workspace.signal);
|
|
30
30
|
const { configManifest } = config;
|
|
31
31
|
if (artifactId !== undefined && !Object.hasOwn(config.artifacts, artifactId))
|
|
32
32
|
throw new Error('Unknown selected Artifact.');
|
|
33
|
-
|
|
34
|
-
report.checks.push({ artifactId, stage, ok: false, code: 'ARTIFACT_GROUP_NOT_EXECUTABLE', message: 'Groups collect member tools. Select a leaf Artifact with --artifact to execute its tool.' });
|
|
35
|
-
return report;
|
|
36
|
-
}
|
|
37
|
-
const selectedScope = resolveArtifactScope(config.artifacts, artifactId === undefined ? Object.keys(config.artifacts) : [artifactId], config.artifactInputs);
|
|
33
|
+
const selectedScope = resolveArtifactScope(config.artifacts, artifactId === undefined ? Object.keys(config.artifacts) : [artifactId]);
|
|
38
34
|
const selected = selectedScope.artifacts;
|
|
39
35
|
if (!selected.length)
|
|
40
36
|
throw new Error('Unknown selected Artifact.');
|
|
41
37
|
if (!artifactId && !audience && !toolName) {
|
|
42
38
|
for (const critic of config.critics) {
|
|
43
39
|
try {
|
|
44
|
-
assertArtifactAudience({ profile: critic.profile, ...resolveArtifactScope(config.artifacts, [critic.target, ...critic.deps]),
|
|
40
|
+
assertArtifactAudience({ profile: critic.profile, ...resolveArtifactScope(config.artifacts, [critic.target, ...critic.deps]), requiredObservations: [critic.target, ...critic.deps] });
|
|
45
41
|
}
|
|
46
42
|
catch (error) {
|
|
47
43
|
report.checks.push({ stage, ok: false, ...safeToolFailure(error) });
|
|
@@ -50,7 +46,7 @@ export async function diagnoseArtifactTools({ repoPath, mode = 'copy', stateDir,
|
|
|
50
46
|
}
|
|
51
47
|
for (const targetAudience of audience ? [audience] : ['agent', 'human']) {
|
|
52
48
|
stage = 'preflight';
|
|
53
|
-
const registry = await createReviewTools({ worktreePath, ...selectedScope,
|
|
49
|
+
const registry = await createReviewTools({ worktreePath, ...selectedScope, configManifest, audience: targetAudience, runDir: join(context.stateDir, 'tool-check', randomUUID()), signal: workspace.signal });
|
|
54
50
|
if (execute && targetAudience === audience && registry.outputDir)
|
|
55
51
|
report.outputDir = registry.outputDir;
|
|
56
52
|
try {
|
|
@@ -63,10 +59,10 @@ export async function diagnoseArtifactTools({ repoPath, mode = 'copy', stateDir,
|
|
|
63
59
|
}
|
|
64
60
|
report.tools.push(...definitions.map(tool => ({ ...tool, audience: targetAudience })));
|
|
65
61
|
for (const artifact of selected) {
|
|
66
|
-
if (
|
|
62
|
+
if (toolName !== undefined || registry.tools.some(tool => tool.artifactId === artifact.id))
|
|
67
63
|
continue;
|
|
68
|
-
const required = audience !== undefined
|
|
69
|
-
report.checks.push({ artifactId: artifact.id, audience: targetAudience, stage, ok: !required, ...(required ? { code: 'ARTIFACT_TOOLS_UNAVAILABLE' } : {}), message: `No ${targetAudience}
|
|
64
|
+
const required = artifactId !== undefined ? audience !== undefined && artifact.id === artifactId : config.critics.some(critic => critic.profile.kind === targetAudience && [critic.target, ...critic.deps].includes(artifact.id));
|
|
65
|
+
report.checks.push({ artifactId: artifact.id, audience: targetAudience, stage, ok: !required, ...(required ? { code: 'ARTIFACT_TOOLS_UNAVAILABLE' } : {}), message: `No ${targetAudience} views are declared for this Artifact.${required ? ' This reviewer requires a view.' : ''}` });
|
|
70
66
|
}
|
|
71
67
|
report.checks.push(...(await registry.preflight({ toolName: resolvedToolName })).map(check => ({ ...check, ...(!check.ok ? safeToolFailure({ code: check.code ?? 'ARTIFACT_TOOL_PREFLIGHT_FAILED' }) : {}), stage: 'preflight', audience: targetAudience })));
|
|
72
68
|
if (execute && targetAudience === audience && definitions.length === 1 && report.checks.every(check => check.ok)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-check.js","sourceRoot":"","sources":["../../../src/artifacts/tool-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"tool-check.js","sourceRoot":"","sources":["../../../src/artifacts/tool-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,43 +1,9 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export type ArtifactOperation = 'read' | 'list';
|
|
3
|
-
export type ArtifactViewerKind = 'text' | 'files';
|
|
1
|
+
import type { ArtifactReference } from './index.js';
|
|
4
2
|
export type ArtifactAudience = 'agent' | 'human';
|
|
5
|
-
export interface BuiltinArtifactTool {
|
|
6
|
-
description?: string;
|
|
7
|
-
}
|
|
8
|
-
export interface HumanCommandTool {
|
|
9
|
-
description: string;
|
|
10
|
-
command: string;
|
|
11
|
-
args: string[];
|
|
12
|
-
timeoutMs?: number;
|
|
13
|
-
}
|
|
14
|
-
export type HumanArtifactToolConfig = BuiltinArtifactTool | HumanCommandTool;
|
|
15
|
-
export interface ArtifactTypeDefinition {
|
|
16
|
-
viewer?: ArtifactViewerKind;
|
|
17
|
-
/** Serialized marker for a type whose tools are in the recorded TS manifest. */
|
|
18
|
-
custom?: true;
|
|
19
|
-
tools?: Partial<Record<ArtifactOperation, {
|
|
20
|
-
description: string;
|
|
21
|
-
}>>;
|
|
22
|
-
agentTools?: Partial<Record<ArtifactOperation, BuiltinArtifactTool>>;
|
|
23
|
-
humanTools?: Record<string, HumanArtifactToolConfig>;
|
|
24
|
-
}
|
|
25
|
-
export declare function validateArtifactType(typeName: unknown, definition: unknown): ArtifactTypeDefinition;
|
|
26
|
-
/** Legacy defaults are available only if neither audience was explicitly declared. */
|
|
27
|
-
export declare function artifactAudienceTools(typeDefinition: ArtifactTypeDefinition, audience: ArtifactAudience, { allowLegacy }?: {
|
|
28
|
-
allowLegacy?: boolean;
|
|
29
|
-
}): Record<string, HumanArtifactToolConfig>;
|
|
30
3
|
export declare function assertArtifactAudience(request: {
|
|
31
4
|
profile: {
|
|
32
5
|
kind: string;
|
|
33
6
|
};
|
|
34
|
-
artifacts: readonly
|
|
35
|
-
|
|
36
|
-
type: string;
|
|
37
|
-
}[];
|
|
38
|
-
artifactTypes: Readonly<Record<string, unknown>>;
|
|
39
|
-
configManifest?: ConfigManifest;
|
|
40
|
-
}, { allowLegacy }?: {
|
|
41
|
-
allowLegacy?: boolean;
|
|
7
|
+
artifacts: readonly ArtifactReference[];
|
|
8
|
+
requiredObservations?: readonly string[];
|
|
42
9
|
}): void;
|
|
43
|
-
export declare function toolDescription(typeDefinition: unknown, toolName: string, artifactName: unknown, audience?: ArtifactAudience): string;
|
|
@@ -1,97 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
3
|
-
const operations = { text: ['read'], files: ['list', 'read'] };
|
|
4
|
-
const defaults = {
|
|
5
|
-
read: 'Read text from {artifactName} using 1-based line ranges.',
|
|
6
|
-
list: 'List files within {artifactName}.',
|
|
7
|
-
};
|
|
8
|
-
export function validateArtifactType(typeName, definition) {
|
|
9
|
-
if (typeof typeName === 'string' && identifier.test(typeName) && object(definition) && definition.custom === true && Object.keys(definition).length === 1)
|
|
10
|
-
return { custom: true };
|
|
11
|
-
if (typeof typeName !== 'string' || !identifier.test(typeName) || !object(definition) ||
|
|
12
|
-
(definition.viewer !== 'text' && definition.viewer !== 'files')) {
|
|
13
|
-
throw new Error(`Invalid artifact type/viewer: ${String(typeName)}`);
|
|
14
|
-
}
|
|
15
|
-
for (const key of Object.keys(definition)) {
|
|
16
|
-
if (!['viewer', 'tools', 'agentTools', 'humanTools'].includes(key))
|
|
17
|
-
throw new Error(`Unknown artifact type field: ${typeName}.${key}`);
|
|
18
|
-
}
|
|
19
|
-
for (const audience of ['tools', 'agentTools', 'humanTools']) {
|
|
20
|
-
if (!Object.hasOwn(definition, audience))
|
|
21
|
-
continue;
|
|
22
|
-
const configured = definition[audience];
|
|
23
|
-
if (!object(configured))
|
|
24
|
-
throw new Error(`Artifact type ${audience} must be an object: ${typeName}`);
|
|
25
|
-
if (Object.keys(configured).length > 32)
|
|
26
|
-
throw new Error(`Too many artifact tools: ${typeName}.${audience}`);
|
|
27
|
-
for (const [operation, tool] of Object.entries(configured)) {
|
|
28
|
-
if (!identifier.test(operation) || !object(tool))
|
|
29
|
-
throw new Error(`Invalid artifact tool: ${typeName}.${operation}`);
|
|
30
|
-
const builtin = operation === 'read' || operation === 'list';
|
|
31
|
-
if (builtin && !operations[definition.viewer].includes(operation)) {
|
|
32
|
-
throw new Error(`Unsupported artifact tool for ${definition.viewer} viewer: ${typeName}.${operation}`);
|
|
33
|
-
}
|
|
34
|
-
if (!builtin && (audience !== 'humanTools' || !Object.hasOwn(tool, 'command'))) {
|
|
35
|
-
throw new Error(`Unsupported artifact tool: ${typeName}.${operation}`);
|
|
36
|
-
}
|
|
37
|
-
if (builtin) {
|
|
38
|
-
if (Object.keys(tool).some(key => key !== 'description'))
|
|
39
|
-
throw new Error(`Artifact builtin tool allows only description: ${typeName}.${operation}`);
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
if (Object.keys(tool).some(key => !['description', 'command', 'args', 'timeoutMs'].includes(key)))
|
|
43
|
-
throw new Error(`Unknown Human command field: ${typeName}.${operation}`);
|
|
44
|
-
if (typeof tool.command !== 'string' || !tool.command.trim() || tool.command.length > 4096 || /[\0\r\n{}]/.test(tool.command) || (!tool.command.startsWith('/') && /[/\\]/.test(tool.command)))
|
|
45
|
-
throw new Error(`Human command must be an executable name or absolute path: ${typeName}.${operation}`);
|
|
46
|
-
if (!Array.isArray(tool.args) || tool.args.length > 64 || !tool.args.includes('{artifactPath}') || tool.args.some(arg => typeof arg !== 'string' || arg.length > 4096 || arg.includes('\0') || (arg !== '{artifactPath}' && /[{}]/.test(arg))))
|
|
47
|
-
throw new Error(`Human command args must include standalone {artifactPath} and fixed string arguments: ${typeName}.${operation}`);
|
|
48
|
-
if (tool.timeoutMs !== undefined && (typeof tool.timeoutMs !== 'number' || !Number.isInteger(tool.timeoutMs) || tool.timeoutMs < 1 || tool.timeoutMs > 120_000))
|
|
49
|
-
throw new Error(`Human command timeoutMs must be 1–120000: ${typeName}.${operation}`);
|
|
50
|
-
}
|
|
51
|
-
if (tool.description === undefined && audience !== 'tools' && builtin)
|
|
52
|
-
continue;
|
|
53
|
-
if (typeof tool.description !== 'string' || !tool.description.trim() || tool.description.length > 4000)
|
|
54
|
-
throw new Error(`Artifact tool description must contain 1–4000 characters: ${typeName}.${operation}`);
|
|
55
|
-
if (/[{}]/.test(tool.description.replaceAll('{artifactName}', '')))
|
|
56
|
-
throw new Error(`Artifact tool description supports only the {artifactName} placeholder: ${typeName}.${operation}`);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
return definition;
|
|
60
|
-
}
|
|
61
|
-
/** Legacy defaults are available only if neither audience was explicitly declared. */
|
|
62
|
-
export function artifactAudienceTools(typeDefinition, audience, { allowLegacy = false } = {}) {
|
|
63
|
-
const definition = validateArtifactType('artifact', typeDefinition);
|
|
64
|
-
if (Object.hasOwn(definition, 'agentTools') || Object.hasOwn(definition, 'humanTools'))
|
|
65
|
-
return structuredClone(definition[audience === 'agent' ? 'agentTools' : 'humanTools'] ?? {});
|
|
66
|
-
if (!allowLegacy)
|
|
67
|
-
return {};
|
|
68
|
-
if (definition.custom)
|
|
69
|
-
return {};
|
|
70
|
-
return Object.fromEntries(operations[definition.viewer].map(operation => [operation, { description: definition.tools?.[operation]?.description ?? defaults[operation] }]));
|
|
71
|
-
}
|
|
72
|
-
export function assertArtifactAudience(request, { allowLegacy = false } = {}) {
|
|
1
|
+
export function assertArtifactAudience(request) {
|
|
73
2
|
const audience = request.profile.kind;
|
|
74
3
|
if (audience !== 'agent' && audience !== 'human')
|
|
75
4
|
return;
|
|
5
|
+
const required = new Set(request.requiredObservations ?? request.artifacts.map(a => a.id));
|
|
76
6
|
for (const artifact of request.artifacts) {
|
|
77
|
-
if (
|
|
78
|
-
if (!Object.keys(request.configManifest.types[artifact.type]?.[audience === 'agent' ? 'agentTools' : 'humanTools'] ?? {}).length)
|
|
79
|
-
throw Object.assign(new Error(`Artifact ${artifact.id} has no ${audience} tools.`), { code: 'ARTIFACT_TOOLS_UNAVAILABLE' });
|
|
7
|
+
if (!required.has(artifact.id))
|
|
80
8
|
continue;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if (!Object.keys(artifactAudienceTools(type, audience, { allowLegacy })).length)
|
|
84
|
-
throw Object.assign(new Error(`Artifact ${artifact.id} has no ${audience} tools. Register ${audience}Tools on artifact type ${artifact.type}.`), { code: 'ARTIFACT_TOOLS_UNAVAILABLE' });
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
export function toolDescription(typeDefinition, toolName, artifactName, audience) {
|
|
88
|
-
const definition = validateArtifactType('artifact', typeDefinition);
|
|
89
|
-
if ((toolName !== 'read' && toolName !== 'list') || !definition.viewer || !operations[definition.viewer].includes(toolName)) {
|
|
90
|
-
throw new Error(`Unsupported artifact tool for ${definition.viewer} viewer: ${String(toolName)}`);
|
|
9
|
+
if (!Object.keys(artifact.views[audience === 'agent' ? 'agentTools' : 'humanTools'] ?? {}).length)
|
|
10
|
+
throw Object.assign(new Error(`Artifact ${artifact.id} has no ${audience} views.`), { code: 'ARTIFACT_TOOLS_UNAVAILABLE' });
|
|
91
11
|
}
|
|
92
|
-
if (typeof artifactName !== 'string' || !artifactName)
|
|
93
|
-
throw new Error('Artifact name is required for its tool description.');
|
|
94
|
-
const template = audience ? artifactAudienceTools(definition, audience, { allowLegacy: true })[toolName]?.description ?? defaults[toolName] : definition.tools?.[toolName]?.description ?? defaults[toolName];
|
|
95
|
-
return template.replaceAll('{artifactName}', () => artifactName);
|
|
96
12
|
}
|
|
97
13
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/artifacts/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/artifacts/types.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,sBAAsB,CAAC,OAAyH;IAC9J,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;IACtC,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO;IACzD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,oBAAoB,IAAI,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3F,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,SAAS;QACzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM;YAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,QAAQ,CAAC,EAAE,WAAW,QAAQ,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC,CAAC;IACjO,CAAC;AACH,CAAC"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
+
import type { ScriptDefinition } from '../tools/contracts.js';
|
|
1
2
|
import type { RepoConfig } from '../contracts.js';
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
type: string;
|
|
5
|
-
mode: string;
|
|
6
|
-
}
|
|
3
|
+
export declare const identifier: RegExp;
|
|
4
|
+
export declare const criticIdentifier: RegExp;
|
|
7
5
|
export declare function validateRelativePath(value: unknown): string;
|
|
6
|
+
export declare function validateScript(value: unknown): asserts value is ScriptDefinition;
|
|
7
|
+
/** Discover static per-folder declarations. No imports, generators, tools, or Providers run here. */
|
|
8
8
|
export declare function readWorkspaceConfig(repoPath: string, signal?: AbortSignal): Promise<{
|
|
9
9
|
config: RepoConfig;
|
|
10
10
|
}>;
|
|
11
|
-
export declare function validateConfig(config: unknown, tree: WorkspaceTreeEntry[]): asserts config is RepoConfig;
|