From aaf75abc15d68c889f640c30fb5cba5931596bdf Mon Sep 17 00:00:00 2001 From: Vito Sansevero Date: Sat, 17 Oct 2026 13:25:10 -0700 Subject: [PATCH] feat(workspace): inspect and send positive and negative prompts --- TESTING.md | 14 + docs/prompt-inspector.md | 32 + docs/screenshots/204/inspector-dark.png | Bin 0 -> 90473 bytes docs/screenshots/204/inspector-light.png | Bin 0 -> 89176 bytes docs/screenshots/204/inspector-mobile.png | Bin 0 -> 30730 bytes docs/screenshots/204/sender-preview.png | Bin 0 -> 71896 bytes py/api/images.py | 73 +++ tests/browser/prompt-inspector.spec.mjs | 169 ++++++ tests/browser/server.py | 44 +- tests/comfyui/prompt-sender.spec.mjs | 68 +++ tests/js/prompt-inspector.test.js | 36 ++ tests/js/prompt-sender.test.js | 121 ++++ tests/test_api_prompt_inspector.py | 581 +++++++++++++++++++ tools/vendor/frontend-coverage-baseline.json | 12 + utils/prompt_inspector.py | 271 +++++++++ web/js/workspace/images.css | 43 ++ web/js/workspace/images.mjs | 22 +- web/js/workspace/prompt-inspector.mjs | 124 ++++ web/js/workspace/prompt-sender.mjs | 155 +++++ 19 files changed, 1760 insertions(+), 5 deletions(-) create mode 100644 docs/prompt-inspector.md create mode 100644 docs/screenshots/204/inspector-dark.png create mode 100644 docs/screenshots/204/inspector-light.png create mode 100644 docs/screenshots/204/inspector-mobile.png create mode 100644 docs/screenshots/204/sender-preview.png create mode 100644 tests/browser/prompt-inspector.spec.mjs create mode 100644 tests/comfyui/prompt-sender.spec.mjs create mode 100644 tests/js/prompt-inspector.test.js create mode 100644 tests/js/prompt-sender.test.js create mode 100644 tests/test_api_prompt_inspector.py create mode 100644 utils/prompt_inspector.py create mode 100644 web/js/workspace/prompt-inspector.mjs create mode 100644 web/js/workspace/prompt-sender.mjs diff --git a/TESTING.md b/TESTING.md index 9f40f7f..dc1f5c9 100644 --- a/TESTING.md +++ b/TESTING.md @@ -183,3 +183,17 @@ The compatibility runner reserves loopback ports 8193–8195; `PM_COMPAT_PORT` selects another consecutive unprivileged range. Never run automated tests against the maintainer's running ComfyUI. This JavaScript host extension needs a full browser refresh after deployment; its first slice adds no gallery send controls. + +### Workspace prompt inspection and sending + +`tests/test_api_prompt_inspector.py` covers rooted physical-file identity, +execution/graph/parameter evidence, saved associations, ambiguity, empty negatives, +read-only behavior, bounded PNG/video metadata and corrupt inputs. Run it with +`python -m unittest discover -s tests -p test_api_prompt_inspector.py` in a disposable +checkout. `tests/js/prompt-inspector.test.js` and `prompt-sender.test.js` cover +request races, explicit destination selection, preview tickets and uncertain +acknowledgements. Browser workflows exercise the same controls in Images and +Viewer, including nested modal focus, mobile layouts and per-role sending. +`tests/comfyui/prompt-sender.spec.mjs` sends through the actual workspace UI into +real Classic and Nodes 2.0 widgets and verifies workflow serialization without +loading a workflow or queueing generation. diff --git a/docs/prompt-inspector.md b/docs/prompt-inspector.md new file mode 100644 index 0000000..81eeaeb --- /dev/null +++ b/docs/prompt-inspector.md @@ -0,0 +1,32 @@ +# Prompt inspection and sending + +The opt-in workspace at `/prompt_manager/workspace#/images` shows full positive +and negative prompts in both Image details and the full-image preview. Existing +gallery and metadata tools remain available during the application rebuild. + +Each prompt shows its evidence source: recorded execution, workflow inference, +embedded generation parameters, or an exact saved-library association. Missing, +ambiguous, and unreadable prompts remain visible as distinct states. An explicitly +empty negative is a resolved value and can clear a destination's negative field. + +Use the blue paper-plane action beside a prompt, or **Send prompt pair**. Keep a +ComfyUI tab open under the same origin and deployment prefix. Choose a window and +compatible Prompt Manager node, select **Preview changes**, review the complete +before/after text and preserved prepend/append composition, then **Apply to +ComfyUI**. The dialog reports success only after a matching acknowledgement. +It does not load workflows or queue generation. If confirmation is lost, inspect +ComfyUI and preview again before another attempt. Closing the dialog cannot undo +an update already sent. + +## Read-only API + +`GET /prompt_manager/images/inspect/{relative_path}?root={root_index}` requires +an explicit configured root, including when two roots contain the same filename. +The response contains `image` identity and `prompts.positive` / `prompts.negative`. +Each role has `status` (`resolved`, `absent`, `unresolved`, or `ambiguous`), `text` +(string only when resolved, otherwise null), and `source`. Inspection does not +index files, alter saved prompts, run scans, or decode image pixels. PNG text and +video probe output are bounded; unsupported or malformed evidence remains +unresolved rather than becoming sendable placeholder text. + +Python route changes require restarting ComfyUI. Browser assets require a refresh. diff --git a/docs/screenshots/204/inspector-dark.png b/docs/screenshots/204/inspector-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..35b46325247a50d439c94f9013c05d81fc2dbebd GIT binary patch literal 90473 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/204/inspector-light.png b/docs/screenshots/204/inspector-light.png new file mode 100644 index 0000000000000000000000000000000000000000..d8765d0edd72542f484c34611238b9aa77e525d3 GIT binary patch literal 89176 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 >#_06ftZv;iWeWf|=r2SET-?^K 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/204/inspector-mobile.png b/docs/screenshots/204/inspector-mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..67ef1e5d781c4a2393256a0ff799d25b68bfc8e4 GIT binary patch literal 30730 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/204/sender-preview.png b/docs/screenshots/204/sender-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..5c8668933a9f7a7a9e5dbd19dcb5e6c1d20e3690 GIT binary patch literal 71896 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

8(YrbzF?ysvlu61hv!C?tDyOrP6@Sk%?;^h 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 dict: + try: + metadata = read_inspection_metadata(path) + except MetadataReadError: + return { + role: {"status": "unresolved", "text": None, "source": None} + for role in ("positive", "negative") + } + saved = ( + self.db.get_image_prompt_info(str(path), False) + if not metadata + else None + ) + return inspect_prompt_roles(metadata, saved) + + prompts = await self._run_in_executor(inspect) + return web.json_response( + { + "success": True, + "image": { + "root_index": index, + "path": Path(relative).as_posix(), + "filename": path.name, + }, + "prompts": prompts, + } + ) + except Exception: + self.logger.exception("Prompt inspection failed") + return web.json_response( + {"success": False, "error": "Prompt inspection failed"}, status=500 + ) + async def get_image_prompt(self, request): """Get prompt information for a specific image path.""" try: diff --git a/tests/browser/prompt-inspector.spec.mjs b/tests/browser/prompt-inspector.spec.mjs new file mode 100644 index 0000000..49fc407 --- /dev/null +++ b/tests/browser/prompt-inspector.spec.mjs @@ -0,0 +1,169 @@ +import {startCoverage,saveCoverage} from '../../tools/vendor/browser-coverage.mjs'; +import {test,expect} from '../../tools/vendor/node_modules/@playwright/test/index.mjs'; + +const workspace='/prompt_manager/workspace#/images'; +const details=page=>page.getByRole('region',{name:'Image details',exact:true}); +const role=(scope,name)=>scope.getByRole('region',{name:`${name} prompt`,exact:true}); +const select=async(page,key)=>page.locator(`article[data-image-key="${key}"]`).getByRole('button',{name:/^Open /}).click(); +const dialog=page=>page.getByRole('dialog',{name:'Send to ComfyUI',exact:true}); + +test.beforeEach(async({page,request,browserName})=>{ + await startCoverage(page,browserName);await expect(await request.post('/__test__/reset',{data:{prompt_inspector:true}})).toBeOK(); + page.promptErrors=[];page.on('pageerror',error=>page.promptErrors.push(error.message)); +}); +test.afterEach(async({page,browserName})=>{await saveCoverage(page,browserName);expect(page.promptErrors).toEqual([]);}); + +async function fakeHost(context,page,{rejectApply=false}={}) { + const host=await context.newPage();await host.goto('/prompt_manager/workspace#/overview'); + await host.evaluate(async rejectApply=>{ + const {createBridgeHost}=await import('/prompt_manager/js/shared/toolkit/prompt-bridge.js'); + window.hostValues={positive:'Existing positive',negative:'Existing negative'};window.applied=[]; + const target={id:'pair-1',label:'My prompt pair',type:'PromptManagerPair',roles:['positive','negative']}; + window.fixtureHost=createBridgeHost({origin:location.origin,namespace:'/',label:'Test ComfyUI',adapter:{ + listTargets:()=>[target], + preview:(_id,roles)=>({preview:{target,fields:Object.entries(roles).map(([role,after])=>({role,before:window.hostValues[role],after})),composition:{prepend:'trigger',append:'detail',prependConnected:false,appendConnected:false,before:`trigger ${window.hostValues.positive} detail`,after:`trigger ${roles.positive??window.hostValues.positive} detail`}},snapshot:roles}), + apply:roles=>{if(rejectApply)throw new Error('Workflow changed. Preview again.');Object.assign(window.hostValues,roles);window.applied.push(roles);return{targetId:target.id,values:roles};}, + }}); + },rejectApply); + return host; +} +async function chooseDestination(page) { + const sender=dialog(page);await expect(sender).toBeVisible(); + const host=sender.getByRole('combobox',{name:'ComfyUI window',exact:true}); + await expect(host.locator('option')).toContainText(['Test ComfyUI']); + await host.selectOption({label:'Test ComfyUI'}); + await sender.getByRole('combobox',{name:'Destination node',exact:true}).selectOption({label:'My prompt pair'}); + return sender; +} + +test('physical image inspector resolves positive and negative metadata separately for duplicate filenames',async({page})=>{ + await page.goto(workspace);await select(page,'0:shared/same.png'); + await expect(role(details(page),'Positive')).toContainText('Cat portrait');await expect(role(details(page),'Negative')).toContainText('blurry, watermark'); + await expect(details(page).getByRole('button',{name:'Send prompt pair',exact:true})).toBeEnabled(); + await select(page,'1:shared/same.png');await expect(role(details(page),'Positive')).toContainText('Dog landscape'); + await expect(role(details(page),'Negative')).toContainText('low quality');await expect(details(page)).not.toContainText('Cat portrait'); +}); + +test('explicit empty negative is sendable while unrecorded text is never invented',async({page})=>{ + await page.goto(workspace);await select(page,'0:empty-negative.png'); + await expect(role(details(page),'Negative')).toContainText('Empty negative prompt'); + await expect(details(page).getByRole('button',{name:'Send negative prompt',exact:true})).toBeEnabled(); + await select(page,'0:uncertain.png');await expect(details(page)).toContainText('Not recorded in this file.'); + await expect(details(page).getByRole('button',{name:/^Send (positive|negative) prompt$/})).toHaveCount(0); +}); + +test('inspection failures retry and a delayed previous selection cannot replace the current prompt',async({page})=>{ + let fail=true;let release;const held=new Promise(resolve=>{release=resolve;}); + await page.route('**/images/inspect/**',async route=>{ + const url=new URL(route.request().url()); + if(url.searchParams.get('root')==='0'&&url.pathname.endsWith('same.png')){ + if(fail){return route.fulfill({status:503,json:{success:false,error:'Temporarily unavailable'}});} + await held; + } + await route.continue().catch(()=>{}); + }); + await page.goto(workspace);await select(page,'0:shared/same.png'); + await expect(details(page)).toContainText('Could not read prompts from this file.'); + fail=false;await details(page).getByRole('button',{name:'Retry prompt details',exact:true}).click(); + await select(page,'1:shared/same.png');await expect(role(details(page),'Positive')).toContainText('Dog landscape'); + release();await expect(role(details(page),'Positive')).toContainText('Dog landscape'); +}); + +test('sender requires explicit destination, previews full changes and acknowledges only the applied pair',async({page,context},testInfo)=>{ + const host=await fakeHost(context,page); + try { + await page.goto(workspace);await select(page,'0:shared/same.png');await details(page).getByRole('button',{name:'Send prompt pair',exact:true}).click(); + const sender=dialog(page);await expect(sender.getByRole('button',{name:'Apply to ComfyUI',exact:true})).toBeDisabled(); + const chosen=await chooseDestination(page);await chosen.getByRole('button',{name:'Preview changes',exact:true}).click(); + for(const text of ['Existing positive','Existing negative','Cat portrait','blurry, watermark','trigger Cat portrait detail'])await expect(chosen).toContainText(text); + expect(await host.evaluate(()=>window.applied)).toEqual([]); + await page.screenshot({path:testInfo.outputPath('sender-preview.png')}); + await chosen.getByRole('button',{name:'Apply to ComfyUI',exact:true}).click();await expect(chosen).toContainText('Sent to ComfyUI.'); + expect(await host.evaluate(()=>window.applied)).toEqual([{positive:'Cat portrait',negative:'blurry, watermark'}]); + await chosen.getByRole('button',{name:'Close',exact:true}).click(); + await page.screenshot({path:testInfo.outputPath('inspector-dark.png'),fullPage:true}); + await page.getByRole('combobox',{name:'Appearance',exact:true}).selectOption('light'); + await page.screenshot({path:testInfo.outputPath('inspector-light.png'),fullPage:true}); + await page.setViewportSize({width:390,height:844});await details(page).scrollIntoViewIfNeeded(); + await page.screenshot({path:testInfo.outputPath('inspector-mobile.png')}); + } finally {await host.evaluate(()=>window.fixtureHost.dispose());await host.close();} +}); + +test('host apply rejection retains the current text and requires a new preview',async({page,context})=>{ + const host=await fakeHost(context,page,{rejectApply:true}); + try { + await page.goto(workspace);await select(page,'0:shared/same.png');await details(page).getByRole('button',{name:'Send positive prompt',exact:true}).click(); + const sender=await chooseDestination(page);await sender.getByRole('button',{name:'Preview changes',exact:true}).click(); + await sender.getByRole('button',{name:'Apply to ComfyUI',exact:true}).click();await expect(sender).toContainText(/Workflow changed/); + await expect(sender.getByRole('button',{name:'Apply to ComfyUI',exact:true})).toBeDisabled(); + expect(await host.evaluate(()=>window.hostValues.positive)).toBe('Existing positive'); + } finally {await host.evaluate(()=>window.fixtureHost.dispose());await host.close();} +}); + +test('nested viewer sender Escape restores focus without closing the image and navigation disposes both overlays',async({page})=>{ + await page.goto(workspace);await select(page,'0:shared/same.png'); + await details(page).getByRole('button',{name:'Open full preview',exact:true}).click(); + const viewer=page.locator('dialog[open]').filter({has:page.locator('.viewer-canvas')});await expect(viewer).toBeVisible(); + const send=viewer.getByRole('button',{name:'Send positive prompt',exact:true});await send.click();await expect(dialog(page)).toBeVisible(); + await page.keyboard.press('Escape');await expect(dialog(page)).toBeHidden();await expect(viewer).toBeVisible();await expect(send).toBeFocused(); + await send.click();await page.evaluate(()=>{location.hash='#/overview';});await expect(page.locator('dialog[open]')).toHaveCount(0); +}); + +test('empty negative send clears only the negative destination and preserves its positive',async({page,context})=>{ + const host=await fakeHost(context,page); + try { + await page.goto(workspace);await select(page,'0:empty-negative.png'); + await details(page).getByRole('button',{name:'Send negative prompt',exact:true}).click(); + const sender=await chooseDestination(page);await sender.getByRole('button',{name:'Preview changes',exact:true}).click(); + await sender.getByRole('button',{name:'Apply to ComfyUI',exact:true}).click();await expect(sender).toContainText('Sent to ComfyUI.'); + expect(await host.evaluate(()=>window.hostValues)).toEqual({positive:'Existing positive',negative:''}); + } finally {await host.evaluate(()=>window.fixtureHost.dispose());await host.close();} +}); + +test('no open ComfyUI window is actionable and rediscovery finds a newly opened host',async({page,context})=>{ + await page.goto(workspace);await select(page,'0:shared/same.png'); + await details(page).getByRole('button',{name:'Send positive prompt',exact:true}).click(); + const sender=dialog(page);await expect(sender).toContainText('No compatible ComfyUI windows found.'); + const host=await fakeHost(context,page); + try { + await sender.getByRole('button',{name:'Find ComfyUI windows',exact:true}).click(); + await chooseDestination(page);await sender.getByRole('button',{name:'Preview changes',exact:true}).click(); + await sender.getByRole('button',{name:'Apply to ComfyUI',exact:true}).click();await expect(sender).toContainText('Sent to ComfyUI.'); + expect(await host.evaluate(()=>window.hostValues)).toEqual({positive:'Cat portrait',negative:'Existing negative'}); + } finally {await host.evaluate(()=>window.fixtureHost.dispose());await host.close();} +}); + +test('mobile inspector exposes full long prompts, truthful uncertainty and copy failure feedback',async({page})=>{ + const text=`A long detailed prompt ${'with readable full composition, '.repeat(150)}END OF FULL PROMPT`; + await page.addInitScript(()=>Object.defineProperty(navigator,'clipboard',{configurable:true,value:{writeText:async()=>{throw new Error('Permission denied');}}})); + await page.route('**/images/inspect/**',route=>route.fulfill({json:{success:true,image:{root_index:0,path:'shared/same.png',filename:'same.png'},prompts:{positive:{status:'resolved',text,source:'execution'},negative:{status:'ambiguous',text:null,source:null}}}})); + await page.setViewportSize({width:390,height:844});await page.goto(workspace);await select(page,'0:shared/same.png'); + const positive=role(details(page),'Positive');await expect(positive.locator('pre')).toHaveText(text); + await expect(role(details(page),'Negative')).toContainText('Multiple possible prompts. Source could not be determined.'); + await expect(details(page).getByRole('button',{name:'Send negative prompt',exact:true})).toHaveCount(0); + await positive.getByRole('button',{name:'Copy positive prompt',exact:true}).click();await expect(positive).toContainText('Copy unavailable. Select the prompt text to copy it.'); + expect(await page.evaluate(()=>document.documentElement.scrollWidth<=innerWidth+1)).toBe(true); + await positive.getByRole('button',{name:'Send positive prompt',exact:true}).click(); + await expect(dialog(page)).toBeVisible();const bounds=await dialog(page).boundingBox(); + expect(bounds.x).toBeGreaterThanOrEqual(0);expect(bounds.x+bounds.width).toBeLessThanOrEqual(391); +}); + +test('filtering away a selected image aborts its pending metadata request',async({page})=>{ + await page.addInitScript(()=>{ + const fetch=window.fetch;window.inspectionAborts=0; + window.fetch=function(input,options){ + if(String(input).includes('/images/inspect/')&&options?.signal)options.signal.addEventListener('abort',()=>window.inspectionAborts++,{once:true}); + return fetch.call(this,input,options); + }; + }); + let started;const requested=new Promise(resolve=>{started=resolve;});let release; + const hold=new Promise(resolve=>{release=resolve;}); + await page.route('**/images/inspect/**',async route=>{started();await hold;await route.continue().catch(()=>{});}); + try { + await page.goto(workspace);await select(page,'0:shared/same.png');await requested; + const baseline=await page.evaluate(()=>window.inspectionAborts); + await page.getByRole('searchbox',{name:'Search filenames',exact:true}).fill('no-such-file'); + await expect(page.getByText('No matching images or media. Try changing the filters.',{exact:true})).toBeVisible(); + await expect.poll(()=>page.evaluate(()=>window.inspectionAborts),{timeout:1500}).toBeGreaterThan(baseline); + } finally {release();} +}); diff --git a/tests/browser/server.py b/tests/browser/server.py index f1e36d0..1d3cd4d 100644 --- a/tests/browser/server.py +++ b/tests/browser/server.py @@ -78,7 +78,11 @@ def create_app(root: Path) -> web.Application: api = PromptManagerAPI() api.add_routes(routes) - def seed(extra_images: int = 0, include_video: bool = False) -> None: + def seed( + extra_images: int = 0, + include_video: bool = False, + prompt_inspector: bool = False, + ) -> None: with api.db.model.get_connection() as conn: for table in ( "image_prompt_pairs", @@ -107,6 +111,25 @@ def create_app(root: Path) -> web.Application: ) with Image.new("RGB", (64, 64), (index * 255, 64, 128)) as image: image.save(image_path, pnginfo=info) + if prompt_inspector: + graph = { + "1": {"class_type": "CLIPTextEncode", "inputs": {"text": text}}, + "2": { + "class_type": "CLIPTextEncode", + "inputs": { + "text": "blurry, watermark" if index == 0 else "low quality" + }, + }, + "3": { + "class_type": "KSampler", + "inputs": {"positive": ["1", 0], "negative": ["2", 0]}, + }, + "4": {"class_type": "SaveImage", "inputs": {"images": ["3", 0]}}, + } + info = PngInfo() + info.add_text("prompt", json.dumps(graph)) + with Image.new("RGB", (64, 64), (index * 255, 64, 128)) as image: + image.save(image_path, pnginfo=info) stamp = time.time() - index * 10 os.utime(image_path, (stamp, stamp)) pid = api.db.save_prompt( @@ -120,6 +143,21 @@ def create_app(root: Path) -> web.Application: extra.parent.mkdir(exist_ok=True) shutil.copyfile(image_path, extra) api.db.link_image_to_prompt(pid, str(extra)) + if prompt_inspector: + for name, parameters in ( + ( + "empty-negative.png", + "Explicit empty negative\nNegative prompt: \n" + "Steps: 20, Sampler: Euler", + ), + ("uncertain.png", None), + ): + info = PngInfo() + if parameters: + info.add_text("parameters", parameters) + with Image.new("RGB", (64, 64), (100, 80, 120)) as image: + image.save(root / "output" / name, pnginfo=info) + os.utime(root / "output" / name, (time.time() - 100, time.time() - 100)) api._generate_gallery_thumbnails_sync(api._get_all_output_dirs(), (150, 150)) if include_video: # Seed after thumbnail generation to exercise a real unthumbnailed video. @@ -135,14 +173,16 @@ def create_app(root: Path) -> web.Application: data = await request.json() if request.can_read_body else {} extra = data.get("extra_images", 0) include_video = data.get("include_video", False) + prompt_inspector = data.get("prompt_inspector", False) if ( isinstance(extra, bool) or not isinstance(extra, int) or not 0 <= extra <= 200 or not isinstance(include_video, bool) + or not isinstance(prompt_inspector, bool) ): raise web.HTTPBadRequest() - await api._run_in_executor(seed, extra, include_video) + await api._run_in_executor(seed, extra, include_video, prompt_inspector) return web.json_response({"success": True}) @routes.post("/__test__/add-nested-image") diff --git a/tests/comfyui/prompt-sender.spec.mjs b/tests/comfyui/prompt-sender.spec.mjs new file mode 100644 index 0000000..a8beeeb --- /dev/null +++ b/tests/comfyui/prompt-sender.spec.mjs @@ -0,0 +1,68 @@ +import {execFileSync} from 'node:child_process'; +import {test,expect} from '../../tools/vendor/node_modules/@playwright/test/index.mjs'; +import {installHostHooks} from './host-fixture.mjs'; + +installHostHooks(test,['PromptManagerPair']); + +test('native image inspector previews and sends a pair into real visible widgets without loading or queueing',async({page,context,request},testInfo)=>{ + const positive=`Inspector host positive ${testInfo.project.name}`;const negative='host negative, watermark'; + const image=execFileSync(process.env.PM_TEST_PYTHON||'python',['-c',[ + 'import io,sys', + 'from PIL import Image', + 'from PIL.PngImagePlugin import PngInfo', + 'info=PngInfo()', + 'info.add_text("parameters",sys.argv[1]+"\\nNegative prompt: "+sys.argv[2]+"\\nSteps: 20, Sampler: Euler")', + 'buffer=io.BytesIO()', + 'Image.new("RGB",(64,64),(30,80,140)).save(buffer,format="PNG",pnginfo=info)', + 'sys.stdout.buffer.write(buffer.getvalue())', + ].join('\n'),positive,negative]); + const filename=`sender-${testInfo.project.name}.png`; + const upload=await request.post('/upload/image',{multipart:{image:{name:filename,mimeType:'image/png',buffer:image},type:'output',subfolder:'prompt-sender',overwrite:'true'}}); + expect(upload.ok()).toBe(true); + const id=await page.evaluate(async()=>{ + const {app}=await import('/scripts/app.js');const node=LiteGraph.createNode('PromptManagerPair');app.graph.add(node); + node.setSize([700,1000]);app.canvas.ds.scale=.8;app.canvas.centerOnNode(node); + return node.id; + }); + const nodeRoot=page.locator('.pm-pair'); + await nodeRoot.getByRole('textbox',{name:'Positive prompt',exact:true}).fill('Before positive'); + await nodeRoot.getByRole('textbox',{name:'Negative prompt',exact:true}).fill('Before negative'); + await nodeRoot.getByText('Composition · prepend / append',{exact:true}).click(); + await nodeRoot.getByRole('textbox',{name:'Prepend',exact:true}).fill('LoRA trigger'); + await nodeRoot.getByRole('textbox',{name:'Append',exact:true}).fill('fine detail'); + await page.evaluate(async()=>{ + const {app}=await import('/scripts/app.js');window.senderEffects={queue:0,load:0}; + for(const [method,key]of [['queuePrompt','queue'],['loadGraphData','load']]){ + const original=app[method];app[method]=function(...args){window.senderEffects[key]++;return original.apply(this,args);}; + } + }); + const workspace=await context.newPage();const errors=[];workspace.on('pageerror',error=>errors.push(error.message)); + try { + await workspace.goto('/prompt_manager/workspace#/images'); + await workspace.getByRole('button',{name:'Refresh',exact:true}).click(); + const card=workspace.locator('article[data-image-key]').filter({has:workspace.getByRole('button',{name:`Open ${filename}`,exact:true})}); + await card.getByRole('button',{name:`Open ${filename}`,exact:true}).click(); + const inspector=workspace.getByRole('region',{name:'Image details',exact:true}); + await expect(inspector.getByRole('region',{name:'Positive prompt',exact:true})).toContainText(positive); + await inspector.getByRole('button',{name:'Send prompt pair',exact:true}).click(); + const sender=workspace.getByRole('dialog',{name:'Send to ComfyUI',exact:true}); + const hosts=sender.getByRole('combobox',{name:'ComfyUI window',exact:true}); + await expect(hosts.locator('option')).toHaveCount(2); + await hosts.selectOption({index:1}); + await sender.getByRole('combobox',{name:'Destination node',exact:true}).selectOption({index:1}); + await sender.getByRole('button',{name:'Preview changes',exact:true}).click(); + for(const text of ['Before positive','Before negative',positive,negative,`LoRA trigger ${positive} fine detail`])await expect(sender).toContainText(text); + await expect(nodeRoot.getByRole('textbox',{name:'Positive prompt',exact:true})).toHaveValue('Before positive'); + await sender.getByRole('button',{name:'Apply to ComfyUI',exact:true}).click(); + await expect(sender).toContainText('Sent to ComfyUI.'); + await expect(nodeRoot.getByRole('textbox',{name:'Positive prompt',exact:true})).toHaveValue(positive); + await expect(nodeRoot.getByRole('textbox',{name:'Negative prompt',exact:true})).toHaveValue(negative); + const state=await page.evaluate(async id=>{ + const {app}=await import('/scripts/app.js');const node=app.graph.getNodeById(id);const serialized=node.serialize(); + return{inputs:(await app.graphToPrompt()).output[String(id)].inputs, + serialized:Object.fromEntries(node.widgets.map((widget,index)=>[widget.name,serialized.widgets_values[index]])),effects:window.senderEffects}; + },id); + for(const name of ['inputs','serialized'])expect(state[name]).toMatchObject({text:positive,negative_text:negative,prepend_text:'LoRA trigger',append_text:'fine detail'}); + expect(state.effects).toEqual({queue:0,load:0});expect(errors).toEqual([]); + } finally {await workspace.close();} +}); diff --git a/tests/js/prompt-inspector.test.js b/tests/js/prompt-inspector.test.js new file mode 100644 index 0000000..d662877 --- /dev/null +++ b/tests/js/prompt-inspector.test.js @@ -0,0 +1,36 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { inspectPath, promptRoles, createInspectionLoader } from '../../web/js/workspace/prompt-inspector.mjs'; + +test('inspection keeps exact physical root and encodes every path component', () => { + assert.equal(inspectPath({root_index:2,path:'a b/x#%.png'}), '/prompt_manager/images/inspect/a%20b/x%23%25.png?root=2'); +}); +test('only confirmed strings can be sent, including explicit empty negatives', () => { + const record = {positive:{status:'resolved',text:'full\npositive'},negative:{status:'resolved',text:''}}; + assert.deepEqual(promptRoles(record), {positive:'full\npositive',negative:''}); + for (const status of ['absent','ambiguous','unresolved','other']) { + assert.deepEqual(promptRoles({positive:{status,text:'placeholder'},negative:{status:'resolved',text:null}}), {}); + } + assert.deepEqual(promptRoles(null), {}); +}); +test('superseded requests and disposed loaders cannot replace current metadata', async () => { + const pending = [], changes = []; + const loader = createInspectionLoader({get:(url,{signal})=>new Promise(resolve=>pending.push({url,signal,resolve}))}, value=>changes.push(value)); + const first=loader.load({root_index:0,path:'one.png'}); + const second=loader.load({root_index:1,path:'one.png'}); + assert.equal(pending[0].signal.aborted,true); + pending[1].resolve({prompts:{positive:{status:'resolved',text:'latest'}}}); await second; + pending[0].resolve({prompts:{positive:{status:'resolved',text:'old'}}}); await first; + assert.equal(changes.at(-1).prompts.positive.text,'latest'); + const third=loader.load({root_index:0,path:'third.png'}); loader.dispose(); + assert.equal(pending[2].signal.aborted,true); + pending[2].resolve({prompts:{positive:{status:'resolved',text:'disposed'}}}); await third; + assert.equal(changes.at(-1).loading,true); +}); +test('failed reads report a retryable error and later reads recover', async () => { + let fail=true; const changes=[]; + const loader=createInspectionLoader({get:async()=>{if(fail)throw Error('bad');return {prompts:{}};}},value=>changes.push(value)); + await loader.load({root_index:0,path:'one.png'}); assert.equal(changes.at(-1).error,true); + fail=false; await loader.load({root_index:0,path:'one.png'}); assert.deepEqual(changes.at(-1).prompts,{}); + loader.dispose(); await loader.load({root_index:0,path:'one.png'}); assert.equal(changes.at(-1).loading,undefined); +}); diff --git a/tests/js/prompt-sender.test.js b/tests/js/prompt-sender.test.js new file mode 100644 index 0000000..70d3395 --- /dev/null +++ b/tests/js/prompt-sender.test.js @@ -0,0 +1,121 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); +const source = import('../../web/js/workspace/prompt-sender.mjs'); +const hosts = [{hostId:'host',label:'Workflow',targets:[{id:'one',label:'Positive',roles:['positive']},{id:'pair',label:'Pair',roles:['positive','negative']}]}]; +const tick = () => new Promise(resolve => setImmediate(resolve)); +function setup(createSendSession, overrides = {}, roles = {positive:'new'}) { + const calls = []; + const client = {discover:async () => hosts, preview:async (...args) => {calls.push(['preview',...args]);return {ticket:'ticket',target:{id:args[1]},fields:[{role:'positive',before:'old',after:'new'}],composition:{before:'prefix old',after:'prefix new'}};},apply:async (...args) => {calls.push(['apply',...args]);return {targetId:'one',values:{positive:'new'}};},dispose:() => calls.push(['dispose']),...overrides}; + const states = []; const session = createSendSession({client,roles,onChange:state=>states.push(state)}); + return {client,calls,states,session}; +} +test('sender requires explicit compatible host and target, preview, then acknowledged apply', async () => { + const {createSendSession} = await source; const s=setup(createSendSession); + await s.session.discover(); assert.equal(s.session.state.hostId,'');assert.equal(s.session.state.targetId,''); + await s.session.preview(); assert.equal(s.calls.length,0); + s.session.selectHost('host');assert.equal(s.session.state.targetId,''); s.session.selectTarget('one'); + await s.session.apply();assert.equal(s.calls.length,0); + await s.session.preview();assert.equal(s.session.state.phase,'ready');assert.equal(s.session.state.preview.composition.after,'prefix new'); + await s.session.apply();assert.equal(s.session.state.phase,'success');assert.equal(s.calls.filter(call=>call[0]==='apply').length,1); + await s.session.apply();assert.equal(s.calls.filter(call=>call[0]==='apply').length,1); s.session.dispose(); +}); +test('pair roles filter incompatible nodes and do not silently choose the sole destination', async()=>{ + const {createSendSession}=await source;const s=setup(createSendSession,{}, {positive:'',negative:'bad'}); + await s.session.discover();assert.deepEqual(s.session.state.hosts[0].targets.map(target=>target.id),['pair']); + s.session.selectHost('host');s.session.selectTarget('one');assert.equal(s.session.state.targetId,''); + s.session.selectTarget('pair');assert.equal(s.session.state.targetId,'pair');s.session.dispose(); +}); +test('late previews are ignored after target changes; aborted and disposed work cannot update state',async()=>{ + const {createSendSession}=await source;let resolve;const s=setup(createSendSession,{preview:()=>new Promise(done=>resolve=done)}); + await s.session.discover();s.session.selectHost('host');s.session.selectTarget('one');const pending=s.session.preview(); + s.session.selectTarget('pair');resolve({ticket:'old'});await pending;assert.equal(s.session.state.preview,null); + s.session.selectTarget('one');const pending2=s.session.preview();s.session.dispose();const count=s.states.length;resolve({ticket:'old'});await pending2;assert.equal(s.states.length,count); +}); +test('unknown apply outcome never retries a ticket and requires a new preview',async()=>{ + const {createSendSession}=await source;const s=setup(createSendSession,{apply:async()=>{throw Error('timed out');}}); + await s.session.discover();s.session.selectHost('host');s.session.selectTarget('one');await s.session.preview();await s.session.apply(); + assert.equal(s.session.state.phase,'error');assert.match(s.session.state.message,/may have applied/i);assert.equal(s.session.state.preview,null); + await s.session.apply();assert.equal(s.session.state.phase,'error');await s.session.preview();assert.equal(s.session.state.phase,'ready');s.session.dispose(); +}); +test('only matching explicit acknowledgements count as success',async()=>{ + const {createSendSession}=await source; + for(const ack of [undefined,{targetId:'other',values:{positive:'new'}},{targetId:'one',values:{positive:'wrong'}}]){ + const s=setup(createSendSession,{apply:async()=>ack});await s.session.discover();s.session.selectHost('host');s.session.selectTarget('one');await s.session.preview();await s.session.apply();assert.equal(s.session.state.phase,'error');s.session.dispose(); + } +}); +test('discovery, empty results and stale preview errors remain actionable',async()=>{ + const {createSendSession}=await source;const s=setup(createSendSession,{discover:async()=>[]});await s.session.discover();assert.match(s.session.state.message,/No compatible/i);s.session.dispose(); + const failed=setup(createSendSession,{discover:async()=>{throw Error('unavailable');}});await failed.session.discover();assert.match(failed.session.state.message,/unavailable/);failed.session.dispose(); + const stale=setup(createSendSession,{preview:async()=>{throw Error('Workflow changed. Preview again.');}});await stale.session.discover();stale.session.selectHost('host');stale.session.selectTarget('one');await stale.session.preview();assert.match(stale.session.state.message,/Workflow changed/);stale.session.dispose(); +}); +test('rediscovery invalidates selections and old discovery cannot replace new results',async()=>{ + const {createSendSession}=await source;let resolve;let count=0;const s=setup(createSendSession,{discover:()=>++count===1?new Promise(done=>resolve=done):Promise.resolve(hosts)}); + const first=s.session.discover();await s.session.discover();resolve([]);await first;assert.equal(s.session.state.hosts.length,1); + s.session.selectHost('host');s.session.selectTarget('one');await s.session.preview();await s.session.discover();assert.equal(s.session.state.hostId,'');assert.equal(s.session.state.preview,null);s.session.dispose(); +}); +test('pending apply explains closing cannot undo the sent update',async()=>{ + const {createSendSession}=await source;let done;const s=setup(createSendSession,{apply:()=>new Promise(resolve=>done=resolve)}); + await s.session.discover();s.session.selectHost('host');s.session.selectTarget('one');await s.session.preview();const pending=s.session.apply(); + assert.match(s.session.state.message,/Closing this dialog does not undo/i);s.session.dispose();done({targetId:'one',values:{positive:'new'}});await pending; +}); +function fakeDOM() { + class Node extends EventTarget { + constructor(tag){super();this.tagName=tag;this.children=[];this.attributes={};this.dataset={};this.value='';this.textContent='';this.isConnected=true;this.open=false;} + append(...children){this.children.push(...children);} + add(option){this.append(option);} + replaceChildren(...children){this.children=children;} + setAttribute(key,value){this.attributes[key]=value;} + showModal(){this.open=true;} + close(){this.open=false;this.dispatchEvent(new Event('close'));} + remove(){this.isConnected=false;} + focus(){this.focused=true;} + } + const previous={document:global.document,window:global.window,Option:global.Option}; + const body=new Node('body'); + global.document={body,createElement:tag=>new Node(tag),createElementNS:(namespace,tag)=>new Node(tag)}; + global.Option=class extends Node {constructor(text,value){super('option');this.textContent=text;this.value=value;}}; + global.window={location:new URL('https://example.test/prefix/prompt_manager/workspace'),ApiClient:{resolveUrl:()=>'/prefix/prompt_manager/'}}; + const find=(root,predicate)=>predicate(root)?root:root.children.map(child=>find(child,predicate)).find(Boolean); + return {body,Node,find,restore(){Object.assign(global,previous);}}; +} +test('native sender dialog uses prefixed namespace, full safe text, explicit choices and owned cleanup',async()=>{ + const {createPromptSender,createSendButton}=await source; + const {createScope}=await import('../../web/js/shared/toolkit/core.js'); + const dom=fakeDOM();const scope=createScope();const trigger=new dom.Node('button');let options,disposed=0; + const client={discover:async()=>hosts,preview:async()=>({ticket:'t',target:{id:'one'},fields:[{role:'positive',before:'',after:'new'}],composition:{prepend:'prefix',append:'suffix',before:null,after:null,prependConnected:true}}),apply:async()=>({targetId:'one',values:{positive:'new'}}),dispose:()=>disposed++}; + try { + const button=createSendButton('Send positive prompt');assert.equal(button.attributes['aria-label'],'Send positive prompt');assert.equal(button.children[0].attributes['aria-hidden'],'true'); + const sender=createPromptSender({scope,clientFactory:value=>{options=value;return client;}});sender.open({positive:'new'},trigger);await tick(); + assert.deepEqual(options,{namespace:'/prefix/',origin:'https://example.test'}); + const dialog=dom.body.children.at(-1);assert.equal(dialog.open,true);assert.equal(dialog.attributes['aria-label'],'Send to ComfyUI'); + const host=dom.find(dialog,node=>node.id==='prompt-sender-host');const target=dom.find(dialog,node=>node.id==='prompt-sender-target'); + assert.equal(host.value,'');assert.equal(target.value,'');host.value='host';host.dispatchEvent(new Event('change'));target.value='one';target.dispatchEvent(new Event('change')); + dom.find(dialog,node=>node.textContent==='Preview changes').dispatchEvent(new Event('click'));await tick(); + assert.ok(dom.find(dialog,node=>node.tagName==='code' && node.textContent==='(empty)'));assert.ok(dom.find(dialog,node=>node.tagName==='code' && node.textContent==='new')); + const apply=dom.find(dialog,node=>node.textContent==='Apply to ComfyUI');assert.equal(apply.className,'ca-primary');assert.equal(apply.disabled,false);apply.dispatchEvent(new Event('click'));await tick(); + assert.ok(dom.find(dialog,node=>node.textContent==='Sent to ComfyUI.'));scope.dispose();assert.equal(dialog.isConnected,false);assert.equal(trigger.focused,true);assert.equal(disposed,1); + sender.open({positive:'new'},trigger);assert.equal(dom.body.children.length,1); + } finally {scope.dispose();dom.restore();} +}); +test('unsupported client or deployment errors are visible and close stays available',async()=>{ + const {createPromptSender}=await source;const {createScope}=await import('../../web/js/shared/toolkit/core.js');const dom=fakeDOM(); + try { + for(const baseUrl of ['https://other.test/prompt_manager/','/prefix/not-prompt-manager/','/prefix/prompt_manager/']) { + const scope=createScope();const sender=createPromptSender({scope,baseUrl,clientFactory:()=>{throw Error('BroadcastChannel unavailable');}}); + sender.open({positive:'new'});const dialog=dom.body.children.at(-1);const alert=dom.find(dialog,node=>node.attributes.role==='alert');assert.match(alert.textContent,/unavailable|Invalid/); + dom.find(dialog,node=>node.textContent==='Close').dispatchEvent(new Event('click'));assert.equal(dialog.isConnected,false);scope.dispose(); + } + } finally {dom.restore();} +}); +test('approval requires an exact destination and complete unambiguous matching preview',async()=>{ + const {createSendSession}=await source; + const valid={ticket:'ticket',target:{id:'one'},fields:[{role:'positive',before:'old',after:'new'}]}; + for(const preview of [null,{}, {...valid,ticket:''},{...valid,target:{id:'other'}},{...valid,fields:[]},{...valid,fields:new Array(1)},{...valid,fields:[null]},{...valid,fields:[...valid.fields,...valid.fields]},{...valid,fields:[{role:'negative',before:'old',after:'new'}]},{...valid,fields:[{role:'positive',before:null,after:'new'}]},{...valid,fields:[{role:'positive',before:'old',after:'unexpected'}]}]) { + const s=setup(createSendSession,{preview:async()=>preview});await s.session.discover();s.session.selectHost('host');s.session.selectTarget('one');await s.session.preview(); + assert.equal(s.session.state.phase,'error');assert.equal(s.session.state.preview,null);await s.session.apply();assert.equal(s.calls.filter(call=>call[0]==='apply').length,0);s.session.dispose(); + } +}); +test('acknowledgement cannot claim an extra role beyond approved changes',async()=>{ + const {createSendSession}=await source;const s=setup(createSendSession,{apply:async()=>({targetId:'one',values:{positive:'new',negative:'also changed'}})}); + await s.session.discover();s.session.selectHost('host');s.session.selectTarget('one');await s.session.preview();await s.session.apply();assert.equal(s.session.state.phase,'error');assert.match(s.session.state.message,/unexpected acknowledgement/);s.session.dispose(); +}); diff --git a/tests/test_api_prompt_inspector.py b/tests/test_api_prompt_inspector.py new file mode 100644 index 0000000..dd271dc --- /dev/null +++ b/tests/test_api_prompt_inspector.py @@ -0,0 +1,581 @@ +"""Physical-file prompt inspection is bounded, conservative and read-only.""" + +import json +from unittest.mock import patch + +from PIL import Image, PngImagePlugin + +try: + from test_api_images import ImageAPITestCase, make_png +except ImportError: + from tests.test_api_images import ImageAPITestCase, make_png + +from utils.pair_execution import EXECUTION_KEY, record_pair_execution +from database.pair_ingestion import ingest_resolved_pair +from utils.prompt_pair_resolver import resolve_prompt_pair + + +def graph(positive="portrait", negative="blurry"): + return { + "1": {"class_type": "CLIPTextEncode", "inputs": {"text": positive}}, + "2": {"class_type": "CLIPTextEncode", "inputs": {"text": negative}}, + "3": { + "class_type": "KSampler", + "inputs": {"positive": ["1", 0], "negative": ["2", 0]}, + }, + } + + +def png(path, **metadata): + info = PngImagePlugin.PngInfo() + for key, value in metadata.items(): + info.add_text(key, value if isinstance(value, str) else json.dumps(value)) + path.parent.mkdir(parents=True, exist_ok=True) + with Image.new("RGB", (4, 4)) as image: + image.save(path, pnginfo=info) + return path + + +class TestPromptInspector(ImageAPITestCase): + async def inspect(self, path="image.png", root="0"): + params = {} if root is None else {"root": root} + response = await self.client.get( + f"/prompt_manager/images/inspect/{path}", params=params + ) + return response, await response.json() + + def side(self, text, source="graph-inferred"): + return {"status": "resolved", "text": text, "source": source} + + async def test_unindexed_graph_pair_is_read_without_indexing_or_decoding(self): + path = png(self.output_dir / "image.png", prompt=graph(negative="")) + before = path.read_bytes() + with self.api.db.model.get_connection() as connection: + rows = connection.execute("SELECT total_changes()").fetchone()[0] + with patch.object(Image.Image, "load", side_effect=AssertionError("decode")): + response, result = await self.inspect() + self.assertEqual(response.status, 200) + self.assertEqual( + result["image"], + {"root_index": 0, "path": "image.png", "filename": "image.png"}, + ) + self.assertEqual(result["prompts"]["positive"], self.side("portrait")) + self.assertEqual(result["prompts"]["negative"], self.side("")) + self.assertEqual(path.read_bytes(), before) + with self.api.db.model.get_connection() as connection: + self.assertEqual( + connection.execute("SELECT total_changes()").fetchone()[0], rows + ) + self.assertEqual( + connection.execute("SELECT COUNT(*) FROM prompts").fetchone()[0], 0 + ) + self.assertNotIn(str(self.comfy_dir), json.dumps(result)) + + async def test_root_identity_collisions_are_not_filename_fallbacks(self): + other = self.comfy_dir / "input" + other.mkdir() + first = png(self.output_dir / "image.png", prompt=graph("output")) + png(other / "image.png", prompt=graph("input")) + self._link_image(first, "Saved output") + self.api._get_all_output_dirs = lambda: [self.output_dir, other] + _, result = await self.inspect(root="1") + self.assertEqual(result["image"]["root_index"], 1) + self.assertEqual(result["prompts"]["positive"]["text"], "input") + make_png(other / "plain.png") + _, result = await self.inspect("plain.png", root="1") + self.assertEqual(result["prompts"]["positive"]["status"], "absent") + + async def test_requires_valid_root_safe_relative_path_existing_media(self): + make_png(self.output_dir / "image.png") + for root in (None, "-1", "1", "x", "0.0"): + response, result = await self.inspect(root=root) + self.assertEqual(response.status, 400, root) + self.assertNotIn(str(self.comfy_dir), json.dumps(result)) + for path in ( + "%2Fetc%2Fpasswd.png", + "..%2Fsecret.png", + "%5Csecret.png", + "bad.txt", + "null%00.png", + "C:%5Csecret.png", + ): + response, result = await self.inspect(path) + self.assertEqual(response.status, 403, path) + response, result = await self.inspect("missing.png") + self.assertEqual(response.status, 404) + outside = png(self.comfy_dir / "outside.png", prompt=graph("private")) + self._make_symlink(outside, self.output_dir / "escape.png") + response, result = await self.inspect("escape.png") + self.assertEqual(response.status, 403) + self.assertNotIn("private", json.dumps(result)) + + async def test_missing_negative_is_distinct_from_explicit_empty(self): + source = graph() + del source["3"]["inputs"]["negative"] + png(self.output_dir / "image.png", prompt=source) + _, result = await self.inspect() + self.assertEqual(result["prompts"]["positive"], self.side("portrait")) + self.assertEqual(result["prompts"]["negative"]["status"], "absent") + self.assertIsNone(result["prompts"]["negative"]["text"]) + + async def test_graph_ambiguity_and_unknown_semantics_do_not_use_saved_fallback( + self, + ): + path = self.output_dir / "image.png" + self._link_image(png(path), "Legacy saved") + for expected in ("ambiguous", "unresolved"): + source = graph() + if expected == "ambiguous": + source["4"] = source["3"] + else: + source["1"]["class_type"] = "UnknownEncoder" + png( + path, + prompt=source, + parameters=( + "Fallback\nNegative prompt: noise\n" "Steps: 20, Sampler: Euler" + ), + ) + _, result = await self.inspect() + for side in result["prompts"].values(): + self.assertEqual(side["status"], expected) + self.assertIsNone(side["text"]) + + async def test_parameters_and_partial_resolution_are_conservative(self): + path = self.output_dir / "image.png" + png(path, parameters="A mountain\nNegative prompt: \nSteps: 20, Sampler: Euler") + _, result = await self.inspect() + self.assertEqual( + result["prompts"]["positive"], + self.side("A mountain", "embedded-parameters"), + ) + self.assertEqual( + result["prompts"]["negative"], self.side("", "embedded-parameters") + ) + source = graph() + source["2"]["class_type"] = "UnknownEncoder" + png(path, prompt=source) + _, result = await self.inspect() + self.assertEqual(result["prompts"]["positive"], self.side("portrait")) + self.assertEqual(result["prompts"]["negative"]["status"], "unresolved") + + async def test_execution_evidence_wins_over_graph_and_saved_recipe(self): + source = { + "1": { + "class_type": "PromptManagerPair", + "inputs": {"text": "portrait", "negative_text": "blurry"}, + }, + "3": { + "class_type": "KSampler", + "inputs": {"positive": ["1", 0], "negative": ["1", 1]}, + }, + } + evidence = {} + record_pair_execution( + evidence, + "1", + text="portrait", + negative_text="blurry", + positive_text="portrait LoRA trigger", + negative_effective_text="blurry", + ) + path = png(self.output_dir / "image.png", prompt=source, **evidence) + self._link_image(path, "Saved recipe") + _, result = await self.inspect() + self.assertEqual( + result["prompts"]["positive"], + self.side("portrait LoRA trigger", "execution"), + ) + self.assertEqual( + result["prompts"]["negative"], self.side("blurry", "execution") + ) + png(path, prompt=source, **{EXECUTION_KEY: "broken"}) + _, result = await self.inspect() + self.assertEqual(result["prompts"]["positive"]["status"], "unresolved") + + async def test_saved_association_fallback_is_exact_and_uses_unique_context(self): + path = make_png(self.output_dir / "image.png") + self._link_image(path, "Saved positive") + _, result = await self.inspect() + self.assertEqual( + result["prompts"]["positive"], + self.side("Saved positive", "saved-association"), + ) + self.assertEqual(result["prompts"]["negative"]["status"], "absent") + other = make_png(self.output_dir / "paired.png") + metadata = {"prompt": graph("Effective positive", "Recorded negative")} + resolution = resolve_prompt_pair(metadata) + ingest_resolved_pair(self.api.db, str(other), metadata, resolution) + _, result = await self.inspect("paired.png") + self.assertEqual( + result["prompts"]["positive"], + self.side("Effective positive", "saved-association"), + ) + self.assertEqual( + result["prompts"]["negative"], + self.side("Recorded negative", "saved-association"), + ) + + async def test_corrupt_malformed_and_no_metadata_do_not_invent_text(self): + path = self.output_dir / "image.png" + for content, expected in ( + (b"broken", "unresolved"), + (None, "absent"), + ("bad-json", "unresolved"), + ): + if isinstance(content, bytes): + path.write_bytes(content) + else: + png(path, **({"prompt": content} if content else {})) + _, result = await self.inspect() + self.assertEqual(result["prompts"]["positive"]["status"], expected) + self.assertIsNone(result["prompts"]["positive"]["text"]) + + async def test_compressed_international_and_post_pixel_metadata(self): + import struct + import zlib + + path = self.output_dir / "image.png" + for kind in ( + "compressed", + "international", + "compressed-international", + "post-idat", + ): + info = PngImagePlugin.PngInfo() + value = json.dumps(graph("猫"), ensure_ascii=False) + if kind == "compressed": + info.add_text("prompt", json.dumps(graph()), zip=True) + elif kind in ("international", "compressed-international"): + info.add_itxt( + "prompt", + value, + lang="en", + tkey="Prompt", + zip=kind.startswith("compressed"), + ) + else: + payload = b"prompt\0" + json.dumps(graph()).encode() + info.add_text("unrelated", "header text") + with Image.new("RGB", (4, 4)) as image: + image.save(path, pnginfo=info) + if kind == "post-idat": + content = path.read_bytes() + chunk = ( + struct.pack(">I", len(payload)) + + b"tEXt" + + payload + + struct.pack(">I", zlib.crc32(b"tEXt" + payload)) + ) + path.write_bytes(content[:-12] + chunk + content[-12:]) + with patch.object( + Image.Image, "load", side_effect=AssertionError("pixels") + ): + _, result = await self.inspect() + self.assertEqual( + result["prompts"]["positive"]["text"], + "猫" if "international" in kind else "portrait", + ) + + async def test_corrupt_truncated_duplicate_and_expanding_metadata_fail_closed(self): + import struct + import zlib + from utils.prompt_inspector import MAX_METADATA_BYTES + + path = self.output_dir / "image.png" + base = png(path, prompt=graph()).read_bytes() + cases = [base[:-1], base[:30]] + index = base.index(b"tEXt") + broken = bytearray(base) + broken[index + 8] ^= 1 + cases.append(bytes(broken)) + for kind, payload in ( + (b"tEXt", b"prompt\0{}"), + (b"zTXt", b"prompt\0\0" + zlib.compress(b"x" * (MAX_METADATA_BYTES + 1))), + (b"tEXt", b"prompt\0" + b"x" * (MAX_METADATA_BYTES + 1)), + (b"tEXt", b"bad-key-without-separator"), + (b"zTXt", b"prompt\0\1bad-compression"), + (b"iTXt", b"prompt\0\2\0\0\0text"), + (b"iTXt", b"prompt\0\1\1\0\0text"), + (b"iTXt", b"prompt\0\0\0\0\0\xff"), + ): + chunk = ( + struct.pack(">I", len(payload)) + + kind + + payload + + struct.pack(">I", zlib.crc32(kind + payload)) + ) + cases.append(base[:-12] + chunk + base[-12:]) + for index, content in enumerate(cases): + path.write_bytes(content) + _, result = await self.inspect() + self.assertEqual( + result["prompts"]["positive"]["status"], "unresolved", index + ) + self.assertIsNone(result["prompts"]["positive"]["text"]) + + async def test_jpeg_header_only_no_metadata_and_read_failure_are_safe(self): + path = self.output_dir / "image.jpg" + with Image.new("RGB", (4, 4)) as image: + image.save(path) + with patch.object(Image.Image, "load", side_effect=AssertionError("pixels")): + response, result = await self.inspect("image.jpg") + self.assertEqual(response.status, 200) + self.assertEqual(result["prompts"]["positive"]["status"], "absent") + with patch( + "py.api.images.read_inspection_metadata", + side_effect=RuntimeError(str(self.comfy_dir)), + ): + response, result = await self.inspect("image.jpg") + self.assertEqual(response.status, 500) + self.assertNotIn(str(self.comfy_dir), json.dumps(result)) + + async def test_invalid_json_depth_and_saved_filename_collision_do_not_escape(self): + path = png(self.output_dir / "image.png", prompt="[" * 2000) + _, result = await self.inspect() + self.assertEqual(result["prompts"]["positive"]["status"], "unresolved") + self._link_image(path, "Saved first") + other = self.comfy_dir / "input" + other.mkdir() + make_png(other / "image.png") + self.api._get_all_output_dirs = lambda: [self.output_dir, other] + with patch.object( + self.api.db, + "get_image_prompt_info", + wraps=self.api.db.get_image_prompt_info, + ) as lookup: + _, result = await self.inspect(root="1") + lookup.assert_called_once_with(str(other / "image.png"), False) + self.assertEqual(result["prompts"]["positive"]["status"], "absent") + + async def test_video_inspection_uses_bounded_container_evidence(self): + import io + from unittest.mock import MagicMock + from utils.prompt_inspector import MAX_METADATA_BYTES + + (self.output_dir / "clip.mp4").write_bytes(b"video fixture") + metadata = {"prompt": graph("Video portrait", "")} + payload = json.dumps( + {"format": {"tags": {"comment": json.dumps(metadata)}}} + ).encode() + process = MagicMock() + process.stdout = io.BytesIO(payload) + process.poll.return_value = 0 + process.returncode = 0 + with ( + patch("utils.prompt_inspector.ffprobe_path", return_value="/tool/ffprobe"), + patch( + "utils.prompt_inspector.subprocess.Popen", return_value=process + ) as spawn, + ): + response, result = await self.inspect("clip.mp4") + self.assertEqual(response.status, 200) + self.assertEqual(result["prompts"]["positive"], self.side("Video portrait")) + self.assertEqual(result["prompts"]["negative"], self.side("")) + self.assertTrue(process.stdout.closed) + process.wait.assert_called() + self.assertNotIn("shell", spawn.call_args.kwargs) + self.assertIn(str(self.output_dir / "clip.mp4"), spawn.call_args.args[0]) + process.stdout = io.BytesIO(b"x" * (MAX_METADATA_BYTES + 1)) + with ( + patch("utils.prompt_inspector.ffprobe_path", return_value="/tool/ffprobe"), + patch("utils.prompt_inspector.subprocess.Popen", return_value=process), + ): + _, result = await self.inspect("clip.mp4") + self.assertEqual(result["prompts"]["positive"]["status"], "unresolved") + self.assertTrue(process.stdout.closed) + + async def test_video_missing_probe_and_timeout_preserve_uncertainty(self): + import io + from unittest.mock import MagicMock + + (self.output_dir / "clip.webm").write_bytes(b"fixture") + with patch("utils.prompt_inspector.ffprobe_path", return_value=None): + _, result = await self.inspect("clip.webm") + self.assertEqual(result["prompts"]["positive"]["status"], "unresolved") + process = MagicMock() + process.stdout = io.BytesIO(b"") + process.poll.return_value = None + process.returncode = -9 + with ( + patch("utils.prompt_inspector.ffprobe_path", return_value="/tool/ffprobe"), + patch("utils.prompt_inspector.subprocess.Popen", return_value=process), + ): + _, result = await self.inspect("clip.webm") + self.assertEqual(result["prompts"]["positive"]["status"], "unresolved") + process.kill.assert_called_once() + process.wait.assert_called() + self.assertTrue(process.stdout.closed) + + async def test_video_description_execution_evidence_and_invalid_envelope(self): + import io + from unittest.mock import MagicMock + + path = self.output_dir / "clip.mp4" + path.write_bytes(b"fixture") + source = { + "1": { + "class_type": "PromptManagerPair", + "inputs": {"text": "portrait", "negative_text": "bad"}, + }, + "3": { + "class_type": "KSampler", + "inputs": {"positive": ["1", 0], "negative": ["1", 1]}, + }, + } + evidence = {} + record_pair_execution( + evidence, + "1", + text="portrait", + negative_text="bad", + positive_text="portrait trigger", + negative_effective_text="bad", + ) + for value in ( + { + "format": { + "tags": { + "comment": "not-json", + "description": json.dumps({"prompt": source, **evidence}), + } + } + }, + [], + {"format": {"tags": []}}, + {"format": {"tags": {}}}, + { + "format": { + "tags": { + "comment": json.dumps( + {"prompt": source, EXECUTION_KEY: "bad-json"} + ) + } + } + }, + ): + process = MagicMock() + process.stdout = io.BytesIO(json.dumps(value).encode()) + process.poll.return_value = 0 + process.returncode = 0 + with ( + patch( + "utils.prompt_inspector.ffprobe_path", return_value="/tool/ffprobe" + ), + patch("utils.prompt_inspector.subprocess.Popen", return_value=process), + ): + _, result = await self.inspect("clip.mp4") + positive = result["prompts"]["positive"] + if ( + isinstance(value, list) + or not isinstance(value["format"]["tags"], dict) + or "bad-json" in json.dumps(value) + ): + self.assertEqual(positive["status"], "unresolved") + elif not value["format"]["tags"]: + self.assertEqual(positive["status"], "absent") + else: + self.assertEqual(positive, self.side("portrait trigger", "execution")) + + async def test_large_sparse_pixels_are_skipped_and_chunk_count_is_bounded(self): + import struct + import zlib + from utils.prompt_inspector import read_inspection_metadata, MetadataReadError + + path = self.output_dir / "large.png" + header = struct.pack(">IIBBBBB", 1024, 1024, 8, 2, 0, 0, 0) + + def chunk(kind, data): + return ( + struct.pack(">I", len(data)) + + kind + + data + + struct.pack(">I", zlib.crc32(kind + data)) + ) + + with path.open("wb") as stream: + stream.write(b"\x89PNG\r\n\x1a\n" + chunk(b"IHDR", header)) + stream.write(struct.pack(">I4s", 64 * 1024 * 1024, b"IDAT")) + stream.seek(64 * 1024 * 1024, 1) + stream.write(b"\0\0\0\0") + stream.write(chunk(b"tEXt", b"prompt\0" + json.dumps(graph()).encode())) + stream.write(chunk(b"IEND", b"")) + original_open = type(path).open + reads = [] + + def tracked_open(item, *args, **kwargs): + stream = original_open(item, *args, **kwargs) + original_read = stream.read + + def read(size=-1): + value = original_read(size) + reads.append(len(value)) + return value + + stream.read = read + return stream + + with patch.object(type(path), "open", tracked_open): + metadata = read_inspection_metadata(path) + self.assertEqual(json.loads(metadata["prompt"]), graph()) + self.assertLess(sum(reads), 4096) + with patch("utils.prompt_inspector.MAX_PNG_CHUNKS", 1): + with self.assertRaises(MetadataReadError): + read_inspection_metadata(path) + + async def test_large_jpeg_uses_bounded_header_without_rejecting_valid_file(self): + from utils.prompt_inspector import MAX_HEADER_BYTES + + path = self.output_dir / "large.jpg" + with Image.new("RGB", (4, 4)) as image: + image.save(path) + with path.open("ab") as stream: + stream.write(b"x" * (MAX_HEADER_BYTES + 1)) + self._link_image(path, "Saved large JPEG") + with patch.object(Image.Image, "load", side_effect=AssertionError("pixels")): + _, result = await self.inspect("large.jpg") + self.assertEqual( + result["prompts"]["positive"], + self.side("Saved large JPEG", "saved-association"), + ) + + async def test_invalid_or_execution_only_video_evidence_never_uses_saved_fallback( + self, + ): + import io + from unittest.mock import MagicMock + + path = self.output_dir / "clip.mp4" + path.write_bytes(b"fixture") + self._link_image(path, "Saved recipe must not replace unknown evidence") + for envelope in ( + {"prompt": None}, + {"parameters": None}, + {EXECUTION_KEY: {"version": 1, "nodes": {}}}, + ): + process = MagicMock() + process.stdout = io.BytesIO( + json.dumps( + { + "format": { + "tags": { + "comment": json.dumps(envelope), + "description": json.dumps( + {"prompt": graph("Other comment")} + ), + } + } + } + ).encode() + ) + process.poll.return_value = 0 + process.returncode = 0 + with ( + patch( + "utils.prompt_inspector.ffprobe_path", return_value="/tool/ffprobe" + ), + patch("utils.prompt_inspector.subprocess.Popen", return_value=process), + ): + _, result = await self.inspect("clip.mp4") + self.assertEqual(result["prompts"]["positive"]["status"], "unresolved") + self.assertIsNone(result["prompts"]["positive"]["text"]) diff --git a/tools/vendor/frontend-coverage-baseline.json b/tools/vendor/frontend-coverage-baseline.json index 7c7a753..ba3c41b 100644 --- a/tools/vendor/frontend-coverage-baseline.json +++ b/tools/vendor/frontend-coverage-baseline.json @@ -190,5 +190,17 @@ "branches": 93, "functions": 98, "statements": 98 + }, + "workspace/prompt-inspector.mjs": { + "lines": 97, + "branches": 92, + "functions": 98, + "statements": 97 + }, + "workspace/prompt-sender.mjs": { + "lines": 98, + "branches": 89, + "functions": 98, + "statements": 98 } } diff --git a/utils/prompt_inspector.py b/utils/prompt_inspector.py new file mode 100644 index 0000000..7ea2d00 --- /dev/null +++ b/utils/prompt_inspector.py @@ -0,0 +1,271 @@ +"""Read prompt evidence without inference, indexing, or decoding image pixels.""" + +import io +import json +import struct +import subprocess # nosec B404 +import threading +import zlib +from pathlib import Path +from typing import Any + +from PIL import Image + +from .pair_execution import EXECUTION_KEY +from .prompt_pair_resolver import resolve_prompt_pair +from .video_metadata import ffprobe_path, is_video_path, metadata_from_tags + +MAX_METADATA_BYTES = 2 * 1024 * 1024 +MAX_HEADER_BYTES = 8 * 1024 * 1024 +MAX_PNG_CHUNKS = 10_000 +_METADATA_KEYS = frozenset({"prompt", "parameters", EXECUTION_KEY}) +_SIGNATURE = b"\x89PNG\r\n\x1a\n" + + +class MetadataReadError(ValueError): + """Prompt evidence is unreadable, incomplete, or exceeds inspection limits.""" + + +def _inflate(data: bytes) -> bytes: + inflater = zlib.decompressobj() + result = inflater.decompress(data, MAX_METADATA_BYTES + 1) + if len(result) > MAX_METADATA_BYTES or not inflater.eof or inflater.unused_data: + raise MetadataReadError("Compressed metadata is invalid or exceeds limits") + return result + + +def _png_text(kind: bytes, data: bytes) -> tuple[str, str]: + keyword, separator, body = data.partition(b"\0") + if not separator or not 1 <= len(keyword) <= 79: + raise MetadataReadError("Malformed PNG text metadata") + key = keyword.decode("latin-1") + encoding = "latin-1" + if kind == b"zTXt": + if not body or body[0] != 0: + raise MetadataReadError("Unsupported PNG text compression") + body = _inflate(body[1:]) + elif kind == b"iTXt": + if len(body) < 2 or body[0] not in (0, 1): + raise MetadataReadError("Malformed international PNG metadata") + flag, method = body[:2] + fields = body[2:].split(b"\0", 2) + if len(fields) != 3 or (flag and method != 0): + raise MetadataReadError("Malformed international PNG metadata") + fields[0].decode("ascii") + fields[1].decode("utf-8") + body = _inflate(fields[2]) if flag else fields[2] + encoding = "utf-8" + if b"\0" in body: + raise MetadataReadError("Malformed PNG text metadata") + return key, body.decode(encoding) + + +def _png_metadata(stream: Any, size: int) -> dict: + """CRC-check text and structural chunks, seeking past compressed pixels. + + PNG text chunks may follow IDAT. Pillow's ``.text`` loads pixels to find + them; this bounded reader instead follows the W3C PNG chunk layout. + IDAT checksums/pixel validity are deliberately outside metadata inspection. + """ + found, compressed_size, expanded_size = {}, 0, 0 + saw_header = saw_pixels = False + for index in range(MAX_PNG_CHUNKS): + header = stream.read(8) + if len(header) != 8: + raise MetadataReadError("Incomplete PNG metadata") + length, kind = struct.unpack(">I4s", header) + if length > 0x7FFFFFFF or stream.tell() + length + 4 > size: + raise MetadataReadError("Incomplete PNG chunk") + if index == 0 and (kind != b"IHDR" or length != 13): + raise MetadataReadError("Missing PNG header") + if kind in (b"tEXt", b"zTXt", b"iTXt", b"IHDR", b"IEND"): + compressed_size += length + if compressed_size > MAX_METADATA_BYTES: + raise MetadataReadError("Metadata exceeds inspection limits") + data, checksum = stream.read(length), stream.read(4) + if zlib.crc32(kind + data) != int.from_bytes(checksum, "big"): + raise MetadataReadError("PNG metadata checksum mismatch") + if kind == b"IHDR": + if saw_header or not all(struct.unpack(">II", data[:8])): + raise MetadataReadError("Malformed PNG header") + saw_header = True + elif kind == b"IEND": + if length or not saw_pixels: + raise MetadataReadError("Incomplete PNG image") + return found + else: + key, value = _png_text(kind, data) + expanded_size += len(value.encode("utf-8")) + if expanded_size > MAX_METADATA_BYTES: + raise MetadataReadError("Metadata exceeds inspection limits") + if key in _METADATA_KEYS: + if key in found: + raise MetadataReadError("Duplicate prompt metadata") + found[key] = value + else: + saw_pixels |= kind == b"IDAT" + stream.seek(length + 4, 1) + raise MetadataReadError("PNG chunk count exceeds inspection limits") + + +def _video_metadata(path: Path) -> dict: + probe = ffprobe_path() + if not probe: + raise MetadataReadError("Video metadata reader is unavailable") + command = [ + probe, + "-v", + "quiet", + "-show_entries", + "format_tags=comment,description", + "-of", + "json", + str(path), + ] + process = subprocess.Popen( # nosec B603 + command, + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL, + creationflags=getattr(subprocess, "CREATE_NO_WINDOW", 0), + ) + + def stop() -> None: + if process.poll() is None: + try: + process.kill() + except OSError: + pass + + timer = threading.Timer(3, stop) + timer.daemon = True + timer.start() + try: + raw = process.stdout.read(MAX_METADATA_BYTES + 1) + if len(raw) > MAX_METADATA_BYTES: + raise MetadataReadError("Video metadata exceeds inspection limits") + process.wait() + if process.returncode: + raise MetadataReadError("Video metadata could not be read") + finally: + timer.cancel() + stop() + process.wait() + process.stdout.close() + probed = json.loads(raw) + if not isinstance(probed, dict) or not isinstance(probed.get("format"), dict): + raise MetadataReadError("Malformed video metadata") + tags = probed["format"].get("tags", {}) + if not isinstance(tags, dict): + raise MetadataReadError("Malformed video metadata") + # The scan normalizer drops null fields and unknown keys. Inspection must + # retain explicit prompt/execution markers so malformed evidence cannot + # silently fall back to an unrelated saved recipe or another comment. + for key in ("comment", "description"): + raw = tags.get(key) + if not isinstance(raw, str): + continue + try: + envelope = json.loads(raw) + except ValueError: + continue + if not isinstance(envelope, dict) or not _METADATA_KEYS.intersection(envelope): + continue + metadata = metadata_from_tags({key: raw}) + for field in _METADATA_KEYS.intersection(envelope): + value = envelope[field] + metadata[field] = ( + value if value is None or isinstance(value, str) else json.dumps(value) + ) + return metadata + return {} + + +def read_inspection_metadata(path: Path) -> dict: + """Return bounded, header-only metadata or raise a response-safe error.""" + try: + if is_video_path(path): + metadata = _video_metadata(path) + else: + with path.open("rb") as stream: + signature = stream.read(8) + if signature == _SIGNATURE: + return _png_metadata(stream, path.stat().st_size) + stream.seek(0) + header = stream.read(MAX_HEADER_BYTES) + with Image.open(io.BytesIO(header)) as image: + metadata = dict(image.info) + result, size = {}, 0 + for key in _METADATA_KEYS: + if key not in metadata: + continue + value = metadata[key] + if not isinstance(value, str): + raise MetadataReadError("Malformed prompt metadata") + size += len(value.encode("utf-8")) + if size > MAX_METADATA_BYTES: + raise MetadataReadError("Metadata exceeds inspection limits") + result[key] = value + return result + except MetadataReadError: + raise + except ( + OSError, + ValueError, + EOFError, + SyntaxError, + RecursionError, + struct.error, + zlib.error, + ): + raise MetadataReadError("Media metadata could not be read") from None + + +def _side(status: str, text: str | None = None, source: str | None = None) -> dict: + return {"status": status, "text": text, "source": source} + + +def inspect_prompt_roles(metadata: dict, saved: dict | None = None) -> dict: + """Keep uncertainty visible; a saved association never replaces file evidence.""" + if not metadata: + context = saved.get("pair_context") if saved else None + if isinstance(context, dict) and all( + isinstance(context.get(f"{role}_text"), str) + for role in ("positive", "negative") + ): + return { + role: _side("resolved", context[f"{role}_text"], "saved-association") + for role in ("positive", "negative") + } + positive = saved.get("text") if saved else None + return { + "positive": ( + _side("resolved", positive, "saved-association") + if isinstance(positive, str) + else _side("absent") + ), + "negative": _side("absent"), + } + canonical = dict(metadata) + if "prompt" not in canonical and "parameters" not in canonical: + return {role: _side("unresolved") for role in ("positive", "negative")} + if isinstance(canonical.get("prompt"), str): + try: + canonical["prompt"] = json.loads(canonical["prompt"]) + except (ValueError, RecursionError): + return {role: _side("unresolved") for role in ("positive", "negative")} + resolution = resolve_prompt_pair(canonical) + state = resolution["state"] + result = {} + for role in ("positive", "negative"): + side = resolution[role] + if ( + state != "ambiguous" + and isinstance(side, dict) + and (role == "negative" or side["text"].strip()) + ): + result[role] = _side( + "resolved", side["text"], side["provenance"]["text_source"] + ) + else: + result[role] = _side(state if state != "resolved" else "unresolved") + return result diff --git a/web/js/workspace/images.css b/web/js/workspace/images.css index 4881459..cf225b7 100644 --- a/web/js/workspace/images.css +++ b/web/js/workspace/images.css @@ -57,3 +57,46 @@ main.images-main { max-inline-size: none; padding: 28px; } } .image-continuation button[aria-disabled="true"] { opacity: .55; cursor: wait; } .options-status { font-size: 12px; padding-inline: 4px; } + +.prompt-inspector { margin-block-start: 22px; min-inline-size: 0; } +.prompt-block { border: 1px solid var(--ca-line); border-inline-start: 3px solid var(--prompt-role); border-radius: 7px; padding: 14px; margin-block-end: 14px; min-inline-size: 0; } +.prompt-positive { --prompt-role: #6bd6a4; } +[data-ca-theme="light"] .prompt-positive { --prompt-role: #14784f; } +.prompt-negative { --prompt-role: #ff7f7f; } +[data-ca-theme="light"] .prompt-negative { --prompt-role: #b51d2d; } +.prompt-block h3 { font-size: 12px; margin: 0 0 8px; color: var(--prompt-role); } +.prompt-source, .prompt-empty, .prompt-block > .muted { font-size: 11px; } +.prompt-text { font: inherit; font-size: 12px; line-height: 1.65; white-space: pre-wrap; overflow-wrap: anywhere; margin-block: 12px; } +.prompt-text:focus-visible { outline: 2px solid var(--ca-focus); outline-offset: 3px; } +.prompt-actions { display: flex; flex-wrap: wrap; gap: 8px; } +.prompt-actions button { font-size: 11px; } +.prompt-copy-status { font-size: 11px; margin-block-end: 0; } +.prompt-copy-status:empty { display: none; } +.image-preview-body { display: grid; grid-template-columns: minmax(0, 1fr) minmax(270px, 340px); } +.image-preview-details { padding: 0 18px 18px; max-block-size: 75dvh; overflow: auto; min-inline-size: 0; } +.image-preview-details .prompt-inspector { margin-block-start: 0; } +.image-preview > header { border-block-end: 1px solid var(--ca-line); } +.prompt-send-button { display: inline-flex; align-items: center; justify-content: center; gap: 7px; color: var(--ca-focus); } +.prompt-send-button svg { inline-size: 16px; block-size: 16px; flex-shrink: 0; } +.prompt-sender { background: var(--ca-surface); color: var(--ca-text); border: 1px solid var(--ca-line); border-radius: 12px; padding: 22px; inline-size: min(760px, calc(100% - 32px)); max-inline-size: none; max-block-size: calc(100dvh - 32px); overflow: auto; } +.prompt-sender::backdrop { background: #000b; } +.prompt-sender-header, .prompt-sender-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; } +.prompt-sender-header h2 { font-size: 20px; margin: 0; } +.prompt-sender-options { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; margin-block: 20px; } +.prompt-sender-options .ca-field { display: flex; flex-direction: column; align-items: stretch; gap: 6px; } +.prompt-sender select { inline-size: 100%; min-block-size: 38px; } +.prompt-sender-status { font-size: 13px; line-height: 1.6; } +.prompt-sender-status[role="alert"] { color: var(--ca-error-text); } +.prompt-sender-preview { margin-block: 20px; min-inline-size: 0; } +.prompt-sender-field { border: 1px solid var(--ca-line); border-radius: 7px; padding: 14px; margin-block: 12px; min-inline-size: 0; } +.prompt-sender-field :where(pre, textarea), .prompt-sender-composition { white-space: pre-wrap; overflow-wrap: anywhere; font: inherit; font-size: 12px; line-height: 1.65; max-inline-size: 100%; } +.prompt-sender-field textarea { inline-size: 100%; min-block-size: 100px; resize: vertical; } +.prompt-sender-composition { padding: 12px; background: var(--ca-field); border-radius: 6px; } +.prompt-sender-actions { justify-content: flex-end; margin-block-start: 18px; } +@media (max-width: 780px) { + .image-preview-body { grid-template-columns: minmax(0, 1fr); } + .image-preview-stage { block-size: 52dvh; } + .image-preview-details { max-block-size: none; } + .image-preview { max-block-size: calc(100dvh - 24px); overflow: auto; } + .prompt-sender-options { grid-template-columns: minmax(0, 1fr); } +} diff --git a/web/js/workspace/images.mjs b/web/js/workspace/images.mjs index bdf3d2e..22e0f5d 100644 --- a/web/js/workspace/images.mjs +++ b/web/js/workspace/images.mjs @@ -1,6 +1,8 @@ import { createScope, createButton, createField, createSelect } from '../shared/toolkit/core.js'; import { createImageStream, imageKey } from './images-state.mjs'; import { layoutImages, visibleImages } from './image-layout.mjs'; +import { mountPromptInspector } from './prompt-inspector.mjs'; +import { createPromptSender } from './prompt-sender.mjs'; function el(tag, text, className) { const element = document.createElement(tag); @@ -19,6 +21,9 @@ export function mountImages(main, api, parentScope) { const scope = createScope(); parentScope.cleanup(() => scope.dispose()); const { resolveUrl } = window.ApiClient; + const sender = createPromptSender({scope}); + let detailInspector, previewInspector; + scope.cleanup(() => { detailInspector?.dispose(); previewInspector?.dispose(); }); const visit = lastVisit; let layout = visit?.layout || 'grid', selection = visit?.selection || null, frame = 0, loadFrame = 0, restoreFrame = 0, observer, viewer; let state, geometry = { positions: [], height: 0, maxHeight: 0 }, optionsRequest; @@ -107,11 +112,17 @@ export function mountImages(main, api, parentScope) { const close = createButton('Close preview'); dialogHeader.append(previewTitle, close); const stage = el('div', undefined, 'image-preview-stage'); - dialog.append(dialogHeader, stage); + const previewBody = el('div', undefined, 'image-preview-body'); + const previewDetails = el('aside', undefined, 'image-preview-details'); + previewDetails.setAttribute('aria-label', 'Preview prompt details'); + previewBody.append(stage, previewDetails); + dialog.append(dialogHeader, previewBody); main.append(dialog); scope.listen(close, 'click', () => dialog.close()); scope.listen(dialog, 'close', () => { destroyPreview(); scheduleLoad(); }); function destroyPreview() { + previewInspector?.dispose(); previewInspector = null; + previewDetails.replaceChildren(); viewer?.destroy(); viewer = null; for (const video of stage.querySelectorAll('video')) releaseVideo(video); stage.replaceChildren(); @@ -130,6 +141,7 @@ export function mountImages(main, api, parentScope) { video.pause(); video.removeAttribute('src'); video.load(); } function inspect(image) { + detailInspector?.dispose(); selection = imageKey(image); for (const video of details.querySelectorAll('video')) releaseVideo(video); const thumbnail = mediaElement(image); @@ -145,8 +157,10 @@ export function mountImages(main, api, parentScope) { preview.dataset.previewKey = selection; const download = el('a', 'Download original', 'workspace-link'); download.href = resolveUrl(image.url); download.download = image.filename; - const legacy = el('p', 'Open Current gallery for prompt details and tagging.', 'muted'); - details.replaceChildren(el('p', 'SELECTED IMAGE', 'eyebrow'), el('h2', image.filename), thumbnail, metadata, preview, download, legacy); + const prompts = el('div'); + const legacy = el('p', 'Open Current gallery for tagging.', 'muted'); + details.replaceChildren(el('p', 'SELECTED IMAGE', 'eyebrow'), el('h2', image.filename), thumbnail, preview, download, prompts, metadata, legacy); + detailInspector = mountPromptInspector(prompts, {api, image, sender, parentScope:scope}); for (const [key, card] of rendered) { card.classList.toggle('selected', key === selection); card.querySelector('.image-open').setAttribute('aria-pressed', String(key === selection)); @@ -161,6 +175,7 @@ export function mountImages(main, api, parentScope) { if (selection !== imageKey(image)) inspect(image); destroyPreview(); previewTitle.textContent = image.filename; + previewInspector = mountPromptInspector(previewDetails, {api, image, sender, parentScope:scope}); if (!dialog.open) dialog.showModal(); if (image.is_video) { const video = el('video'); video.controls = true; video.src = resolveUrl(image.url); video.preload = 'metadata'; @@ -315,6 +330,7 @@ export function mountImages(main, api, parentScope) { observer.observe(continuation); } function reset() { + detailInspector?.dispose(); detailInspector = null; selection = null; for (const video of details.querySelectorAll('video')) releaseVideo(video); details.replaceChildren(el('h2', 'Image details'), el('p', 'Select an image to inspect it.')); diff --git a/web/js/workspace/prompt-inspector.mjs b/web/js/workspace/prompt-inspector.mjs new file mode 100644 index 0000000..e4367da --- /dev/null +++ b/web/js/workspace/prompt-inspector.mjs @@ -0,0 +1,124 @@ +import { createScope, createButton } from '../shared/toolkit/core.js'; +import { createSendButton } from './prompt-sender.mjs'; + +export function inspectPath(image) { + return `/prompt_manager/images/inspect/${image.path.split('/').map(encodeURIComponent).join('/')}?root=${image.root_index}`; +} + +export function promptRoles(prompts) { + return Object.fromEntries(['positive', 'negative'].filter(role => prompts?.[role]?.status === 'resolved' && typeof prompts[role].text === 'string').map(role => [role, prompts[role].text])); +} + +export function createInspectionLoader(api, onChange) { + let request, disposed = false; + return { + async load(image) { + if (disposed) return; + request?.abort(); + const current = request = new AbortController(); + onChange({ loading: true }); + try { + const result = await api.get(inspectPath(image), {signal:current.signal}); + if (!disposed && request === current) onChange({prompts:result.prompts}); + } catch { + if (!disposed && request === current) onChange({error:true}); + } + }, + dispose() { disposed = true; request?.abort(); }, + }; +} + +const sources = { + execution: 'Recorded at execution', + 'graph-inferred': 'Inferred from the saved workflow', + 'embedded-parameters': 'Embedded generation parameters', + 'saved-association': 'Saved library association', +}; +const statuses = { + absent: 'Not recorded in this file.', + ambiguous: 'Multiple possible prompts. Source could not be determined.', + unresolved: 'Prompt could not be resolved.', +}; +function el(tag, text, className) { + const node = document.createElement(tag); + if (text !== undefined) node.textContent = text; + if (className) node.className = className; + return node; +} + +export function mountPromptInspector(container, {api, image, sender, parentScope}) { + const scope = createScope(); + const dispose = () => scope.dispose(); + parentScope.signal.addEventListener('abort', dispose, {once:true}); + scope.cleanup(() => parentScope.signal.removeEventListener('abort', dispose)); + container.classList.add('prompt-inspector'); + const loader = createInspectionLoader(api, render); + scope.cleanup(() => loader.dispose()); + scope.listen(container, 'click', async event => { + const send = event.target.closest('[data-send-role]'); + if (send) { + const role = send.dataset.sendRole; + sender.open(role === 'pair' ? roles : {[role]:roles[role]}, send); + } + const copy = event.target.closest('[data-copy-role]'); + if (copy) { + const role = copy.dataset.copyRole; + const status = copy.closest('section').querySelector('.prompt-copy-status'); + try { + await navigator.clipboard.writeText(roles[role]); + if (!scope.signal.aborted) status.textContent = 'Copied.'; + } catch { + if (!scope.signal.aborted) status.textContent = 'Copy unavailable. Select the prompt text to copy it.'; + } + } + if (event.target.closest('[data-retry-prompts]')) loader.load(image); + }); + let roles = {}; + function render(state) { + roles = {}; + container.replaceChildren(); + if (state.loading || state.error) { + const status = el('p', state.loading ? 'Loading prompts…' : 'Could not read prompts from this file.', 'muted'); + status.setAttribute('role', state.error ? 'alert' : 'status'); + container.append(status); + if (state.error) { + const retry = createButton('Retry prompt details'); + retry.dataset.retryPrompts = ''; + container.append(retry); + } + return; + } + roles = promptRoles(state.prompts); + for (const role of ['positive', 'negative']) { + const title = `${role[0].toUpperCase() + role.slice(1)} prompt`; + const record = state.prompts?.[role]; + const block = el('section', undefined, `prompt-block prompt-${role}`); + block.setAttribute('aria-label', title); + block.append(el('h3', title)); + if (Object.hasOwn(roles, role)) { + block.append(el('p', sources[record.source] || 'Source not recorded', 'prompt-source muted')); + if (roles[role] === '') block.append(el('p', `Empty ${role} prompt`, 'prompt-empty')); + else { + const text = el('pre', roles[role], 'prompt-text'); + text.tabIndex = 0; + block.append(text); + } + const actions = el('div', undefined, 'prompt-actions'); + const send = createSendButton(`Send ${role} prompt`); + send.dataset.sendRole = role; + const copy = createButton(`Copy ${role} prompt`); + copy.dataset.copyRole = role; + actions.append(send, copy); + const status = el('p', '', 'prompt-copy-status muted'); status.setAttribute('role', 'status'); + block.append(actions, status); + } else block.append(el('p', statuses[record?.status] || statuses.unresolved, 'muted')); + container.append(block); + } + if (Object.hasOwn(roles, 'positive') && Object.hasOwn(roles, 'negative')) { + const pair = createSendButton('Send prompt pair'); pair.dataset.sendRole = 'pair'; + container.append(pair); + } + } + loader.load(image); + return {dispose:() => scope.dispose()}; +} diff --git a/web/js/workspace/prompt-sender.mjs b/web/js/workspace/prompt-sender.mjs new file mode 100644 index 0000000..8d33a00 --- /dev/null +++ b/web/js/workspace/prompt-sender.mjs @@ -0,0 +1,155 @@ +import {createBridgeClient, validateRoles} from '../shared/toolkit/prompt-bridge.js'; +import {createButton, createField, createScope, createSelect} from '../shared/toolkit/core.js'; + +export function createSendSession({client, roles:rawRoles, onChange}) { + const roles = Object.freeze(validateRoles(rawRoles)); + let state = {phase:'idle',hosts:[],hostId:'',targetId:'',preview:null,message:''}; + let operation, generation = 0, disposed = false; + const emit = patch => { if (!disposed) { state = Object.freeze({...state,...patch}); onChange(state); } }; + function invalidate() { generation++; operation?.abort(); operation = null; } + function begin(phase) { invalidate(); operation = new AbortController(); emit({phase,preview:null,message:''}); return {signal:operation.signal,version:generation}; } + const current = request => !disposed && generation === request.version; + const selected = () => state.hosts.find(host=>host.hostId===state.hostId)?.targets.find(target=>target.id===state.targetId); + return { + get state() { return state; }, + async discover() { + if (disposed) return; + const request = begin('discovering'); emit({hosts:[],hostId:'',targetId:'',message:'Looking for ComfyUI windows…'}); + try { + const found = await client.discover({signal:request.signal}); + if (!current(request)) return; + const hosts = found.map(host=>({...host,targets:host.targets.filter(target=>typeof target.id==='string' && Array.isArray(target.roles) && Object.keys(roles).every(role=>target.roles.includes(role)))})).filter(host=>host.targets.length); + emit({phase:'select',hosts,message:hosts.length ? 'Choose a ComfyUI window and destination node.' : 'No compatible ComfyUI windows found. Open a workflow with a compatible Prompt Manager node, then find windows again.'}); + } catch (error) { if (current(request)) emit({phase:'error',message:error.message}); } + }, + selectHost(hostId) { if (disposed) return; invalidate(); emit({phase:'select',hostId:state.hosts.some(host=>host.hostId===hostId)?hostId:'',targetId:'',preview:null,message:'Choose a destination node, then preview changes.'}); }, + selectTarget(targetId) { if (disposed) return; invalidate(); const host=state.hosts.find(host=>host.hostId===state.hostId); emit({phase:'select',targetId:host?.targets.some(target=>target.id===targetId)?targetId:'',preview:null,message:'Preview changes before applying.'}); }, + async preview() { + if (disposed || !selected() || ['previewing','applying'].includes(state.phase)) return; + const request=begin('previewing'); + try { + const preview=await client.preview(state.hostId,state.targetId,roles,{signal:request.signal}); + if (!current(request)) return; + const fields=preview?.fields; + if(typeof preview?.ticket!=='string' || !preview.ticket || preview.target?.id!==state.targetId || !Array.isArray(fields) || fields.length!==Object.keys(roles).length || new Set(fields.map(field=>field?.role)).size!==fields.length || Array.from(fields).some(field=>!field || !Object.hasOwn(roles,field.role) || typeof field.before!=='string' || field.after!==roles[field.role])) throw Error('ComfyUI returned an unexpected preview. Find the destination and preview again.'); + emit({phase:'ready',preview,message:'Review the complete changes, then apply.'}); + } catch(error) { if(current(request)) emit({phase:'error',preview:null,message:error.message}); } + }, + async apply() { + if(disposed || state.phase!=='ready' || !state.preview) return; + const {ticket}=state.preview; const targetId=state.targetId; const hostId=state.hostId; + const request=begin('applying'); + emit({message:'Waiting for ComfyUI confirmation. Closing this dialog does not undo a sent update.'}); + try { + const acknowledgement=await client.apply(hostId,ticket,{signal:request.signal}); + if(!current(request)) return; + if(acknowledgement?.targetId!==targetId || !acknowledgement.values || Object.keys(acknowledgement.values).length!==Object.keys(roles).length || Object.keys(roles).some(role=>!Object.hasOwn(acknowledgement.values,role) || acknowledgement.values[role]!==roles[role])) throw Error('ComfyUI returned an unexpected acknowledgement.'); + emit({phase:'success',message:'Sent to ComfyUI.'}); + } catch(error) { if(current(request)) emit({phase:'error',preview:null,message:`No confirmation received. The update may have applied. Check ComfyUI, then preview again. ${error.message}`}); } + }, + dispose() { if(disposed) return; disposed=true; invalidate(); client.dispose(); }, + }; +} + +function element(tag,text,className) { + const node=document.createElement(tag); + if(text!==undefined) node.textContent=text; + if(className) node.className=className; + return node; +} + +export function createSendButton(label='Send to ComfyUI') { + const button=createButton('', 'prompt-send-button'); + button.setAttribute('aria-label',label); + const icon=document.createElementNS('http://www.w3.org/2000/svg','svg'); + icon.setAttribute('viewBox','0 0 24 24');icon.setAttribute('aria-hidden','true');icon.setAttribute('fill','none');icon.setAttribute('stroke','currentColor');icon.setAttribute('stroke-width','1.8'); + const path=document.createElementNS('http://www.w3.org/2000/svg','path'); + path.setAttribute('d','M21 3 9.5 14.5M21 3l-7 18-4.5-6.5L3 10z');icon.append(path); + button.append(icon,element('span',label)); + return button; +} + +export function createPromptSender({scope,baseUrl=window.ApiClient.resolveUrl('/prompt_manager/'),clientFactory=createBridgeClient}) { + let active; + const close = () => active?.dispose(); + scope.cleanup(close); + return {open(roles,trigger) { + if(scope.signal.aborted) return; + close(); + const local=createScope(); + const dialog=element('dialog',undefined,'prompt-sender'); + dialog.setAttribute('aria-label','Send to ComfyUI'); + const header=element('header',undefined,'prompt-sender-header'); + const title=element('h2','Send to ComfyUI');const dismiss=createButton('Close'); + header.append(title,dismiss); + const description=element('p','Choose where to send this prompt. Nothing changes until you approve the preview.'); + const status=element('p','', 'prompt-sender-status');status.setAttribute('role','status');status.setAttribute('aria-live','polite'); + const host=createSelect([['','Choose a ComfyUI window']], ''); + const target=createSelect([['','Choose a destination node']], ''); + const controls=element('div',undefined,'prompt-sender-options'); + controls.append(createField('ComfyUI window',host,'prompt-sender-host'),createField('Destination node',target,'prompt-sender-target')); + const preview=element('section',undefined,'prompt-sender-preview');preview.setAttribute('aria-label','Prompt changes'); + const find=createButton('Find ComfyUI windows');const inspect=createButton('Preview changes');const apply=createButton('Apply to ComfyUI','ca-primary'); + inspect.disabled=true;apply.disabled=true; + const actions=element('footer',undefined,'prompt-sender-actions');actions.append(find,inspect,apply); + dialog.append(header,description,controls,status,preview,actions);document.body.append(dialog); + let session,closed=false; + function dispose() { + if(closed) return;closed=true;local.dispose();session?.dispose(); + if(dialog.open) dialog.close();dialog.remove(); + if(active?.dialog===dialog) active=null; + if(trigger?.isConnected) trigger.focus(); + } + active={dialog,dispose}; + local.listen(dismiss,'click',dispose);local.listen(dialog,'close',dispose); + local.listen(host,'change',()=>session?.selectHost(host.value)); + local.listen(target,'change',()=>session?.selectTarget(target.value)); + local.listen(find,'click',()=>session?.discover()); + local.listen(inspect,'click',()=>session?.preview()); + local.listen(apply,'click',()=>session?.apply()); + function options(select,placeholder,entries,value) { + select.replaceChildren(...[["",placeholder],...entries].map(([value,label])=>{const option=element('option',label);option.value=value;return option;}));select.value=value; + } + function textBlock(parent,label,value) { + parent.append(element('h4',label));const text=element('pre');text.tabIndex=0;text.append(element('code',value === '' ? '(empty)' : value));parent.append(text); + } + function render(state) { + if(closed) return; + const busy=['discovering','previewing','applying'].includes(state.phase); + status.textContent=state.message;status.dataset.phase=state.phase; + status.setAttribute('role',state.phase==='error'?'alert':'status');status.setAttribute('aria-live',state.phase==='error'?'assertive':'polite'); + dialog.setAttribute('aria-busy',String(busy)); + options(host,'Choose a ComfyUI window',state.hosts.map(item=>[item.hostId,item.label]),state.hostId); + const selected=state.hosts.find(item=>item.hostId===state.hostId); + options(target,'Choose a destination node',(selected?.targets || []).map(item=>[item.id,item.label]),state.targetId); + host.disabled=busy;target.disabled=busy || !selected; + find.disabled=busy;inspect.disabled=busy || !state.targetId;apply.disabled=state.phase!=='ready'; + preview.replaceChildren(); + if(state.preview) { + preview.append(element('h3','Review changes')); + for(const field of state.preview.fields || []) { + const section=element('section',undefined,`prompt-sender-field prompt-role-${field.role}`); + section.append(element('h3',field.role==='positive'?'Positive prompt':'Negative prompt')); + textBlock(section,'Before',field.before);textBlock(section,'After',field.after);preview.append(section); + } + const composition=state.preview.composition; + if(composition) { + const section=element('section',undefined,'prompt-sender-composition');section.append(element('h3','Positive composition')); + textBlock(section,'Prepend (preserved)',composition.prepend || '');textBlock(section,'Append (preserved)',composition.append || ''); + textBlock(section,'Combined before',composition.before ?? 'Resolved at execution from connected inputs.'); + textBlock(section,'Combined after',composition.after ?? 'Resolved at execution from connected inputs.'); + if(composition.prependConnected || composition.appendConnected) section.append(element('p','Connected prepend and append inputs are preserved and resolved when the workflow runs.')); + preview.append(section); + } + } + } + dialog.showModal(); + try { + const url=new URL(baseUrl,window.location.href); + if(url.origin!==window.location.origin || !url.pathname.endsWith('/prompt_manager/')) throw Error('Invalid PromptManager deployment origin or path'); + const client=clientFactory({namespace:url.pathname.slice(0,-'prompt_manager/'.length),origin:window.location.origin}); + try { session=createSendSession({client,roles,onChange:render}); } catch(error) {client.dispose();throw error;} + session.discover(); + } catch(error) {status.textContent=`Prompt sending is unavailable. ${error.message}`;status.dataset.phase='error';status.setAttribute('role','alert');status.setAttribute('aria-live','assertive');find.disabled=true;host.disabled=true;target.disabled=true;} + }}; +}