Implement optional single-image intake, Signal ingestion, and multimodal vision analysis

- Add image intake service with format validation (JPEG, PNG, WebP) and EXIF/GPS stripping
- Enforce strict single-image rule across Web and Signal attachment channels
- Implement token-optimized vision downscaling and JPEG compression
- Add IMAGE_CONTEXT pipeline stage with OmniRoute vision routing and resilient failover
- Seed and manage versioned idea-image-interpreter prompt in catalog
- Update Web UI with responsive image picker, preview chip, and Visual Context tab
- Add comprehensive automated test suite in test_image_intake.py
- Update README and Labyricorn devlog
This commit is contained in:
2026-08-23 01:40:22 -07:00
parent 94ff1e4408
commit 41e08611c9
30 changed files with 3784 additions and 278 deletions
+20 -5
View File
@@ -53,12 +53,25 @@ class ThinkStormQueue:
try:
# 1. Check foreground queue first
if not self.foreground_queue.empty():
job = await self.foreground_queue.get()
job = self.foreground_queue.get_nowait()
elif not self.background_queue.empty():
job = await self.background_queue.get()
job = self.background_queue.get_nowait()
else:
# Wait for any job
job = await self.foreground_queue.get()
# Wait for next job from either queue concurrently
fg_task = asyncio.create_task(self.foreground_queue.get())
bg_task = asyncio.create_task(self.background_queue.get())
done, pending = await asyncio.wait(
[fg_task, bg_task],
return_when=asyncio.FIRST_COMPLETED
)
for task in pending:
task.cancel()
for task in done:
job = task.result()
break
if not job:
continue
job_key = f"{job['type']}:{job['id']}"
self.running_jobs[job_key] = {
@@ -81,9 +94,11 @@ class ThinkStormQueue:
async def _process_job(self, job: Dict[str, Any]):
job_type = job["type"]
job_id = job["id"]
job_data = job.get("data") or {}
if job_type == "intake":
await execute_intake_pipeline(job_id)
bypass = job_data.get("bypass_duplicate_check", False)
await execute_intake_pipeline(job_id, bypass_duplicate_check=bypass)
elif job_type == "work_track":
await execute_work_track_workflow(job_id)