FILE: /home/shire3d/ARMOR/agents/apps/covercanvas/src/pages/Studio.jsx
00296:
00297: );
00298:
00299: return (
00300: <>
00301:
00302:
00303: {savedAt && Draft saved}
00304: {project?.hasUnsavedChanges && Unsaved changes from a previous session recovered.}
00305:
00306: {(loadError || opError) && (
00307:
00308: {loadError || opError}
FILE: /home/shire3d/ARMOR/agents/apps/covercanvas/src/lib/geometryService.js
00001: // GeometryService adapter — development mock.
00002: // Every mocked response includes simulation: true.
00003: // Never display "Print Ready", "Export Complete" or "Validated Geometry" from a simulated response.
00004:
00005: // Assemble the full LimbForge Geometry Engine request payload from project data.
00006: // Includes original + processed artwork, processing settings, layer transforms,
00007: // projection/application mode, emboss/engraving/relief/stencil settings, cover
00008: // model reference and all zone data.
00009: export function buildGeometryRequest({ project, cover, layers = [], assets = [], concept = null } = {}) {
...
00011: const assetFor = (l) => (assets || []).find(a => a.id === l?.artworkAssetId);
00012: const appMode = project?.applicationMode || 'colour_texture';
00013: const gs = project?.geometrySettings || {};
00014: return {
00015: project_id: project?.id || null,
00016: simulation: true,
00017: cover_model: {
00018: reference: cover?.sourceFile || null,
00019: id: cover?.id || null,
00020: name: cover?.name || null,
00021: limb_type: cover?.limbType || null,
00022: side: cover?.side || null,
00023: source_format: cover?.sourceFormat || null,
...
00079: }
00080:
00081: const simulated = (operation, extra = {}) =>
00082: new Promise(resolve => setTimeout(() => resolve({
00083: ok: true,
00084: simulation: true,
00085: operation,
00086: service_version: 'mock-0.1',
00087: ...extra
00088: }), 600));
00089:
00090: export const GeometryService = {
00091: buildGeometryRequest,
00092: checkHealth: () => simulated('health', { status: 'simulation_only', connected: false }),
00093: uploadCover: payload => simulated('upload_cover', { cover_reference: payload?.cover_model?.reference || payload?.sourceFile || null }),
00094: uploadArtwork: payload => simulated('upload_artwork', { artwork_reference: payload?.artwork?.original_reference || payload?.originalFile || null }),
00095: generatePromptConcepts: payload => simulated('prompt_concepts', { concepts: [], prompt: payload?.promptText || '' }),
00096: createProjectionPreview: payload => simulated('projection_preview', { projection: payload?.application_mode || payload?.projectionMode || 'planar', layers: payload?.layers?.length || 0, real: false }),
00097: generateEmboss: payload => simulated('emboss', { settings: payload?.emboss, real: false }),
00098: generateEngraving: payload => simulated('engraving', { settings: payload?.engraving, real: false }),
00099: generateRelief: payload => simulated('relief', { settings: payload?.relief, real: false }),
00100: generateStencil: payload => simulated('stencil', { settings: payload?.stencil, real: false }),
00101: validateGeometry: payload => simulated('validate_geometry', { request: !!payload, real: false }),
00102: exportCover: () => Promise.resolve({
00103: ok: false,
00104: simulation: true,
00105: blocked: true,
00106: error: 'Real geometry service and writable SHiREVault are required for export.'
00107: }),
00108: getJobStatus: id => simulated('job_status', { id, status: 'completed', progress: 100, real: false }),
00109:
00110: // --- Design-first (Universal Design → Cover Variant) adapter methods ---
00111: // All mocked with simulation: true. None of these unlock Real Geometry,
00112: // Validated, or Print Ready states.
00113:
00114: // Evaluate browser-available cover metadata for design compatibility.
00115: analyseCoverCompatibility: payload => simulated('analyse_cover_compatibility', {
00116: cover_id: payload?.coverModelId || payload?.cover?.id || null,
00117: design_id: payload?.universalDesignId || payload?.design?.id || null,
00118: level: 'requires_processing',
...
00156: }),
00157:
00158: // Export remains blocked until real geometry service + writable SHiREVault exist.
00159: exportCoverVariant: () => Promise.resolve({
00160: ok: false,
00161: simulation: true,
00162: blocked: true,
00163: error: 'Real geometry service and writable SHiREVault are required to export a cover variant.'
00164: })
00165: };
FILE: /home/shire3d/ARMOR/agents/apps/covercanvas/src/lib/adaptation.js
00158: movedRegions: adapted.filter(a => !a.focal).map(a => ({ layer: a.name })),
00159: protectedZoneWarnings,
00160: brandingStatus: safeArr(cover?.brandingZones).length ? 'preserved' : 'unverified',
00161: summary,
00162: details,
00163: simulation: true,
00164: note: 'Browser preview only. Final surface wrapping and print checks happen during 3D processing.'
00165: };
00166: }
00167:
00168: // Strategy options with friendly guided labels.
00169: export const GUIDED_STRATEGY_CHOICES = [
00170: ['best_fit', 'Recommended fit'],
FILE: /home/shire3d/ARMOR/agents/apps/covercanvas/src/components/canvas/FitPreview.jsx
00051: Anchor: U {adaptation.anchor.u.toFixed(2)} · V {adaptation.anchor.v.toFixed(2)}
00052: Decoration rect: {adaptation.decorationRect.x.toFixed(2)},{adaptation.decorationRect.y.toFixed(2)} {adaptation.decorationRect.w.toFixed(2)}×{adaptation.decorationRect.h.toFixed(2)}
00053: Preserve aspect: {String(adaptation.distortionReport.preserveAspect)}
00054: Max scale: {adaptation.distortionReport.maxScale}
00055: Adapted layers: {adaptation.adaptedLayers.length}
00056: Simulation: {String(adaptation.simulation)}
00057:
00058: )}
00059:
Simulation only — final curved-surface fitting requires the Geometry Engine.
00060: