From 12be86b5e69f7a49f8319fac339c81f8e1cb7f3d Mon Sep 17 00:00:00 2001 From: Till JS Date: Thu, 9 Apr 2026 11:56:51 +0200 Subject: [PATCH] chore: remove abandoned per-product workspace artifacts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three independent dead-code cleanups bundled together because they all touch dev scripts in the root package.json: 1. games/voxelava/ + games/worldream/ — orphaned game stubs ~5886 LOC of Svelte components, route handlers, and types with no root package.json in either directory, no CI references, no docker-compose entry, no mana-apps registry presence. The matching root scripts dev:worldream:web + worldream:dev pointed to a @worldream/web filter that doesn't exist as a workspace member. games/arcade and games/whopixels remain untouched. 2. apps/memoro/* — clean stale @memoro/web references apps/memoro/apps/web/ was removed during the consolidation; the memoro frontend now lives in apps/mana/apps/web/src/lib/modules/ memoro/. But several scripts still pointed at the deleted filter: - root: dev:memoro:web (deleted), dev:memoro:app + :full rewritten to drop the :web piece (server + audio-server only) - apps/memoro/package.json: dev:web removed, top-level dev script removed (filtered @memoro/* which would have hit the dead web filter) 3. apps/memoro/apps/server: declare @mana/notify-client dep src/lib/notify.ts:6 has been importing @mana/notify-client without declaring it in package.json — works by accident via hoisted node_modules in the workspace. Add the dep so the import is properly tracked. Found while verifying that notify-client (which has 0 declared consumers) was actually safe to keep. Tracked as items #18, #19, #29 in docs/REFACTORING_AUDIT_2026_04.md. Co-Authored-By: Claude Opus 4.6 (1M context) --- apps/memoro/apps/server/package.json | 1 + apps/memoro/package.json | 2 - .../src/lib/components/auth/Register.svelte | 268 ------ .../lib/components/auth/UserProfile.svelte | 517 ----------- .../apps/web/src/lib/types/level.types.ts | 83 -- .../web/src/lib/components/AiGenerator.svelte | 200 ---- .../lib/components/AiImageGenerator.svelte | 403 --------- .../lib/components/GlobalAiAuthorBar.svelte | 607 ------------- .../src/lib/components/ImageGallery.svelte | 222 ----- .../lib/components/ImageUploadModal.svelte | 319 ------- .../src/lib/components/ImageUploader.svelte | 141 --- .../web/src/lib/components/NodeDetail.svelte | 852 ------------------ .../src/lib/components/NodeEditForm.svelte | 389 -------- .../customFields/CustomDataForm.svelte | 520 ----------- .../customFields/CustomFieldsDisplay.svelte | 224 ----- .../src/lib/components/forms/NodeForm.svelte | 833 ----------------- .../apps/web/src/lib/types/content.ts | 210 ----- .../characters/[slug]/edit/+page.svelte | 98 -- package.json | 7 +- 19 files changed, 3 insertions(+), 5893 deletions(-) delete mode 100644 games/voxelava/apps/web/src/lib/components/auth/Register.svelte delete mode 100644 games/voxelava/apps/web/src/lib/components/auth/UserProfile.svelte delete mode 100644 games/voxelava/apps/web/src/lib/types/level.types.ts delete mode 100644 games/worldream/apps/web/src/lib/components/AiGenerator.svelte delete mode 100644 games/worldream/apps/web/src/lib/components/AiImageGenerator.svelte delete mode 100644 games/worldream/apps/web/src/lib/components/GlobalAiAuthorBar.svelte delete mode 100644 games/worldream/apps/web/src/lib/components/ImageGallery.svelte delete mode 100644 games/worldream/apps/web/src/lib/components/ImageUploadModal.svelte delete mode 100644 games/worldream/apps/web/src/lib/components/ImageUploader.svelte delete mode 100644 games/worldream/apps/web/src/lib/components/NodeDetail.svelte delete mode 100644 games/worldream/apps/web/src/lib/components/NodeEditForm.svelte delete mode 100644 games/worldream/apps/web/src/lib/components/customFields/CustomDataForm.svelte delete mode 100644 games/worldream/apps/web/src/lib/components/customFields/CustomFieldsDisplay.svelte delete mode 100644 games/worldream/apps/web/src/lib/components/forms/NodeForm.svelte delete mode 100644 games/worldream/apps/web/src/lib/types/content.ts delete mode 100644 games/worldream/apps/web/src/routes/worlds/[world]/characters/[slug]/edit/+page.svelte diff --git a/apps/memoro/apps/server/package.json b/apps/memoro/apps/server/package.json index a809712e0..1a0b197eb 100644 --- a/apps/memoro/apps/server/package.json +++ b/apps/memoro/apps/server/package.json @@ -8,6 +8,7 @@ "build": "bun build src/index.ts --outdir dist --target bun" }, "dependencies": { + "@mana/notify-client": "workspace:*", "@mana/shared-hono": "workspace:*", "@supabase/supabase-js": "^2.49.5", "hono": "^4.7.0", diff --git a/apps/memoro/package.json b/apps/memoro/package.json index f3acf3403..64e56e816 100644 --- a/apps/memoro/package.json +++ b/apps/memoro/package.json @@ -4,10 +4,8 @@ "private": true, "description": "Memoro - AI-powered voice recording & memo management", "scripts": { - "dev": "pnpm run --filter=@memoro/* --parallel dev", "dev:server": "cd apps/server && bun run --watch src/index.ts", "dev:audio-server": "cd apps/audio-server && bun run --watch src/index.ts", - "dev:web": "pnpm --filter @memoro/web dev", "dev:mobile": "pnpm --filter @memoro/mobile start", "dev:landing": "pnpm --filter @memoro/landing dev" }, diff --git a/games/voxelava/apps/web/src/lib/components/auth/Register.svelte b/games/voxelava/apps/web/src/lib/components/auth/Register.svelte deleted file mode 100644 index 0c73cf115..000000000 --- a/games/voxelava/apps/web/src/lib/components/auth/Register.svelte +++ /dev/null @@ -1,268 +0,0 @@ - - -
-

Registrieren

- - {#if errorMessage} -
- {errorMessage} -
- {/if} - - {#if successMessage} -
- {successMessage} -
- {/if} - -
-
- - -
- -
- - -
- -
- - -
- - -
- - -
- - diff --git a/games/voxelava/apps/web/src/lib/components/auth/UserProfile.svelte b/games/voxelava/apps/web/src/lib/components/auth/UserProfile.svelte deleted file mode 100644 index 2074f3d4e..000000000 --- a/games/voxelava/apps/web/src/lib/components/auth/UserProfile.svelte +++ /dev/null @@ -1,517 +0,0 @@ - - -
-

Dein Profil

- - {#if errorMessage} -
- {errorMessage} -
- {/if} - - {#if isLoading} -
Daten werden geladen...
- {:else if user} - - -
-

Deine Levels

- - {#if userLevels.length === 0} -
Du hast noch keine Levels erstellt.
- {:else} -
- {#each userLevels as level} -
-
-

{level.name}

-

{level.description || 'Keine Beschreibung'}

-
- - 👁️ - {level.playCount} - - - ❤️ - {level.likesCount} - - - 🏷️ - {level.difficulty || 'Normal'} - -
-
- -
- - - - - -
-
- {/each} -
- {/if} -
- {:else} -
- Du bist nicht angemeldet. Bitte melde dich an, um dein Profil zu sehen. -
- {/if} -
- - diff --git a/games/voxelava/apps/web/src/lib/types/level.types.ts b/games/voxelava/apps/web/src/lib/types/level.types.ts deleted file mode 100644 index 0d9c01994..000000000 --- a/games/voxelava/apps/web/src/lib/types/level.types.ts +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Repräsentiert einen einzelnen Block im Voxel-Spiel - */ -export interface Block { - /** X-Koordinate des Blocks */ - x: number; - /** Y-Koordinate des Blocks */ - y: number; - /** Z-Koordinate des Blocks */ - z: number; - /** Typ des Blocks (z.B. 'grass', 'stone', 'lava') */ - type: string; - /** Gibt an, ob dieser Block ein Spawn-Punkt ist */ - isSpawnPoint?: boolean; - /** Gibt an, ob dieser Block ein Ziel ist */ - isGoal?: boolean; -} - -/** - * Repräsentiert die Größe der Spielwelt - */ -export interface WorldSize { - /** Breite der Welt in Blöcken */ - width: number; - /** Höhe der Welt in Blöcken */ - height: number; - /** Tiefe der Welt in Blöcken */ - depth: number; -} - -/** - * Repräsentiert die Position des Spawn-Punkts - */ -export interface SpawnPoint { - /** X-Koordinate des Spawn-Punkts */ - x: number; - /** Y-Koordinate des Spawn-Punkts */ - y: number; - /** Z-Koordinate des Spawn-Punkts */ - z: number; -} - -/** - * Repräsentiert die Metadaten eines Levels (ohne Blockdaten) - */ -export interface LevelMetadata { - /** Eindeutige ID des Levels */ - id: string; - /** Name des Levels */ - name: string; - /** Beschreibung des Levels */ - description: string; - /** ID des Benutzers, der das Level erstellt hat */ - userId: string; - /** Zeitpunkt der Erstellung des Levels */ - createdAt: string; - /** Zeitpunkt der letzten Aktualisierung des Levels */ - updatedAt: string; - /** Gibt an, ob das Level öffentlich ist */ - isPublic?: boolean; - /** Anzahl der Aufrufe des Levels */ - playCount: number; - /** Anzahl der Likes des Levels */ - likesCount: number; - /** Schwierigkeitsgrad des Levels */ - difficulty?: string; - /** Tags zur Kategorisierung des Levels */ - tags?: string[]; - /** URL zum Vorschaubild des Levels */ - thumbnailUrl?: string; -} - -/** - * Repräsentiert ein vollständiges Level mit allen Daten - */ -export interface Level extends LevelMetadata { - /** Liste aller Blöcke im Level */ - blocks: Block[]; - /** Position des Spawn-Punkts */ - spawnPoint: SpawnPoint; - /** Größe der Spielwelt */ - worldSize: WorldSize; -} diff --git a/games/worldream/apps/web/src/lib/components/AiGenerator.svelte b/games/worldream/apps/web/src/lib/components/AiGenerator.svelte deleted file mode 100644 index 6df6c950c..000000000 --- a/games/worldream/apps/web/src/lib/components/AiGenerator.svelte +++ /dev/null @@ -1,200 +0,0 @@ - - -
- - - {#if isOpen} -
-
- -
- - -
-
-
- - - -
-
-

- {kindLabels[kind]} mit KI generieren -

-
-

- Beschreibe, was du erstellen möchtest. Die KI generiert dann alle Details für - dich. -

-
-
-
- -
- {#if error} -
-

{error}

-
- {/if} - - - - {#if context} -
- {#if context.world} -

Welt: {context.world}

- {/if} - {#if context.existingCharacters?.length} -

Verfügbare Charaktere: {context.existingCharacters.slice(0, 3).join(', ')}

- {/if} - {#if context.existingPlaces?.length} -

Verfügbare Orte: {context.existingPlaces.slice(0, 3).join(', ')}

- {/if} -
- {/if} -
- -
- - -
-
-
-
- {/if} -
diff --git a/games/worldream/apps/web/src/lib/components/AiImageGenerator.svelte b/games/worldream/apps/web/src/lib/components/AiImageGenerator.svelte deleted file mode 100644 index 8fc6a2c8a..000000000 --- a/games/worldream/apps/web/src/lib/components/AiImageGenerator.svelte +++ /dev/null @@ -1,403 +0,0 @@ - - -
-
-

Bild generieren

- {#if !generatedImageUrl} - - {/if} -
- - {#if showOptions && !generatedImageUrl} -
-
- - -
- -

- Das Bild wird basierend auf dem Titel und der Beschreibung generiert. -

-
- {/if} - - - {#if appearance && !generatedImageUrl} -
-
-

Deutsche Beschreibung:

-

{appearance}

-
- - {#if !imagePrompt} - - {:else} -
-

- - - - Englischer Bild-Prompt: -

-

- {imagePrompt} -

-
- {/if} -
- {/if} - - {#if generatedImageUrl} -
- {`Generiertes - -
- {:else} - - {/if} - - {#if error} -
-
-
- - - -
-
-

{error}

-
-
-
- {/if} - - {#if imagePrompt} -
- Verwendeter Prompt -

- {imagePrompt} -

-
- {/if} -
diff --git a/games/worldream/apps/web/src/lib/components/GlobalAiAuthorBar.svelte b/games/worldream/apps/web/src/lib/components/GlobalAiAuthorBar.svelte deleted file mode 100644 index 4f5390323..000000000 --- a/games/worldream/apps/web/src/lib/components/GlobalAiAuthorBar.svelte +++ /dev/null @@ -1,607 +0,0 @@ - - - -
- {#if success} -
-
-
- {#if success.includes('🔄')} - - - - - {:else} - - - - {/if} -
-

{success}

-
-
- {/if} - - {#if error} -
-
-
- - - -
-

{error}

-
-
- {/if} -
- - -{#if aiState.currentNode && aiState.isOwner} - -{/if} - - -{#if aiState.currentNode && aiState.isOwner} -
-
- -
-
-
-
-
- {#if processingCommands.size > 0} -
- {processingCommands.size} -
- {/if} -
-

✨ AI Author

-
- - -
- - -
-
- - -
- - - {#if aiState.mode === 'text'} - -
- -
- - {#if loading} -
- - - - -
- {/if} -
⌘+Enter
-
- - - {#if suggestions.length > 0 && !command.trim()} -
- {#each suggestions as suggestion} - - {/each} -
- {/if} - - - {#if processingCommands.size > 0} -
-

- Verarbeite {processingCommands.size} Befehl{processingCommands.size !== 1 - ? 'e' - : ''}: -

-
- {#each Array.from(processingCommands) as cmd} -
- - - - - {cmd.substring(0, 50)}{cmd.length > 50 ? '...' : ''} -
- {/each} -
-
- {/if} - - -
-
- - - {loading - ? `Verarbeite ${processingCommands.size} Befehl${processingCommands.size !== 1 ? 'e' : ''}...` - : 'AI bereit'} - -
-
- - -
-
-
- {:else} - -
- {#if aiState.currentNode} - - {/if} - - {#if imageUrl} -
- - -
- {/if} -
- {/if} -
-
-{/if} - - diff --git a/games/worldream/apps/web/src/lib/components/ImageGallery.svelte b/games/worldream/apps/web/src/lib/components/ImageGallery.svelte deleted file mode 100644 index 4a5899751..000000000 --- a/games/worldream/apps/web/src/lib/components/ImageGallery.svelte +++ /dev/null @@ -1,222 +0,0 @@ - - -{#if images.length > 0} - - {#if primaryImage} -
-
- -
-
- {/if} - - - {#if galleryImages.length > 0} -
- {#each galleryImages as image} -
- - - {#if editable} -
- - -
- {/if} -
- {/each} -
- {/if} -{:else} -
Noch keine Bilder vorhanden
-{/if} - - -{#if showLightbox && selectedImage} -
-
- Vollbild e.stopPropagation()} - /> - - - - {#if selectedImage.prompt} -
-

{selectedImage.prompt}

-
- {/if} -
-
-{/if} diff --git a/games/worldream/apps/web/src/lib/components/ImageUploadModal.svelte b/games/worldream/apps/web/src/lib/components/ImageUploadModal.svelte deleted file mode 100644 index dd4bdc652..000000000 --- a/games/worldream/apps/web/src/lib/components/ImageUploadModal.svelte +++ /dev/null @@ -1,319 +0,0 @@ - - -{#if show} -
-
e.stopPropagation()} - > - -
-

Bilder hochladen

- -
- - -
- - - -

- Bilder hier ablegen oder - -

-

- JPG, PNG, WebP oder GIF • Max. 10MB pro Bild -

- -
- - - {#if previews.length > 0} -
-

- Ausgewählte Bilder ({previews.length}) -

-
- {#each previews as preview, index} -
- Vorschau - - {#if index === 0} - - Hauptbild - - {/if} -
- {/each} -
-
- {/if} - - - {#if uploading} -
-
- Hochladen... - {Math.round(uploadProgress)}% -
-
-
-
-
- {/if} - - -
- - -
-
-
-{/if} diff --git a/games/worldream/apps/web/src/lib/components/ImageUploader.svelte b/games/worldream/apps/web/src/lib/components/ImageUploader.svelte deleted file mode 100644 index 2a2df535b..000000000 --- a/games/worldream/apps/web/src/lib/components/ImageUploader.svelte +++ /dev/null @@ -1,141 +0,0 @@ - - -
- {#if !showGenerator} - - {:else} -
-
-

Neues Bild generieren

- -
- - {#if error} -
-

{error}

-
- {/if} - - - - {#if imageUrl} -
- - -
- {/if} -
- {/if} -
diff --git a/games/worldream/apps/web/src/lib/components/NodeDetail.svelte b/games/worldream/apps/web/src/lib/components/NodeDetail.svelte deleted file mode 100644 index 023b2cf45..000000000 --- a/games/worldream/apps/web/src/lib/components/NodeDetail.svelte +++ /dev/null @@ -1,852 +0,0 @@ - - -{#if !isSideBySide && (node.kind === 'world' || node.kind === 'place') && !loadingImages && (images.length > 0 || node.image_url)} - -
- {#if images.length > 0 && images[0]?.image_url} - -
- {`Bild -
- {:else if node.image_url} - -
- {`Bild console.log('🖼️ Fallback image loaded:', node.image_url)} - onerror={() => console.error('🚨 Fallback image failed:', node.image_url)} - /> -
- {/if} -
-{/if} - -
- {#if isSideBySide} - -
- -
-
- - {#if !loadingImages && (images.length > 0 || node.image_url)} - {#if images.length > 0} - - {:else if node.image_url} - - {`Bild console.log('🖼️ Fallback image loaded:', node.image_url)} - onerror={() => console.error('🚨 Fallback image failed:', node.image_url)} - /> - {/if} - {/if} - - -
-
-

{node.title}

-
- - - {#if isOwner} - - - {/if} -
-
- {#if node.summary} -

{node.summary}

- {/if} - - {#if showLeftMetadata} -
- - {node.visibility} - - {#if node.world_slug} - - 🌍 {node.world_slug} - - {/if} - {#if node.tags && node.tags.length > 0} - {#each node.tags as tag} - - {tag} - - {/each} - {/if} -
- {/if} -
-
-
- - -
- - {#if node.kind !== 'story'} -
-
- - - {#if node.generation_prompt} - - {/if} - {#if node.custom_schema && node.custom_schema.fields.length > 0} - - {/if} -
- {#if isOwner} - - {/if} -
- {/if} - - -
- {#if node.kind !== 'story' && activeTab === 'memory'} - - { - node.memory = updatedMemory; - }} - /> - {:else if node.kind !== 'story' && activeTab === 'prompt' && node.generation_prompt} - - - {:else} - -
- {#each contentFields as field} - {#if node.content?.[field.key]} -
-

- {field.label} -

-
- {#if field.key === 'lore' && node.kind === 'story'} - - {:else if field.key.includes('text') || field.key === 'references'} - {@html parseReferences(node.content[field.key])} - {:else} -

{node.content[field.key]}

- {/if} -
-
- {/if} - {/each} -
- - - {#if node.kind === 'character' && linkedObjects.length > 0} -
-

- 📒 Inventar-Objekte -

- -
- {/if} - {/if} -
-
-
- {:else} - -
- - {#if node.kind === 'story' && !loadingImages && (images.length > 0 || node.image_url)} -
- {#if images.length > 0} - - {:else if node.image_url} - -
- {`Bild console.log('🖼️ Fallback image loaded:', node.image_url)} - onerror={() => console.error('🚨 Fallback image failed:', node.image_url)} - /> -
- {/if} -
- {/if} - - -
-

{node.title}

- {#if node.summary} -

{node.summary}

- {/if} -
- - {node.visibility} - - {#if node.world_slug} - - 🌍 {node.world_slug} - - {/if} - {#if node.tags && node.tags.length > 0} - {#each node.tags as tag} - - {tag} - - {/each} - {/if} -
-
- - - {#if node.kind !== 'story'} -
-
- - - {#if node.generation_prompt} - - {/if} -
- {#if isOwner} - - {/if} -
- {/if} - - -
- {#if node.kind !== 'story' && activeTab === 'memory'} - - { - node.memory = updatedMemory; - }} - /> - {:else if node.kind !== 'story' && activeTab === 'prompt' && node.generation_prompt} - - - {:else if node.kind !== 'story' && activeTab === 'custom'} - - - {:else} - -
- {#each contentFields as field} - {#if node.content?.[field.key]} -
-

- {field.label} -

-
- {#if field.key === 'lore' && node.kind === 'story'} - - {:else if field.key.includes('text') || field.key === 'references'} - {@html parseReferences(node.content[field.key])} - {:else} -

{node.content[field.key]}

- {/if} -
-
- {/if} - {/each} -
- {/if} -
-
- {/if} - - - {#if backPath} - - {:else} - -
- {/if} -
- - -{#if showUploadModal} - (showUploadModal = false)} - onUploadComplete={loadImages} - /> -{/if} diff --git a/games/worldream/apps/web/src/lib/components/NodeEditForm.svelte b/games/worldream/apps/web/src/lib/components/NodeEditForm.svelte deleted file mode 100644 index c524138d7..000000000 --- a/games/worldream/apps/web/src/lib/components/NodeEditForm.svelte +++ /dev/null @@ -1,389 +0,0 @@ - - -
-
-

{config.title} bearbeiten

-

- Bearbeite die Details für "{node.title}" -

-
- - {#if error} -
-

{error}

-
- {/if} - -
- -
-

Grundinformationen

- -
-
- - -
- -
- - -
-
- -
- - -
- -
-
- - -
- -
- - -
-
-
- - - {#if node.kind !== 'story'} -
-

Bild

- -
- {/if} - - -
-

Details

- -
- {#each requiredFields as field} -
- - -
- {/each} -
-
- - - {#if optionalFields.length > 0} - - {#snippet children()} - {#each optionalFields as field} -
- - - {#if field.key === 'inventory_text'} -

- Verwende @objekt-slug um Objekte zu verlinken -

- {:else if field.key === 'state_text' && node.kind === 'object'} -

- z.B. 'Im Besitz von @charakter-slug' -

- {/if} -
- {/each} - {/snippet} -
- {/if} - - -
- - -
-
-
diff --git a/games/worldream/apps/web/src/lib/components/customFields/CustomDataForm.svelte b/games/worldream/apps/web/src/lib/components/customFields/CustomDataForm.svelte deleted file mode 100644 index ff7f4a5a8..000000000 --- a/games/worldream/apps/web/src/lib/components/customFields/CustomDataForm.svelte +++ /dev/null @@ -1,520 +0,0 @@ - - -
- {#each fieldsByCategory() as [category, fields]} -
- {#if category !== '_uncategorized'} -

- {category} -

- {/if} - -
- {#each fields as field} -
- - - {#if field.description} -

- {field.description} -

- {/if} - - -
handleFieldChange(field.key, e.detail)} - onmultiselectchange={(e: CustomEvent) => { - const current = formData[field.key] || []; - if (e.detail.checked) { - handleFieldChange(field.key, [...current, e.detail.value]); - } else { - handleFieldChange( - field.key, - current.filter((v) => v !== e.detail.value) - ); - } - }} - onlistitemchange={(e: CustomEvent) => { - const items = [...(formData[field.key] || [])]; - items[e.detail.index] = e.detail.value; - handleFieldChange(field.key, items); - }} - onlistitemremove={(e: CustomEvent) => { - const items = [...(formData[field.key] || [])]; - items.splice(e.detail, 1); - handleFieldChange(field.key, items); - }} - onlistitemadd={() => { - const items = [...(formData[field.key] || [])]; - items.push(getDefaultValueForType(field.config.item_type || 'text')); - handleFieldChange(field.key, items); - }} - > - {@html getFieldComponent(field)} -
- - {#if errors[field.key]} -

- {errors[field.key]} -

- {/if} -
- {/each} -
-
- {/each} - - {#if onSave && !readonly} -
- -
- {/if} -
- - diff --git a/games/worldream/apps/web/src/lib/components/customFields/CustomFieldsDisplay.svelte b/games/worldream/apps/web/src/lib/components/customFields/CustomFieldsDisplay.svelte deleted file mode 100644 index 0555cf496..000000000 --- a/games/worldream/apps/web/src/lib/components/customFields/CustomFieldsDisplay.svelte +++ /dev/null @@ -1,224 +0,0 @@ - - -{#if schema && schema.fields.length > 0} - {#if !hasData} -
- Keine benutzerdefinierten Daten vorhanden -
- {:else} -
- {#each fieldsByCategory() as [category, fields]} -
- {#if category !== '_uncategorized'} -

- {category} -

- {/if} - -
- {#each fields as field} - {#if !isEmpty(data[field.key])} -
-
- {field.label} -
-
- {#if field.type === 'range'} - -
-
-
-
- - {formatValue(field, data[field.key])} - -
- {:else if field.type === 'text' && field.config.multiline} - -
- {@html parseReferences(data[field.key])} -
- {:else if field.type === 'json'} - -
-												{formatValue(field, data[field.key])}
-											
- {:else if field.type === 'boolean'} - - - {formatValue(field, data[field.key])} - - {:else if field.type === 'multiselect' || field.type === 'list'} - -
- {#each Array.isArray(data[field.key]) ? data[field.key] : [] as item} - - {field.type === 'multiselect' - ? field.config.choices?.find((c) => c.value === item)?.label || item - : item} - - {/each} -
- {:else} - - - {@html parseReferences(formatValue(field, data[field.key]))} - - {/if} -
-
- {/if} - {/each} -
-
- {/each} -
- {/if} -{:else} -
- Keine benutzerdefinierten Felder definiert -
-{/if} - - diff --git a/games/worldream/apps/web/src/lib/components/forms/NodeForm.svelte b/games/worldream/apps/web/src/lib/components/forms/NodeForm.svelte deleted file mode 100644 index cc29dd9a8..000000000 --- a/games/worldream/apps/web/src/lib/components/forms/NodeForm.svelte +++ /dev/null @@ -1,833 +0,0 @@ - - -
-
-

- {mode === 'create' ? `Neuer ${config.title}` : `${config.title} bearbeiten`} -

-

- {#if mode === 'create'} - {#if worldTitle} - Erstelle einen neuen {config.title.toLowerCase()} in - {worldTitle} - {:else} - Erstelle einen neuen {config.title.toLowerCase()} - {/if} - {:else} - Bearbeite die Details für "{initialData.title}" - {/if} -

-
- - {#if error} -
-

{error}

-
- {/if} - -
- - {#if kind === 'story' && mode === 'create'} -
- (selectedCharacters = selected)} - /> - - (selectedPlace = selected)} - /> -
- {/if} - - - {#if mode === 'create'} -
- -
- - {#if !showFormSections} -
- -
- {/if} - {/if} - - {#if showFormSections} - -
-

Grundinformationen

- -
-
- - -
- -
- - -
-
- -
- - -
- -
-
- - -
- -
- - -
-
-
- - - {#if kind === 'story' && mode === 'create'} -
-

Weitere Story-Elemente

-

- Ergänze deine Story mit Objekten aus dieser Welt. -

- -
-
- - - {#if suggestions.objects.length > 0} -

- Verfügbar: {suggestions.objects.slice(0, 5).join(', ')}{suggestions.objects - .length > 5 - ? '...' - : ''} -

- {/if} -
-
-
- {/if} - - - {#if kind === 'story'} -
-

Story-Bild

- -
- {:else} -
-

Bild

- -
- {/if} - - -
-

- {kind === 'story' ? 'Story-Inhalt' : 'Details'} -

- -
- {#each requiredFields as field} -
- - -
- {/each} -
-
- - - {#if optionalFields.length > 0} - - {#snippet children()} - {#each optionalFields as field} -
- - - {#if field.key === 'inventory_text'} -

- Verwende @objekt-slug um Objekte zu verlinken -

- {:else if field.key === 'state_text' && kind === 'object'} -

- z.B. 'Im Besitz von @charakter-slug' -

- {:else if field.key === 'relationships_text'} -

- Verwende @slug für Referenzen zu anderen Charakteren -

- {:else if field.key === 'references' && kind === 'story'} -

- Leer lassen, um die Story Builder Auswahl zu verwenden -

- {/if} -
- {/each} - {/snippet} -
- {/if} - - -
-

Benutzerdefinierte Felder

- (customSchema = schema)} - onDataChange={(data) => (customData = data)} - /> -
- {/if} - - -
- - -
-
-
diff --git a/games/worldream/apps/web/src/lib/types/content.ts b/games/worldream/apps/web/src/lib/types/content.ts deleted file mode 100644 index 8d0df42de..000000000 --- a/games/worldream/apps/web/src/lib/types/content.ts +++ /dev/null @@ -1,210 +0,0 @@ -export type NodeKind = 'world' | 'character' | 'object' | 'place' | 'story'; -export type VisibilityLevel = 'private' | 'shared' | 'public'; -export type StoryEntryType = 'narration' | 'dialog' | 'note'; - -export interface GenerationContext { - userPrompt: string; - systemPrompt: string; - worldContext?: string; - selectedCharacters?: Array<{ - name: string; - slug: string; - summary?: string; - appearance?: string; - voice_style?: string; - motivations?: string; - capabilities?: string; - }>; - model: string; - timestamp: string; -} - -export interface ContentNode { - id: string; - kind: NodeKind; - slug: string; - title: string; - summary?: string; - owner_id?: string; - visibility: VisibilityLevel; - tags: string[]; - world_slug?: string; - content: ContentData; - memory?: CharacterMemory; - skills?: CharacterSkills; - custom_schema?: any; // Will be CustomFieldSchema from customFields.ts - custom_data?: Record; // CustomFieldData - schema_version?: number; - generation_prompt?: string; - generation_model?: string; - generation_date?: string; - generation_context?: GenerationContext; - image_url?: string; - created_at: string; - updated_at: string; -} - -export interface ContentData { - appearance?: string; - image_prompt?: string; - lore?: string; - voice_style?: string; - capabilities?: string; - constraints?: string; - motivations?: string; - secrets?: string; - relationships_text?: string; - inventory_text?: string; - timeline_text?: string; - glossary_text?: string; - canon_facts_text?: string; - state_text?: string; - prompt_guidelines?: string; - references?: string; - _links?: Record; - _aliases?: string[]; - _i18n?: Record; - // Index signature für dynamische Content-Felder - [key: string]: string | Record | string[] | Record | undefined; -} - -export interface StoryEntry { - id: string; - story_slug: string; - position: number; - type: StoryEntryType; - speaker_slug?: string; - body: string; - created_by?: string; - created_at: string; -} - -export interface PromptTemplate { - id: string; - owner_id?: string; - world_slug?: string; - kind: NodeKind; - title: string; - prompt_template: string; - description?: string; - tags?: string[]; - usage_count: number; - is_public: boolean; - created_at: string; - updated_at: string; -} - -export interface PromptHistory { - id: string; - user_id: string; - node_id: string; - prompt: string; - response?: any; - model?: string; - created_at: string; -} - -// Memory System Types -export interface ShortTermMemory { - id: string; - timestamp: string; - content: string; - location?: string; - involved?: string[]; - tags?: string[]; - importance: number; - decay_at: string; -} - -export interface MediumTermMemory { - id: string; - timestamp: string; - content: string; - original_details?: string; - context?: string; - location?: string; - involved?: string[]; - tags?: string[]; - importance: number; - decay_at: string; - linked_memories?: string[]; -} - -export interface LongTermMemory { - id: string; - timestamp: string; - content: string; - emotional_weight: number; - category: 'trauma' | 'triumph' | 'relationship' | 'skill' | 'secret' | 'manual'; - triggers?: string[]; - effects?: string; - involved?: string[]; - immutable: boolean; -} - -export interface MemoryTraits { - memory_quality: 'excellent' | 'good' | 'average' | 'poor'; - trauma_filter?: boolean; - selective_memory?: string[]; - memory_conditions?: { - drunk?: 'partial_blackout' | 'full_blackout' | 'fuzzy'; - stressed?: 'detail_loss' | 'time_gaps'; - happy?: 'enhanced_positive' | 'forget_negative'; - }; -} - -export interface CharacterMemory { - short_term_memory: ShortTermMemory[]; - medium_term_memory: MediumTermMemory[]; - long_term_memory: LongTermMemory[]; - memory_traits: MemoryTraits; - last_processed?: string; -} - -// Skills System Types -export interface Skill { - name: string; - level: number; - level_text?: string; - subskills?: Record; - learned_from?: string; - learned_at?: string; - training_years?: number; - last_used?: string; - conditions?: Record; -} - -export interface LearningSkill { - name: string; - progress: number; - teacher?: string; - started: string; - blocked_by?: string; - next_milestone?: string; -} - -export interface SkillCondition { - trigger: string; - effect: string; -} - -export interface CharacterSkills { - primary: Skill[]; - learning: LearningSkill[]; - conditions: Record; -} - -// Memory Event for story integration -export interface MemoryEvent { - id: string; - node_id: string; - story_id?: string; - event_timestamp: string; - event_type: 'observed' | 'experienced' | 'told' | 'dreamed' | 'remembered'; - raw_event: string; - processed_memory?: any; - memory_tier?: 'short' | 'medium' | 'long'; - importance?: number; - created_at: string; - updated_at?: string; -} diff --git a/games/worldream/apps/web/src/routes/worlds/[world]/characters/[slug]/edit/+page.svelte b/games/worldream/apps/web/src/routes/worlds/[world]/characters/[slug]/edit/+page.svelte deleted file mode 100644 index 6bcba68b2..000000000 --- a/games/worldream/apps/web/src/routes/worlds/[world]/characters/[slug]/edit/+page.svelte +++ /dev/null @@ -1,98 +0,0 @@ - - - - {node ? `${node.title} bearbeiten - Worldream` : 'Charakter bearbeiten - Worldream'} - - -{#if loading} - -{:else if error} -
-
-

Fehler

-

{error}

- -
-
-{:else if node} - -{/if} diff --git a/package.json b/package.json index 828ec6243..6228b67c0 100644 --- a/package.json +++ b/package.json @@ -87,11 +87,10 @@ "dev:todo:app": "concurrently -n api,web -c yellow,cyan \"pnpm dev:api\" \"pnpm dev:todo:web\"", "dev:todo:full": "./scripts/setup-databases.sh auth && concurrently -n auth,sync,api,web -c blue,magenta,yellow,cyan \"pnpm dev:auth\" \"pnpm dev:sync\" \"pnpm dev:api\" \"pnpm dev:todo:web\"", "dev:todo:local": "concurrently -n sync,api,web -c magenta,yellow,cyan \"pnpm dev:sync\" \"pnpm dev:api\" \"pnpm dev:todo:web\"", - "dev:memoro:web": "pnpm --filter @memoro/web dev", "dev:memoro:server": "cd apps/memoro/apps/server && bun run --watch src/index.ts", "dev:memoro:audio-server": "cd apps/memoro/apps/audio-server && bun run --watch src/index.ts", - "dev:memoro:app": "concurrently -n server,audio,web -c yellow,green,cyan \"pnpm dev:memoro:server\" \"pnpm dev:memoro:audio-server\" \"pnpm dev:memoro:web\"", - "dev:memoro:full": "concurrently -n auth,server,audio,web -c blue,yellow,green,cyan \"pnpm dev:auth\" \"pnpm dev:memoro:server\" \"pnpm dev:memoro:audio-server\" \"pnpm dev:memoro:web\"", + "dev:memoro:app": "concurrently -n server,audio -c yellow,green \"pnpm dev:memoro:server\" \"pnpm dev:memoro:audio-server\"", + "dev:memoro:full": "concurrently -n auth,server,audio -c blue,yellow,green \"pnpm dev:auth\" \"pnpm dev:memoro:server\" \"pnpm dev:memoro:audio-server\"", "dev:uload:web": "pnpm --filter @uload/web dev", "dev:uload:server": "cd apps/uload/apps/server && bun run --watch src/index.ts", "dev:uload:landing": "pnpm --filter @uload/landing dev", @@ -144,8 +143,6 @@ "dev:figgos:web": "pnpm --filter @figgos/web dev", "dev:figgos:ios": "pnpm --filter @figgos/mobile ios", "dev:figgos:android": "pnpm --filter @figgos/mobile android", - "worldream:dev": "turbo run dev --filter=worldream...", - "dev:worldream:web": "pnpm --filter @worldream/web dev", "context:dev": "turbo run dev --filter=context...", "dev:context:mobile": "pnpm --filter @context/mobile dev", "dev:context:web": "pnpm --filter @context/web dev",