COVERCANVAS LIVE ADAPTER AND FINALISATION MAP
============================================================================
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 } = {}) {
00010: const activeLayers = (layers || []).filter(l => l.visible);
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',
...
00153: validateCoverVariant: payload => simulated('validate_cover_variant', {
00154: variant_id: payload?.variantId || null,
00155: real: false
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/storageAdapter.js
----------------------------------------------------------------------------
00001: // SHiREVault storage adapter.
00002: // Final LimbForge projects must use the SHiREVault network drive at /SHiRELimbs.
00003: // During the Base44 MVP, Base44-hosted files are temporary prototype storage only.
00004:
00005: const verify = settings => ({
00006: mounted: settings?.shireVaultStatus === 'connected',
00007: writable: settings?.shireVaultWritable === true,
00008: pathValid: settings?.shireVaultPath === '/SHiRELimbs'
00009: });
00010:
00011: export const storageAdapter = {
00012: prototypeLabel: 'Temporary Base44 prototype storage — not SHiREVault',
00013: requiredRoot: '/SHiRELimbs',
00014: verifyFinalStorage: verify,
00015: canFinalize: settings => {
00016: const v = verify(settings);
00017: return v.mounted && v.writable && v.pathValid;
00018: }
00019: };
FILE: /home/shire3d/ARMOR/agents/apps/covercanvas/src/pages/Settings.jsx
----------------------------------------------------------------------------
00005: import PageHeader from '@/components/app/PageHeader';
00006: import StatusBadge from '@/components/app/StatusBadge';
00007: import { storageAdapter } from '@/lib/storageAdapter';
00008:
00009: const defaults = {
00010: geometryServiceUrl: 'https://geometry.shire.example/v1', geometryServiceAuth: 'none', healthCheckEndpoint: '/health',
00011: maxUploadSize: 50, defaultEmbossHeight: 1.2, defaultEngravingDepth: 0.8, minimumFeatureSize: 0.6, minimumWallThickness: 2,
00012: geometryServiceStatus: 'simulation_only', shireVaultStatus: 'not_connected', shireVaultPath: '/SHiRELimbs', shireVaultWritable: false,
00013: aiConceptServiceUrl: 'built-in InvokeLLM', defaultStorageType: 'prototype', allowedFileFormats: ['stl', 'obj', 'glb', 'png', 'jpg', 'jpeg', 'webp', 'svg']
00014: };
00015:
00016: export default function Settings() {
00017: const [s, setS] = useState(defaults);
00018: const [id, setId] = useState(null);
00019: const [saved, setSaved] = useState(false);
00020: const { mode, setMode } = useExperienceMode();
00021: const [user, setUser] = useState(null);
00022:
00023: useEffect(() => {
...
00040: };
00041: const v = storageAdapter.verifyFinalStorage(s);
00042:
00043: return (
00044: <>
00045: Experience
00048:
Final processing and export are blocked. Temporary Base44 files are prototype storage only; there is no local final-output fallback.
} 00084:PromptForge concept text uses the built-in InvokeLLM integration; preview images use GenerateImage (integration credits).
00089:{j.id.slice(0, 12)}
00080:Operation: {j.jobType?.replaceAll('_', ' ')}
00084:Engine: {j.simulation ? 'simulation' : 'live'}
00085:{overall === 'READY FOR REAL 3D PROCESSING' ? 'Everything we can check in the browser looks good. Submit for real 3D processing to finish.' : 'Some checks need attention. Items marked Simulation require the real Geometry Engine.'}
00180:{f.what}
00204:{f.why}{c.note ? ` ${c.note}` : ''}
} 00207: {needsFix && ( 00208:Final geometry, printing and export are confirmed by the Geometry Engine and SHiRE storage — not by this preview.
00226:{c.name}
{c.note &&{c.note}
}