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:
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user