diff --git a/AI_RULES.md b/AI_RULES.md index 0798e88f..ba2710d7 100644 --- a/AI_RULES.md +++ b/AI_RULES.md @@ -26,6 +26,7 @@ This is the **Single Source of Truth** for ALL AI agents. Refer to [PROJECT_ARCH - **NO UPPERCASE** or **NO ITALICS** in any UI context (headers, labels, buttons). - **NO BOLD FONTS**: Use `font-normal` throughout. Hierarchy via size and color only. - **NO `tracking-widest`**. + - **StatCard Typography**: Numeric values in StatCards MUST match the exact text size of their corresponding labels (e.g., `text-base md:text-lg`) to avoid overwhelming the density of the component. - **Layout**: Main pages MUST use `max-w-7xl`. - **Unified Headers**: Icon box (`p-4 bg-primary/10 border-primary/20`) + Title (`text-3xl font-normal`). - **Iconography**: Use **Lucide Icons** exclusively. diff --git a/backend/ai_vision.py b/backend/ai_vision.py index c1c0c738..5a990bb3 100644 --- a/backend/ai_vision.py +++ b/backend/ai_vision.py @@ -100,6 +100,7 @@ def extract_label_info(image_bytes: bytes, mode: str = "item"): "Size": "size", "Color": "color", "PartNr": "part_number", + "Specs": "specs", "OCR": "ocr_text" } diff --git a/config/ai_prompt.md b/config/ai_prompt.md index 4473884e..a206d0eb 100644 --- a/config/ai_prompt.md +++ b/config/ai_prompt.md @@ -1,4 +1,4 @@ - # Technical Inventory Hardware Extraction Protocol +# Technical Inventory Hardware Extraction Protocol Extract ALL relevant hardware items from the image with precise, standardized formatting. @@ -8,7 +8,7 @@ - **Multi-item labels**: Treat each SKU/variant as a separate item (e.g., "5m cable" and "7m cable" = 2 items) ## Item Field Format (CRITICAL) - [] + Format: ` ` **Component Rules:** - ``: @@ -17,8 +17,16 @@ - Rule: If ≥1000GB, use TB. If ≥1000MB, use GB. Otherwise use MB. - **CABLE/WIRE LENGTH**: Meters only. Examples: "5m", "10m", "50m" - **RAM DIMM**: Capacity in GB. Examples: "128GB", "32GB", "8GB" + - **SFP/TRANSCEIVER SPEED**: Speed in G/Mbps. Examples: "10G", "1G", "40G", "100G" + + - ``: Asset class. + - **CABLES**: + - Use "Fiber" for all optical fiber cables. + - Use "Patchcord" for all copper UTP/RJ45 cables. + - Others: SATA, SAS, Power, USB, etc. + - **COMPONENTS**: DDR3/DDR4/DDR5, NVMe, SSD, HDD, SFP/Transceiver, DIMM, etc. + - **PRECEDENCE**: If an item is both "SSD" and "NVMe", use **NVMe** as the type and category. - - ``: Asset class. One of: DDR3/DDR4/DDR5, SSD/HDD/NVMe, SATA/SAS, Patchcord/Fiber/Cable, SFP/Transceiver, DIMM, etc. - ``: Manufacturer (HP, HPE, Dell, Samsung, Cisco, Hynix, Intel, Broadcom) - ``: Physical interface (RJ45, LC-LC, MPO, U.3, SATA, SAS, ST, SC). Omit if N/A. - ``: Part number ONLY if visible. **Omit serial numbers.** @@ -26,9 +34,10 @@ **Item Examples (WITH HUMAN-READABLE SIZES):** - `1.6TB NVMe HPE U.3 P66093-002` (not 1600GB) - `256GB SSD Dell SATA SK-8765` (already human-readable) - - `5m Patchcord LC-LC` + - `5m Fiber LC-LC` (optical cable) + - `2m Patchcord RJ45` (copper cable) - `128GB DDR4 Hynix` - - `512MB Cache Samsung SATA` (stays MB if under 1GB) + - `10G SFP+ Cisco LC 10-2415-03` **Size Conversion Examples:** - 1600GB → 1.6TB @@ -47,72 +56,74 @@ ## Other Fields - **Type**: Repeat the asset class (DDR4, SSD, NVMe, Patchcord, etc.) - **Description**: Technical summary, max 5 words. Examples: "High-speed fiber optic", "Enterprise Gen4 storage" - - **Category**: Memory, Storage, Network, Cabling, Compute, Optical, Transceiver + - **Category**: + - For Spare Parts (see below): Use `spare parts - ` where `` is the lowercase component name (e.g., `spare parts - ram`, `spare parts - ssd`, `spare parts - nvme`, `spare parts - raid card`, `spare parts - cpu`, `spare parts - psu`, `spare parts - hba`, `spare parts - nic`, `spare parts - sfp`). + - For Others: Use `Network`, `Cabling`, `Compute`, `Optical`, `Consumable`. - **Connector**: Interface type from Item field. Examples: "LC-LC", "RJ45", "U.3" - - **Size**: **HUMAN-READABLE capacity or length.** Examples: "1.6TB", "256GB", "5m" (NOT "1600GB") + - **Size**: **HUMAN-READABLE capacity, length, or speed.** Examples: "1.6TB", "256GB", "5m", "10G" (NOT "1600GB") - **Color**: Physical color if distinguishing - - **PartNr**: Part number only (no serial numbers) - - **OCR**: Robust matching key for OCR tolerance + - **PartNr**: Part number only. **CRITICAL: NEVER include Serial Numbers (S/N, SN, Serial).** + - **Specs**: Detailed technical specifications (e.g., "1.2V, CL22", "850W 80+ Gold", "Gen4 x4", "Single-mode"). + - **OCR**: Robust matching key for OCR tolerance. Format: `TYPE SIZE VENDOR CONNECTOR PARTNUMBER` (UPPERCASE, no special chars). ## OCR Field Rules (CRITICAL) - Generate a SHORT, clean matching key: + Generate a SHORT, clean matching key for database lookup: - Format: **UPPERCASE space-separated, NO special chars, NO duplicates** - Include ONLY: Type + Size + Primary Vendor + Connector + Part Number - - **EXCLUDE**: Serial numbers, secondary vendors, duplicate tokens, EMC/SK labels - - **USE HUMAN-READABLE SIZE**: Use TB/GB from Item field, not original notation + - **STRICT EXCLUSIONS**: + - NO serial numbers (S/N, SN, Serial) + - NO secondary vendor names + - NO extraneous labels + - **CONSTRAINTS**: + - Each token appears ONE time only (no duplicates) + - Remove hyphens/special chars for fuzzy matching (e.g., `SK-8765` -> `SK8765`) + - **USE HUMAN-READABLE SIZE**: Use TB/GB/M/G from Item field. - **OCR Format:** `TYPE SIZE VENDOR CONNECTOR PARTNUMBER` - - **OCR Examples (WITH HUMAN-READABLE SIZES):** + **OCR Examples:** - Item: `1.6TB NVMe HPE U.3 P66093-002` → OCR: `NVME 1.6TB HPE U3 P66093002` - - Item: `5m Patchcord LC-LC` → OCR: `PATCHCORD 5M LC LC` + - Item: `5m Fiber LC-LC` → OCR: `FIBER 5M LC LC` + - Item: `2m Patchcord RJ45` → OCR: `PATCHCORD 2M RJ45` - Item: `256GB SSD Samsung SAS SK-8765` → OCR: `SSD 256GB SAMSUNG SAS SK8765` - Item: `128GB DDR4 Hynix` → OCR: `DDR4 128GB HYNIX` - - **OCR Constraints:** - - NO duplicate part numbers - - NO secondary vendor names - - NO extraneous labels - - Each token appears ONE time only - - Remove hyphens/special chars for fuzzy matching - - Use HUMAN-READABLE sizes (1.6TB not 1600GB) + - Item: `10G SFP+ Cisco LC 10-2415-03` → OCR: `SFP+ 10G CISCO LC 10241503` ## Spare-Parts vs Consumables Classification CLASSIFICATION GUIDE - SPARE PARTS vs CONSUMABLES: Spare Parts (replaceable components that plug into or interface with devices): - - RAM, DDR memory modules (DDR3, DDR4, DDR5, SODIMM, DIMM) - - SSDs, NVMe drives, M.2 modules, SATA drives, hard drives - - CPUs, GPUs, processors, discrete graphics cards - - Power supply units (PSU), power modules (NOT generic power cords) - - Expansion cards (PCIe, PCI, RAID controllers, network cards/NIC) - - Cooling solutions (heatsinks, CPU coolers, thermal solutions) - - Motherboards, chipsets, BIOS modules + - **RAM**: DDR3, DDR4, DDR5, SODIMM, DIMM → Category: `spare parts - ram` + - **Storage**: NVMe, SSD, M.2, SATA HDD, SAS HDD → Category: `spare parts - nvme`, `spare parts - ssd`, or `spare parts - hdd`. + - *Rule: Use `nvme` if the item is an NVMe SSD.* + - **CPU**: Processors, Intel Xeon, AMD EPYC → Category: `spare parts - cpu` + - **Power**: PSU, Power Supply Modules → Category: `spare parts - psu` + - **Controllers**: RAID Controllers, HBA, NIC, Network Cards → Category: `spare parts - raid card` or `spare parts - hba` or `spare parts - nic` + - **Cooling**: Heatsinks, Fans (specific to models) → Category: `spare parts - cooling` + - **Mainboard**: Motherboards, Riser Cards → Category: `spare parts - motherboard` or `spare parts - riser` + - **Optical**: SFPs, Transceivers → Category: `spare parts - sfp` NOT Spare Parts (consumables, generic items): - - Cables (power, SATA, USB, Ethernet, proprietary cords) - - Fasteners (screws, washers, bolts, standoffs) - - Thermal paste, thermal pads, adhesive tapes - - Connectors, plugs, sockets, generic adapters - - Generic cords and utility items + - Cables: Power cables, SATA cables, USB, Ethernet, Fiber Patchcords → Category: `Cabling` or `Consumable` + - Fasteners: Screws, brackets, rails → Category: `Consumable` + - Materials: Thermal paste, pads, tapes → Category: `Consumable` Decision Tree: - 1. Does the item have a replaceable function in a larger system? - 2. Does it have a manufacturer part number and technical specifications? - 3. Is it described with model/revision information? - If YES to 2+ questions: Mark as SPARE PART - If item matches consumable examples exactly: Mark as CONSUMABLE - Otherwise: Mark as "uncertain" in the Category field for human review. + 1. Does the item have a manufacturer part number (P/N)? + 2. Is it a modular component of a larger system (Server, PC, Switch)? + 3. Does it have technical specs (Speed, Capacity, Voltage)? + If YES to 2+ questions: Mark as `spare parts - ` + If item is a cable: Mark as `Cabling` + If item is a generic hardware: Mark as `Consumable` + Otherwise: Mark as `uncertain` for review. Examples: - ✓ "Kingston Fury 16GB DDR4-3200" → Spare Part (RAM module) - ✓ "Samsung 970 EVO 1TB NVMe" → Spare Part (SSD) - ✓ "Intel Core i7-12700K" → Spare Part (CPU) - ✓ "Corsair RM850x 850W Power Supply" → Spare Part (PSU) - ✗ "6ft SATA Cable" → Consumable (cable) - ✗ "CPU Mounting Hardware Kit" → Consumable (fasteners) - ✗ "Thermal Paste Tube" → Consumable (adhesive material) + ✓ "Kingston Fury 16GB DDR4-3200" → Category: `spare parts - ram` + ✓ "Samsung 970 EVO 1TB NVMe" → Category: `spare parts - nvme` + ✓ "Intel Core i7-12700K" → Category: `spare parts - cpu` + ✓ "LSI MegaRAID 9361-8i" → Category: `spare parts - raid card` + ✗ "6ft SATA Cable" → Category: `Cabling` + ✗ "M3 Mounting Screws" → Category: `Consumable` + ## Output Format ```json @@ -127,7 +138,8 @@ "Size": "human_readable_size", "Color": "color", "PartNr": "part_number", - "OCR": "TYPE SIZE VENDOR CONNECTOR PARTNUMBER" + "Specs": "detailed technical specifications", + "OCR": "SIZE TYPE VENDOR CONNECTOR PARTNUMBER" } ] } diff --git a/dev_docs/PLAN.md b/dev_docs/PLAN.md index a6420e52..eb44995a 100644 --- a/dev_docs/PLAN.md +++ b/dev_docs/PLAN.md @@ -42,8 +42,23 @@ A unified inventory management system that eliminates manual data entry through ## 5. Design & Operational Constraints - **Tech Stack**: FastAPI (Python), SQLite, Next.js (TypeScript), Tailwind CSS. +<<<<<<< HEAD - **UI Fidelity**: Premium density, Lucide icons, **NO UPPERCASE**, **NO BOLD FONTS**. - **Security**: Mandatory auth, immutable audit logs. +======= +- **UI Fidelity**: Premium density, Lucide icons, **NO UPPERCASE**, **NO BOLD FONTS** (normal weight only). +- **StatCard Rule**: Numeric values MUST match label text size for balanced density. +- **Database**: Single-instance SQLite (WAL mode). Multi-instance is v3+. +- **Security**: Mandatory auth, no bypasses, immutable audit logs. +- **AI**: Multi-provider resilience (Gemini primary, Claude fallback). + +--- + +## 5. Decision Log Summary +- **Reset Planning (2026-04-22)**: Refocused on v2 stable release, deferred complex analytics to v3. +- **Image Handling (2026-04-22)**: Simplified to rotation-only adjustment; removed complex cropping to improve stability. +- **SQLite Choice**: Selected for zero-ops overhead; proven sufficient for 10K item scale. +>>>>>>> dev --- diff --git a/dev_docs/SESSION_STATE.md b/dev_docs/SESSION_STATE.md index 4864901d..c3999c85 100644 --- a/dev_docs/SESSION_STATE.md +++ b/dev_docs/SESSION_STATE.md @@ -2,6 +2,7 @@ **Active AI:** Gemini CLI **Last Updated:** 2026-04-23 +<<<<<<< HEAD **Current Version:** v1.14.22 **Status**: ✅ MILESTONE 7 VERIFIED | 🟢 READY FOR PHASE 8 @@ -23,12 +24,41 @@ ### 3. Infrastructure Stability - **LDAP Config**: Refactored `auth.py` to use `ConfigManager` for saving settings directly to `backend.yaml`, eliminating legacy JSON side-files. - **Caddy Proxy**: Resolved Port 80 conflict by disabling automatic HTTP->HTTPS redirects in standalone mode. +======= +**Current Version:** v1.14.20 +**Status**: ✅ STATCARD TYPOGRAPHY REFINED | 🟢 READY FOR PHASE 8 + +--- + +## SESSION 44 EXECUTION SUMMARY — StatCard UI Tweak + +### 1. StatCard Typography Adjustment +- **Constraint**: Reduced numeric value font size in dashboard cards (`StatCard.tsx`) to match their label text size (`text-base md:text-lg`). +- **Rationale**: User feedback indicated the previous large font sizes (`text-2xl md:text-3xl`) were overwhelming and disproportionate to the card's density. + +### 2. Rule Standardization +- **AI_RULES.md Updated**: Formally documented the new standard in Section 3 (UI/UX Fidelity Standards). Numeric values in StatCards MUST now match label sizes to maintain visual balance. +>>>>>>> dev --- ## NEXT STEPS (Phase 8: Hardening & Release) +<<<<<<< HEAD 1. **Production Runbook**: Create a finalized guide for production deployment. 2. **Stress Testing**: Verify system performance with 10k+ items and multiple users. 3. **E2E Validation**: Verify data consistency in multi-page Excel exports and Python management scripts. 4. **Final Polish**: Perform a final accessibility and performance audit before v1.15.0 stable release. +======= +1. **Extraction Validation**: + - Run sample images of RAID cards and NVMe drives to confirm `spare parts - ` categorization. +2. **UX Refinement**: + - Ensure the Admin UI displays these new categories correctly. +3. **v1.15.0 Milestone**: + - Finalize the release candidate. + +--- + +✓ All tasks for this session are implemented, verified, and committed. +✓ Services are currently RUNNING in the background. +>>>>>>> dev diff --git a/frontend/VERSION.json b/frontend/VERSION.json index 79c21d37..07339e3e 100644 --- a/frontend/VERSION.json +++ b/frontend/VERSION.json @@ -1,6 +1,6 @@ { - "version": "1.14.22", - "last_build": "2026-04-23-1616", + "version": "1.14.23", + "last_build": "2026-04-23-1823", "codename": "ConfigCore", - "commit": "e5bb14d9" + "commit": "7c4441a9" } \ No newline at end of file diff --git a/frontend/app/inventory/page.tsx b/frontend/app/inventory/page.tsx index a8b55383..94415174 100644 --- a/frontend/app/inventory/page.tsx +++ b/frontend/app/inventory/page.tsx @@ -448,7 +448,7 @@ export default function InventoryPage() { />
- +
- + {value}