@dailephd/my-frontend-observer 0.9.0 → 0.10.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/CHANGELOG.md +25 -0
- package/README.md +17 -7
- package/dist/application/visualChangeAgentHandoffService.d.ts +28 -0
- package/dist/application/visualChangeAgentHandoffService.js +111 -0
- package/dist/application/visualChangeAgentHandoffService.js.map +1 -0
- package/dist/application/visualChangeProjectWorkflowService.d.ts +95 -0
- package/dist/application/visualChangeProjectWorkflowService.js +376 -0
- package/dist/application/visualChangeProjectWorkflowService.js.map +1 -0
- package/dist/application/visualChangeReviewService.d.ts +50 -0
- package/dist/application/visualChangeReviewService.js +69 -0
- package/dist/application/visualChangeReviewService.js.map +1 -0
- package/dist/application/visualChangeWorkflowPersistenceService.d.ts +26 -0
- package/dist/application/visualChangeWorkflowPersistenceService.js +15 -0
- package/dist/application/visualChangeWorkflowPersistenceService.js.map +1 -0
- package/dist/artifacts/visualChangeWorkflowArtifactReader.d.ts +9 -0
- package/dist/artifacts/visualChangeWorkflowArtifactReader.js +47 -0
- package/dist/artifacts/visualChangeWorkflowArtifactReader.js.map +1 -0
- package/dist/artifacts/visualChangeWorkflowArtifactWriter.d.ts +20 -0
- package/dist/artifacts/visualChangeWorkflowArtifactWriter.js +41 -0
- package/dist/artifacts/visualChangeWorkflowArtifactWriter.js.map +1 -0
- package/dist/cli.js +510 -508
- package/dist/cli.js.map +1 -1
- package/dist/domain/visualChangeAgentHandoff.d.ts +82 -0
- package/dist/domain/visualChangeAgentHandoff.js +80 -0
- package/dist/domain/visualChangeAgentHandoff.js.map +1 -0
- package/dist/domain/visualChangeAgentHandoffSerialization.d.ts +2 -0
- package/dist/domain/visualChangeAgentHandoffSerialization.js +11 -0
- package/dist/domain/visualChangeAgentHandoffSerialization.js.map +1 -0
- package/dist/domain/visualChangeCycle.d.ts +8 -0
- package/dist/domain/visualChangeCycle.js +7 -0
- package/dist/domain/visualChangeCycle.js.map +1 -0
- package/dist/domain/visualChangeWorkflow.d.ts +125 -0
- package/dist/domain/visualChangeWorkflow.js +109 -0
- package/dist/domain/visualChangeWorkflow.js.map +1 -0
- package/dist/domain/visualChangeWorkflowIdentity.d.ts +5 -0
- package/dist/domain/visualChangeWorkflowIdentity.js +24 -0
- package/dist/domain/visualChangeWorkflowIdentity.js.map +1 -0
- package/dist/index.d.ts +21 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/projectWorkflow/projectPaths.d.ts +3 -0
- package/dist/projectWorkflow/projectPaths.js +7 -0
- package/dist/projectWorkflow/projectPaths.js.map +1 -1
- package/dist/viewer/assets/index-DglJ6f28.css +1 -0
- package/dist/viewer/assets/index-DsODREY5.js +9 -0
- package/dist/viewer/index.html +2 -2
- package/dist/viewer/sw.js +1 -1
- package/dist/viewerServer/evidence/classify.d.ts +3 -1
- package/dist/viewerServer/evidence/classify.js +10 -0
- package/dist/viewerServer/evidence/classify.js.map +1 -1
- package/dist/viewerServer/evidence/handles.js +1 -0
- package/dist/viewerServer/evidence/handles.js.map +1 -1
- package/dist/viewerServer/evidence/projection.d.ts +5 -0
- package/dist/viewerServer/evidence/projection.js +19 -0
- package/dist/viewerServer/evidence/projection.js.map +1 -1
- package/dist/viewerServer/evidence/visualChangeWorkflowView.d.ts +31 -0
- package/dist/viewerServer/evidence/visualChangeWorkflowView.js +36 -0
- package/dist/viewerServer/evidence/visualChangeWorkflowView.js.map +1 -0
- package/dist/viewerServer/httpServer.js +323 -1
- package/dist/viewerServer/httpServer.js.map +1 -1
- package/dist/viewerServer/referenceApproval.d.ts +22 -0
- package/dist/viewerServer/referenceApproval.js +42 -0
- package/dist/viewerServer/referenceApproval.js.map +1 -0
- package/dist/viewerServer/referenceVisualChangeAuthoring.d.ts +28 -0
- package/dist/viewerServer/referenceVisualChangeAuthoring.js +134 -0
- package/dist/viewerServer/referenceVisualChangeAuthoring.js.map +1 -0
- package/dist/viewerServer/runtimeVisualChangeAuthoring.d.ts +33 -0
- package/dist/viewerServer/runtimeVisualChangeAuthoring.js +81 -0
- package/dist/viewerServer/runtimeVisualChangeAuthoring.js.map +1 -0
- package/dist/viewerServer/visualChangeAuthoring.d.ts +46 -0
- package/dist/viewerServer/visualChangeAuthoring.js +63 -0
- package/dist/viewerServer/visualChangeAuthoring.js.map +1 -0
- package/dist/viewerServer/visualChangeHandoff.d.ts +23 -0
- package/dist/viewerServer/visualChangeHandoff.js +31 -0
- package/dist/viewerServer/visualChangeHandoff.js.map +1 -0
- package/dist/viewerServer/visualChangeReview.d.ts +30 -0
- package/dist/viewerServer/visualChangeReview.js +46 -0
- package/dist/viewerServer/visualChangeReview.js.map +1 -0
- package/docs/ARCHITECTURE.md +17 -5
- package/docs/CI_CD.md +33 -1
- package/docs/COMMANDS.md +19 -5
- package/docs/CONTRACTS.md +38 -4
- package/docs/CURRENT_STATE.md +92 -11
- package/docs/DEVELOPMENT.md +32 -2
- package/docs/PROJECT_MILESTONES.md +28 -0
- package/docs/PROJECT_OVERVIEW.md +36 -14
- package/docs/QUICKSTART.md +7 -3
- package/docs/RELEASE.md +15 -11
- package/docs/ROADMAP.md +55 -2
- package/docs/SECURITY.md +25 -3
- package/docs/WORKFLOWS.md +29 -3
- package/docs/plans/v0.10-implementation-plan.md +1509 -0
- package/docs/plans/v0.9.1-implementation-plan.md +468 -0
- package/docs/reports/v0.10-batch1-visual-change-workflow-foundation.md +102 -0
- package/docs/reports/v0.10-batch2-project-composition-check-recording.md +103 -0
- package/docs/reports/v0.10-batch3-viewer-visual-change-workspace.md +93 -0
- package/docs/reports/v0.10-batch4-actual-frontend-entry.md +59 -0
- package/docs/reports/v0.10-batch5-reference-driven-entry.md +238 -0
- package/docs/reports/v0.10-batch6-coding-agent-handoff.md +85 -0
- package/docs/reports/v0.10-batch7-correction-review-acceptance.md +145 -0
- package/docs/reports/v0.10-batch8-integrated-acceptance.md +109 -0
- package/docs/reports/v0.10-implementation-completeness-documentation-reconciliation.md +344 -0
- package/docs/reports/v0.10-pre-release-readiness.md +120 -0
- package/docs/reports/v0.10-release-preparation.md +70 -0
- package/docs/reports/v0.9.1-batch1-pwa-hard-gate-isolation.md +359 -0
- package/docs/reports/v0.9.1-batch2-hard-gate-validation-integration.md +262 -0
- package/docs/reports/v0.9.1-pre-release-readiness.md +206 -0
- package/package.json +3 -2
- package/dist/viewer/assets/index-BN41MI7m.css +0 -1
- package/dist/viewer/assets/index-CkKXnlrI.js +0 -9
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ReferenceRuntimeBindingDeclaration } from '../domain/externalReferenceRuntimeBinding.js';
|
|
2
|
+
import type { ViewerAuthoringSession } from './authoringSecurity.js';
|
|
3
|
+
export interface StartReferenceVisualChangeRequest {
|
|
4
|
+
annotationHandle: string;
|
|
5
|
+
itemIds: string[];
|
|
6
|
+
baselineObservationHandle: string;
|
|
7
|
+
bindings: ReferenceRuntimeBindingDeclaration[];
|
|
8
|
+
}
|
|
9
|
+
export declare function parseStartReferenceVisualChangeRequest(value: unknown): {
|
|
10
|
+
ok: true;
|
|
11
|
+
request: StartReferenceVisualChangeRequest;
|
|
12
|
+
} | {
|
|
13
|
+
ok: false;
|
|
14
|
+
error: string;
|
|
15
|
+
};
|
|
16
|
+
export type StartReferenceVisualChangeResult = {
|
|
17
|
+
ok: true;
|
|
18
|
+
visualChangeRequestId: string;
|
|
19
|
+
visualChangeWorkflowId: string;
|
|
20
|
+
referenceId: string;
|
|
21
|
+
referenceRequestId: string;
|
|
22
|
+
bindingCount: number;
|
|
23
|
+
} | {
|
|
24
|
+
ok: false;
|
|
25
|
+
reason: string;
|
|
26
|
+
error: string;
|
|
27
|
+
};
|
|
28
|
+
export declare function startReferenceVisualChangeFromViewer(root: string, session: ViewerAuthoringSession, referenceHandle: string, request: StartReferenceVisualChangeRequest): Promise<StartReferenceVisualChangeResult>;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { evaluateReferenceRuntimeBindings, isValidReferenceRuntimeBindingDeclarations } from '../domain/externalReferenceRuntimeBinding.js';
|
|
3
|
+
import { buildReferenceRequirement, deriveReferenceRequirementAdequacy } from '../domain/externalReferenceRequirements.js';
|
|
4
|
+
import { createProjectVisualChangeWorkflow } from '../application/visualChangeProjectWorkflowService.js';
|
|
5
|
+
import { readProjectConfig } from '../projectWorkflow/projectConfig.js';
|
|
6
|
+
import { aliasCatalogPath, projectConfigPath, projectEvidenceRoot } from '../projectWorkflow/projectPaths.js';
|
|
7
|
+
import { readAliasCatalog } from '../projectWorkflow/aliasCatalog.js';
|
|
8
|
+
import { resolveContainedAcceptancePath } from '../projectWorkflow/checkAcceptance.js';
|
|
9
|
+
import { readPersistentBaselineContract } from '../artifacts/frontendContractArtifactReader.js';
|
|
10
|
+
import { getAnnotationView } from './evidence/annotationView.js';
|
|
11
|
+
import { loadArtifactByHandle } from './evidence/index.js';
|
|
12
|
+
import { decodeArtifactHandle } from './evidence/handles.js';
|
|
13
|
+
import { resolveContainedDir } from './evidence/pathSafety.js';
|
|
14
|
+
import { parseAuthoringItemIds, runSerializedAuthoringWrite } from './annotationAuthoring.js';
|
|
15
|
+
export function parseStartReferenceVisualChangeRequest(value) {
|
|
16
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
17
|
+
return { ok: false, error: 'request body must be a JSON object' };
|
|
18
|
+
const record = value;
|
|
19
|
+
const allowed = ['annotationHandle', 'itemIds', 'baselineObservationHandle', 'bindings'];
|
|
20
|
+
const extra = Object.keys(record).filter((key) => !allowed.includes(key));
|
|
21
|
+
if (extra.length > 0 || Object.keys(record).length !== 4)
|
|
22
|
+
return { ok: false, error: `request body must contain only ${allowed.join(', ')}` };
|
|
23
|
+
if (typeof record.annotationHandle !== 'string' || record.annotationHandle.length === 0 || typeof record.baselineObservationHandle !== 'string' || record.baselineObservationHandle.length === 0)
|
|
24
|
+
return { ok: false, error: 'annotationHandle and baselineObservationHandle must be non-empty strings' };
|
|
25
|
+
const ids = parseAuthoringItemIds(record.itemIds);
|
|
26
|
+
if (!ids.ok)
|
|
27
|
+
return ids;
|
|
28
|
+
if (!Array.isArray(record.bindings))
|
|
29
|
+
return { ok: false, error: 'bindings must be an array' };
|
|
30
|
+
return { ok: true, request: { annotationHandle: record.annotationHandle, itemIds: ids.itemIds, baselineObservationHandle: record.baselineObservationHandle, bindings: record.bindings } };
|
|
31
|
+
}
|
|
32
|
+
const relative = (root, dir) => { const result = path.relative(root, dir).split(path.sep).join('/'); return result && !result.startsWith('../') && !path.posix.isAbsolute(result) ? result : undefined; };
|
|
33
|
+
const requiredRegions = (reference) => new Set((reference.requirements ?? []).flatMap((requirement) => requirement.subject.kind === 'region-property' ? [requirement.subject.region] : [requirement.subject.subjectRegion, requirement.subject.relatedRegion]));
|
|
34
|
+
function selectedIntent(annotation, ids) {
|
|
35
|
+
const byId = new Map(annotation.items.map((item) => [item.annotationItemId, item]));
|
|
36
|
+
const items = [];
|
|
37
|
+
for (const id of ids) {
|
|
38
|
+
const item = byId.get(id);
|
|
39
|
+
if (item === undefined || item.interpretation.state !== 'confirmed' || !['reference-region', 'reference-requirement'].includes(item.interpretation.intent.kind))
|
|
40
|
+
return { ok: false, error: `annotation item "${id}" is not confirmed executable reference intent` };
|
|
41
|
+
items.push(item);
|
|
42
|
+
}
|
|
43
|
+
return { ok: true, items };
|
|
44
|
+
}
|
|
45
|
+
export function startReferenceVisualChangeFromViewer(root, session, referenceHandle, request) {
|
|
46
|
+
return runSerializedAuthoringWrite(session, async () => {
|
|
47
|
+
const loaded = await loadArtifactByHandle(root, referenceHandle);
|
|
48
|
+
if (!loaded.ok)
|
|
49
|
+
return { ok: false, reason: 'unknown-handle', error: 'unknown reference handle' };
|
|
50
|
+
if (loaded.detail.family !== 'external-reference-approved')
|
|
51
|
+
return { ok: false, reason: 'reference-not-approved', error: 'only an approved reference can start a visual change' };
|
|
52
|
+
const reference = loaded.detail.artifact;
|
|
53
|
+
const annotationView = await getAnnotationView(root, request.annotationHandle);
|
|
54
|
+
if (!annotationView.ok || annotationView.annotation.source.kind !== 'external-reference' || annotationView.source.status !== 'available' || annotationView.source.family !== 'external-reference-approved' || annotationView.source.handle !== referenceHandle)
|
|
55
|
+
return { ok: false, reason: 'annotation-source-mismatch', error: 'annotation must belong to the exact approved reference' };
|
|
56
|
+
const selected = selectedIntent(annotationView.annotation, request.itemIds);
|
|
57
|
+
if (!selected.ok)
|
|
58
|
+
return { ok: false, reason: 'invalid-selection', error: selected.error };
|
|
59
|
+
for (const item of selected.items) {
|
|
60
|
+
const intent = item.interpretation.intent;
|
|
61
|
+
if (intent.kind === 'reference-region') {
|
|
62
|
+
const match = (reference.regions ?? []).find((region) => region.id.toLowerCase() === intent.region.id.toLowerCase());
|
|
63
|
+
if (match === undefined || JSON.stringify(match.rectangle) !== JSON.stringify(intent.region.rectangle))
|
|
64
|
+
return { ok: false, reason: 'intent-not-represented', error: 'reference intent must first be materialized and explicitly approved' };
|
|
65
|
+
}
|
|
66
|
+
if (intent.kind === 'reference-requirement') {
|
|
67
|
+
const id = buildReferenceRequirement(intent.requirement).requirementId;
|
|
68
|
+
if (!(reference.requirements ?? []).some((requirement) => requirement.requirementId === id))
|
|
69
|
+
return { ok: false, reason: 'intent-not-represented', error: 'reference intent must first be materialized and explicitly approved' };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const adequacy = deriveReferenceRequirementAdequacy(reference.regions ?? [], reference.requirements ?? []);
|
|
73
|
+
if (adequacy.status !== 'adequate')
|
|
74
|
+
return { ok: false, reason: 'reference-inadequate', error: 'approved reference requirement evidence must be adequate' };
|
|
75
|
+
const baselineLoaded = await loadArtifactByHandle(root, request.baselineObservationHandle);
|
|
76
|
+
if (!baselineLoaded.ok || baselineLoaded.detail.family !== 'observation')
|
|
77
|
+
return { ok: false, reason: 'baseline-invalid', error: 'baselineObservationHandle must identify a supported observation' };
|
|
78
|
+
const baseline = baselineLoaded.detail.artifact;
|
|
79
|
+
const baselineDecoded = decodeArtifactHandle(request.baselineObservationHandle);
|
|
80
|
+
const baselineRoot = baselineDecoded.ok ? resolveContainedDir(root, baselineDecoded.relativeDir) : undefined;
|
|
81
|
+
const baselinePath = baselineRoot === undefined ? undefined : relative(session.projectRoot, baselineRoot);
|
|
82
|
+
if (baselinePath === undefined)
|
|
83
|
+
return { ok: false, reason: 'baseline-invalid', error: 'baseline observation is outside the project' };
|
|
84
|
+
const catalog = await readAliasCatalog(aliasCatalogPath(session.projectRoot));
|
|
85
|
+
const evidenceRelative = baselineRoot === undefined ? '' : path.relative(projectEvidenceRoot(session.projectRoot), baselineRoot).split(path.sep).join('/');
|
|
86
|
+
if (!catalog.ok || !Object.values(catalog.catalog.observations).some((entry) => entry.observationId === baseline.observationId && entry.requestId === baseline.requestId && entry.relativeArtifactDir === evidenceRelative))
|
|
87
|
+
return { ok: false, reason: 'baseline-alias-missing', error: 'baseline observation has no exact current alias' };
|
|
88
|
+
const config = await readProjectConfig(projectConfigPath(session.projectRoot));
|
|
89
|
+
if (!config.ok)
|
|
90
|
+
return { ok: false, reason: 'project-config-invalid', error: 'project configuration is invalid' };
|
|
91
|
+
if (config.config.acceptance?.reference === undefined)
|
|
92
|
+
return { ok: false, reason: 'reference-not-configured', error: 'project reference acceptance must be configured' };
|
|
93
|
+
const validation = isValidReferenceRuntimeBindingDeclarations(request.bindings, reference);
|
|
94
|
+
if (!validation.valid)
|
|
95
|
+
return { ok: false, reason: 'bindings-invalid', error: validation.reason };
|
|
96
|
+
const evaluated = evaluateReferenceRuntimeBindings(reference, baseline, request.bindings);
|
|
97
|
+
if (!evaluated.ok)
|
|
98
|
+
return { ok: false, reason: 'bindings-invalid', error: evaluated.reason };
|
|
99
|
+
const evaluation = evaluated.evaluation;
|
|
100
|
+
if (evaluation.compatibility.state === 'incomparable')
|
|
101
|
+
return { ok: false, reason: 'incomparable', error: 'approved reference and baseline observation are incomparable' };
|
|
102
|
+
const byRegion = new Map(evaluation.bindings.map((binding) => [binding.referenceRegion.toLowerCase(), binding]));
|
|
103
|
+
for (const region of requiredRegions(reference)) {
|
|
104
|
+
const binding = byRegion.get(region.toLowerCase());
|
|
105
|
+
if (binding === undefined)
|
|
106
|
+
return { ok: false, reason: 'binding-coverage-incomplete', error: `required reference region "${region}" has no workflow binding` };
|
|
107
|
+
if (binding.status !== 'bound')
|
|
108
|
+
return { ok: false, reason: 'binding-not-bound', error: `required reference region "${region}" is ${binding.status}` };
|
|
109
|
+
}
|
|
110
|
+
const annotationDecoded = decodeArtifactHandle(request.annotationHandle);
|
|
111
|
+
const referenceDecoded = decodeArtifactHandle(referenceHandle);
|
|
112
|
+
const annotationRoot = annotationDecoded.ok ? resolveContainedDir(root, annotationDecoded.relativeDir) : undefined;
|
|
113
|
+
const referenceRoot = referenceDecoded.ok ? resolveContainedDir(root, referenceDecoded.relativeDir) : undefined;
|
|
114
|
+
const annotationPath = annotationRoot === undefined ? undefined : relative(session.projectRoot, annotationRoot);
|
|
115
|
+
const referencePath = referenceRoot === undefined ? undefined : relative(session.projectRoot, referenceRoot);
|
|
116
|
+
if (annotationPath === undefined || referencePath === undefined)
|
|
117
|
+
return { ok: false, reason: 'scope-invalid', error: 'workflow evidence is outside the project' };
|
|
118
|
+
let baselineContract;
|
|
119
|
+
if (config.config.acceptance.contract !== undefined) {
|
|
120
|
+
const configured = config.config.acceptance.contract.baselineArtifact;
|
|
121
|
+
const resolved = resolveContainedAcceptancePath(session.projectRoot, configured);
|
|
122
|
+
const read = resolved.ok ? await readPersistentBaselineContract(path.join(resolved.path, 'manifest.json')) : undefined;
|
|
123
|
+
if (read === undefined || !read.ok)
|
|
124
|
+
return { ok: false, reason: 'baseline-contract-invalid', error: 'configured baseline contract is invalid' };
|
|
125
|
+
baselineContract = { artifactId: read.contract.baselineId, baselineId: read.contract.baselineId, artifactPath: configured };
|
|
126
|
+
}
|
|
127
|
+
const scope = { entryMode: 'reference', annotationId: annotationView.annotation.annotationId, annotationArtifactPath: annotationPath, baselineObservation: { artifactId: baseline.observationId, observationId: baseline.observationId, requestId: baseline.requestId, artifactPath: baselinePath }, ...(baselineContract === undefined ? {} : { baselineContract }), approvedReference: { artifactId: reference.referenceId, referenceId: reference.referenceId, referenceRequestId: reference.referenceRequestId, artifactPath: referencePath }, bindings: request.bindings };
|
|
128
|
+
const workflow = await createProjectVisualChangeWorkflow({ projectRoot: session.projectRoot, scope });
|
|
129
|
+
if (!workflow.ok)
|
|
130
|
+
return { ok: false, reason: 'workflow-persistence-failed', error: 'reason' in workflow ? workflow.reason : workflow.diagnostics.map((item) => item.message).join('; ') };
|
|
131
|
+
return { ok: true, visualChangeRequestId: workflow.visualChangeRequestId, visualChangeWorkflowId: workflow.visualChangeWorkflowId, referenceId: reference.referenceId, referenceRequestId: reference.referenceRequestId, bindingCount: request.bindings.length };
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=referenceVisualChangeAuthoring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"referenceVisualChangeAuthoring.js","sourceRoot":"","sources":["../../src/viewerServer/referenceVisualChangeAuthoring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { promoteVisualAnnotationContract } from '../application/visualAnnotationContractPromotionService.js';
|
|
2
|
+
import { createProjectVisualChangeWorkflow } from '../application/visualChangeProjectWorkflowService.js';
|
|
3
|
+
import type { ViewerAuthoringSession } from './authoringSecurity.js';
|
|
4
|
+
export interface StartRuntimeVisualChangeRequest {
|
|
5
|
+
itemIds: string[];
|
|
6
|
+
}
|
|
7
|
+
export type StartRuntimeVisualChangeFailureReason = 'unknown-annotation-handle' | 'not-an-annotation' | 'reference-annotation' | 'source-unavailable' | 'source-mismatch' | 'project-config-invalid' | 'contract-not-configured' | 'configured-baseline-invalid' | 'baseline-alias-missing' | 'invalid-selection' | 'contract-persistence-failed' | 'workflow-persistence-failed';
|
|
8
|
+
export type StartRuntimeVisualChangeResult = {
|
|
9
|
+
ok: true;
|
|
10
|
+
contractId: string;
|
|
11
|
+
contractRequestId: string;
|
|
12
|
+
clauseCount: number;
|
|
13
|
+
visualChangeRequestId: string;
|
|
14
|
+
visualChangeWorkflowId: string;
|
|
15
|
+
} | {
|
|
16
|
+
ok: false;
|
|
17
|
+
reason: StartRuntimeVisualChangeFailureReason;
|
|
18
|
+
error: string;
|
|
19
|
+
contractId?: string;
|
|
20
|
+
contractRequestId?: string;
|
|
21
|
+
};
|
|
22
|
+
export interface RuntimeVisualChangeDependencies {
|
|
23
|
+
promote: typeof promoteVisualAnnotationContract;
|
|
24
|
+
create: typeof createProjectVisualChangeWorkflow;
|
|
25
|
+
}
|
|
26
|
+
export declare function parseStartRuntimeVisualChangeRequest(value: unknown): {
|
|
27
|
+
ok: true;
|
|
28
|
+
request: StartRuntimeVisualChangeRequest;
|
|
29
|
+
} | {
|
|
30
|
+
ok: false;
|
|
31
|
+
error: string;
|
|
32
|
+
};
|
|
33
|
+
export declare function startRuntimeVisualChangeFromViewer(root: string, session: ViewerAuthoringSession, annotationHandle: string, request: StartRuntimeVisualChangeRequest, dependencies?: RuntimeVisualChangeDependencies): Promise<StartRuntimeVisualChangeResult>;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { readProjectConfig } from '../projectWorkflow/projectConfig.js';
|
|
3
|
+
import { aliasCatalogPath, contractOutputLocation, projectConfigPath, projectEvidenceRoot } from '../projectWorkflow/projectPaths.js';
|
|
4
|
+
import { readAliasCatalog } from '../projectWorkflow/aliasCatalog.js';
|
|
5
|
+
import { resolveContainedAcceptancePath } from '../projectWorkflow/checkAcceptance.js';
|
|
6
|
+
import { readPersistentBaselineContract } from '../artifacts/frontendContractArtifactReader.js';
|
|
7
|
+
import { promoteVisualAnnotationContract } from '../application/visualAnnotationContractPromotionService.js';
|
|
8
|
+
import { createProjectVisualChangeWorkflow } from '../application/visualChangeProjectWorkflowService.js';
|
|
9
|
+
import { getAnnotationView } from './evidence/annotationView.js';
|
|
10
|
+
import { loadArtifactByHandle } from './evidence/index.js';
|
|
11
|
+
import { decodeArtifactHandle } from './evidence/handles.js';
|
|
12
|
+
import { resolveContainedDir } from './evidence/pathSafety.js';
|
|
13
|
+
import { parseAuthoringItemIds, runSerializedAuthoringWrite } from './annotationAuthoring.js';
|
|
14
|
+
const DEFAULT_DEPENDENCIES = { promote: promoteVisualAnnotationContract, create: createProjectVisualChangeWorkflow };
|
|
15
|
+
export function parseStartRuntimeVisualChangeRequest(value) {
|
|
16
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
17
|
+
return { ok: false, error: 'request body must be a JSON object' };
|
|
18
|
+
const record = value;
|
|
19
|
+
if (Object.keys(record).some((key) => key !== 'itemIds'))
|
|
20
|
+
return { ok: false, error: 'request body must contain only itemIds' };
|
|
21
|
+
const parsed = parseAuthoringItemIds(record.itemIds);
|
|
22
|
+
return parsed.ok ? { ok: true, request: { itemIds: parsed.itemIds } } : parsed;
|
|
23
|
+
}
|
|
24
|
+
function portableRelative(projectRoot, absoluteDir) {
|
|
25
|
+
const relative = path.relative(projectRoot, absoluteDir).split(path.sep).join('/');
|
|
26
|
+
return relative.length > 0 && !relative.startsWith('../') && !path.posix.isAbsolute(relative) ? relative : undefined;
|
|
27
|
+
}
|
|
28
|
+
export function startRuntimeVisualChangeFromViewer(root, session, annotationHandle, request, dependencies = DEFAULT_DEPENDENCIES) {
|
|
29
|
+
return runSerializedAuthoringWrite(session, () => performStart(root, session, annotationHandle, request, dependencies));
|
|
30
|
+
}
|
|
31
|
+
async function performStart(root, session, annotationHandle, request, dependencies) {
|
|
32
|
+
const view = await getAnnotationView(root, annotationHandle);
|
|
33
|
+
if (!view.ok)
|
|
34
|
+
return { ok: false, reason: view.reason === 'unknown-handle' ? 'unknown-annotation-handle' : 'not-an-annotation', error: view.reason === 'unknown-handle' ? 'unknown annotation handle' : 'the handle does not name a supported visual annotation' };
|
|
35
|
+
const { annotation, source } = view;
|
|
36
|
+
if (annotation.source.kind !== 'runtime-observation')
|
|
37
|
+
return { ok: false, reason: 'reference-annotation', error: 'actual-frontend visual changes require a runtime-observation annotation' };
|
|
38
|
+
if (source.status !== 'available' || source.family !== 'observation')
|
|
39
|
+
return { ok: false, reason: 'source-unavailable', error: 'the exact annotation source observation is unavailable' };
|
|
40
|
+
const loaded = await loadArtifactByHandle(root, source.handle);
|
|
41
|
+
if (!loaded.ok || loaded.detail.family !== 'observation')
|
|
42
|
+
return { ok: false, reason: 'source-unavailable', error: 'the exact annotation source observation is no longer loadable' };
|
|
43
|
+
const observation = loaded.detail.artifact;
|
|
44
|
+
const annotationDecoded = decodeArtifactHandle(annotationHandle);
|
|
45
|
+
const sourceDecoded = decodeArtifactHandle(source.handle);
|
|
46
|
+
const annotationDir = annotationDecoded.ok ? resolveContainedDir(root, annotationDecoded.relativeDir) : undefined;
|
|
47
|
+
const observationDir = sourceDecoded.ok ? resolveContainedDir(root, sourceDecoded.relativeDir) : undefined;
|
|
48
|
+
const annotationPath = annotationDir === undefined ? undefined : portableRelative(session.projectRoot, annotationDir);
|
|
49
|
+
const observationPath = observationDir === undefined ? undefined : portableRelative(session.projectRoot, observationDir);
|
|
50
|
+
if (annotationPath === undefined || observationPath === undefined || observationDir === undefined)
|
|
51
|
+
return { ok: false, reason: 'source-mismatch', error: 'annotation or source observation is outside the project' };
|
|
52
|
+
const config = await readProjectConfig(projectConfigPath(session.projectRoot));
|
|
53
|
+
if (!config.ok)
|
|
54
|
+
return { ok: false, reason: 'project-config-invalid', error: 'the project configuration is invalid' };
|
|
55
|
+
const acceptance = config.config.acceptance?.contract;
|
|
56
|
+
if (acceptance === undefined)
|
|
57
|
+
return { ok: false, reason: 'contract-not-configured', error: 'project contract acceptance must be configured' };
|
|
58
|
+
const baselineRoot = resolveContainedAcceptancePath(session.projectRoot, acceptance.baselineArtifact);
|
|
59
|
+
if (!baselineRoot.ok)
|
|
60
|
+
return { ok: false, reason: 'configured-baseline-invalid', error: 'the configured baseline contract path is missing or outside the project' };
|
|
61
|
+
const baseline = await readPersistentBaselineContract(path.join(baselineRoot.path, 'manifest.json'));
|
|
62
|
+
if (!baseline.ok)
|
|
63
|
+
return { ok: false, reason: 'configured-baseline-invalid', error: 'the configured baseline contract is missing or invalid' };
|
|
64
|
+
const catalog = await readAliasCatalog(aliasCatalogPath(session.projectRoot));
|
|
65
|
+
const expectedRelative = path.relative(projectEvidenceRoot(session.projectRoot), observationDir).split(path.sep).join('/');
|
|
66
|
+
const exactAlias = catalog.ok && Object.values(catalog.catalog.observations).some((record) => record.observationId === observation.observationId && record.requestId === observation.requestId && record.relativeArtifactDir === expectedRelative);
|
|
67
|
+
if (!exactAlias)
|
|
68
|
+
return { ok: false, reason: 'baseline-alias-missing', error: 'the source observation has no exact current project alias' };
|
|
69
|
+
const promoted = await dependencies.promote({ annotation, sourceObservation: observation, selectedItemIds: request.itemIds, activeBaselineIds: [baseline.contract.baselineId], outputLocation: contractOutputLocation(), cwd: session.projectRoot });
|
|
70
|
+
if (!promoted.ok)
|
|
71
|
+
return { ok: false, reason: promoted.code === 'persistence-failed' ? 'contract-persistence-failed' : promoted.code === 'invalid-selection' ? 'invalid-selection' : 'source-mismatch', error: promoted.reason };
|
|
72
|
+
const changePath = portableRelative(session.projectRoot, promoted.artifactRoot);
|
|
73
|
+
if (changePath === undefined)
|
|
74
|
+
return { ok: false, reason: 'workflow-persistence-failed', error: 'the change contract was persisted, but its project-relative location could not be established', contractId: promoted.contractId, contractRequestId: promoted.contractRequestId };
|
|
75
|
+
const scope = { entryMode: 'actual-frontend', annotationId: annotation.annotationId, annotationArtifactPath: annotationPath, baselineObservation: { artifactId: observation.observationId, observationId: observation.observationId, requestId: observation.requestId, artifactPath: observationPath }, baselineContract: { artifactId: baseline.contract.baselineId, baselineId: baseline.contract.baselineId, artifactPath: acceptance.baselineArtifact }, changeContract: { artifactId: promoted.contractId, contractId: promoted.contractId, contractRequestId: promoted.contractRequestId, artifactPath: changePath } };
|
|
76
|
+
const workflow = await dependencies.create({ projectRoot: session.projectRoot, scope });
|
|
77
|
+
if (!workflow.ok)
|
|
78
|
+
return { ok: false, reason: 'workflow-persistence-failed', error: 'the change contract was persisted, but the visual-change workflow was not created', contractId: promoted.contractId, contractRequestId: promoted.contractRequestId };
|
|
79
|
+
return { ok: true, contractId: promoted.contractId, contractRequestId: promoted.contractRequestId, clauseCount: promoted.clauseCount, visualChangeRequestId: workflow.visualChangeRequestId, visualChangeWorkflowId: workflow.visualChangeWorkflowId };
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=runtimeVisualChangeAuthoring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimeVisualChangeAuthoring.js","sourceRoot":"","sources":["../../src/viewerServer/runtimeVisualChangeAuthoring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { VisualChangeScope } from '../domain/visualChangeWorkflow.js';
|
|
2
|
+
import type { VisualChangeProjectWorkflowFailureCode } from '../application/visualChangeProjectWorkflowService.js';
|
|
3
|
+
import type { ViewerAuthoringSession } from './authoringSecurity.js';
|
|
4
|
+
export declare const VISUAL_CHANGE_FAILURE_STATUS: Record<VisualChangeProjectWorkflowFailureCode, number>;
|
|
5
|
+
export type ResolveVisualChangeTargetResult = {
|
|
6
|
+
ok: true;
|
|
7
|
+
workflowManifestPath: string;
|
|
8
|
+
} | {
|
|
9
|
+
ok: false;
|
|
10
|
+
status: 404 | 409;
|
|
11
|
+
error: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function resolveVisualChangeTarget(root: string, handle: string): Promise<ResolveVisualChangeTargetResult>;
|
|
14
|
+
export declare function parseCreateVisualChangeRequest(value: unknown): {
|
|
15
|
+
ok: true;
|
|
16
|
+
scope: VisualChangeScope;
|
|
17
|
+
} | {
|
|
18
|
+
ok: false;
|
|
19
|
+
error: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function parseEmptyVisualChangeRequest(value: unknown): {
|
|
22
|
+
ok: true;
|
|
23
|
+
} | {
|
|
24
|
+
ok: false;
|
|
25
|
+
error: string;
|
|
26
|
+
};
|
|
27
|
+
export type VisualChangeViewerResult = {
|
|
28
|
+
ok: true;
|
|
29
|
+
status: 200 | 201;
|
|
30
|
+
body: Record<string, unknown>;
|
|
31
|
+
} | {
|
|
32
|
+
ok: false;
|
|
33
|
+
status: number;
|
|
34
|
+
body: {
|
|
35
|
+
ok: false;
|
|
36
|
+
code: VisualChangeProjectWorkflowFailureCode;
|
|
37
|
+
error: string;
|
|
38
|
+
check?: unknown;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
export declare function createVisualChangeFromViewer(session: ViewerAuthoringSession, scope: VisualChangeScope): Promise<VisualChangeViewerResult>;
|
|
42
|
+
export declare function mutateVisualChangeFromViewer(root: string, session: ViewerAuthoringSession, handle: string, operation: 'activate' | 'check' | 'restore'): Promise<VisualChangeViewerResult | {
|
|
43
|
+
ok: false;
|
|
44
|
+
status: 404 | 409;
|
|
45
|
+
error: string;
|
|
46
|
+
}>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { getProducerInfo } from '../domain/schema.js';
|
|
3
|
+
import { VISUAL_CHANGE_WORKFLOW_ARTIFACT_KIND, VISUAL_CHANGE_WORKFLOW_SCHEMA_VERSION, isValidVisualChangeWorkflowArtifact } from '../domain/visualChangeWorkflow.js';
|
|
4
|
+
import { activateProjectVisualChangeWorkflow, createProjectVisualChangeWorkflow, restoreProjectVisualChangeWorkflowAcceptance, runProjectVisualChangeCheck } from '../application/visualChangeProjectWorkflowService.js';
|
|
5
|
+
import { decodeArtifactHandle } from './evidence/handles.js';
|
|
6
|
+
import { loadArtifactByHandle } from './evidence/index.js';
|
|
7
|
+
import { resolveContainedDir } from './evidence/pathSafety.js';
|
|
8
|
+
export const VISUAL_CHANGE_FAILURE_STATUS = {
|
|
9
|
+
'activation-not-configured': 409, 'activation-already-restored': 409, 'baseline-drift': 409, 'acceptance-drift': 409,
|
|
10
|
+
'check-scope-mismatch': 409, 'candidate-not-produced': 409, 'duplicate-attempt': 409, 'attempt-limit-reached': 409, 'project-config-invalid': 409,
|
|
11
|
+
'workflow-invalid': 422, 'workflow-reference-invalid': 422,
|
|
12
|
+
'project-config-write-failure': 500, 'workflow-persistence-failure': 500, 'partial-state-failure': 500,
|
|
13
|
+
'review-required': 409, 'workflow-accepted': 409, 'workflow-abandoned': 409,
|
|
14
|
+
};
|
|
15
|
+
export async function resolveVisualChangeTarget(root, handle) {
|
|
16
|
+
const loaded = await loadArtifactByHandle(root, handle);
|
|
17
|
+
if (!loaded.ok)
|
|
18
|
+
return loaded.reason === 'unknown-handle' ? { ok: false, status: 404, error: 'unknown viewer artifact handle' } : { ok: false, status: 409, error: 'workflow target is not currently supported' };
|
|
19
|
+
if (loaded.detail.family !== 'visual-change-workflow')
|
|
20
|
+
return { ok: false, status: 409, error: 'handle does not name a visual-change workflow' };
|
|
21
|
+
const decoded = decodeArtifactHandle(handle);
|
|
22
|
+
const directory = decoded.ok ? resolveContainedDir(root, decoded.relativeDir) : undefined;
|
|
23
|
+
return directory === undefined ? { ok: false, status: 404, error: 'unknown viewer artifact handle' } : { ok: true, workflowManifestPath: path.join(directory, 'manifest.json') };
|
|
24
|
+
}
|
|
25
|
+
export function parseCreateVisualChangeRequest(value) {
|
|
26
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
27
|
+
return { ok: false, error: 'request body must be a JSON object' };
|
|
28
|
+
const record = value;
|
|
29
|
+
const keys = Object.keys(record);
|
|
30
|
+
if (keys.length !== 1 || keys[0] !== 'scope')
|
|
31
|
+
return { ok: false, error: 'request body must contain exactly scope' };
|
|
32
|
+
const candidate = { artifactKind: VISUAL_CHANGE_WORKFLOW_ARTIFACT_KIND, schemaVersion: VISUAL_CHANGE_WORKFLOW_SCHEMA_VERSION, visualChangeRequestId: 'request', visualChangeWorkflowId: 'workflow', producer: getProducerInfo(), scope: record.scope, attempts: [], ...(record.scope?.entryMode === 'reference' ? { bindings: { path: 'bindings.json', sha256: '0'.repeat(64), declarationCount: Array.isArray(record.scope.bindings) ? record.scope.bindings.length : 0 } } : {}), provenance: { createdAt: 'validation' } };
|
|
33
|
+
const valid = isValidVisualChangeWorkflowArtifact(candidate);
|
|
34
|
+
return valid.valid ? { ok: true, scope: candidate.scope } : { ok: false, error: `scope is invalid: ${valid.reason}` };
|
|
35
|
+
}
|
|
36
|
+
export function parseEmptyVisualChangeRequest(value) {
|
|
37
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value) && Object.keys(value).length === 0 ? { ok: true } : { ok: false, error: 'request body must be an empty JSON object' };
|
|
38
|
+
}
|
|
39
|
+
function applicationFailure(result) { return { ok: false, status: VISUAL_CHANGE_FAILURE_STATUS[result.code], body: { ok: false, code: result.code, error: result.reason, ...(result.check === undefined ? {} : { check: result.check }) } }; }
|
|
40
|
+
const success = (status, result, extra = {}) => ({ ok: true, status, body: { ok: true, visualChangeRequestId: result.visualChangeRequestId, visualChangeWorkflowId: result.visualChangeWorkflowId, ...extra } });
|
|
41
|
+
export async function createVisualChangeFromViewer(session, scope) {
|
|
42
|
+
const result = await createProjectVisualChangeWorkflow({ projectRoot: session.projectRoot, scope });
|
|
43
|
+
if (result.ok)
|
|
44
|
+
return success(201, result);
|
|
45
|
+
return 'code' in result ? applicationFailure(result) : { ok: false, status: 500, body: { ok: false, code: 'workflow-persistence-failure', error: 'visual-change workflow could not be persisted' } };
|
|
46
|
+
}
|
|
47
|
+
export async function mutateVisualChangeFromViewer(root, session, handle, operation) {
|
|
48
|
+
const target = await resolveVisualChangeTarget(root, handle);
|
|
49
|
+
if (!target.ok)
|
|
50
|
+
return { ok: false, status: target.status, error: target.error };
|
|
51
|
+
const workflowManifestPath = path.relative(session.projectRoot, target.workflowManifestPath).split(path.sep).join('/');
|
|
52
|
+
if (operation === 'activate') {
|
|
53
|
+
const result = await activateProjectVisualChangeWorkflow({ projectRoot: session.projectRoot, workflowManifestPath });
|
|
54
|
+
return result.ok ? success(200, result) : applicationFailure(result);
|
|
55
|
+
}
|
|
56
|
+
if (operation === 'restore') {
|
|
57
|
+
const result = await restoreProjectVisualChangeWorkflowAcceptance({ projectRoot: session.projectRoot, workflowManifestPath });
|
|
58
|
+
return result.ok ? success(200, result) : applicationFailure(result);
|
|
59
|
+
}
|
|
60
|
+
const result = await runProjectVisualChangeCheck({ projectRoot: session.projectRoot, workflowManifestPath });
|
|
61
|
+
return result.ok ? success(200, result, { attempt: result.attempt, check: result.check }) : applicationFailure(result);
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=visualChangeAuthoring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visualChangeAuthoring.js","sourceRoot":"","sources":["../../src/viewerServer/visualChangeAuthoring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { VisualChangeAgentHandoff, VisualChangeExternalCoordination } from '../domain/visualChangeAgentHandoff.js';
|
|
2
|
+
import { type PrepareVisualChangeAgentHandoffFailureCode } from '../application/visualChangeAgentHandoffService.js';
|
|
3
|
+
import type { ContextSessionState } from './context.js';
|
|
4
|
+
import type { ViewerAuthoringSession } from './authoringSecurity.js';
|
|
5
|
+
export interface PrepareVisualChangeHandoffRequest {
|
|
6
|
+
coordination?: VisualChangeExternalCoordination;
|
|
7
|
+
}
|
|
8
|
+
export declare function parsePrepareVisualChangeHandoffRequest(value: unknown): {
|
|
9
|
+
ok: true;
|
|
10
|
+
request: PrepareVisualChangeHandoffRequest;
|
|
11
|
+
} | {
|
|
12
|
+
ok: false;
|
|
13
|
+
error: string;
|
|
14
|
+
};
|
|
15
|
+
export type PrepareVisualChangeHandoffFromViewerResult = {
|
|
16
|
+
ok: true;
|
|
17
|
+
handoff: VisualChangeAgentHandoff;
|
|
18
|
+
} | {
|
|
19
|
+
ok: false;
|
|
20
|
+
code: 'unknown-handle' | 'wrong-family' | PrepareVisualChangeAgentHandoffFailureCode;
|
|
21
|
+
error: string;
|
|
22
|
+
};
|
|
23
|
+
export declare function prepareVisualChangeHandoffFromViewer(root: string, session: ViewerAuthoringSession, context: ContextSessionState, handle: string, request: PrepareVisualChangeHandoffRequest): Promise<PrepareVisualChangeHandoffFromViewerResult>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { getProducerInfo } from '../domain/schema.js';
|
|
3
|
+
import { isValidVisualChangeExternalCoordination } from '../domain/visualChangeAgentHandoff.js';
|
|
4
|
+
import { prepareVisualChangeAgentHandoff } from '../application/visualChangeAgentHandoffService.js';
|
|
5
|
+
import { decodeArtifactHandle } from './evidence/handles.js';
|
|
6
|
+
import { loadArtifactByHandle } from './evidence/index.js';
|
|
7
|
+
export function parsePrepareVisualChangeHandoffRequest(value) {
|
|
8
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
9
|
+
return { ok: false, error: 'request body must be a JSON object' };
|
|
10
|
+
const record = value;
|
|
11
|
+
if (Object.keys(record).some((key) => key !== 'coordination'))
|
|
12
|
+
return { ok: false, error: 'request body may contain only coordination' };
|
|
13
|
+
if (record.coordination !== undefined && !isValidVisualChangeExternalCoordination(record.coordination))
|
|
14
|
+
return { ok: false, error: 'coordination must be a valid my-dev-kit-orchestrator run reference' };
|
|
15
|
+
return { ok: true, request: record.coordination === undefined ? {} : { coordination: record.coordination } };
|
|
16
|
+
}
|
|
17
|
+
export async function prepareVisualChangeHandoffFromViewer(root, session, context, handle, request) {
|
|
18
|
+
const loaded = await loadArtifactByHandle(root, handle);
|
|
19
|
+
if (!loaded.ok)
|
|
20
|
+
return { ok: false, code: 'unknown-handle', error: 'unknown workflow handle' };
|
|
21
|
+
if (loaded.detail.family !== 'visual-change-workflow')
|
|
22
|
+
return { ok: false, code: 'wrong-family', error: 'prepare-handoff is only available for visual-change workflows' };
|
|
23
|
+
const decoded = decodeArtifactHandle(handle);
|
|
24
|
+
if (!decoded.ok)
|
|
25
|
+
return { ok: false, code: 'unknown-handle', error: 'unknown workflow handle' };
|
|
26
|
+
const workflowManifestPath = path.relative(session.projectRoot, path.join(root, ...decoded.relativeDir.split('/'), 'manifest.json')).split(path.sep).join('/');
|
|
27
|
+
const producer = getProducerInfo();
|
|
28
|
+
const result = await prepareVisualChangeAgentHandoff({ projectRoot: session.projectRoot, workflowManifestPath, context, generatedAt: new Date().toISOString(), producerVersion: producer.version, ...request });
|
|
29
|
+
return result.ok ? result : { ok: false, code: result.code, error: result.reason };
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=visualChangeHandoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visualChangeHandoff.js","sourceRoot":"","sources":["../../src/viewerServer/visualChangeHandoff.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,uCAAuC,EAAE,MAAM,uCAAuC,CAAC;AAChG,OAAO,EAAE,+BAA+B,EAAmD,MAAM,mDAAmD,CAAC;AAErJ,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAI3D,MAAM,UAAU,sCAAsC,CAAC,KAAc;IACnE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC;IAC3I,MAAM,MAAM,GAAG,KAAgC,CAAC;IAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,cAAc,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,4CAA4C,EAAE,CAAC;IAC1L,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,uCAAuC,CAAC,MAAM,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oEAAoE,EAAE,CAAC;IAC1M,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC;AAC/G,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,oCAAoC,CAAC,IAAY,EAAE,OAA+B,EAAE,OAA4B,EAAE,MAAc,EAAE,OAA0C;IAChM,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;IACxJ,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,wBAAwB;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,+DAA+D,EAAE,CAAC;IAC1K,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAAC,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;IAC9I,MAAM,oBAAoB,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/J,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,+BAA+B,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,oBAAoB,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,eAAe,EAAE,QAAQ,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAChN,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACrF,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type VisualChangeReviewDecision } from '../application/visualChangeReviewService.js';
|
|
2
|
+
import type { ViewerAuthoringSession } from './authoringSecurity.js';
|
|
3
|
+
export declare function parseVisualChangeReviewRequest(value: unknown): {
|
|
4
|
+
ok: true;
|
|
5
|
+
decision: VisualChangeReviewDecision;
|
|
6
|
+
} | {
|
|
7
|
+
ok: false;
|
|
8
|
+
error: string;
|
|
9
|
+
};
|
|
10
|
+
export type GovernanceRequest = {
|
|
11
|
+
kind: 'baseline-approval' | 'external-reference-approval';
|
|
12
|
+
approvalHandle: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function parseVisualChangeGovernanceRequest(value: unknown): {
|
|
15
|
+
ok: true;
|
|
16
|
+
request: GovernanceRequest;
|
|
17
|
+
} | {
|
|
18
|
+
ok: false;
|
|
19
|
+
error: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function reviewVisualChangeFromViewer(root: string, session: ViewerAuthoringSession, handle: string, decision: VisualChangeReviewDecision): Promise<{
|
|
22
|
+
ok: false;
|
|
23
|
+
status: 404 | 409;
|
|
24
|
+
error: string;
|
|
25
|
+
} | import("../application/visualChangeReviewService.js").VisualChangeReviewResult>;
|
|
26
|
+
export declare function recordVisualChangeGovernanceFromViewer(root: string, session: ViewerAuthoringSession, handle: string, request: GovernanceRequest): Promise<{
|
|
27
|
+
ok: false;
|
|
28
|
+
status: 404 | 409;
|
|
29
|
+
error: string;
|
|
30
|
+
} | import("../application/visualChangeReviewService.js").VisualChangeGovernanceResult>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { recordVisualChangeGovernance, reviewVisualChangeWorkflow } from '../application/visualChangeReviewService.js';
|
|
3
|
+
import { decodeArtifactHandle } from './evidence/handles.js';
|
|
4
|
+
import { loadArtifactByHandle } from './evidence/index.js';
|
|
5
|
+
import { resolveContainedDir } from './evidence/pathSafety.js';
|
|
6
|
+
import { resolveVisualChangeTarget } from './visualChangeAuthoring.js';
|
|
7
|
+
export function parseVisualChangeReviewRequest(value) {
|
|
8
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value) || Object.keys(value).length !== 1 || !('decision' in value) || !['correction-requested', 'accepted', 'abandoned'].includes(String(value.decision)))
|
|
9
|
+
return { ok: false, error: 'request body must contain exactly one valid decision' };
|
|
10
|
+
return { ok: true, decision: value.decision };
|
|
11
|
+
}
|
|
12
|
+
export function parseVisualChangeGovernanceRequest(value) {
|
|
13
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value) || Object.keys(value).length !== 2)
|
|
14
|
+
return { ok: false, error: 'request body must contain exactly kind and approvalHandle' };
|
|
15
|
+
const record = value;
|
|
16
|
+
if (!['baseline-approval', 'external-reference-approval'].includes(String(record.kind)) || typeof record.approvalHandle !== 'string' || record.approvalHandle.length === 0)
|
|
17
|
+
return { ok: false, error: 'invalid governance request' };
|
|
18
|
+
return { ok: true, request: record };
|
|
19
|
+
}
|
|
20
|
+
export async function reviewVisualChangeFromViewer(root, session, handle, decision) {
|
|
21
|
+
const target = await resolveVisualChangeTarget(root, handle);
|
|
22
|
+
if (!target.ok)
|
|
23
|
+
return target;
|
|
24
|
+
const workflowManifestPath = path.relative(session.projectRoot, target.workflowManifestPath).split(path.sep).join('/');
|
|
25
|
+
return reviewVisualChangeWorkflow({ projectRoot: session.projectRoot, workflowManifestPath, decision });
|
|
26
|
+
}
|
|
27
|
+
export async function recordVisualChangeGovernanceFromViewer(root, session, handle, request) {
|
|
28
|
+
const target = await resolveVisualChangeTarget(root, handle);
|
|
29
|
+
if (!target.ok)
|
|
30
|
+
return target;
|
|
31
|
+
const approval = await loadArtifactByHandle(root, request.approvalHandle);
|
|
32
|
+
if (!approval.ok)
|
|
33
|
+
return { ok: false, status: approval.reason === 'unknown-handle' ? 404 : 409, error: 'approval handle is not supported' };
|
|
34
|
+
const expected = request.kind === 'baseline-approval' ? 'baseline-contract' : 'external-reference-approved';
|
|
35
|
+
if (approval.detail.family !== expected)
|
|
36
|
+
return { ok: false, status: 409, error: `approval handle must identify ${expected}` };
|
|
37
|
+
const decoded = decodeArtifactHandle(request.approvalHandle);
|
|
38
|
+
const directory = decoded.ok ? resolveContainedDir(root, decoded.relativeDir) : undefined;
|
|
39
|
+
if (directory === undefined)
|
|
40
|
+
return { ok: false, status: 404, error: 'unknown approval handle' };
|
|
41
|
+
const artifactPath = path.relative(session.projectRoot, directory).split(path.sep).join('/');
|
|
42
|
+
const workflowManifestPath = path.relative(session.projectRoot, target.workflowManifestPath).split(path.sep).join('/');
|
|
43
|
+
const governance = request.kind === 'baseline-approval' ? { kind: request.kind, artifact: approval.detail.artifact, artifactPath } : { kind: request.kind, artifact: approval.detail.artifact, artifactPath };
|
|
44
|
+
return recordVisualChangeGovernance({ projectRoot: session.projectRoot, workflowManifestPath, governance });
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=visualChangeReview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visualChangeReview.js","sourceRoot":"","sources":["../../src/viewerServer/visualChangeReview.ts"],"names":[],"mappings":"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"}
|