@ai-matrx/alchemy 0.23.42 → 0.23.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,5 +3,5 @@
3
3
  ${" ".repeat(segments.length)}`).length}function columnSize(rows,columnId){let column=rows.columns.find(c=>c.id===columnId);if(!column)return 0;let total=0;for(let row of rows.rows){let value=readTransferCell(row,column);total+=value==null?0:typeof value=="string"?value.length:JSON.stringify(value).length}return total}function sizeLabel(chars){return`${formatCount(chars)} chars \xB7 \u2248${formatCount(Math.ceil(chars/4))} tokens`}import*as React4 from"react";import{formatCount as formatCount3}from"@ai-matrx/kit/format";import{createPortal,flushSync}from"react-dom";import{concretePointers as concretePointers2,createDraft,editDraft,outputPointer,patternCovers as patternCovers2,readTransferCell as readTransferCell2,resetDraft as resetDraft2,resolveTransferPreferences,sealTransferArtifact as sealTransferArtifact2,serialize as serialize2,undoDraft}from"@ai-matrx/alchemy/operate";import{Button as Button2}from"@ai-matrx/design-system";import{cn}from"@ai-matrx/design-system";import{Dialog as Dialog2,DialogContent as DialogContent2,DialogDescription as DialogDescription2,DialogHeader as DialogHeader2,DialogTitle as DialogTitle2}from"@ai-matrx/design-system";import{ContextMenu,ContextMenuContent,ContextMenuItem,ContextMenuLabel,ContextMenuTrigger}from"@ai-matrx/design-system";import{LayeredFilterBuilder}from"@ai-matrx/design-system/data-table";import{directSource,normalizeTransferJson,projectSnapshot}from"@ai-matrx/alchemy/operate";var sectionLeverKey=id=>`section:${id}`;function payloadForEnvelope(value){if(typeof value=="string")return{payload:{kind:"markdown",text:value}};let{data,dataFormat,instructions:_instructions,...envelope}=value,clean=record=>Object.fromEntries(Object.entries(record??{}).filter(([,entry])=>entry!==void 0)),meta={...envelope,attributes:clean(envelope.attributes),context:clean(envelope.context)};return typeof data=="string"?{payload:dataFormat==="markdown"?{kind:"markdown",text:data}:{kind:"text",text:data},envelope:meta}:{payload:{kind:"json",value:normalizeTransferJson(data,{omitUndefinedObjectProperties:!0})},envelope:meta}}function customLevers(custom){return{options:custom.options,initial:Object.fromEntries(custom.options.map(option=>[option.key,option.default])),build(values){let optionValues=values,result=custom.build(optionValues),{payload,envelope}=payloadForEnvelope(custom.wrap(result.text,optionValues,result.meta));return{payload,envelope,...result.meta?{meta:result.meta}:{}}}}}function nestedJsonLength(key,value){let text=JSON.stringify(value,null,2);return text===void 0?0:2+JSON.stringify(key).length+2+text.replace(/\n/g,`
4
4
  `).length+2}function groomerLevers(config){return{sections:config.sections,initial:Object.fromEntries(config.sections.map(section=>[sectionLeverKey(section.id),section.defaultSelection??"full"])),build(values){let data={},dropped=[],sectionSizes={};for(let section of config.sections){let level=values[sectionLeverKey(section.id)]??"full";if(level==="off"){dropped.push(section.id),sectionSizes[section.id]=0;continue}let value=section.build(level);value!=null?(data[section.id]=value,sectionSizes[section.id]=nestedJsonLength(section.id,normalizeTransferJson(value,{omitUndefinedObjectProperties:!0}))):sectionSizes[section.id]=0}return{payload:{kind:"json",value:normalizeTransferJson(data,{omitUndefinedObjectProperties:!0})},envelope:{kind:config.kind,location:config.location,description:config.description,...config.summary!==void 0?{summary:config.summary}:{},attributes:{...config.attributes,...dropped.length?{dropped_sections:dropped.join(",")}:{}},...config.context?{context:config.context}:{}},sectionSizes}}}}function applyGroomerPreset(preset,sections){return Object.fromEntries(sections.map(section=>[section.id,preset==="everything"?"full":preset==="balanced"?"compact":section.cuttable?"off":"brief"]))}function activeGroomerPreset(values,sections){for(let preset of["everything","balanced","minimal"]){let levels=applyGroomerPreset(preset,sections);if(sections.every(section=>(values[sectionLeverKey(section.id)]??"full")===levels[section.id]))return preset}return null}function leverSnapshot(payload,sourceId,label){let raw=directSource(payload,{sourceId,label});return projectSnapshot(raw.snapshot,raw.projection)}import*as React3 from"react";import{formatCount as formatCount2}from"@ai-matrx/kit/format";import{computeWindow}from"@ai-matrx/design-system/data-table";import{displayPath,jsonSize,nodeChars,patternBelow,patternCovers,pointerSegments as pointerSegments2}from"@ai-matrx/alchemy/operate";import{jsx as jsx3,jsxs as jsxs3}from"react/jsx-runtime";var KEEP="keep",TEXT_LIMITS=[{value:KEEP,label:"Keep"},{value:"stub",label:"Stub"},{value:"chars:200",label:"Max 200 chars"},{value:"chars:1000",label:"Max 1,000 chars"},{value:"chars:4000",label:"Max 4,000 chars"}],LIST_LIMITS=[{value:KEEP,label:"Keep"},{value:"stub",label:"Stub"},{value:"items:5",label:"First 5 items"},{value:"items:25",label:"First 25 items"},{value:"items:100",label:"First 100 items"}],OBJECT_LIMITS=[{value:KEEP,label:"Keep"},{value:"stub",label:"Stub"},{value:"chars:1000",label:"Max 1,000 chars per text"}],CELL_LIMITS=[{value:KEEP,label:"Keep"},{value:"stub",label:"Stub cells"},{value:"chars:100",label:"Max 100 chars"},{value:"chars:500",label:"Max 500 chars"},{value:"chars:2000",label:"Max 2,000 chars"}];function encodeLimit(limit){return limit?limit.kind==="stub"?"stub":limit.kind==="maxChars"?`chars:${limit.value}`:`items:${limit.value}`:KEEP}function decodeLimit(value){if(value==="stub")return{kind:"stub"};let m=/^(chars|items):(\d+)$/.exec(value);return m?m[1]==="chars"?{kind:"maxChars",value:Number(m[2])}:{kind:"maxItems",value:Number(m[2])}:null}function useRowHeight(){let[coarse,setCoarse]=React3.useState(()=>typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia("(pointer: coarse)").matches);return React3.useEffect(()=>{if(typeof window>"u"||typeof window.matchMedia!="function")return;let query=window.matchMedia("(pointer: coarse)"),update=()=>setCoarse(query.matches);return query.addEventListener?.("change",update),()=>query.removeEventListener?.("change",update)},[]),coarse?48:40}function Checkbox({state,label,onChange}){let ref=React3.useRef(null);return React3.useEffect(()=>{ref.current&&(ref.current.indeterminate=state==="mixed")},[state]),jsx3("input",{ref,type:"checkbox",className:"matrx-alchemy-tree-check","aria-label":label,checked:state==="on","aria-checked":state==="mixed"?"mixed":state==="on",onChange})}var LockGlyph=()=>jsxs3("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[jsx3("rect",{x:"5",y:"11",width:"14",height:"10",rx:"2"}),jsx3("path",{d:"M8 11V7a4 4 0 0 1 8 0v4"})]}),CopyGlyph=()=>jsxs3("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[jsx3("rect",{x:"9",y:"9",width:"12",height:"12",rx:"2"}),jsx3("path",{d:"M5 15H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1"})]}),Chevron=({open})=>jsx3("svg",{viewBox:"0 0 24 24",width:"14",height:"14",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",style:{transform:open?"rotate(90deg)":void 0,transition:"transform 120ms"},children:jsx3("path",{d:"m9 6 6 6-6 6"})});function TreeRow({item,whole,focused,height,handlers}){let share=whole>0&&item.chars!==null?Math.min(1,item.chars/whole):0;return jsxs3("div",{role:"treeitem","aria-level":item.depth+1,"aria-expanded":item.expandable?!!item.expanded:void 0,"aria-selected":focused,"data-row-index":item.rowIndex,className:"matrx-alchemy-tree-row","data-state":item.state??"root",style:{height,paddingLeft:`${.25+item.depth*.875}rem`},children:[item.expandable?jsx3("button",{type:"button",className:"matrx-alchemy-tree-twisty","aria-label":`${item.expanded?"Collapse":"Expand"} ${item.label}`,onClick:()=>handlers.expand?.(item),children:jsx3(Chevron,{open:!!item.expanded})}):jsx3("span",{className:"matrx-alchemy-tree-twisty","aria-hidden":"true"}),item.locked?jsx3("span",{className:"matrx-alchemy-tree-lock",role:"img","aria-label":item.locked,title:item.locked,children:jsx3(LockGlyph,{})}):item.coveredBy?jsx3("button",{type:"button",className:"matrx-alchemy-tree-covered","aria-label":`Left out by ${item.coveredBy} \u2014 include it again`,title:`Left out by ${item.coveredBy}. Include it again.`,onClick:()=>handlers.includeAgain?.(item),children:jsx3("input",{type:"checkbox",tabIndex:-1,"aria-hidden":"true",checked:!1,readOnly:!0})}):item.state?jsx3(Checkbox,{state:item.state,label:item.label,onChange:()=>handlers.toggle(item)}):jsx3("span",{className:"matrx-alchemy-tree-twisty","aria-hidden":"true"}),jsxs3("button",{type:"button",className:"matrx-alchemy-tree-label","aria-label":`Highlight ${item.label}`,"aria-pressed":focused,onClick:()=>handlers.focus(item),title:item.detail?`${item.label} \u2014 ${item.detail}`:item.label,children:[jsx3("span",{className:"matrx-alchemy-tree-name",children:item.label}),jsxs3("span",{className:"matrx-alchemy-tree-meta",children:[item.chars!==null?jsxs3("span",{className:"matrx-alchemy-prep-size matrx-alchemy-tree-size",title:sizeLabel(item.chars),children:[jsx3("span",{className:"matrx-alchemy-prep-share","aria-hidden":"true",children:jsx3("span",{style:{width:`${(share*100).toFixed(1)}%`}})}),jsx3("span",{children:compactSize(item.chars)})]}):null,item.detail?jsx3("small",{className:"matrx-alchemy-tree-detail",children:item.detail}):null]})]}),item.limitChoices&&handlers.limit&&item.state!=="off"&&!item.locked&&!item.coveredBy?jsx3("select",{className:"matrx-alchemy-tree-limit","aria-label":`Limit ${item.label}`,value:item.limit??KEEP,onChange:event=>handlers.limit(item,event.target.value),children:item.limitChoices.map(choice=>jsx3("option",{value:choice.value,children:choice.label},choice.value))}):null,item.copyPath&&handlers.copyPath?jsx3("button",{type:"button",className:"matrx-alchemy-tree-icon","aria-label":`Copy path ${item.copyPath}`,title:`Copy ${item.copyPath}`,onClick:()=>handlers.copyPath(item.copyPath),children:jsx3(CopyGlyph,{})}):null]})}function compactSize(chars){let short=value=>formatCount2(value,{style:"compact"});return`${short(chars)} \xB7 \u2248${short(Math.ceil(chars/4))} tok`}function StructureTreeList({label,items,whole,focusKey,handlers,maxHeight="24rem",onContextMenu}){let height=useRowHeight(),ref=React3.useRef(null),[offset,setOffset]=React3.useState(0),[viewport,setViewport]=React3.useState(0);React3.useLayoutEffect(()=>{let node=ref.current;if(!node)return;let measure=()=>setViewport(node.clientHeight);if(measure(),typeof ResizeObserver>"u")return;let observer=new ResizeObserver(measure);return observer.observe(node),()=>observer.disconnect()},[]);let view=computeWindow({count:items.length,itemSize:height,viewport:viewport||640,offset}),rows=[];for(let index=view.start;index<view.end;index++){let item=items[index];rows.push(jsx3(TreeRow,{item,whole,focused:item.key===focusKey,height,handlers},item.key))}return jsxs3("div",{ref,role:"tree","aria-label":label,className:"matrx-alchemy-tree",style:{maxHeight},onScroll:event=>setOffset(event.currentTarget.scrollTop),onContextMenu,children:[jsx3("div",{style:{height:view.padStart},"aria-hidden":"true"}),rows,jsx3("div",{style:{height:view.padEnd},"aria-hidden":"true"})]})}var isRecord=value=>value!==null&&typeof value=="object"&&!Array.isArray(value),enc=segment=>segment.replace(/~/g,"~0").replace(/\//g,"~1");function jsonChildren(node){let values=node.values;if(values.length&&values.every(Array.isArray)){let items=values.flat(),out=[];return items.length>1&&out.push({pattern:`${node.pattern}/*`,label:"[*] every item",values:items,concrete:!1}),node.concrete&&values[0].forEach((item,index)=>out.push({pattern:`${node.pattern}/${index}`,label:`[${index}]`,values:[item],concrete:!0})),out}let objects=values.filter(isRecord);if(!objects.length)return[];let keys=[],seen=new Set;for(let object of objects)for(let key of Object.keys(object))seen.has(key)||(seen.add(key),keys.push(key));return keys.map(key=>({pattern:`${node.pattern}/${enc(key)}`,label:key,values:objects.filter(object=>Object.prototype.hasOwnProperty.call(object,key)).map(object=>object[key]),concrete:node.concrete}))}var hasChildren=node=>node.values.some(value=>Array.isArray(value)&&value.length>0||isRecord(value)&&Object.keys(value).length>0);function preview(value){return typeof value=="string"?value.length>60?`"${value.slice(0,60).replace(/\s+/g," ")}\u2026"`:JSON.stringify(value):Array.isArray(value)?`[${formatCount2(value.length)} items]`:isRecord(value)?`{${formatCount2(Object.keys(value).length)} keys}`:String(value)}function limitChoicesFor(node){return node.values.every(Array.isArray)?LIST_LIMITS:node.values.every(value=>typeof value=="string")?TEXT_LIMITS:node.values.every(isRecord)?OBJECT_LIMITS:[{value:KEEP,label:"Keep"},{value:"stub",label:"Stub"}]}function overlaps(a,b){let x=pointerSegments2(a),y=pointerSegments2(b);return x.length===y.length&&x.every((segment,index)=>segment===y[index]||segment==="*"||y[index]==="*")}function nodeState(pattern,exclude){if(exclude.includes(pattern))return{state:"off"};let cover=exclude.find(candidate=>patternCovers(candidate,pattern));return cover!==void 0?{state:"off",coveredBy:cover}:exclude.some(candidate=>patternBelow(candidate,pattern)||overlaps(candidate,pattern))?{state:"mixed"}:{state:"on"}}function toggleNode(recipe,pattern){let{state}=nodeState(pattern,recipe.exclude);if(state==="off")return{...recipe,exclude:recipe.exclude.filter(candidate=>candidate!==pattern)};let limits=Object.fromEntries(Object.entries(recipe.limits).filter(([candidate])=>!patternCovers(pattern,candidate)));return{exclude:[...recipe.exclude.filter(candidate=>!patternCovers(pattern,candidate)),pattern],limits}}function jsonTreeItems(root,recipe,expanded){let items=[],visit=(node,depth)=>{let expandable=hasChildren(node),isOpen=expandable&&expanded.has(node.pattern),chars=node.values.reduce((sum,value)=>sum+(node.pattern===""?jsonSize(value):nodeChars(value)),0),{state,coveredBy}=node.pattern===""?{state:void 0,coveredBy:void 0}:nodeState(node.pattern,recipe.exclude);if(items.push({key:node.pattern||"#root",depth,label:node.label,detail:node.concrete?preview(node.values[0]??null):`in ${formatCount2(node.values.length)} items`,chars,state,coveredBy:coveredBy===void 0?void 0:displayPath(coveredBy),expandable,expanded:isOpen,...node.pattern?{limitChoices:limitChoicesFor(node),limit:encodeLimit(recipe.limits[node.pattern]),copyPath:displayPath(node.pattern)}:{copyPath:"data"}}),isOpen&&state!=="off")for(let child of jsonChildren(node))visit(child,depth+1)};return visit({pattern:"",label:"data",values:[root],concrete:!0},0),items}function jsonSearchItems(root,recipe,query,cap=500){let q=query.trim().toLocaleLowerCase();if(!q)return[];let items=[],walk=(value,segments)=>{if(items.length>=cap)return;let key=segments[segments.length-1]??"",scalar=value===null||typeof value!="object";if((key.toLocaleLowerCase().includes(q)||scalar&&String(value).toLocaleLowerCase().includes(q))&&segments.length){let pattern=segments.map(segment=>`/${enc(segment)}`).join(""),{state,coveredBy}=nodeState(pattern,recipe.exclude),node={pattern,label:key,values:[value],concrete:!0};items.push({key:`search:${pattern}`,depth:0,label:displayPath(pattern),detail:preview(value),chars:nodeChars(value),state,coveredBy:coveredBy===void 0?void 0:displayPath(coveredBy),limitChoices:limitChoicesFor(node),limit:encodeLimit(recipe.limits[pattern]),copyPath:displayPath(pattern)})}if(Array.isArray(value))value.forEach((item,index)=>walk(item,[...segments,String(index)]));else if(isRecord(value))for(let[child,item]of Object.entries(value))walk(item,[...segments,child])};return walk(root,[]),items}var itemPattern=item=>item.key.startsWith("search:")?item.key.slice(7):item.key==="#root"?"":item.key;import{Fragment as Fragment2,jsx as jsx4,jsxs as jsxs4}from"react/jsx-runtime";var PANE_KEY="matrx-alchemy:prepare-panes",TAB_KEY="matrx-alchemy:prepare-tab",DEFAULT_PANES={left:320,right:340},MIN_PANE=220,MOBILE_WIDTH=768,PREVIEW_CHUNK_LINES=200;function readStored(key,fallback,valid){try{let raw=globalThis.localStorage?.getItem(key);if(!raw)return fallback;let value=JSON.parse(raw);return valid(value)?value:fallback}catch{return fallback}}function writeStored(key,value){try{globalThis.localStorage?.setItem(key,JSON.stringify(value))}catch{}}var isPanes=value=>!!value&&typeof value=="object"&&Number.isFinite(value.left)&&Number.isFinite(value.right),isTab=value=>value==="structure"||value==="preview"||value==="settings";function useNarrow(ref){let[narrow,setNarrow]=React4.useState(()=>typeof window<"u"&&window.innerWidth<MOBILE_WIDTH);return React4.useLayoutEffect(()=>{let node=ref.current;if(!node)return;let measure=()=>{let width=node.getBoundingClientRect().width||window.innerWidth;setNarrow(width<MOBILE_WIDTH)};if(measure(),typeof ResizeObserver>"u")return window.addEventListener("resize",measure),()=>window.removeEventListener("resize",measure);let observer=new ResizeObserver(measure);return observer.observe(node),()=>observer.disconnect()}),narrow}function PreviewText({text,id,marks=EMPTY_MARKS,label="Prepared output"}){let chunks=React4.useMemo(()=>{let out=[],start=0,lines=0;for(let i=0;i<text.length;i++)text.charCodeAt(i)===10&&++lines===PREVIEW_CHUNK_LINES&&(out.push({start,text:text.slice(start,i+1)}),start=i+1,lines=0);return(start<text.length||out.length===0)&&out.push({start,text:text.slice(start)}),out},[text]),ref=React4.useRef(null),focusStart=marks.find(mark=>mark.kind==="focus")?.start??-1;return React4.useEffect(()=>{focusStart<0||ref.current?.querySelector("[data-mark~='focus']")?.scrollIntoView?.({block:"center"})},[focusStart]),jsx4("div",{ref,id,className:"matrx-alchemy-preview matrx-alchemy-prep-preview",role:"region","aria-label":label,tabIndex:0,"data-chars":text.length,children:chunks.map((chunk,index)=>jsx4("pre",{className:"matrx-alchemy-prep-chunk",children:marked(chunk.text,chunk.start,marks)},index))})}var EMPTY_MARKS=[];function marked(text,offset,marks){let end=offset+text.length,inside=marks.filter(mark=>mark.end>offset&&mark.start<end&&mark.end>mark.start);if(!inside.length)return text;let cuts=new Set([offset,end]);for(let mark of inside)cuts.add(Math.max(offset,mark.start)),cuts.add(Math.min(end,mark.end));let points=[...cuts].sort((a,b)=>a-b),out=[];for(let i=0;i<points.length-1;i++){let a=points[i],b=points[i+1],piece=text.slice(a-offset,b-offset),kinds=[...new Set(inside.filter(mark=>mark.start<=a&&mark.end>=b).map(mark=>mark.kind))];out.push(kinds.length?jsx4("mark",{className:"matrx-alchemy-mark","data-mark":kinds.join(" "),children:piece},a):piece)}return out}function PreviewHtml({html}){return jsx4("iframe",{className:"matrx-alchemy-preview matrx-alchemy-prep-html",title:"Prepared output (formatted)",sandbox:"",srcDoc:html})}function ShareBar({part,whole}){let share=whole>0?Math.min(1,part/whole):0;return jsx4("span",{className:"matrx-alchemy-prep-share","aria-hidden":"true",children:jsx4("span",{style:{width:`${(share*100).toFixed(1)}%`}})})}function SizeNote({chars,whole}){return chars===null?null:jsxs4("span",{className:"matrx-alchemy-prep-size",children:[jsx4(ShareBar,{part:chars,whole}),jsx4("span",{children:sizeLabel(chars)})]})}function useProjectedLabels(labels,adapters){let engine=hostEngineFor(adapters,"plain"),key=labels.join("\0"),[projected,setProjected]=React4.useState(null);return React4.useEffect(()=>{if(!engine||!labels.some(label=>/[#*_`[\]>~|]/.test(label)))return;let controller=new AbortController;return Promise.all(labels.map(async label=>(await buildWithAdapter(engine,{snapshotId:"label",sourceId:"label",sourceRevision:"label",revision:0,payload:{kind:"markdown",text:label.replace(/\s+(#{1,6}\s)/g,`
5
5
  $1`)},omissions:[],manuallyEdited:!1,provenance:[]},controller.signal)).plainText.replace(/\s+/g," ").trim()||label)).then(result=>{controller.signal.aborted||setProjected({key,labels:result})}).catch(()=>{}),()=>controller.abort()},[engine,key]),projected?.key===key?projected.labels:labels}function Segmented({label,value,choices,onChange}){return jsx4("div",{className:"matrx-alchemy-prep-segmented",role:"group","aria-label":label,children:choices.map(choice=>jsx4("button",{type:"button","aria-pressed":choice.value===value,title:choice.title,onClick:()=>onChange(choice.value),children:choice.label},String(choice.value)))})}function LeverControl({option,value,onChange}){let hint="hint"in option&&option.hint?jsx4("small",{className:"matrx-alchemy-prep-hint",children:option.hint}):null;if(option.kind==="toggle")return jsxs4("div",{className:"matrx-alchemy-prep-lever",children:[jsxs4("button",{type:"button",role:"switch","aria-checked":!!value,className:"matrx-alchemy-prep-switch",onClick:()=>onChange(!value),children:[jsx4("span",{className:"matrx-alchemy-prep-switch-track","aria-hidden":"true",children:jsx4("span",{})}),jsx4("span",{className:"matrx-alchemy-prep-lever-label",children:option.label})]}),hint]});if(option.kind==="preset")return jsxs4("div",{className:"matrx-alchemy-prep-lever",children:[jsx4("span",{className:"matrx-alchemy-prep-lever-label",children:option.label}),jsx4(Segmented,{label:option.label,value:Number(value),choices:option.options.map(choice=>({value:choice.value,label:choice.label})),onChange})]});if(option.kind==="slider"){let index=Math.max(0,option.stops.indexOf(Number(value)));return jsxs4("label",{className:"matrx-alchemy-prep-lever",children:[jsxs4("span",{className:"matrx-alchemy-prep-lever-row",children:[jsx4("span",{className:"matrx-alchemy-prep-lever-label",children:option.label}),jsx4("output",{className:"matrx-alchemy-prep-value",children:option.formatValue(Number(value))})]}),jsx4("input",{type:"range","aria-label":option.label,min:0,max:Math.max(0,option.stops.length-1),step:1,value:index,"aria-valuetext":option.formatValue(Number(value)),onChange:event=>onChange(option.stops[Number(event.target.value)])}),hint]})}return jsxs4("div",{className:"matrx-alchemy-prep-lever",children:[jsxs4("label",{className:"matrx-alchemy-prep-lever-row",children:[jsx4("span",{className:"matrx-alchemy-prep-lever-label",children:option.label}),jsx4("input",{type:"number","aria-label":option.label,min:option.min,step:option.step,value:Number(value),onChange:event=>{Number.isNaN(event.target.valueAsNumber)||onChange(event.target.valueAsNumber)}})]}),option.presets?.length?jsx4(Segmented,{label:`${option.label} presets`,value:Number(value),choices:option.presets.map(preset=>({value:preset.value,label:preset.label})),onChange}):null,hint]})}var LEVEL_NAMES={full:"Full",compact:"Compact",brief:"Brief",off:"Off"};function GroomerSection({section,level,size,whole,onChange}){let levels=section.cuttable?["full","compact","brief","off"]:["full","compact","brief"];return jsxs4("div",{className:"matrx-alchemy-prep-node","data-level":level,children:[jsxs4("div",{className:"matrx-alchemy-prep-node-head",children:[jsxs4("span",{className:"matrx-alchemy-prep-node-title",children:[section.title,section.cuttable?jsx4("span",{className:"matrx-alchemy-prep-cut",title:"Safe to cut",children:"\u2702"}):null]}),jsx4(SizeNote,{chars:size,whole})]}),section.description?jsx4("small",{className:"matrx-alchemy-prep-hint",children:section.description}):null,jsx4(Segmented,{label:`${section.title} detail`,value:level,choices:levels.map(value=>({value,label:LEVEL_NAMES[value],...value!=="off"&&section.levelLabels?.[value]?{title:section.levelLabels[value]}:{}})),onChange}),level!=="off"&&section.levelLabels?.[level]?jsx4("small",{className:"matrx-alchemy-prep-hint",children:section.levelLabels[level]}):null]})}function PreparationWorkspace({restoreFocus,open,frame,windowNode,state,scopes,scopeLabels,onClose,onChange,transport,ai,adapters,actions,onOutcome,captureScope,promptFocus=0}){let fence=useFence(),latest=React4.useRef(state);latest.current=state;let aiSession=React4.useRef(void 0);!aiSession.current&&ai&&(aiSession.current=ai.fork?.()??ai);let[controls,setControls]=React4.useState(()=>initialControls(state)),[controlsHistory,setControlsHistory]=React4.useState([]),[pending,setPending]=React4.useState(null),requestedFormat=state.preferences.initialFormat,firstOffered=()=>{let kind=state.draft.payload.kind;return[kind==="json"||kind==="registered"?"json":kind==="rows"?"tsv":kind==="markdown"?"markdown":"plain",...COPIES].find(f=>offersFormat(f,state.draft.payload,adapters))??"plain"},[format,setFormat]=React4.useState(()=>isBuiltInFormat(requestedFormat)?offersFormat(requestedFormat,state.draft.payload,adapters)?requestedFormat:firstOffered():adapters.some(adapter=>adapter.id===requestedFormat&&adapter.supports(state.draft.payload))?requestedFormat:firstOffered()),[envelopeOn,setEnvelopeOn]=React4.useState(state.preferences.initialEnvelope!=="text"),[instructions,setInstructions]=React4.useState(""),instructionsRef=React4.useRef(null),[sealedInstructions,setSealedInstructions]=React4.useState(""),[formatArtifact,setFormatArtifact]=React4.useState(null),[formatError,setFormatError]=React4.useState(null),[editing,setEditing]=React4.useState(!1),[buffer,setBuffer]=React4.useState(""),[bufferError,setBufferError]=React4.useState(null),[aiInstruction,setAiInstruction]=React4.useState(""),[busy,setBusy]=React4.useState(null),[aiFailed,setAiFailed]=React4.useState(!1),[biggestFirst,setBiggestFirst]=React4.useState(!1),[focus,setFocus]=React4.useState(null),[treeQuery,setTreeQuery]=React4.useState(""),[expanded,setExpanded]=React4.useState(()=>new Set([""])),[showRemoved,setShowRemoved]=React4.useState(!1),[removedView,setRemovedView]=React4.useState(null),[panes,setPanes]=React4.useState(()=>readStored(PANE_KEY,DEFAULT_PANES,isPanes)),[tab,setTab]=React4.useState(()=>readStored(TAB_KEY,"preview",isTab));React4.useEffect(()=>{if(!promptFocus||!open)return;setEnvelopeOn(!0),setTab("settings");let timer=setTimeout(()=>instructionsRef.current?.focus(),50);return()=>clearTimeout(timer)},[promptFocus,open]);let root=React4.useRef(null),narrow=useNarrow(root);React4.useEffect(()=>{setAiFailed(!1)},[state.snapshot.id,state.draft.revision]);let handingOff=React4.useRef(!1);React4.useEffect(()=>{open&&(handingOff.current=!1)},[open]);let activeAi=React4.useRef(null),activeCapture=React4.useRef(null);React4.useEffect(()=>{let timer=setTimeout(()=>setSealedInstructions(instructions),200);return()=>clearTimeout(timer)},[instructions]),React4.useEffect(()=>{if(state.buildError){setFormatArtifact(null),setFormatError(null);return}if(bufferError)return;let adapter=adapters.find(candidate=>candidate.id===format),controller=new AbortController,snapshotId=state.snapshot.id,revision=state.draft.revision;return setFormatError(null),(isBuiltInFormat(format)?buildFormat(state.draft,format,state.snapshot.label,adapters,controller.signal):adapter?buildWithAdapter(adapter,state.draft,controller.signal):buildArtifact(state.draft,"plain",state.snapshot.label)).then(artifact=>{!controller.signal.aborted&&artifact.snapshotId===snapshotId&&artifact.draftRevision===revision&&setFormatArtifact(artifact)}).catch(error=>{controller.signal.aborted||setFormatError(errorMessage(error,"Format preview failed"))}),()=>controller.abort()},[adapters,bufferError,format,state.buildError,state.draft,state.snapshot.id,state.snapshot.label]);let sealed=React4.useMemo(()=>{if(state.buildError||!formatArtifact||formatArtifact.snapshotId!==state.snapshot.id||formatArtifact.draftRevision!==state.draft.revision)return{artifact:null,error:null};let dataFormat=envelopeDataFormat(format,formatArtifact);if(!envelopeOn||!dataFormat)return{artifact:formatArtifact,error:null};try{return{artifact:sealForAi(formatArtifact,dataFormat,state.envelope??defaultEnvelope(state.snapshot),sealedInstructions,state.snapshot.label),error:null}}catch(cause){return{artifact:null,error:errorMessage(cause,"The AI envelope could not be sealed.")}}},[envelopeOn,format,formatArtifact,sealedInstructions,state.buildError,state.draft.revision,state.envelope,state.snapshot]),shown=sealed.artifact,close=React4.useCallback(()=>{activeAi.current?.abort(),activeCapture.current?.abort(),activeAi.current=null,activeCapture.current=null,fence.abortAll(),setBusy(null),onClose()},[fence,onClose]),applyLevers=(values,base=latest.current,withControls=controls)=>{let levers=base.levers;if(levers)try{let built=levers.build(values),snapshot=leverSnapshot(built.payload,base.snapshot.sourceId,base.snapshot.label),original=createDraft(snapshot),next={...base,snapshot,original,draft:original,leverValues:values,leverMeta:built.meta,leverSizes:built.sectionSizes,envelope:built.envelope,buildError:void 0,error:void 0};onChange({...next,draft:rebuild(next,withControls)})}catch(cause){onChange({...base,leverValues:values,buildError:errorMessage(cause,"This source could not be prepared with these options.")})}},changeLevers=values=>{if(state.draft.manuallyEdited){setPending({kind:"levers",values});return}React4.startTransition(()=>applyLevers(values))},leverTimer=React4.useRef(null);React4.useEffect(()=>()=>{leverTimer.current&&clearTimeout(leverTimer.current)},[]);let[typedLevers,setTypedLevers]=React4.useState(null),leverValues=typedLevers??state.leverValues??state.levers?.initial??{},setLever=(key,value,debounce=!1)=>{let next={...leverValues,[key]:value};if(!debounce){setTypedLevers(null),changeLevers(next);return}setTypedLevers(next),leverTimer.current&&clearTimeout(leverTimer.current),leverTimer.current=setTimeout(()=>{setTypedLevers(null),changeLevers(next)},150)},changeControls=next=>{if(state.draft.manuallyEdited){setPending({kind:"controls",controls:next});return}setControlsHistory(history=>[...history,controls]),setControls(next),React4.startTransition(()=>onChange({...latest.current,draft:rebuild(latest.current,next),error:void 0}))},applyPending=()=>{pending&&(setBufferError(null),setEditing(!1),pending.kind==="controls"?(setControlsHistory(history=>[...history,controls]),setControls(pending.controls),onChange({...state,draft:rebuild(state,pending.controls),error:void 0})):applyLevers(pending.values,state),setPending(null))},rebuildFromSource=()=>{setBufferError(null),setEditing(!1),setPending(null),state.levers?applyLevers(state.leverValues??state.levers.initial,state):onChange({...state,draft:rebuild(state,controls),error:void 0})},startEditing=()=>{setBuffer(formatArtifact?.plainText??""),setEditing(!0)},editBuffer=text=>{setBuffer(text),setFormatError(null);let payload=state.draft.payload;if(payload.kind==="json"||payload.kind==="registered"){try{let value=JSON.parse(text),next=payload.kind==="json"?{kind:"json",value}:{kind:"registered",format:payload.format,value};setBufferError(null),onChange({...state,draft:editDraft(state.draft,next),error:void 0})}catch{setBufferError("JSON is incomplete or invalid. Fix it before copying or downloading.")}return}setBufferError(null);let kind=payload.kind==="markdown"||format==="markdown"?"markdown":"text";(payload.kind==="rows"||!isBuiltInFormat(format))&&setFormat("plain"),onChange({...state,draft:editDraft(state.draft,{kind,text}),error:void 0})},requestCapture=async scope=>{activeCapture.current?.abort();let{controller,id}=fence.begin();activeCapture.current=controller;let revision=state.draft.revision;setBusy("capture");try{let result=await captureScope(scope,controller.signal);fence.valid(id,controller)&&latest.current.draft.revision===revision&&onChange({...latest.current,pending:{...result,scope},sourceStale:!1,error:result.collectionError})}catch(error){fence.valid(id,controller)&&onChange({...latest.current,error:errorMessage(error,"Refresh failed")})}finally{fence.finish(controller),activeCapture.current===controller&&(activeCapture.current=null),fence.valid(id,controller)&&setBusy(null)}},resolveCapture=choice=>{if(!state.pending)return;if(choice==="keep"){let{pending:_pending,...kept}=state;onChange({...kept,error:void 0});return}let fresh=state.pending,preferences=resolveTransferPreferences({},state.preferences,fresh.snapshot.limits),base={...fresh,key:state.key,original:createDraft(fresh.snapshot),draft:createDraft(fresh.snapshot),scope:fresh.scope,preferences,...fresh.collectionError?{error:fresh.collectionError}:{},...state.envelope?{envelope:state.envelope}:{}},nextControls=initialControls(base);setControls(nextControls),setControlsHistory([]),setPending(null),setBufferError(null),setEditing(!1),onChange({...base,draft:rebuild(base,nextControls)})},runAi=async(recover=!1)=>{let adapter=aiSession.current;if(!adapter||!adapter.supports(state.snapshot)||!recover&&!aiInstruction.trim()||recover&&!adapter.recover)return;activeAi.current?.abort();let{controller,id}=fence.begin();activeAi.current=controller;let snapshotId=state.snapshot.id,revision=state.draft.revision;setBusy("ai"),setAiFailed(!1);try{let next=recover?await adapter.recover({snapshot:state.snapshot,draft:state.draft,signal:controller.signal}):await adapter.run({snapshot:state.snapshot,draft:state.draft,instruction:aiInstruction,signal:controller.signal}),current=latest.current;if(!fence.valid(id,controller)||current.snapshot.id!==snapshotId||current.draft.revision!==revision||next.snapshotId!==snapshotId||next.sourceId!==state.draft.sourceId||next.sourceRevision!==state.draft.sourceRevision||next.revision<=revision)return;try{serialize2(next,"plain")}catch{onChange({...current,error:"AI returned an invalid transfer draft."}),setAiFailed(!0);return}onChange({...current,draft:next,error:void 0}),setBufferError(null)}catch(error){!isAbort(error)&&fence.valid(id,controller)&&(setAiFailed(!0),onChange({...latest.current,error:errorMessage(error,"AI preparation failed")}))}finally{fence.finish(controller),activeAi.current===controller&&(activeAi.current=null),fence.valid(id,controller)&&setBusy(null)}},cancelAi=async()=>{let aiController=activeAi.current,{controller,id}=fence.begin();try{await aiSession.current?.cancel?.()}catch(error){fence.valid(id,controller)&&onChange({...latest.current,error:errorMessage(error,"AI cancellation failed")})}finally{aiController?.abort(),fence.finish(controller),activeAi.current===aiController&&(activeAi.current=null),fence.valid(id,controller)&&setBusy(null)}},[deliveryNotice,setDeliveryNotice]=React4.useState(null);React4.useEffect(()=>{setDeliveryNotice(null)},[state.draft.revision]);let reportDelivery=outcome=>{setDeliveryNotice(outcomeMessage(outcome)),onOutcome(outcome)},deliver=async download=>{if(bufferError)return;let{controller,id}=fence.begin(),snapshotId=state.snapshot.id,revision=state.draft.revision;setBusy(download?"download":"copy");try{if(!shown)throw new Error("Wait for the preview before delivery.");let artifact=shown,current=latest.current;if(!fence.valid(id,controller)||current.snapshot.id!==snapshotId||current.draft.revision!==revision||artifact.snapshotId!==snapshotId||artifact.draftRevision!==revision)return;let result=await transport[download?"download":"copy"](artifact,controller.signal);fence.valid(id,controller)&&reportDelivery(result)}catch(error){fence.valid(id,controller)&&reportDelivery({status:"error",code:"prepare-failed",message:errorMessage(error,"Preparation failed"),retryable:!0})}finally{fence.finish(controller),fence.valid(id,controller)&&setBusy(null)}},deliverAction=async action=>{if(busy||bufferError||formatError||!shown)return;let{controller,id}=fence.begin(),current=latest.current;setBusy("action");try{if(!action.supports(current.snapshot,current.draft))throw new Error(`${action.label} is unavailable for this prepared content.`);handingOff.current=!0,flushSync(()=>onClose());let result=await action.run({snapshot:current.snapshot,draft:current.draft,signal:controller.signal});fence.valid(id,controller)&&reportDelivery(result)}catch(error){fence.valid(id,controller)&&reportDelivery({status:"error",code:"destination-failed",message:errorMessage(error,"Could not deliver prepared content"),retryable:!1})}finally{fence.finish(controller),fence.valid(id,controller)&&setBusy(null)}},eligibleActions=state.buildError?[]:actions.filter(action=>action.supports(state.snapshot,state.draft)),rows=state.original.payload.kind==="rows"?state.original.payload:null,formats=COPIES.filter(f=>offersFormat(f,state.draft.payload,adapters)),workspaceAdapters=adapters.filter(adapter=>!isBuiltInFormat(adapter.id)&&adapter.supports(state.draft.payload)),displayedOmissions=shown?.omissions??state.draft.omissions,shownText=shown?.plainText??"",chars=shownText.length,bytes=React4.useMemo(()=>new TextEncoder().encode(shownText).length,[shownText]),envelopeOffered=formatArtifact?envelopeDataFormat(format,formatArtifact)!==null:format!=="html"&&format!=="xlsx",snapshotSections=state.snapshot.sections,sectionLabels=useProjectedLabels(snapshotSections.map(section=>section.label),adapters),sectionRows=snapshotSections.map((section,index)=>({section,label:sectionLabels[index]??section.label,size:sectionSize(state.original.payload,section.path)})),sectionWhole=sectionRows.reduce((sum,row)=>sum+(row.size??0),0),orderedSections=biggestFirst?[...sectionRows].sort((a,b)=>(b.size??0)-(a.size??0)):sectionRows,groomer=state.levers?.sections??null,groomerWhole=Object.values(state.leverSizes??{}).reduce((sum,size)=>sum+size,0),orderedGroomer=groomer?biggestFirst?[...groomer].sort((a,b)=>(state.leverSizes?.[b.id]??0)-(state.leverSizes?.[a.id]??0)):groomer:null,activePreset=groomer?activeGroomerPreset(leverValues,groomer):null,options=state.levers?.options??null,jsonRoot=!groomer&&(state.original.payload.kind==="json"||state.original.payload.kind==="registered")?state.original.payload.value:void 0,hasStructure=!!(rows||snapshotSections.length||groomer||jsonRoot!==void 0),editHeld=state.draft.manuallyEdited,meta=Object.entries(state.leverMeta??{}).filter(([,value])=>value!==void 0&&value!==""),title=`Prepare ${state.snapshot.label}`,copyVisible=!state.buildError&&!formatError&&!bufferError&&!sealed.error&&!showRemoved,spans=React4.useMemo(()=>shown&&formatArtifact&&formatArtifact.snapshotId===state.snapshot.id&&formatArtifact.draftRevision===state.draft.revision?shownSpans(state.draft,formatArtifact,shown):null,[formatArtifact,shown,state.draft,state.snapshot.id]),[projectedSections,setProjectedSections]=React4.useState(null);React4.useEffect(()=>{let engine=hostEngineFor(adapters,format),layout2=draftLayout(state.draft),payload=state.draft.payload;if(!engine||!formatArtifact||!layout2.sectionRanges||payload.kind!=="text"&&payload.kind!=="markdown"||formatArtifact.draftRevision!==state.draft.revision){setProjectedSections(null);return}let controller=new AbortController,pieces=Object.entries(layout2.sectionRanges).sort((a,b)=>a[1].start-b[1].start).map(([id,range])=>({id,text:payload.text.slice(range.start,range.end)}));return locateProjectedSections(formatArtifact.plainText,pieces,engine,controller.signal).then(ranges=>{controller.signal.aborted||setProjectedSections({artifact:formatArtifact,ranges})}).catch(()=>{controller.signal.aborted||setProjectedSections(null)}),()=>controller.abort()},[adapters,format,formatArtifact,state.draft]);let focusResult=React4.useMemo(()=>{if(!focus||!shown)return{marks:[],note:null};if(!spans)return{marks:[],note:"This format has no highlight map. Choose JSON, Markdown, CSV, Google Sheets or plain text to see where it lands."};let byPath=new Map(spans.map(span=>[span.path,span])),found=[];if(focus.kind==="json"&&jsonRoot!==void 0)found=(focus.id.includes("*")?concretePointers2(jsonRoot,focus.id).slice(0,500):[focus.id]).map(pointer=>outputPointer(jsonRoot,controls.structure,pointer)).flatMap(pointer=>pointer===null?[]:[byPath.get(pointer)].filter(span=>!!span));else if(focus.kind==="section"){let section=snapshotSections.find(candidate=>candidate.id===focus.id),span=section?sectionSpan(state.draft,spans,shownText,section.id)??byPath.get(section.path):void 0,projected=section&&projectedSections?.artifact===formatArtifact?projectedSections.ranges[section.id]:void 0,whole=byPath.get("");!span&&projected&&whole&&(span={path:`/sections/${section.id}`,start:whole.start+projected.start,end:whole.start+projected.end}),span&&(found=[span])}else if(focus.kind==="row"){let position=draftLayout(state.draft).rowOrder?.indexOf(Number(focus.id))??-1,span=position>=0?byPath.get(`/rows/${position}`):void 0;span&&(found=[span])}else{let span=byPath.get(`/columns/${encodePointer(focus.id)}`);span&&(found=[span])}if(!found.length){let included=focus.kind==="section"?controls.sections.includes(focus.id):focus.kind==="row"?!controls.excludedRows.includes(Number(focus.id)):!0;return{marks:[],note:included&&focus.kind==="section"?"This format rewrites the text, so this section's place cannot be pointed at yet. Choose Markdown to see exactly where it lands.":"Not in the output: it is left out, or a limit trimmed it."}}return{marks:found.map(span=>({start:span.start,end:span.end,kind:"focus"})),note:null}},[controls.excludedRows,controls.sections,controls.structure,focus,formatArtifact,jsonRoot,projectedSections,shown,shownText,snapshotSections,spans,state.draft]),searchQuery=rows?controls.search:treeQuery,matches=React4.useMemo(()=>findMatches(shownText,searchQuery,rows?controls.searchMode:"contains"),[controls.searchMode,rows,searchQuery,shownText]),previewMarks=React4.useMemo(()=>[...focusResult.marks,...matches.marks],[focusResult.marks,matches.marks]),copyText=(text,what)=>{let artifact=sealTransferArtifact2({snapshotId:state.draft.snapshotId,draftRevision:state.draft.revision,format:"plain",plainText:text,omissions:[]});transport.copy(artifact,new AbortController().signal).then(outcome=>{setDeliveryNotice(outcome.status==="success"?`${what} copied`:outcomeMessage(outcome)),onOutcome(outcome)}).catch(error=>setDeliveryNotice(errorMessage(error,`${what} could not be copied`)))};React4.useEffect(()=>{if(!showRemoved){setRemovedView(null);return}if(!isBuiltInFormat(format)||format==="xlsx"||format==="html"){setRemovedView({error:"Choose JSON, Markdown, CSV, Google Sheets or plain text to see what was removed."});return}let controller=new AbortController,full=resetDraft2(state.snapshot);return buildFormat(full,format,state.snapshot.label,adapters,controller.signal).then(async artifact=>{if(controller.signal.aborted)return;let engine=hostEngineFor(adapters,format),payload=full.payload,prose=(payload.kind==="text"||payload.kind==="markdown")&&snapshotSections.length>0&&snapshotSections.every(section=>/^\/text\/\d+-\d+$/.test(section.path)),projected=engine&&prose?await locateProjectedSections(artifact.plainText,snapshotSections.map(section=>{let[,a,b]=/^\/text\/(\d+)-(\d+)$/.exec(section.path);return{id:section.id,text:payload.text.slice(Number(a),Number(b))}}),engine,controller.signal):void 0;if(controller.signal.aborted)return;let result=removedMarks(state,controls,full,artifact,projected);setRemovedView(result?{text:artifact.plainText,marks:result.marks,summary:`${formatCount3(result.removed)} removed \xB7 ${formatCount3(result.changed)} shortened \xB7 ${formatCount3(result.chars)} chars left out`}:{error:"This format has no span map, so its removals cannot be pointed at."})}).catch(error=>{controller.signal.aborted||setRemovedView({error:errorMessage(error,"Full could not be built in this format.")})}),()=>controller.abort()},[adapters,controls,format,showRemoved,state.draft,state.snapshot]);let jsonItems=React4.useMemo(()=>jsonRoot===void 0?[]:treeQuery.trim()?jsonSearchItems(jsonRoot,controls.structure,treeQuery):jsonTreeItems(jsonRoot,controls.structure,expanded),[controls.structure,expanded,jsonRoot,treeQuery]),jsonWhole=jsonItems.find(item=>item.key==="#root")?.chars??jsonItems.reduce((max,item)=>Math.max(max,item.chars??0),0),setStructure=structure2=>changeControls({...controls,structure:structure2}),jsonHandlers={toggle:item=>setStructure(toggleNode(controls.structure,itemPattern(item))),includeAgain:item=>{let pattern=itemPattern(item),cover=controls.structure.exclude.find(candidate=>candidate!==pattern&&patternCovers2(candidate,pattern));cover!==void 0&&setStructure({...controls.structure,exclude:controls.structure.exclude.filter(candidate=>candidate!==cover)})},expand:item=>setExpanded(current=>{let next=new Set(current),pattern=itemPattern(item);return next.has(pattern)?next.delete(pattern):next.add(pattern),next}),focus:item=>setFocus({kind:"json",id:itemPattern(item),key:item.key}),limit:(item,value)=>{let pattern=itemPattern(item),limits={...controls.structure.limits},limit=decodeLimit(value);limit?limits[pattern]=limit:delete limits[pattern],setStructure({...controls.structure,limits})},copyPath:path=>copyText(path,"Path")},sectionText=path=>{let m=/^\/text\/(\d+)-(\d+)$/.exec(path),payload=state.original.payload;return m&&(payload.kind==="text"||payload.kind==="markdown")?payload.text.slice(Number(m[1]),Number(m[2])):""},sectionQuery=treeQuery.trim().toLocaleLowerCase(),sectionItems=orderedSections.filter(({section,label})=>!sectionQuery||label.toLocaleLowerCase().includes(sectionQuery)||sectionText(section.path).toLocaleLowerCase().includes(sectionQuery)).map(({section,label,size})=>({key:`section:${section.id}`,depth:0,label,chars:size,state:controls.sections.includes(section.id)?"on":"off",limitChoices:TEXT_LIMITS,limit:encodeLimit(controls.sectionLimits[section.id])})),sectionId=item=>item.key.slice(8),sectionHandlers={toggle:item=>{let id=sectionId(item);changeControls({...controls,sections:controls.sections.includes(id)?controls.sections.filter(value=>value!==id):[...controls.sections,id]})},focus:item=>setFocus({kind:"section",id:sectionId(item),key:item.key}),limit:(item,value)=>{let id=sectionId(item),limits={...controls.sectionLimits},limit=decodeLimit(value);limit?limits[id]=limit:delete limits[id],changeControls({...controls,sectionLimits:limits})}},drag=React4.useRef(null),clampPane=width=>{let total=root.current?.getBoundingClientRect().width||1600;return Math.round(Math.min(Math.max(width,MIN_PANE),Math.max(MIN_PANE,total*.45)))},setPane=(side,width,persist)=>{setPanes(current=>{let next={...current,[side]:clampPane(width)};return persist&&writeStored(PANE_KEY,next),next})},divider=side=>jsx4("div",{role:"separator","aria-orientation":"vertical","aria-label":side==="left"?"Resize structure pane":"Resize settings pane","aria-valuenow":panes[side],"aria-valuemin":MIN_PANE,tabIndex:0,className:"matrx-alchemy-prep-divider",onPointerDown:event=>{drag.current={side,startX:event.clientX,start:panes[side]},event.currentTarget.setPointerCapture?.(event.pointerId)},onPointerMove:event=>{let d=drag.current;if(!d||d.side!==side)return;let delta=event.clientX-d.startX;setPane(side,side==="left"?d.start+delta:d.start-delta,!1)},onPointerUp:event=>{drag.current&&(drag.current=null,event.currentTarget.releasePointerCapture?.(event.pointerId),setPanes(current=>(writeStored(PANE_KEY,current),current)))},onKeyDown:event=>{let step=event.shiftKey?64:16;event.key==="ArrowLeft"&&(event.preventDefault(),setPane(side,panes[side]+(side==="left"?-step:step),!0)),event.key==="ArrowRight"&&(event.preventDefault(),setPane(side,panes[side]+(side==="left"?step:-step),!0))}}),chooseTab=next=>{setTab(next),writeStored(TAB_KEY,next)},topBar=jsxs4("div",{className:"matrx-alchemy-prep-top",children:[scopes.length>1?jsxs4("label",{className:"matrx-alchemy-prep-field",children:["Scope",jsx4("select",{"aria-label":"Transfer scope",value:state.scope,disabled:busy!==null,onChange:e=>{requestCapture(e.target.value)},children:scopes.map(scope=>jsx4("option",{value:scope,children:scopeLabels?.[scope]??SCOPE_LABEL[scope]},scope))})]}):null,jsxs4("label",{className:"matrx-alchemy-prep-field",children:["Detail",jsxs4("select",{"aria-label":"Detail preset",value:controls.preset,onChange:e=>changeControls({...controls,preset:e.target.value}),children:[jsx4("option",{value:"full",children:"Full"}),jsx4("option",{value:"compact",children:"Compact"}),jsx4("option",{value:"brief",children:"Brief"}),jsx4("option",{value:"custom",children:"Custom"})]})]}),jsxs4("label",{className:"matrx-alchemy-prep-field",children:["Format",jsxs4("select",{"aria-label":"Output format",value:format,onChange:e=>{setFormat(e.target.value),setEditing(!1)},children:[formats.map(f=>jsx4("option",{value:f,children:LABEL[f]},f)),state.draft.payload.kind==="rows"?jsx4("option",{value:"xlsx",children:"Excel workbook"}):null,workspaceAdapters.map(adapter=>jsx4("option",{value:adapter.id,children:adapter.label},adapter.id))]})]}),envelopeOffered?jsx4(Segmented,{label:"Copy as",value:envelopeOn?"ai":"text",choices:[{value:"text",label:"Text",title:"The format's bytes alone"},{value:"ai",label:"For AI",title:"Inside the AI envelope, with your instructions first"}],onChange:value=>setEnvelopeOn(value==="ai")}):null,jsx4("span",{className:"matrx-alchemy-prep-totals","aria-live":"polite",children:shown?jsxs4(Fragment2,{children:[formatCount3(chars)," chars \xB7 ",formatCount3(bytes)," bytes \xB7 \u2248",formatCount3(Math.ceil(chars/4))," tokens ",jsx4("small",{children:"(estimate)"})]}):state.buildError?"Nothing to copy":"Preparing\u2026"}),meta.length?jsx4("span",{className:"matrx-alchemy-prep-meta",children:meta.map(([key,value])=>`${key.replace(/_/g," ")} ${String(value)}`).join(" \xB7 ")}):null]}),structure=hasStructure?jsxs4("section",{className:"matrx-alchemy-prep-pane matrx-alchemy-prep-structure","aria-label":"Structure",children:[jsxs4("div",{className:"matrx-alchemy-prep-pane-head",children:[jsx4("h3",{children:"Structure"}),snapshotSections.length>1||(groomer?.length??0)>1?jsx4("button",{type:"button",className:"matrx-alchemy-prep-chip","aria-pressed":biggestFirst,onClick:()=>setBiggestFirst(!biggestFirst),children:"Biggest first"}):null]}),editHeld?jsx4("p",{className:"matrx-alchemy-prep-held",children:"Editing \u2014 rebuild from source to change the structure."}):null,focusResult.note?jsx4("p",{className:"matrx-alchemy-prep-hint",role:"status",children:focusResult.note}):null,groomer&&orderedGroomer?jsxs4("div",{className:"matrx-alchemy-prep-group",children:[jsxs4("div",{className:"matrx-alchemy-prep-lever-row",children:[jsx4("span",{className:"matrx-alchemy-prep-lever-label",children:"Sections"}),jsx4("span",{className:"matrx-alchemy-prep-hint",children:activePreset?`${activePreset[0].toUpperCase()}${activePreset.slice(1)}`:"Custom"})]}),jsx4(Segmented,{label:"Section preset",value:activePreset??"custom",choices:[{value:"everything",label:"Everything"},{value:"balanced",label:"Balanced"},{value:"minimal",label:"Minimal"},...activePreset?[]:[{value:"custom",label:"Custom"}]],onChange:value=>{if(value==="custom")return;let levels=applyGroomerPreset(value,groomer);changeLevers({...leverValues,...Object.fromEntries(Object.entries(levels).map(([id,level])=>[sectionLeverKey(id),level]))})}}),orderedGroomer.map(section=>jsx4(GroomerSection,{section,level:leverValues[sectionLeverKey(section.id)]??"full",size:state.leverSizes?.[section.id]??0,whole:groomerWhole,onChange:level=>setLever(sectionLeverKey(section.id),level)},section.id))]}):null,jsonRoot!==void 0?jsxs4("div",{className:"matrx-alchemy-prep-group",children:[jsx4("input",{className:"matrx-alchemy-prep-search",type:"search","aria-label":"Find in data",placeholder:"Find a key or value",value:treeQuery,onChange:e=>setTreeQuery(e.target.value)}),treeQuery.trim()?jsxs4("small",{className:"matrx-alchemy-prep-hint",role:"status",children:[jsonItems.length>=500?"500+":formatCount3(jsonItems.length)," ",jsonItems.length===1?"node matches":"nodes match"," \xB7 ",formatCount3(matches.total)," in the preview"]}):null,jsx4(StructureTreeList,{label:"Data",items:jsonItems,whole:jsonWhole,focusKey:focus?.key??null,handlers:jsonHandlers,maxHeight:"calc(92dvh - 16rem)"})]}):null,snapshotSections.length?jsxs4("fieldset",{className:"matrx-alchemy-prep-group","aria-label":"Included sections",children:[jsxs4("legend",{className:"matrx-alchemy-prep-legend",children:[controls.sections.length.toLocaleString()," of ",snapshotSections.length.toLocaleString()," ",countNoun(state.snapshot.coverage.unit??"section",snapshotSections.length)," included"]}),snapshotSections.length>6?jsx4("input",{className:"matrx-alchemy-prep-search",type:"search","aria-label":`Find a ${state.snapshot.coverage.unit??"section"}`,placeholder:"Find by name or text",value:treeQuery,onChange:e=>setTreeQuery(e.target.value)}):null,sectionQuery?jsxs4("small",{className:"matrx-alchemy-prep-hint",role:"status",children:[formatCount3(sectionItems.length)," ",sectionItems.length===1?"matches":"match"," \xB7 ",formatCount3(matches.total)," in the preview"]}):null,jsx4(StructureTreeList,{label:"Sections",items:sectionItems,whole:sectionWhole,focusKey:focus?.key??null,handlers:sectionHandlers,maxHeight:"calc(92dvh - 16rem)"})]}):null,rows?jsx4(RowsStructure,{rows,controls,change:changeControls,draft:state.draft,focusKey:focus?.key??null,matchesInPreview:matches.total,onFocus:(kind,id)=>setFocus({kind,id,key:`${kind}:${id}`}),onCopyRow:text=>copyText(text,"Row")}):null]}):null,previewPane=jsxs4("section",{className:"matrx-alchemy-prep-pane matrx-alchemy-prep-center","aria-label":"Preview",children:[jsxs4("div",{className:"matrx-alchemy-prep-pane-head",children:[jsx4("h3",{children:editing?"Editing":showRemoved?"Removed compared with Full":envelopeOn&&envelopeOffered?"Preview \u2014 for AI":"Preview"}),searchQuery.trim()&&shown&&!showRemoved?jsxs4("span",{className:"matrx-alchemy-prep-hint",role:"status","aria-label":"Matches in the preview",children:[matches.total.toLocaleString()," ",matches.total===1?"match":"matches"]}):null,hasStructure&&!editing&&!state.buildError?jsx4("button",{type:"button",className:"matrx-alchemy-prep-chip","aria-pressed":showRemoved,onClick:()=>setShowRemoved(!showRemoved),children:showRemoved?"Back to preview":"Show what was removed"}):null,!state.buildError&&!showRemoved&&(formatArtifact||editing)?editing?jsx4(Button2,{type:"button",size:"sm",variant:"outline",className:"matrx-alchemy-workspace-secondary",onClick:()=>setEditing(!1),children:"Done"}):jsx4(Button2,{type:"button",size:"sm",variant:"outline",className:"matrx-alchemy-workspace-secondary",onClick:startEditing,children:"Edit"}):null]}),editHeld&&!editing&&!pending?jsxs4("div",{className:"matrx-alchemy-prep-held",role:"status",children:[jsx4("span",{children:"Editing \u2014 rebuild from source to change the structure."}),jsx4(Button2,{type:"button",size:"sm",variant:"outline",className:"matrx-alchemy-workspace-secondary",onClick:rebuildFromSource,children:"Rebuild from source"})]}):null,pending?jsxs4("div",{className:"matrx-alchemy-decision",role:"alert",children:[jsx4("p",{children:"This control would replace your manual edit."}),jsx4(Button2,{className:"matrx-alchemy-workspace-secondary",type:"button",variant:"outline",onClick:()=>setPending(null),children:"Keep edited draft"}),jsx4(Button2,{className:"matrx-alchemy-workspace-primary",type:"button",onClick:applyPending,children:"Rebuild from source"})]}):null,state.buildError?jsxs4("div",{className:"matrx-alchemy-preview matrx-alchemy-prep-preview matrx-alchemy-prep-failed",role:"alert","aria-label":"Prepared output",children:[jsx4("p",{children:jsx4("strong",{children:"This source could not be prepared."})}),jsx4("p",{children:state.buildError}),jsx4("p",{className:"matrx-alchemy-prep-hint",children:"Change an option to try again; nothing was copied."})]}):editing?jsxs4(Fragment2,{children:[envelopeOn&&envelopeOffered?jsxs4("p",{className:"matrx-alchemy-prep-hint",children:["Copy wraps this text in the AI envelope",sealedInstructions.trim()?" with your instructions first":"","."]}):null,jsx4("textarea",{className:"matrx-alchemy-preview matrx-alchemy-prep-editor","aria-label":"Edit prepared output","aria-invalid":bufferError?!0:void 0,"aria-describedby":bufferError?"alchemy-buffer-error":void 0,value:buffer,onChange:e=>editBuffer(e.target.value),autoFocus:!0})]}):showRemoved?removedView===null?jsx4("p",{className:"matrx-alchemy-prep-hint",role:"status",children:"Building Full to compare\u2026"}):"error"in removedView?jsx4("p",{className:"matrx-alchemy-prep-hint",role:"status",children:removedView.error}):jsxs4(Fragment2,{children:[jsxs4("p",{className:"matrx-alchemy-prep-hint",role:"status",children:[removedView.summary,". Full, before your structure choices \u2014 this is not what you copy."]}),jsx4(PreviewText,{text:removedView.text,marks:removedView.marks,label:"Removed compared with Full"})]}):shown?shown.html!==void 0&&!(envelopeOn&&envelopeOffered)?jsx4(PreviewHtml,{html:shown.html}):jsx4(PreviewText,{text:shownText,marks:previewMarks}):formatError?null:jsx4("p",{className:"matrx-alchemy-prep-hint",role:"status",children:"Preparing preview\u2026"}),bufferError?jsx4("p",{id:"alchemy-buffer-error",role:"alert",className:"matrx-alchemy-error",children:bufferError}):null,formatError?jsx4("p",{role:"alert",className:"matrx-alchemy-error",children:formatError}):null,sealed.error?jsx4("p",{role:"alert",className:"matrx-alchemy-error",children:sealed.error}):null,bufferError?jsx4(Button2,{className:"matrx-alchemy-workspace-secondary",type:"button",variant:"outline",disabled:busy!==null,onClick:()=>{let fallback=editDraft(state.draft,{kind:"text",text:buffer});setBufferError(null),onChange({...state,draft:fallback,error:void 0}),setFormat("plain")},children:"Use invalid JSON as plain text"}):null,jsxs4("div",{className:"matrx-alchemy-coverage",children:[jsxs4("span",{children:[snapshotSections.length?`${formatCount3(controls.sections.length)} of ${formatCount3(snapshotSections.length)} ${countNoun(state.snapshot.coverage.unit??"section",snapshotSections.length)} included`:`${formatCount3(state.snapshot.coverage.included)} included${state.snapshot.coverage.total==null?"":` of ${formatCount3(state.snapshot.coverage.total)}`}`," \xB7 ",state.snapshot.coverage.status]}),state.snapshot.coverage.reason?jsx4("span",{children:state.snapshot.coverage.reason}):null,displayedOmissions.length?jsxs4("details",{children:[jsxs4("summary",{children:[displayedOmissions.length," omissions or adjustments"]}),jsx4("ul",{children:displayedOmissions.map((o,i)=>jsxs4("li",{children:[o.label?`${o.label}: ${o.reason}`:`${o.path||"/"}: ${o.reason}`,o.count==null?"":` (${o.count})`]},`${o.path}-${o.reason}-${i}`))})]}):null]})]}),settings=jsxs4("section",{className:"matrx-alchemy-prep-pane matrx-alchemy-prep-settings","aria-label":"Settings",children:[jsx4("div",{className:"matrx-alchemy-prep-pane-head",children:jsx4("h3",{children:"Settings"})}),options?.length?jsxs4("div",{className:"matrx-alchemy-prep-group",role:"group","aria-label":"Source options",children:[jsx4("h4",{children:"Source options"}),options.map(option=>jsx4(LeverControl,{option,value:leverValues[option.key]??option.default,onChange:value=>setLever(option.key,value,option.kind==="number")},option.key))]}):null,controls.preset==="custom"?jsxs4("fieldset",{className:"matrx-alchemy-prep-group",children:[jsx4("legend",{className:"matrx-alchemy-prep-legend",children:state.draft.payload.kind==="json"||state.draft.payload.kind==="registered"?"JSON limits":"Content limits"}),[["maxDepth","Maximum depth"],["maxStringChars",state.draft.payload.kind==="rows"?"Maximum characters per cell":"Maximum string characters"],["maxArrayItems","Maximum array items"]].filter(([key])=>key==="maxStringChars"||state.draft.payload.kind==="json"||state.draft.payload.kind==="registered").map(([key,text])=>jsxs4("label",{className:"matrx-alchemy-prep-lever-row",children:[jsx4("span",{children:text}),jsx4("input",{type:"number",min:"0",value:controls[key]??"",onChange:e=>changeControls({...controls,[key]:Number.isNaN(e.target.valueAsNumber)?null:e.target.valueAsNumber})})]},key))]}):null,envelopeOn&&envelopeOffered?jsxs4("label",{className:"matrx-alchemy-prep-group",children:[jsx4("h4",{children:"Instructions for the model"}),jsx4("textarea",{ref:instructionsRef,"aria-label":"Instructions for the model",value:instructions,onChange:e=>setInstructions(e.target.value),placeholder:"e.g. Review this conversation for tool errors"}),jsx4("small",{className:"matrx-alchemy-prep-hint",children:"Sealed first in what you copy, and counted in the total."})]}):null,ai?jsxs4("div",{className:"matrx-alchemy-prep-group",children:[jsx4("h4",{children:"Prepare with AI"}),jsxs4("label",{className:"matrx-alchemy-prep-field",children:["Start with",jsxs4("select",{"aria-label":"AI preparation recipe",defaultValue:"",onChange:event=>{event.target.value&&setAiInstruction(event.target.value)},children:[jsx4("option",{value:"",children:"Choose an instruction"}),jsx4("option",{value:"Summarize this content concisely. Preserve important facts, names, decisions, and source references.",children:"Summarize"}),jsx4("option",{value:"Extract decisions, action items, owners, and due dates. Mark missing details as unspecified.",children:"Extract action items"}),jsx4("option",{value:"Prepare a complete handoff for another assistant. Include the objective, relevant facts, constraints, decisions, and unresolved questions.",children:"Assistant handoff"}),jsx4("option",{value:"Condense this content by removing repetition and formatting noise. Preserve every unique fact and all identifiers.",children:"Condense without losing facts"}),jsx4("option",{value:"Turn this content into a clear structured outline. Keep the original meaning and explicitly flag uncertainty.",children:"Create an outline"}),jsx4("option",{value:"Analyze this data. Identify patterns, anomalies, and useful comparisons. Distinguish observations from inferences.",children:"Analyze the data"})]})]}),jsxs4("label",{className:"matrx-alchemy-prep-field",children:["AI instruction",jsx4("textarea",{value:aiInstruction,onChange:e=>setAiInstruction(e.target.value),placeholder:"Tell AI how to prepare this content"})]}),jsx4(Button2,{className:"matrx-alchemy-workspace-secondary",type:"button",variant:"outline",disabled:!aiSession.current||!aiInstruction.trim()||busy!==null||!aiSession.current.supports(state.snapshot),onClick:()=>{runAi(!1)},children:"Generate preview"}),busy==="ai"?jsx4(Button2,{className:"matrx-alchemy-workspace-secondary",type:"button",variant:"outline",onClick:()=>{cancelAi()},children:aiSession.current?.cancel?"Cancel AI":"Stop waiting"}):null,aiFailed&&aiSession.current?.recover&&busy!=="ai"?jsx4(Button2,{className:"matrx-alchemy-workspace-secondary",type:"button",variant:"outline",onClick:()=>{runAi(!0)},children:"Retry or rejoin AI run"}):null,jsx4("p",{className:"matrx-alchemy-meta",children:"AI updates the preview; copy it when you are ready. Closing this window lets the AI run continue."})]}):null,!options?.length&&controls.preset!=="custom"&&!(envelopeOn&&envelopeOffered)&&!ai&&!eligibleActions.length?jsx4("p",{className:"matrx-alchemy-prep-hint",children:envelopeOffered?"Choose For AI to seal instructions for the model with what you copy.":"This format has no further settings."}):null,busy==="capture"?jsx4(Button2,{className:"matrx-alchemy-workspace-secondary",type:"button",variant:"outline",onClick:()=>{activeCapture.current?.abort(),activeCapture.current=null,setBusy(null)},children:"Stop loading rows"}):null,state.error?jsx4("p",{role:"alert",className:"matrx-alchemy-error",children:state.error}):null,eligibleActions.length?jsxs4("details",{className:"matrx-alchemy-prep-group matrx-alchemy-destinations",children:[jsxs4("summary",{children:["Use prepared content \xB7 ",eligibleActions.length," ",eligibleActions.length===1?"destination":"destinations"]}),jsx4("div",{className:"matrx-alchemy-destination-grid",children:eligibleActions.map(action=>jsx4("button",{type:"button",className:"matrx-alchemy-palette-row",disabled:busy!==null||!!(bufferError||formatError)||!shown,onClick:()=>{deliverAction(action)},children:jsx4(DestinationPresentation,{action})},action.id))})]}):null]}),footer=jsxs4("div",{className:"matrx-alchemy-prep-footer",children:[state.sourceStale?jsx4("p",{role:"alert",className:"matrx-alchemy-decision",children:"The source changed since this draft. Use Refresh source to review the latest data."}):null,state.pending?jsxs4("div",{className:"matrx-alchemy-decision",role:"alert",children:[jsx4("p",{children:"A fresh source snapshot is ready."}),state.pending.scope!==state.scope?jsxs4("p",{children:["Switch from ",scopeLabels?.[state.scope]??SCOPE_LABEL[state.scope]," to ",scopeLabels?.[state.pending.scope]??SCOPE_LABEL[state.pending.scope]," by regenerating. Your current draft is retained until you choose."]}):null,jsx4(Button2,{className:"matrx-alchemy-workspace-secondary",type:"button",variant:"outline",onClick:()=>resolveCapture("keep"),children:"Keep current snapshot and draft"}),jsx4(Button2,{className:"matrx-alchemy-workspace-primary",type:"button",onClick:()=>resolveCapture("regenerate"),children:"Regenerate from fresh source"})]}):null,jsxs4("div",{className:"matrx-alchemy-prep-actions",children:[deliveryNotice?jsx4("p",{role:"status",className:"matrx-alchemy-meta",children:deliveryNotice}):null,showRemoved?jsx4(Button2,{type:"button",size:"sm",className:"matrx-alchemy-workspace-primary",onClick:()=>setShowRemoved(!1),children:"Back to preview to copy"}):null,jsx4(Button2,{type:"button",size:"sm",variant:"outline",className:"matrx-alchemy-workspace-secondary",disabled:!state.draft.history?.length&&!controlsHistory.length||busy!==null,onClick:()=>{if(setBufferError(null),controlsHistory.length){let next=controlsHistory[controlsHistory.length-1];setControls(next),setControlsHistory(history=>history.slice(0,-1)),onChange({...state,draft:rebuild(state,next),error:void 0})}else onChange({...state,draft:undoDraft(state.draft),error:void 0})},children:"Undo"}),jsx4(Button2,{type:"button",size:"sm",variant:"outline",className:"matrx-alchemy-workspace-secondary",disabled:busy!==null,onClick:()=>{let next=initialControls(state);setControls(next),setControlsHistory([]),setPending(null),setBufferError(null),setEditing(!1),state.levers?applyLevers(state.levers.initial,state,next):onChange({...state,draft:rebuild(state,next),error:void 0})},children:"Reset"}),state.levers?null:jsx4(Button2,{type:"button",size:"sm",variant:"outline",className:"matrx-alchemy-workspace-secondary",disabled:busy!==null,onClick:()=>{requestCapture(state.scope)},children:"Refresh source"}),frame==="dialog"?jsx4(Button2,{type:"button",variant:"outline",className:"matrx-alchemy-workspace-secondary",onClick:close,children:"Close"}):null,copyVisible?jsx4(Button2,{type:"button",variant:"outline",className:"matrx-alchemy-workspace-secondary","aria-label":"Download prepared output",disabled:busy!==null||!shown,onClick:()=>{deliver(!0)},children:"Download"}):null,copyVisible?jsx4(Button2,{type:"button",className:"matrx-alchemy-workspace-primary","aria-label":"Copy prepared output",disabled:busy!==null||!shown,onClick:()=>{deliver(!1)},children:shown?envelopeOn&&envelopeOffered?"Copy for AI":"Copy":"Preparing\u2026"}):null]})]}),layout=narrow?jsxs4(Fragment2,{children:[jsx4("div",{className:"matrx-alchemy-prep-tabs",role:"tablist","aria-label":"Workspace sections",children:[...hasStructure?[["structure","Structure"]]:[],["preview","Preview"],["settings","Settings"]].map(([id,label])=>jsx4("button",{type:"button",role:"tab","aria-selected":(hasStructure||tab!=="structure"?tab:"preview")===id,onClick:()=>chooseTab(id),children:label},id))}),jsx4("div",{className:"matrx-alchemy-prep-tabpanel",role:"tabpanel",children:(hasStructure||tab!=="structure"?tab:"preview")==="structure"?structure:tab==="settings"?settings:previewPane})]}):jsxs4("div",{className:"matrx-alchemy-prep-panes",style:{gridTemplateColumns:hasStructure?`${panes.left}px 8px minmax(0, 1fr) 8px ${panes.right}px`:`minmax(0, 1fr) 8px ${panes.right}px`},children:[structure,hasStructure?divider("left"):null,previewPane,divider("right"),settings]}),body=jsxs4("div",{ref:root,className:cn("matrx-alchemy-prep",narrow&&"matrx-alchemy-prep-narrow"),"data-frame":frame,"aria-busy":busy!==null,children:[frame==="host"&&state.snapshot.unsavedChanges?jsx4("p",{className:"matrx-alchemy-prep-hint",children:"Includes your unsaved changes."}):null,topBar,layout,footer]});return frame==="host"?open&&windowNode?createPortal(body,windowNode):null:jsx4(Dialog2,{open,onOpenChange:next=>{next||close()},children:jsxs4(DialogContent2,{onCloseAutoFocus:event=>{event.preventDefault(),handingOff.current||restoreFocus()},className:"matrx-alchemy-workspace matrx-alchemy-prep-dialog","aria-busy":busy!==null,children:[jsxs4(DialogHeader2,{children:[jsx4(DialogTitle2,{children:title}),jsxs4(DialogDescription2,{children:[state.snapshot.unsavedChanges?"Includes your unsaved changes. ":"","Review and edit this copy. Your original stays unchanged."]})]}),body]})})}function RowsStructure({rows,controls,change,draft,focusKey,matchesInPreview,onFocus,onCopyRow}){let[columnSearch,setColumnSearch]=React4.useState(""),[menuRow,setMenuRow]=React4.useState(null),shown=React4.useMemo(()=>new Set(controls.visibleColumns),[controls.visibleColumns]),filterCount=Object.values(controls.filters).filter(Boolean).length+controls.layeredFilters.length,sizes=React4.useMemo(()=>Object.fromEntries(rows.columns.map(column=>[column.id,columnSize(rows,column.id)])),[rows]),whole=Object.values(sizes).reduce((sum,size)=>sum+size,0),shownColumns=rows.columns.filter(column=>!columnSearch.trim()||column.label.toLowerCase().includes(columnSearch.trim().toLowerCase())),visibleDefs=rows.columns.filter(column=>shown.has(column.id)&&exportableColumn(column)),matched=draftLayout(draft).matchedRows??rows.rows.map((_,index)=>index),left=React4.useMemo(()=>new Set(controls.excludedRows),[controls.excludedRows]),included=matched.filter(index=>!left.has(index)).length,rowText=React4.useCallback(index=>visibleDefs.map(column=>cellText(readTransferCell2(rows.rows[index],column))),[rows,visibleDefs]),rowItems=React4.useMemo(()=>matched.map(index=>{let cells=rowText(index),summary=cells.slice(0,2).filter(Boolean).join(" \xB7 ");return{key:`row:${index}`,depth:0,label:`Row ${index+1}${summary?` \u2014 ${summary}`:""}`,chars:cells.reduce((sum,cell)=>sum+cell.length,0),state:left.has(index)?"off":"on",rowIndex:index}}),[left,matched,rowText]),rowWhole=rowItems.reduce((sum,item)=>sum+(item.chars??0),0),setRowIncluded=(index,include)=>change({...controls,excludedRows:include?controls.excludedRows.filter(value=>value!==index):[...controls.excludedRows,index]}),rowHandlers={toggle:item=>setRowIncluded(item.rowIndex,left.has(item.rowIndex)),focus:item=>onFocus("row",String(item.rowIndex))},everyRow=included===matched.length?"on":included===0?"off":"mixed",toggleEveryRow=()=>{let inView=new Set(matched);change({...controls,excludedRows:everyRow==="off"?controls.excludedRows.filter(index=>!inView.has(index)):[...new Set([...controls.excludedRows,...matched])]})},setColumnShown=(column,visible)=>{if(visible){change({...controls,visibleColumns:[...controls.visibleColumns,column.id]});return}let{[column.id]:_filter,...filters}=controls.filters,{[column.id]:_limit,...columnLimits}=controls.columnLimits;change({...controls,visibleColumns:controls.visibleColumns.filter(id=>id!==column.id),filters,columnLimits,layeredFilters:controls.layeredFilters.filter(rule=>rule.field!==column.id),...controls.sort===column.id?{sort:"",direction:"asc"}:{}})},layeredFields=visibleDefs.map(column=>column.schema?.dataType==="number"||column.schema?.dataType==="integer"?{id:column.id,label:column.label,kind:"number"}:{id:column.id,label:column.label,kind:"text"}),rowCopy=index=>visibleDefs.map(column=>`${column.label}: ${cellText(readTransferCell2(rows.rows[index],column))}`).join(`
6
- `);return jsxs4("div",{className:"matrx-alchemy-prep-group",children:[jsxs4("div",{className:"matrx-alchemy-prep-rowbar",children:[jsxs4("label",{className:"matrx-alchemy-prep-field",children:["Search",jsx4("input",{type:"search","aria-label":"Search",value:controls.search,placeholder:"Every shown column",onChange:e=>change({...controls,search:e.target.value})})]}),jsx4("button",{type:"button",className:"matrx-alchemy-prep-chip","aria-pressed":controls.searchMode==="whole_words",title:"Match whole words only: \u201Care\u201D finds \u201Cwe are ready\u201D, never \u201Chardware\u201D",onClick:()=>change({...controls,searchMode:controls.searchMode==="whole_words"?"contains":"whole_words"}),children:"Whole words"}),jsxs4("label",{className:"matrx-alchemy-prep-field",children:["Sort",jsxs4("select",{"aria-label":"Sort",value:controls.sort,onChange:e=>change({...controls,sort:e.target.value}),children:[jsx4("option",{value:"",children:"None"}),visibleDefs.map(column=>jsx4("option",{value:column.id,children:column.label},column.id))]})]}),jsxs4("label",{className:"matrx-alchemy-prep-field",children:["Direction",jsxs4("select",{"aria-label":"Direction",value:controls.direction,disabled:!controls.sort,onChange:e=>change({...controls,direction:e.target.value}),children:[jsx4("option",{value:"asc",children:"Ascending"}),jsx4("option",{value:"desc",children:"Descending"})]})]}),jsxs4("label",{className:"matrx-alchemy-prep-field",children:["Top rows",jsx4("input",{type:"number","aria-label":"Top rows",min:"0",value:controls.top??"",onChange:e=>change({...controls,top:Number.isNaN(e.target.valueAsNumber)?null:e.target.valueAsNumber})})]}),jsx4(LayeredFilterBuilder,{fields:layeredFields,rules:controls.layeredFilters,onChange:layeredFilters=>change({...controls,layeredFilters}),label:"Advanced row filters"})]}),controls.search.trim()?jsxs4("small",{className:"matrx-alchemy-prep-hint",role:"status",children:[formatCount3(matched.length)," of ",formatCount3(rows.rows.length)," rows match \xB7 ",formatCount3(matchesInPreview)," in the preview"]}):null,jsxs4("fieldset",{className:"matrx-alchemy-prep-group","aria-label":"Columns and filters",children:[jsxs4("legend",{className:"matrx-alchemy-prep-legend",children:[visibleDefs.length," of ",rows.columns.length," columns",filterCount?` \xB7 ${filterCount} filter${filterCount===1?"":"s"}`:""]}),rows.columns.length>6?jsx4("input",{className:"matrx-alchemy-prep-search",type:"search","aria-label":"Find a column",placeholder:"Find a column",value:columnSearch,onChange:e=>setColumnSearch(e.target.value)}):null,shownColumns.map(column=>{let exportable=exportableColumn(column),on=exportable&&shown.has(column.id);return jsxs4("div",{className:"matrx-alchemy-prep-node matrx-alchemy-column","data-focused":focusKey===`column:${column.id}`||void 0,children:[jsxs4("div",{className:"matrx-alchemy-tree-row matrx-alchemy-column-head",children:[exportable?jsx4("input",{type:"checkbox",className:"matrx-alchemy-tree-check","aria-label":column.label,checked:on,onChange:e=>setColumnShown(column,e.target.checked)}):jsx4("span",{className:"matrx-alchemy-tree-lock",role:"img","aria-label":`${column.label} is declared ${column.classification==="secret"||column.classification==="credential"?column.classification:"not exportable"} and never leaves this page`,title:"Declared not exportable \u2014 it never leaves this page",children:jsx4(LockGlyph,{})}),jsx4("button",{type:"button",className:"matrx-alchemy-tree-label","aria-label":`Highlight ${column.label}`,"aria-pressed":focusKey===`column:${column.id}`,onClick:()=>onFocus("column",column.id),children:jsx4("span",{className:"matrx-alchemy-tree-name",children:column.label})}),on?jsx4("select",{className:"matrx-alchemy-tree-limit","aria-label":`Limit ${column.label}`,value:encodeLimit(controls.columnLimits[column.id]),onChange:e=>{let limit=decodeLimit(e.target.value),{[column.id]:_old,...rest}=controls.columnLimits;change({...controls,columnLimits:limit&&e.target.value!==KEEP?{...rest,[column.id]:limit}:rest})},children:CELL_LIMITS.map(choice=>jsx4("option",{value:choice.value,children:choice.label},choice.value))}):null]}),jsxs4("div",{className:"matrx-alchemy-column-meta",children:[jsx4(SizeNote,{chars:sizes[column.id]??0,whole}),on?jsx4("input",{"aria-label":`Filter ${column.label}`,placeholder:"Filter",value:controls.filters[column.id]??"",onChange:e=>change({...controls,filters:{...controls.filters,[column.id]:e.target.value}})}):null]})]},column.id)})]}),jsxs4("div",{className:"matrx-alchemy-prep-group",role:"group","aria-label":"Rows",children:[jsxs4("div",{className:"matrx-alchemy-tree-row matrx-alchemy-rows-head",children:[jsx4(RowsCheckbox,{state:everyRow,onChange:toggleEveryRow}),jsxs4("span",{className:"matrx-alchemy-prep-legend",children:["Rows \u2014 ",formatCount3(included)," of ",formatCount3(matched.length)," included",matched.length<rows.rows.length?` (${formatCount3(rows.rows.length)} captured)`:""]})]}),jsxs4(ContextMenu,{children:[jsx4(ContextMenuTrigger,{asChild:!0,children:jsx4("div",{onContextMenu:event=>{let index=event.target.closest("[data-row-index]")?.getAttribute("data-row-index");setMenuRow(index==null?null:Number(index))},children:jsx4(StructureTreeList,{label:"Rows",items:rowItems,whole:rowWhole,focusKey,handlers:rowHandlers,maxHeight:"min(24rem, 50dvh)"})})}),jsx4(ContextMenuContent,{children:menuRow===null?jsx4(ContextMenuLabel,{children:"Right-click a row to copy it"}):jsxs4(Fragment2,{children:[jsxs4(ContextMenuLabel,{children:["Row ",menuRow+1]}),jsx4(ContextMenuItem,{onSelect:()=>onCopyRow(rowCopy(menuRow)),children:"Copy this row\u2019s shown columns"}),jsx4(ContextMenuItem,{onSelect:()=>setRowIncluded(menuRow,left.has(menuRow)),children:left.has(menuRow)?"Include this row":"Leave this row out"})]})})]})]})]})}function RowsCheckbox({state,onChange}){let ref=React4.useRef(null);return React4.useEffect(()=>{ref.current&&(ref.current.indeterminate=state==="mixed")},[state]),jsx4("input",{ref,type:"checkbox",className:"matrx-alchemy-tree-check","aria-label":"Include every matching row",checked:state==="on","aria-checked":state==="mixed"?"mixed":state==="on",onChange})}function cellText(value){return value==null?"":typeof value=="string"?value:typeof value=="number"||typeof value=="boolean"?String(value):JSON.stringify(value)??""}var liveSessions=new Set,sessionListeners=new Set;function setWorkspaceSessionLive(key,live){live?liveSessions.add(key):liveSessions.delete(key),sessionListeners.forEach(listener=>listener())}var subscribeSessions=listener=>(sessionListeners.add(listener),()=>{sessionListeners.delete(listener)});function WorkspaceWindowSlot({onNode,sessionKey,onClose}){return React4.useSyncExternalStore(subscribeSessions,()=>sessionKey===void 0||liveSessions.has(sessionKey),()=>!0)?jsx4("div",{className:"matrx-alchemy-prep-slot",ref:onNode}):jsxs4("div",{className:"matrx-alchemy-prep-released",role:"status",children:[jsx4("p",{children:jsx4("strong",{children:"The rows this held were released."})}),jsx4("p",{children:"The page that opened this preparation closed or reloaded, so what it captured is gone. Reopen Prepare from the table or page to start again."}),onClose?jsx4(Button2,{type:"button",variant:"outline",className:"matrx-alchemy-workspace-secondary",onClick:onClose,children:"Close"}):null]})}import{Popover,PopoverContent,PopoverTrigger}from"@ai-matrx/design-system";import{TapTargetButton,TapTargetButtonTransparent}from"@ai-matrx/design-system/tap-target";import{ALCHEMY_GLYPH_VIEWBOX,ALCHEMY_GLYPH_PATHS}from"@ai-matrx/design-system/content-transfer/icon";import{ALCHEMY_GLYPH_SVG,ALCHEMY_COPY_TRANSFORM_SVG}from"@ai-matrx/design-system/content-transfer/icon";import{ContentTransferError,readTransferCell as readTransferCell3,sealTransferArtifact as sealTransferArtifact3,serialize as serialize3}from"@ai-matrx/alchemy/operate";var exportableColumns=payload=>payload.columns.filter(column=>column.visible&&column.exportable!==!1&&column.classification!=="secret"&&column.classification!=="credential"),tableSchemaFormat={id:"table-schema",label:"Schema",supports:payload=>payload.kind==="rows",extension:"json",mime:"application/json",modes:["copy","download"],runsOn:"client",load:async()=>({async build(draft,_options,signal){if(signal.aborted)throw new DOMException("Cancelled","AbortError");if(draft.payload.kind!=="rows")throw new ContentTransferError("unsupported-format","Schema + rows requires tabular content; manually edited text cannot carry a table schema.");let rowColumns=exportableColumns(draft.payload),columns=rowColumns.map(column=>({id:column.id,label:column.label,path:column.path,...column.schema===void 0?{}:{schema:column.schema}})),body={sourceId:draft.sourceId,columns,rows:draft.payload.rows.map(row=>Object.fromEntries(rowColumns.map(column=>[column.id,readTransferCell3(row,column)??null])))},plainText=JSON.stringify(body,null,2);return sealTransferArtifact3({snapshotId:draft.snapshotId,draftRevision:draft.revision,format:"table-schema",plainText,file:{filename:"table-schema.json",mime:"application/json",bytes:new TextEncoder().encode(plainText)},omissions:[...draft.omissions]})}})};function displayLabels(payload){let columns=exportableColumns(payload),counts=new Map;for(let column of columns)counts.set(column.label,(counts.get(column.label)??0)+1);let used=new Set;return columns.map(column=>{let base=counts.get(column.label)===1?column.label:`${column.label} [${column.id}]`,label=base;for(let suffix=2;used.has(label);suffix+=1)label=`${base} (${suffix})`;return used.add(label),[label,column]})}var tableDataFormat={id:"table-data",label:"Table JSON",supports:payload=>payload.kind==="rows",extension:"json",mime:"application/json;charset=utf-8",modes:["copy","download"],runsOn:"client",load:async()=>({async build(draft,_options,signal){if(signal.aborted)throw new DOMException("Cancelled","AbortError");if(draft.payload.kind!=="rows")throw new ContentTransferError("unsupported-format","Display-label JSON requires tabular content.");let columns=displayLabels(draft.payload),plainText=JSON.stringify(draft.payload.rows.map(row=>Object.fromEntries(columns.map(([label,column])=>[label,readTransferCell3(row,column)??null]))),null,2);return sealTransferArtifact3({snapshotId:draft.snapshotId,draftRevision:draft.revision,format:"json",plainText,file:{filename:"data.json",mime:"application/json;charset=utf-8",bytes:new TextEncoder().encode(plainText)},omissions:[...draft.omissions]})}})},emailArtifact=(draft,format,signal,jsonFormat)=>format==="json"&&jsonFormat?.supports(draft.payload)?jsonFormat.load().then(engine=>engine.build(draft,{},signal)):Promise.resolve(serialize3(draft,format));function createTransferEmailActions(email,options={}){return["csv","json","markdown"].map(format=>({id:`email-${format}`,label:`Email ${format==="csv"?"CSV":format==="json"?"JSON":"Markdown"}`,prepared:!0,group:"email",supports:(_snapshot,draft)=>!!draft&&(format!=="csv"||draft?.payload.kind==="rows"),async run({draft,signal,snapshot}){if(signal.aborted)return{status:"cancelled"};let artifact=await emailArtifact(draft,format,signal,options.jsonFormat);return email.send(artifact,{label:snapshot.label,signal})}}))}function createTransferHtmlPreviewAction(port){return{id:"html-preview",label:"HTML preview",supports:(snapshot,draft)=>{let kind=(draft?.payload??snapshot.payload).kind;return kind==="markdown"||kind==="text"},async run({draft,snapshot,signal}){if(signal.aborted)return{status:"cancelled"};if(draft.payload.kind!=="markdown"&&draft.payload.kind!=="text")throw new ContentTransferError("unsupported-format","HTML preview requires text.");return await port.open({content:draft.payload.text,title:snapshot.label}),{status:"success",delivered:"action",mimeTypes:[],message:"HTML preview opened"}}}}import{ContentTransferSurfaceProvider,useContentTransferSurface as useContentTransferSurface2}from"@ai-matrx/alchemy/react/surface";import*as React5 from"react";import{buildAgentPayload,capture,createBrowserTransport,createDraft as createDraft2,serialize as serialize4,directSource as directSource2,hasThinking,stripThinking,normalizeTransferJson as normalizeTransferJson2,sealTransferArtifact as sealTransferArtifact4}from"@ai-matrx/alchemy/operate";import{cn as cn2}from"@ai-matrx/design-system";import{Fragment as Fragment3,jsx as jsx5,jsxs as jsxs5}from"react/jsx-runtime";var TWIN_CHECK_MAX_CHARS=2e4,resolve=value=>typeof value=="function"?value():value,asPayload=value=>({kind:"markdown",text:typeof value=="string"?value:buildAgentPayload(value)}),structuredPayload=value=>payloadForEnvelope(value),actionDone=message=>({status:"success",delivered:"action",mimeTypes:[],message}),isSafeFilename=filename=>filename===filename.trim()&&filename.length>0&&!/^\.+$/.test(filename)&&!/[\\/\x00-\x1F\x7F]/.test(filename),sourceFor=(id,label,build,shape)=>({id,label,...shape?{shape}:{},capture:async({signal})=>{signal.throwIfAborted();let payload=await build();return signal.throwIfAborted(),directSource2(payload,{sourceId:id,label})}});function MatrxCopyMenu(props){let inherited=useContentTransferCapabilities();return jsx5(MatrxCopyMenuSession,{...props},JSON.stringify([inherited.identityKey??null,props.sourceId??props.label]))}function MatrxCopyMenuSession(props){let instance=React5.useId(),controller=React5.useRef(null),transport=useContentTransferCapabilities().transport??createBrowserTransport(),[modal,setModal]=React5.useState(null),copyVisible=!props.hide?.includes("copy"),humanSource=()=>{let text=resolve(props.human);return props.stripThinking?stripThinking(text):text},richText=props.contentFlavor==="markdown"&&props.human!==void 0&&copyVisible,richCopy=richText?async flavor=>{let markdown=humanSource();if(props.richCopy)return props.richCopy(markdown,flavor);let signal=new AbortController().signal,{snapshot}=await capture({kind:"markdown",text:markdown},signal),draft=createDraft2(snapshot),artifact=flavor==="default"?await markdownRichArtifact(draft):serialize4(draft,"markdown");return transport.copy(artifact,signal)}:void 0,aiVisible=!props.hide?.includes("ai"),exportVisible=!props.hide?.includes("export"),make=(suffix,build,label=props.label,shape)=>sourceFor(`${props.sourceId??`${instance}:${props.label}`}:${suffix}`,label,build,shape),humanCheap=typeof props.human=="string"&&props.human.length<=TWIN_CHECK_MAX_CHARS,human=copyVisible&&props.human!==void 0?make("human",()=>({kind:"text",text:humanSource()}),props.label,{kind:"text",cheap:humanCheap}):void 0,humanMarkdown=copyVisible&&props.human!==void 0?make("human-markdown",()=>({kind:"markdown",text:humanSource()}),props.label,{kind:"markdown",cheap:humanCheap}):void 0,humanText=copyVisible&&props.human!==void 0?make("human-text",()=>({kind:"markdown",text:humanSource()}),props.label,{kind:"markdown",cheap:humanCheap}):void 0,json=aiVisible&&props.json!==void 0?make("json",()=>({kind:"json",value:normalizeTransferJson2(resolve(props.json),{omitUndefinedObjectProperties:!0})}),props.label,{kind:"json"}):void 0,agent=aiVisible&&props.agent!==void 0?make("agent",()=>asPayload(resolve(props.agent))):void 0,structuredAgent=aiVisible&&props.agent!==void 0?make("structured-agent",()=>structuredPayload(resolve(props.agent)).payload):void 0,table=(exportVisible||props.primarySource==="table")&&props.export?.sheetRows?make("rows",async()=>{let value=normalizeTransferJson2(await props.export.sheetRows(),{omitUndefinedObjectProperties:!0});if(!Array.isArray(value)||value.some(row=>row===null||typeof row!="object"||Array.isArray(row)))throw new Error("Sheet rows must be JSON objects.");let rows=value,columns=props.export.sheetColumns?.()??[...new Set(rows.flatMap(row=>Object.keys(row)))].map(id=>({id,label:id})),ids=new Set;for(let column of columns){if(!column.id||!column.label||ids.has(column.id))throw new Error("Sheet columns require unique nonempty ids and labels.");ids.add(column.id)}for(let row of rows)for(let key of Object.keys(row))if(!ids.has(key))throw new Error("Table data contains a field outside its declared columns.");return{kind:"rows",rows,columns:columns.map(column=>({id:column.id,label:column.label,path:`/${column.id.replace(/~/g,"~0").replace(/\//g,"~1")}`,visible:!0}))}}):void 0,builderVariants=aiVisible?(props.aiVariants??[]).filter(variant=>variant.build&&!variant.onSelect&&!variant.modal&&!variant.prepare).map(variant=>({...variant,copyLabel:variant.label,source:make(`variant:${variant.id}`,async()=>asPayload(await variant.build()),variant.label)})):[],faithful=agent?[{id:props.agentVariant?.id??"faithful",label:props.agentVariant?.label??"Full AI context",source:agent,copyLabel:props.agentVariant?.label??"Copy for AI",...props.agentVariant?.hint?{hint:props.agentVariant.hint}:{}}]:[],thinkingVariants=copyVisible&&props.stripThinking&&typeof props.human=="string"&&hasThinking(props.human)?[{id:"include-thinking",label:"Including thinking",copyLabel:"Copy including thinking",hint:"Includes the original reasoning content",section:"copy",source:make("include-thinking",()=>({kind:"markdown",text:props.human}),props.label,{kind:"markdown",cheap:!1})}]:[],variants=props.agentVariant?.position==="last"?[...thinkingVariants,...builderVariants,...faithful]:[...thinkingVariants,...faithful,...builderVariants],actions=[];if(aiVisible)for(let variant of props.aiVariants??[])!variant.onSelect&&!variant.modal&&!variant.prepare||actions.push({...variant,id:`variant-action:${variant.id}`,label:variant.label,...variant.prepare?{placement:"prepare"}:{},supports:()=>!0,run:async()=>{if(variant.prepare){if(!controller.current)throw new Error("Alchemy is no longer mounted.");let prepared=variant.prepare();await controller.current.prepare(prepared.payload,{id:`${instance}:${variant.id}`,label:prepared.label,...prepared.envelope?{envelope:prepared.envelope}:{}})}else variant.onSelect?await variant.onSelect():setModal(variant);return actionDone(`Opened ${variant.label}`)}});if(aiVisible&&props.aiCustom&&actions.push({id:"configure-source",label:props.aiCustom.label??"Customize source",...props.aiCustom.hint?{hint:props.aiCustom.hint}:{},supports:()=>!0,run:async()=>{if(!controller.current)throw new Error("Alchemy is no longer mounted.");return await controller.current.prepareLevers(customLevers(props.aiCustom),{id:`${instance}:custom`,label:props.aiCustom.dialogTitle??props.label}),actionDone("Source options opened")}}),aiVisible&&props.groomer&&actions.push({id:"groom-source",label:"Customize sections",supports:()=>!0,run:async()=>{if(!controller.current)throw new Error("Alchemy is no longer mounted.");let config=props.groomer();return await controller.current.prepareLevers(groomerLevers(config),{id:`${instance}:groomer`,label:config.label}),actionDone("Section options opened")}}),exportVisible)for(let item of props.export?.items??[])actions.push({id:`export:${item.id}`,label:item.label,supports:()=>!0,...item.build&&!item.onSelect?{placement:"download",source:make(`export:${item.id}`,async()=>{let file=item.build(),bytes=new Uint8Array(await new Blob([file.content],{type:file.mime}).arrayBuffer());return{kind:"registered",format:"matrx-file",value:{bytes:Array.from(bytes),mime:file.mime,extension:file.extension,...file.filename!==void 0?{filename:file.filename}:{}}}},item.label)}:{},run:async({snapshot,draft,signal})=>{if(item.onSelect)return await item.onSelect(),actionDone(`Opened ${item.label}`);let value=draft.payload.kind==="registered"?draft.payload.value:null;if(!value||Array.isArray(value)||typeof value!="object"||!Array.isArray(value.bytes)||typeof value.mime!="string"||typeof value.extension!="string"||value.bytes.some(byte=>typeof byte!="number"||!Number.isInteger(byte)||byte<0||byte>255))throw new Error(`${item.label} did not capture a valid file.`);if(value.filename!==void 0&&(typeof value.filename!="string"||!isSafeFilename(value.filename)))throw new Error(`${item.label} has an unsafe filename. Use a nonempty basename without leading or trailing whitespace, dots only, path separators, or control characters.`);if(draft.omissions.some(omission=>omission.reason!=="duplicate"))throw new Error("This custom file exceeds the configured export limits or contains excluded content. Use a standard format or revise the source options.");let bytes=new Uint8Array(value.bytes),filename=typeof value.filename=="string"?value.filename:`${props.label.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"export"}.${value.extension.replace(/[^a-zA-Z0-9.-]/g,"")||"bin"}`;return transport.download(sealTransferArtifact4({snapshotId:snapshot.id,draftRevision:draft.revision,format:`export:${item.id}`,plainText:"",file:{filename,mime:value.mime,bytes},omissions:[...draft.omissions]}),signal)}});exportVisible&&table&&props.sendToSheet&&actions.push({id:"send-google-sheet",label:"Send to Google Sheet",source:table,supports:()=>!0,run:async({draft})=>{if(draft.payload.kind!=="rows")throw new Error("Google Sheets requires captured rows.");return props.sendToSheet(draft.payload.rows,props.label)}});let source=(props.primarySource==="table"?table:void 0)??json??table??structuredAgent??human??builderVariants[0]?.source;if(!source&&!actions.length)return null;let target=source??make("actions",()=>({kind:"text",text:props.label}));return jsxs5(Fragment3,{children:[jsx5(ContentTransferMenu,{triggerSize:props.size==="xs"||props.size==="toolbar"?"compact":"default",source:target,...source&&source===structuredAgent?{envelope:()=>structuredPayload(resolve(props.agent)).envelope}:{},...props.references?{references:props.references}:{},...props.referenceActions?{referenceActions:props.referenceActions}:{},...props.icon!==void 0?{icon:props.icon}:{},...props.triggerVariant!==void 0?{triggerVariant:props.triggerVariant}:{},controllerRef:value=>{controller.current=value,typeof props.controllerRef=="function"?props.controllerRef(value):props.controllerRef&&(props.controllerRef.current=value)},...props.triggerHidden?{triggerHidden:!0}:{},...richCopy?{richCopy,...props.richCopyFlavors?{richCopyFlavors:props.richCopyFlavors}:props.richCopy?{}:{richCopyFlavors:["markdown"]}}:{},label:props.label,...aiVisible&&props.aiCustom?{copyWithPrompt:async()=>{if(!controller.current)throw new Error("Alchemy is no longer mounted.");await controller.current.prepareLevers(customLevers(props.aiCustom),{id:`${instance}:custom`,label:props.aiCustom.dialogTitle??props.label})}}:{},variants,actions,...richText&&props.htmlPreview!==!1?{htmlPreview:!0}:{},sourceFormats:!!source,hide:[...!copyVisible||!source?["copy"]:[],...!aiVisible||!source?["prepare"]:[],...exportVisible?[]:["download"]],formatSources:{...human?{plain:humanText,markdown:humanMarkdown,html:humanMarkdown}:{},...json?{json,"compact-json":json}:{},...table&&exportVisible?{csv:table,tsv:table}:{}},...props.disabled!==void 0?{disabled:props.disabled}:{},className:cn2(props.className,props.size==="xs"&&"matrx-alchemy-xs",props.size==="sm"&&"matrx-alchemy-sm",props.size==="toolbar"&&"matrx-alchemy-toolbar-target"),...props.stopPropagation!==void 0?{stopPropagation:props.stopPropagation}:{}}),modal?.modal?.({open:!0,onOpenChange:open=>{open||setModal(null)}})]})}var GROOMER_LEVELS=["full","compact","brief"];function defaultGroomerSelections(sections){return Object.fromEntries(sections.map(section=>[section.id,section.defaultSelection??"full"]))}function buildGroomerPresetPayload(config,preset){let selections=applyGroomerPreset(preset,config.sections),data={},dropped=[];for(let section of config.sections){let selection=selections[section.id]??"full";if(selection==="off"){dropped.push(section.id);continue}let value=section.build(selection);value!=null&&(data[section.id]=value)}return{kind:config.kind,location:config.location,description:preset==="everything"?config.description:`${config.description} (${preset} detail)`,data,...config.summary!==void 0?{summary:config.summary}:{},attributes:{...config.attributes,detail:preset,...dropped.length?{dropped_sections:dropped.join(",")}:{}},...config.context?{context:config.context}:{}}}function groomerPresetVariants(getConfig){return[{id:"balanced",label:"Balanced",hint:"Compact sections",build:()=>buildGroomerPresetPayload(getConfig(),"balanced")},{id:"minimal",label:"Minimal",hint:"Brief sections with optional detail excluded",build:()=>buildGroomerPresetPayload(getConfig(),"minimal")}]}import{jsx as jsx6}from"react/jsx-runtime";function AlchemyTableCopyControls(props){return jsx6(MatrxCopyMenu,{...props})}import{Fragment as Fragment4,jsx as jsx7,jsxs as jsxs6}from"react/jsx-runtime";function AlchemyGlyph({icon="portal",...props}){return jsx7("svg",{width:"18",height:"18",viewBox:ALCHEMY_GLYPH_VIEWBOX[icon],fill:"none",stroke:"currentColor",strokeWidth:"1.75",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",...props,children:ALCHEMY_GLYPH_PATHS[icon].map(d=>jsx7("path",{d},d))})}var CapabilityContext=React6.createContext({});function ContentTransferCapabilitiesProvider({value,children}){return jsx7(CapabilityContext.Provider,{value,children})}var useContentTransferCapabilities=()=>React6.useContext(CapabilityContext),PALETTE_HEADINGS=["Copy as","Download as","Quick copy","Copy for AI","Edit and prepare","Other sources","References","Save to Matrx","Continue with AI","Email to me"],DESTINATION_HEADING={save:"Save to Matrx",chat:"Continue with AI",email:"Email to me"};function PaletteRows({title,items,onRun,extra,ai=!1,glyphKind,fallbackHint}){return!items.length&&!extra?null:jsxs6("section",{className:"matrx-alchemy-palette-section",children:[jsx7("h3",{children:title}),items.map(item=>{let label=item.copyLabel??item.label,hint=item.hint??fallbackHint;return jsxs6("button",{type:"button",className:cn3("matrx-alchemy-palette-row",ai&&"matrx-alchemy-palette-row-ai"),"aria-label":item.ariaLabel??`${label}${hint?` ${hint}`:""}`,onClick:()=>onRun?.(item),children:[item.icon?jsx7(item.icon,{className:"matrx-alchemy-menu-icon"}):jsx7(PaletteGlyph,{ai,...glyphKind?{kind:glyphKind}:{}}),jsxs6("span",{children:[label,hint?jsx7("small",{className:"matrx-alchemy-menu-hint",children:hint}):null]})]},item.id)}),extra]})}function ContentTransferMenu(props){let inherited=React6.useContext(CapabilityContext),identityKey=props.capabilities?.identityKey??inherited.identityKey;return jsx7(ContentTransferMenuSession,{...props},identityKey??"anonymous")}var shapeOf=material=>material&&!("kind"in material)&&!("instanceId"in material)?material.shape:void 0,shapePayload=shape=>shape.kind==="json"?{kind:"json",value:{}}:shape.kind==="markdown"?{kind:"markdown",text:""}:{kind:"text",text:"",...shape.language?{language:shape.language}:{}},NOTICE_MS=4e3,NOTICE_ERROR_MS=8e3;function ContentTransferMenuSession({references=[],referenceActions=[],source,surface,label,projection,sections,preferences,table,formatSources,sourceFormats=!0,variants=EMPTY_VARIANTS,actions=[],htmlPreview=!1,capabilities:local,disabled,enabled=!0,className,stopPropagation=!0,hide=[],controllerRef,icon="portal",triggerVariant="transparent",triggerSize="default",triggerHidden=!1,envelope:primaryEnvelope,richCopy,richCopyFlavors=["markdown","text"],copyWithPrompt}){let[promptFocus,setPromptFocus]=React6.useState(0),triggerRef=React6.useRef(null),restoreFocusRef=React6.useRef(null),inherited=React6.useContext(CapabilityContext),nearestSurface=useContentTransferSurface(),fence=useFence(),inspectionFence=useFence(),[copiedFormat,setCopiedFormat]=React6.useState(null),copiedTimer=React6.useRef(null),leaveTimer=React6.useRef(null),clipboardQueue=React6.useRef(Promise.resolve());React6.useEffect(()=>()=>{copiedTimer.current&&clearTimeout(copiedTimer.current),leaveTimer.current&&clearTimeout(leaveTimer.current)},[]);let confirmCopy=React6.useCallback(format=>{copiedTimer.current&&clearTimeout(copiedTimer.current),setCopiedFormat(format),copiedTimer.current=setTimeout(()=>setCopiedFormat(null),3e3)},[]),[menuCapture,setMenuCapture]=React6.useState(null),[menuStatus,setMenuStatus]=React6.useState("idle"),[workspaces,setWorkspaces]=React6.useState({}),[workspaceKey,setWorkspaceKey]=React6.useState(null),[workspaceOpen,setWorkspaceOpen]=React6.useState(!1),workspaceCaptures=React6.useRef(new Map),externalWorkspaceKeys=React6.useRef(new Set),[notice,setNotice]=React6.useState(null),[receiptTarget,setReceiptTarget]=React6.useState(),[paletteOpen,setPaletteOpen]=React6.useState(!1),[paletteTarget,setPaletteTarget]=React6.useState(null),externalPaletteClose=React6.useRef(null),externalPaletteRestoreFocus=React6.useRef(null),feedbackDocument=React6.useRef(null),[mode,setMode]=React6.useState("copy"),scopes=React6.useMemo(()=>table?.availableScopes??["target"],[table]),[requestedScope,setRequestedScope]=React6.useState(table?.initialScope??"target"),initialScope=scopes.includes(requestedScope)?requestedScope:table?.initialScope??"target";if(!scopes.includes(initialScope))throw new Error("Alchemy initialScope must be included in availableScopes.");let primary=surface??source??nearestSurface,sourceLabel=label??surface?.surfaceName??(source&&"label"in source?source.label:nearestSurface?.surfaceName)??"content",primaryWorkspaceBase=`primary:${materialIdentity(primary)}`,primaryWorkspaceKey=`${primaryWorkspaceBase}:${initialScope}`;React6.useEffect(()=>(setCopiedFormat(null),setNotice(null),copiedTimer.current&&clearTimeout(copiedTimer.current),fence.abortAll),[primaryWorkspaceBase,initialScope,fence.abortAll]);let nearestWorkspaceKey=source&&!surface&&nearestSurface?`surface:${materialIdentity(nearestSurface)}`:null,variantWorkspaceKeys=React6.useMemo(()=>new Map(variants.map(variant=>[variant.id,`variant:${variant.id}:${materialIdentity(variant.source)}`])),[variants]),baseTransport=local?.transport??inherited.transport??createBrowserTransport2(),transport={download:(artifact,signal)=>baseTransport.download(artifact,signal),copy:(artifact,signal)=>{let deliver=()=>signal.aborted?Promise.resolve({status:"cancelled"}):baseTransport.copy(artifact,signal),pending=clipboardQueue.current.then(deliver,deliver);return clipboardQueue.current=pending,pending}},ai=local?.ai??inherited.ai,referencePort=local?.reference??inherited.reference,{email:emailPort,review:emailReview}=useReviewedTransferEmail(local?.email??inherited.email),providerPreferences=React6.useMemo(()=>resolveTransferPreferences2(inherited.preferences,local?.preferences),[inherited.preferences,local?.preferences]),windowPort=local?.window??inherited.window,sessionId=React6.useId(),windowHandles=React6.useRef(new Map),sessionKeys=React6.useRef(new Set),[windowNodes,setWindowNodes]=React6.useState({}),slotRefs=React6.useRef(new Map),slotRef=key=>{let ref=slotRefs.current.get(key);return ref||(ref=node=>setWindowNodes(current=>{if(node)return current[key]===node?current:{...current,[key]:node};if(!(key in current))return current;let{[key]:_gone,...rest}=current;return rest}),slotRefs.current.set(key,ref)),ref},[duplicateFormats,setDuplicateFormats]=React6.useState(()=>new Set),adapters=React6.useMemo(()=>{let hostIds=new Set([...inherited.formats??[],...local?.formats??[]].map(format=>format.id));return resolveTransferRegistry(BUILT_INS.filter(builtIn=>!hostIds.has(builtIn.id)),inherited.formats??[],local?.formats??[]).filter(x=>"load"in x)},[inherited.formats,local?.formats]),emailJsonFormat=adapters.find(adapter=>adapter.id==="table-data"),emailActions=React6.useMemo(()=>emailPort?createTransferEmailActions(emailPort,emailJsonFormat?{jsonFormat:emailJsonFormat}:{}):[],[emailPort,emailJsonFormat]),htmlPreviewPort=local?.htmlPreview??inherited.htmlPreview,htmlPreviewActions=React6.useMemo(()=>htmlPreview&&htmlPreviewPort?[createTransferHtmlPreviewAction(htmlPreviewPort)]:[],[htmlPreview,htmlPreviewPort]),registeredActions=React6.useMemo(()=>resolveTransferRegistry(emailActions,htmlPreviewActions,inherited.actions??[],local?.actions??[],actions),[actions,emailActions,htmlPreviewActions,inherited.actions,local?.actions]);React6.useMemo(()=>resolveTransferRegistry(variants),[variants]);let noticeTimer=React6.useRef(null),noticeLife=React6.useRef(NOTICE_MS),clearNoticeTimer=React6.useCallback(()=>{noticeTimer.current&&clearTimeout(noticeTimer.current),noticeTimer.current=null},[]),startNoticeTimer=React6.useCallback(()=>{clearNoticeTimer(),noticeTimer.current=setTimeout(()=>setNotice(null),noticeLife.current)},[clearNoticeTimer]);React6.useEffect(()=>clearNoticeTimer,[clearNoticeTimer]);let report=React6.useCallback(result=>{inherited.onOutcome?.(result),local?.onOutcome?.(result),setReceiptTarget("target"in result?result.target:void 0);let delivered=result.status==="success"?result.delivered:void 0;if(result.status==="success"&&delivered==="clipboard"&&!("target"in result&&result.target)){clearNoticeTimer(),setNotice(null);return}noticeLife.current=result.status==="error"?NOTICE_ERROR_MS:NOTICE_MS,setNotice(outcomeMessage(result)),startNoticeTimer()},[inherited,local,clearNoticeTimer,startNoticeTimer]);React6.useEffect(()=>{let valid=new Set([...scopes.map(scope=>`${primaryWorkspaceBase}:${scope}`),...nearestWorkspaceKey?[nearestWorkspaceKey]:[],...variantWorkspaceKeys.values(),...externalWorkspaceKeys.current]);setWorkspaces(current=>Object.fromEntries(Object.entries(current).filter(([key])=>valid.has(key))));for(let key of workspaceCaptures.current.keys())valid.has(key)||workspaceCaptures.current.delete(key);workspaceKey&&!valid.has(workspaceKey)&&(setWorkspaceKey(null),setWorkspaceOpen(!1))},[nearestWorkspaceKey,primaryWorkspaceBase,scopes,variantWorkspaceKeys,workspaceKey]);let captureOne=React6.useCallback(async(material,scope,signal,applyMenuProjection=!1,collectPages=!0)=>{if(!material)throw new Error("Alchemy needs a source or a mounted transfer surface.");let sourceMaterial;if("instanceId"in material){if(!material.isMounted())throw new Error("The requested transfer surface is no longer mounted.");let captured=await material.capture(signal);sourceMaterial={id:captured.snapshot.sourceId,label:captured.snapshot.label,capture:async()=>captured}}else"kind"in material?sourceMaterial={id:materialIdentity(material),label:sourceLabel,capture:async()=>directSource3(material,{sourceId:materialIdentity(material),label:sourceLabel,...applyMenuProjection&&projection?{projection}:{},...applyMenuProjection&&sections?{sections}:{}})}:applyMenuProjection&&(projection||sections)?sourceMaterial={id:material.id,label:material.label,capture:async request=>{let captured=await material.capture(request);return{...captured,projection:{rules:[...captured.projection.rules,...projection?.rules??[]]},snapshot:{...captured.snapshot,...sections?{sections}:{}}}}}:sourceMaterial=material;let raw=await sourceMaterial.capture({scope,signal}),constrained=resolveTransferPreferences2(providerPreferences,preferences,raw.snapshot.limits),result=await capture2({id:raw.snapshot.sourceId,label:raw.snapshot.label,capture:async()=>({...raw,snapshot:{...raw.snapshot,limits:constrained.limits}})},signal,scope);if(scope!=="all-matching"||!collectPages)return result;if(!result.allMatching)throw new Error("This source cannot provide a stable all-matching export.");let collected=await collectAllMatching(result.allMatching,signal);if(result.snapshot.payload.kind!=="rows")throw new Error("All-matching export requires tabular content.");return{snapshot:projectSnapshot2({...result.snapshot,payload:{kind:"rows",rows:collected.rows,columns:result.snapshot.payload.columns},coverage:collected.coverage,omissions:[...collected.omissions]},{rules:[]}),allMatching:result.allMatching,...collected.error?{collectionError:collected.error.message}:{}}},[preferences,projection,providerPreferences,sections,sourceLabel]),capturePrimary=React6.useCallback((scope,signal)=>captureOne(primary,scope,signal,!0),[captureOne,primary]);workspaceCaptures.current.set(primaryWorkspaceKey,capturePrimary),nearestWorkspaceKey&&nearestSurface&&workspaceCaptures.current.set(nearestWorkspaceKey,(scope,signal)=>captureOne(nearestSurface,scope,signal,!0));for(let variant of variants){let key=variantWorkspaceKeys.get(variant.id);workspaceCaptures.current.set(key,(scope,signal)=>captureOne(variant.source,scope,signal,!0))}let runRich=React6.useCallback(async flavor=>{if(richCopy){copiedTimer.current&&clearTimeout(copiedTimer.current),setCopiedFormat(null),setNotice(null);try{let result=await richCopy(flavor);if(result===!1)return;result&&typeof result=="object"?(result.status==="success"&&confirmCopy(`rich-${flavor}`),report(result)):confirmCopy(`rich-${flavor}`)}catch(error){report({status:"error",code:"prepare-failed",message:errorMessage(error,"Copy failed"),retryable:!0})}}},[confirmCopy,report,richCopy]),preflight=React6.useCallback(async(scope=initialScope)=>{let{controller,id}=inspectionFence.begin();setMenuCapture(null),setMenuStatus("loading");try{let probe=primary??formatSources?.plain??formatSources?.markdown??formatSources?.json??null,shape=shapeOf(probe),result=await captureOne(shape?shapePayload(shape):probe,scope,controller.signal,!0,!1);inspectionFence.valid(id,controller)&&(setMenuCapture(result),setMenuStatus("idle"));let explicit=COPIES.filter(format=>formatSources?.[format]),duplicates=new Set,comparable=explicit.every(format=>{let declared=shapeOf(formatSources[format]);return!declared||declared.cheap===!0});if(explicit.length>1&&comparable){let seen=new Set;for(let format of explicit)try{let captured=await captureOne(formatSources[format],scope,controller.signal,!0,!1),artifact=await buildFormat(createDraft3(captured.snapshot),format,captured.snapshot.label,adapters,controller.signal),signature=`${artifact.plainText}\0${artifact.html??""}`;seen.has(signature)?(duplicates.add(format),inspectionFence.valid(id,controller)&&setDuplicateFormats(new Set(duplicates))):seen.add(signature)}catch{}}inspectionFence.valid(id,controller)&&setDuplicateFormats(duplicates)}catch(error){inspectionFence.valid(id,controller)&&(setMenuCapture(null),setMenuStatus(errorMessage(error,"Could not inspect content")))}finally{inspectionFence.finish(controller)}},[adapters,captureOne,inspectionFence,formatSources,initialScope,primary]),closePalette=React6.useCallback(()=>{leaveTimer.current&&clearTimeout(leaveTimer.current),leaveTimer.current=null;let onClose=externalPaletteClose.current,restoreFocus=externalPaletteRestoreFocus.current;externalPaletteClose.current=null,externalPaletteRestoreFocus.current=null,onClose?.(),restoreFocus?.(),setPaletteTarget(null),setPaletteOpen(!1)},[]),mountPalette=React6.useCallback((target,onClose,restoreFocus)=>{if(!target){externalPaletteClose.current=null,externalPaletteRestoreFocus.current=null,setPaletteTarget(null),setPaletteOpen(!1);return}if(!enabled)throw new Error("Alchemy is not enabled for this record.");if(disabled)throw new Error("Alchemy is disabled for this record.");externalPaletteClose.current=onClose??null,externalPaletteRestoreFocus.current=restoreFocus??null,feedbackDocument.current=target.ownerDocument,restoreFocusRef.current=restoreFocus??(()=>target.focus()),setPaletteTarget(target),setPaletteOpen(!0),setMode("copy"),preflight()},[closePalette,disabled,enabled,preflight]);React6.useEffect(()=>{if(!paletteTarget||!paletteOpen)return;paletteTarget.querySelector("button:not([disabled]), select:not([disabled]), input:not([disabled]), textarea:not([disabled]), [href]")?.focus()},[paletteOpen,paletteTarget]);let transfer=React6.useCallback(async(format,download,alternate)=>{fence.abortAll();let{controller,id}=fence.begin();copiedTimer.current&&clearTimeout(copiedTimer.current),setCopiedFormat(null),setNotice(null);try{let explicit=alternate?.source??(format==="default"?formatSources?.plain??(primary?void 0:formatSources?.markdown??formatSources?.json):typeof format=="string"&&format!=="xlsx"?formatSources?.[format]:void 0),result=await(explicit?captureOne(explicit,initialScope,controller.signal,!0):capturePrimary(initialScope,controller.signal));if(result.collectionError)throw new Error(`The complete source could not be collected: ${result.collectionError}`);if(result.snapshot.coverage.status!=="complete"||result.snapshot.omissions.length>0){let reason=result.snapshot.coverage.reason??`${result.snapshot.omissions.length} omission${result.snapshot.omissions.length===1?"":"s"}`;throw new Error(`Quick transfer is partial (${reason}). Open Prepare for AI to review it before delivery.`)}let resolved=resolveTransferPreferences2(providerPreferences,preferences,result.snapshot.limits),draft=applyTransferLimits2(createDraft3(result.snapshot),resolved.limits),revision=draft.revision;if(draft.omissions.length>result.snapshot.omissions.length)throw new Error("Quick transfer requires content reductions. Open Prepare for AI to review them before delivery.");let defaultFormat=formatSources?.plain?"plain":result.snapshot.payload.kind==="markdown"?"markdown":["json","registered","rows"].includes(result.snapshot.payload.kind)?"json":"plain",deliveryFormat=format==="default"?defaultFormat:format;if(format==="default"&&!formatSources?.[defaultFormat]&&!offersFormat(defaultFormat,result.snapshot.payload,adapters))return;let artifact=typeof deliveryFormat=="string"?await buildFormat(draft,deliveryFormat,result.snapshot.label,adapters,controller.signal):await buildWithAdapter(deliveryFormat,draft,controller.signal);if(artifact.omissions.length>draft.omissions.length)throw new Error(`Quick format requires ${artifact.omissions.length-draft.omissions.length} adjustment${artifact.omissions.length-draft.omissions.length===1?"":"s"}. Open Prepare for AI to review before delivery.`);if(!fence.valid(id,controller)||artifact.snapshotId!==result.snapshot.id||artifact.draftRevision!==revision)return;let outcome=await transport[download?"download":"copy"](artifact,controller.signal);fence.valid(id,controller)&&(!download&&outcome.status==="success"&&outcome.delivered==="clipboard"?confirmCopy(alternate?.id??(typeof deliveryFormat=="string"?deliveryFormat:deliveryFormat.id)):!download&&outcome.status==="degraded"&&outcome.delivered==="plain-text"&&confirmCopy("plain"),report(outcome.status==="success"&&alternate?.successMessage?{...outcome,message:alternate.successMessage}:outcome))}catch(error){fence.valid(id,controller)&&report({status:"error",code:"prepare-failed",message:errorMessage(error,"Preparation failed"),retryable:!0})}finally{fence.finish(controller)}},[adapters,captureOne,capturePrimary,confirmCopy,fence,formatSources,initialScope,preferences,primary,providerPreferences,report,transport]),openWorkspace=React6.useCallback(async(key=primaryWorkspaceKey,variant)=>{let variantMaterial=variant&&"kind"in variant.source?{id:`variant:${key}`,label:variant.label,capture:async()=>directSource3(variant.source,{sourceId:`variant:${key}`,label:variant.label})}:variant?.source,captureWorkspace=(scope,signal,collectPages=!0)=>captureOne(variantMaterial??primary,scope,signal,!0,collectPages);workspaceCaptures.current.set(key,captureWorkspace);let existing=workspaces[key],{controller,id}=fence.begin();if(existing){try{let scopeChanged=existing.scope!==initialScope,allMatching=initialScope==="all-matching",fresh=await captureWorkspace(initialScope,controller.signal,scopeChanged||!allMatching);if(!fence.valid(id,controller)||!workspaceCaptures.current.has(key))return;if(allMatching&&(!fresh.allMatching||!scopeChanged&&!existing.allMatching))throw new Error("This source can no longer provide an all-matching snapshot.");let collectionIdentity=value=>value&&{query:value.source.query,projection:value.projection,columns:value.columns,limits:value.limits},changed=scopeChanged||(allMatching?JSON.stringify(collectionIdentity(existing.allMatching))!==JSON.stringify(collectionIdentity(fresh.allMatching)):snapshotContent(existing.snapshot)!==snapshotContent(fresh.snapshot));setWorkspaces(current=>{let retained=current[key];return retained?{...current,[key]:{...retained,error:fresh.collectionError,...allMatching&&!scopeChanged?{sourceStale:changed}:changed?{pending:{...fresh,scope:initialScope}}:{pending:void 0}}}:current}),setWorkspaceKey(key),setWorkspaceOpen(!0)}catch(error){fence.valid(id,controller)&&workspaceCaptures.current.has(key)&&(setWorkspaces(current=>current[key]?{...current,[key]:{...current[key],error:errorMessage(error,"Could not refresh source")}}:current),setWorkspaceKey(key),setWorkspaceOpen(!0))}finally{fence.finish(controller)}return}try{let result=await captureWorkspace(initialScope,controller.signal);if(!fence.valid(id,controller))return;let resolved=resolveTransferPreferences2(providerPreferences,preferences,result.snapshot.limits),original=createDraft3(result.snapshot),envelope=variant?.envelope??(key===primaryWorkspaceKey?primaryEnvelope?.():void 0),base={...result,key,original,draft:original,scope:initialScope,preferences:resolved,...result.collectionError?{error:result.collectionError}:{},...envelope?{envelope}:{}};setWorkspaces(current=>({...current,[key]:{...base,draft:rebuild(base,initialControls(base))}})),setWorkspaceKey(key),setWorkspaceOpen(!0)}catch(error){fence.valid(id,controller)&&(setReceiptTarget(void 0),noticeLife.current=NOTICE_ERROR_MS,setNotice(errorMessage(error,"Could not capture content")),startNoticeTimer())}finally{fence.finish(controller)}},[captureOne,capturePrimary,fence,initialScope,preferences,primaryWorkspaceKey,primary,primaryEnvelope,providerPreferences,startNoticeTimer,workspaces]),prepareLevers=React6.useCallback(async(levers,options)=>{let key=`levers:${options.id}`;if(externalWorkspaceKeys.current.add(key),!workspaces[key]){let sourceId=`levers:${sessionId}:${options.id}`,built=null,buildError;try{built=levers.build(levers.initial)}catch(cause){buildError=errorMessage(cause,"This source could not be prepared with these options.")}let snapshot=leverSnapshot(built?.payload??{kind:"text",text:""},sourceId,options.label),original=createDraft3(snapshot),base={snapshot,key,original,draft:original,scope:initialScope,preferences:resolveTransferPreferences2(providerPreferences,preferences,snapshot.limits),levers,leverValues:levers.initial,...built?.meta?{leverMeta:built.meta}:{},...built?.sectionSizes?{leverSizes:built.sectionSizes}:{},...built?{envelope:built.envelope}:{},...buildError?{buildError}:{}};setWorkspaces(current=>({...current,[key]:{...base,draft:rebuild(base,initialControls(base))}}))}setWorkspaceKey(key),setWorkspaceOpen(!0)},[initialScope,preferences,providerPreferences,sessionId,workspaces]);React6.useImperativeHandle(controllerRef,()=>({focusTrigger:()=>triggerRef.current?.focus(),mountPalette,preparePrimary:async options=>{if(!enabled)throw new Error("Alchemy is not enabled for this record.");if(disabled)throw new Error("Alchemy is disabled for this record.");if(hide.includes("prepare"))throw new Error("Alchemy preparation is unavailable for this record.");if(!primary)throw new Error("Alchemy has no source to prepare.");restoreFocusRef.current=options?.restoreFocus??null,await openWorkspace(primaryWorkspaceKey,{source:primary,label:sourceLabel})},prepare:async(requestedSource,options)=>{let requestedLabel=options?.label??("label"in requestedSource?requestedSource.label:"content"),requestedKey=`controller:${options?.id??"source"}:${materialIdentity(requestedSource)}`;externalWorkspaceKeys.current.add(requestedKey),await openWorkspace(requestedKey,{source:requestedSource,label:requestedLabel,envelope:options?.envelope})},prepareLevers}),[disabled,enabled,hide,mountPalette,openWorkspace,prepareLevers,primary,primaryWorkspaceKey,sourceLabel]),React6.useEffect(()=>{if(!windowPort)return;let openKey=workspaceOpen?workspaceKey:null;for(let[key,handle2]of[...windowHandles.current])key!==openKey&&(windowHandles.current.delete(key),handle2.close());if(!openKey||windowHandles.current.has(openKey))return;let label2=workspaces[openKey]?.snapshot.label??sourceLabel,instanceId=`alchemy-prepare${sessionId}${openKey}`.replace(/[^A-Za-z0-9_-]+/g,"-");setWorkspaceSessionLive(instanceId,!0),sessionKeys.current.add(instanceId);let handle=windowPort.open(()=>jsx7(WorkspaceWindowSlot,{onNode:slotRef(openKey),sessionKey:instanceId,onClose:()=>handle.close()}),{title:`Prepare ${label2}`,size:"full",instanceId,onClose:()=>{windowHandles.current.get(openKey)===handle&&(windowHandles.current.delete(openKey),setWorkspaceOpen(!1))}});windowHandles.current.set(openKey,handle)},[windowPort,workspaceOpen,workspaceKey]),React6.useEffect(()=>()=>{for(let key of sessionKeys.current)setWorkspaceSessionLive(key,!1);sessionKeys.current.clear();let handles=[...windowHandles.current.values()];windowHandles.current.clear();for(let handle of handles)handle.close()},[]);let runAction=React6.useCallback(async action=>{let{controller,id}=fence.begin();try{let actionSource=action.source,{snapshot}=actionSource?await captureOne(actionSource,initialScope,controller.signal,!0):await capturePrimary(initialScope,controller.signal),resolved=resolveTransferPreferences2(providerPreferences,preferences,snapshot.limits),draft=applyTransferLimits2(createDraft3(snapshot),resolved.limits);if(snapshot.coverage.status!=="complete"||draft.omissions.length)throw new Error("This content is partial or requires reductions. Open Prepare for AI to review it before sending it to a destination.");if(!action.supports(snapshot,draft))throw new Error(`${action.label} is unavailable for this content.`);let result=await action.run({snapshot,draft,signal:controller.signal});fence.valid(id,controller)&&draft.snapshotId===snapshot.id&&report(result)}catch(error){fence.valid(id,controller)&&report({status:"error",code:"action-failed",message:errorMessage(error,"Action failed"),retryable:!0})}finally{fence.finish(controller)}},[captureOne,capturePrimary,fence,initialScope,preferences,providerPreferences,report]),copyReference=async reference=>{let{controller,id}=fence.begin();closePalette();try{if(!referencePort?.supports(reference))throw new Error("This reference is not registered or its identity is incomplete.");let text=await referencePort.build(reference);if(!text.trim())throw new Error("The reference serializer returned no content.");let artifact=sealTransferArtifact5({snapshotId:`reference:${reference.id}`,draftRevision:0,format:"matrx-reference",plainText:text,omissions:[]});if(!fence.valid(id,controller))return;let outcome=await transport.copy(artifact,controller.signal);fence.valid(id,controller)&&(outcome.status==="success"&&outcome.delivered==="clipboard"&&confirmCopy(`reference:${reference.id}`),report(outcome))}catch(error){fence.valid(id,controller)&&report({status:"error",code:"reference-failed",message:errorMessage(error,"Could not copy reference"),retryable:!0})}finally{fence.finish(controller)}},openReference=async action=>{closePalette();try{await action.run()}catch(error){report({status:"error",code:"reference-failed",message:errorMessage(error,"Could not open reference picker"),retryable:!0})}},cancelPointerClose=()=>{leaveTimer.current&&clearTimeout(leaveTimer.current),leaveTimer.current=null},schedulePointerClose=event=>{event.pointerType!=="mouse"||!paletteOpen||(cancelPointerClose(),leaveTimer.current=setTimeout(()=>closePalette(),200))},visibleActions=React6.useMemo(()=>{if(!menuCapture)return[];let draft=applyTransferLimits2(createDraft3(menuCapture.snapshot),resolveTransferPreferences2(providerPreferences,preferences,menuCapture.snapshot.limits).limits);return registeredActions.filter(a=>a.supports(menuCapture.snapshot,draft))},[menuCapture,preferences,providerPreferences,registeredActions]);if(!enabled)return null;let payload=menuCapture?.snapshot.payload??(source&&"kind"in source?source:void 0),quickVariants=section=>variants.filter(v=>v.copyLabel&&(v.section??"ai")===section),visibleCopies=sourceFormats?COPIES.filter(f=>!duplicateFormats.has(f)&&(!!formatSources?.[f]||(payload?offersFormat(f,payload,adapters):!["csv","tsv"].includes(f)))):[],visibleDownloads=sourceFormats?DOWNLOADS.filter(f=>!duplicateFormats.has(f)&&(f!=="xlsx"&&!!formatSources?.[f]||(payload?offersFormat(f,payload,adapters):!["csv","tsv","xlsx"].includes(f)))):[],visibleAdapters=sourceFormats&&menuCapture?adapters.filter(a=>!isBuiltInFormat(a.id)&&a.supports(menuCapture.snapshot.payload)):[],downloadActions=visibleActions.filter(action=>action.placement==="download"),prepareActions=visibleActions.filter(action=>action.placement==="prepare"),ordinaryActions=visibleActions.filter(action=>action.placement===void 0),preparedActions=registeredActions.filter(action=>action.prepared&&!action.source),copyAvailable=!hide.includes("copy")&&(!!richCopy||visibleCopies.length+visibleAdapters.length+quickVariants("copy").length>0),downloadAvailable=!hide.includes("download")&&visibleDownloads.length+visibleAdapters.length+downloadActions.length>0,prepareAvailable=!hide.includes("prepare")&&(quickVariants("ai").length>0||!!primary||!!nearestWorkspaceKey||variants.length>0||prepareActions.length>0),resolvedMode=mode==="copy"&&!copyAvailable?"download":mode==="download"&&!downloadAvailable?"copy":mode,nativeAiFormat={id:"ai-context",label:"AI context",extension:"txt",mime:"text/plain;charset=utf-8",modes:["copy","download"],runsOn:"client",supports:()=>!0,load:async()=>({build:async draft=>{let envelope=primaryEnvelope?.()??{kind:"matrx_content",location:sourceLabel,description:"Captured content for an assistant",attributes:{source:draft.sourceId}};if(draft.payload.kind==="text"||draft.payload.kind==="markdown"){let text=serialize5(draft,draft.payload.kind==="markdown"?"markdown":"plain");return sealTransferArtifact5({snapshotId:draft.snapshotId,draftRevision:draft.revision,format:"ai-context",plainText:buildAgentPayload2({...envelope,data:text.plainText,dataFormat:draft.payload.kind==="markdown"?"markdown":"text"}),omissions:[...text.omissions]})}let json=serialize5(draft,"json");return sealTransferArtifact5({snapshotId:draft.snapshotId,draftRevision:draft.revision,format:"ai-context",plainText:buildAgentPayload2({...envelope,data:JSON.parse(json.plainText)}),omissions:[...json.omissions]})}})},copyFirst=sourceFormats&&!hide.includes("copy")&&!!(richCopy||primary||formatSources?.plain||formatSources?.markdown||formatSources?.json),copiedGlyph=jsx7("svg",{className:"matrx-alchemy-copied-check",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2","aria-hidden":"true",children:jsx7("path",{d:"m5 12 4 4L19 6"})}),triggerGlyph=copiedFormat?copiedGlyph:jsx7(AlchemyGlyph,{icon}),tile=(id,label2,onClick,options={})=>{let presentation=options.action,Icon=presentation?.icon,fallbackLabel=options.file&&!/^download\b/i.test(label2)?`Download ${label2}`:label2;return jsxs6("button",{type:"button",className:"matrx-alchemy-palette-tile","data-copied":resolvedMode==="copy"&&copiedFormat===id?"true":void 0,title:id==="table-data"?"JSON using column display names":id==="table-schema"?"Table schema and rows":label2,"aria-label":presentation?.ariaLabel??(presentation?fallbackLabel:options.ariaLabel??`${resolvedMode==="copy"?"Copy":"Download"} ${label2}`),onClick:()=>{closePalette(),onClick()},children:[resolvedMode==="copy"&&copiedFormat===id?copiedGlyph:Icon?jsx7(Icon,{className:"matrx-alchemy-menu-icon"}):jsx7(PaletteGlyph,{format:id,ai:!!options.ai,file:options.file||!!(options.custom&&id!=="table-data"&&id!=="table-schema")}),jsxs6("span",{children:[label2,resolvedMode==="copy"&&copiedFormat===id?jsx7("small",{className:"matrx-alchemy-copied-label",children:"Copied to clipboard"}):null,presentation?.hint?jsx7("small",{className:"matrx-alchemy-menu-hint",children:presentation.hint}):null]})]},id)},palette=jsxs6(Fragment4,{children:[menuStatus==="loading"?jsx7("p",{className:"matrx-alchemy-palette-status",children:"Inspecting content\u2026"}):menuStatus!=="idle"?jsx7("p",{className:"matrx-alchemy-error",children:menuStatus}):null,table&&scopes.length>1?jsxs6("label",{className:"matrx-alchemy-scope",children:["Content scope",jsx7("select",{"aria-label":"Content scope",value:initialScope,onChange:event=>{let next=scopes.find(scope=>scope===event.target.value);next&&(setRequestedScope(next),preflight(next))},children:scopes.map(scope=>jsx7("option",{value:scope,children:table.scopeLabels?.[scope]??SCOPE_LABEL[scope]},scope))})]}):null,copyAvailable||downloadAvailable?jsxs6("section",{className:"matrx-alchemy-output",children:[jsx7("h3",{children:resolvedMode==="copy"?"Copy as":"Download as"}),copyAvailable&&downloadAvailable?jsxs6("div",{className:"matrx-alchemy-mode","aria-label":"Output action",children:[jsx7("button",{type:"button","aria-label":"Copy mode","aria-pressed":resolvedMode==="copy",onClick:()=>setMode("copy"),children:"Copy"}),jsx7("button",{type:"button","aria-label":"Download mode","aria-pressed":resolvedMode==="download",onClick:()=>setMode("download"),children:"Download"})]}):null,resolvedMode==="copy"&&copyAvailable?jsxs6(Fragment4,{children:[jsxs6("div",{className:"matrx-alchemy-palette-grid",children:[richCopy?jsxs6(Fragment4,{children:[richCopyFlavors.includes("markdown")?tile("rich-markdown","Copy markdown",()=>{runRich("markdown")},{ariaLabel:"Copy markdown"}):null,richCopyFlavors.includes("text")?tile("rich-text","Copy text",()=>{runRich("text")},{ariaLabel:"Copy text"}):null]}):null,visibleCopies.filter(format=>!richCopy||format!=="plain"&&format!=="markdown"&&(!["json","compact-json"].includes(format)||!!formatSources?.[format])).map(format=>tile(format,{plain:"Text",markdown:"Markdown",html:"Formatted",json:"JSON","compact-json":"Compact",csv:"CSV",tsv:"Sheets"}[format],()=>{transfer(format,!1)},{ariaLabel:`Copy ${LABEL[format]}`})),visibleAdapters.map(adapter=>tile(adapter.id,adapter.label,()=>{transfer(adapter,!1)},{custom:!0}))]}),quickVariants("copy").length?jsx7(PaletteRows,{title:"Quick copy",items:quickVariants("copy"),onRun:variant=>{closePalette(),transfer("markdown",!1,variant)}}):null]}):null,resolvedMode==="download"&&downloadAvailable?jsx7(Fragment4,{children:jsxs6("div",{className:"matrx-alchemy-palette-grid",children:[visibleDownloads.map(format=>tile(format,{plain:"Text",markdown:"Markdown",html:"Formatted",json:"JSON","compact-json":"Compact",csv:"CSV",tsv:"Sheets",xlsx:"Excel"}[format],()=>{transfer(format,!0)},{ariaLabel:`Download ${LABEL[format]}`})),visibleAdapters.map(adapter=>tile(adapter.id,adapter.label,()=>{transfer(adapter,!0)},{custom:!0})),downloadActions.map(action=>tile(action.id,action.label,()=>{runAction(action)},{custom:!0,action,file:!0}))]})}):null]}):null,prepareAvailable?jsxs6(Fragment4,{children:[jsx7(PaletteRows,{title:"Copy for AI",ai:!0,glyphKind:"ai-copy",fallbackHint:"Copies immediately",extra:jsxs6(Fragment4,{children:[sourceFormats?jsxs6("button",{type:"button",className:"matrx-alchemy-palette-row",onClick:()=>{closePalette(),transfer(nativeAiFormat,!1)},children:[jsx7(PaletteGlyph,{kind:"ai-copy"}),jsxs6("span",{children:["Copy with AI context",jsx7("small",{className:"matrx-alchemy-menu-hint",children:"Include source context"})]})]}):null,copyWithPrompt||primary?jsxs6("button",{type:"button",className:"matrx-alchemy-palette-row","aria-label":"Copy with prompt",onClick:()=>{closePalette(),(copyWithPrompt?copyWithPrompt():openWorkspace()).then(()=>setPromptFocus(n=>n+1))},children:[jsx7(PaletteGlyph,{kind:"ai-copy"}),jsxs6("span",{children:["Copy with prompt\u2026",jsx7("small",{className:"matrx-alchemy-menu-hint",children:"Add your instructions"})]})]}):null]}),items:quickVariants("ai"),onRun:variant=>{closePalette(),transfer("markdown",!1,variant)}}),jsx7(PaletteRows,{title:"Edit and prepare",items:[],extra:jsxs6(Fragment4,{children:[prepareActions.map(action=>{let presentation=action;return jsxs6("button",{type:"button",className:"matrx-alchemy-palette-row","aria-label":presentation.ariaLabel??`${action.label}${presentation.hint?` ${presentation.hint}`:""}`,onClick:()=>{closePalette(),runAction(action)},children:[jsx7(PaletteGlyph,{kind:"sliders"}),jsxs6("span",{children:[action.label,"\u2026",presentation.hint?jsx7("small",{className:"matrx-alchemy-menu-hint",children:presentation.hint}):null]})]},action.id)}),table?jsxs6("button",{type:"button",className:"matrx-alchemy-palette-row","aria-label":"Filter & sort before copying",onClick:()=>{closePalette(),openWorkspace()},children:[jsx7(PaletteGlyph,{kind:"sliders"}),jsxs6("span",{children:["Filter & sort before copying\u2026",jsx7("small",{className:"matrx-alchemy-menu-hint",children:table.size?`${table.size} \xB7 search, filter, sort, pick rows`:"Search, filter, sort, pick rows"})]})]}):null,jsxs6("button",{type:"button",className:"matrx-alchemy-palette-row","aria-label":"Prepare for AI",onClick:()=>{closePalette(),openWorkspace()},children:[jsx7(PaletteGlyph,{kind:"sliders"}),jsxs6("span",{children:["Prepare for AI",jsx7("small",{className:"matrx-alchemy-menu-hint",children:"Trim, edit or summarize"})]})]})]})})]}):null,prepareAvailable&&(nearestWorkspaceKey||variants.length)?jsx7(PaletteRows,{title:"Other sources",items:[],extra:jsxs6(Fragment4,{children:[nearestWorkspaceKey&&nearestSurface?jsxs6("button",{type:"button",className:"matrx-alchemy-palette-row",onClick:()=>{closePalette(),openWorkspace(nearestWorkspaceKey,{source:nearestSurface,label:nearestSurface.surfaceName})},children:[jsx7(PaletteGlyph,{kind:"surface"}),jsx7("span",{children:"Prepare this page"})]}):null,variants.map(variant=>jsx7("button",{type:"button",className:"matrx-alchemy-palette-row","aria-label":variant.ariaLabel,onClick:()=>{closePalette(),openWorkspace(variantWorkspaceKeys.get(variant.id),variant)},children:jsx7(MenuPresentation,{...variant,label:`Prepare ${variant.label}`})},variant.id))]})}):null,references.length||referenceActions.length?jsxs6("section",{className:"matrx-alchemy-palette-section",children:[jsx7("h3",{children:"References"}),referenceActions.map(action=>jsxs6("button",{type:"button",className:"matrx-alchemy-palette-row",onClick:()=>{openReference(action)},children:[jsx7(PaletteGlyph,{kind:"link"}),jsx7("span",{children:action.label}),jsx7("svg",{className:"matrx-alchemy-disclosure",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.5","aria-hidden":"true",children:jsx7("path",{d:"m6 4 4 4-4 4"})})]},action.id)),references.map(reference=>jsxs6("button",{type:"button",className:"matrx-alchemy-palette-row",title:"Copies a reference to saved data",onClick:()=>{copyReference(reference)},children:[jsx7(PaletteGlyph,{kind:"link"}),jsx7("span",{children:reference.label})]},reference.id))]}):null,["save","chat","email"].map(group=>{let entries=ordinaryActions.filter(action=>action.group===group);return entries.length?jsxs6("details",{className:"matrx-alchemy-palette-destinations",children:[jsxs6("summary",{children:[DESTINATION_HEADING[group],jsxs6("span",{className:"matrx-alchemy-disclosure-meta",children:[jsx7("span",{children:entries.length}),jsx7("svg",{className:"matrx-alchemy-disclosure",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.5","aria-hidden":"true",children:jsx7("path",{d:"m6 4 4 4-4 4"})})]})]}),jsx7("div",{children:entries.map(action=>jsx7("button",{type:"button",className:"matrx-alchemy-palette-row","aria-label":action.ariaLabel,onClick:()=>{closePalette(),runAction(action)},children:jsx7(DestinationPresentation,{action})},action.id))})]},group):null}),ordinaryActions.some(action=>!action.group)?jsx7("section",{className:"matrx-alchemy-palette-section","data-alchemy-inline-actions":"",children:ordinaryActions.filter(action=>!action.group).map(action=>jsx7("button",{type:"button",className:"matrx-alchemy-palette-row","aria-label":action.ariaLabel,onClick:()=>{closePalette(),runAction(action)},children:jsx7(DestinationPresentation,{action})},action.id))}):null]}),feedbackOwner=paletteTarget??triggerRef.current??feedbackDocument.current?.body??null;return jsxs6("span",{className:cn3("matrx-alchemy",className),onPointerEnter:cancelPointerClose,onPointerLeave:schedulePointerClose,onClick:stopPropagation?event=>event.stopPropagation():void 0,children:[!triggerHidden&&!paletteTarget?jsxs6(Popover,{open:paletteOpen,onOpenChange:open=>{open?(setPaletteOpen(!0),setMode("copy"),preflight(),copyFirst&&(richCopy?runRich("default"):transfer("default",!1))):(cancelPointerClose(),closePalette())},children:[jsx7(PopoverTrigger,{asChild:!0,children:triggerVariant==="outline"?jsx7(Button3,{ref:triggerRef,variant:"outline",size:"icon-sm","aria-label":`Copy, transform or export ${sourceLabel}`,"data-alchemy-trigger":"outline","data-copied":copiedFormat?"true":void 0,"aria-description":copiedFormat?"Copied to clipboard":void 0,disabled,children:triggerGlyph}):triggerVariant==="glass"?jsx7(TapTargetButton,{ref:triggerRef,icon:triggerGlyph,tooltip:!1,ariaLabel:`Copy, transform or export ${sourceLabel}`,"data-alchemy-trigger":"glass","data-alchemy-size":triggerSize,"data-copied":copiedFormat?"true":void 0,"aria-description":copiedFormat?"Copied to clipboard":void 0,disabled}):jsx7(TapTargetButtonTransparent,{ref:triggerRef,icon:triggerGlyph,tooltip:!1,ariaLabel:`Copy, transform or export ${sourceLabel}`,"data-alchemy-trigger":"transparent","data-alchemy-size":triggerSize,"data-copied":copiedFormat?"true":void 0,"aria-description":copiedFormat?"Copied to clipboard":void 0,disabled})}),jsx7(PopoverContent,{align:"end",className:"matrx-alchemy-menu matrx-alchemy-palette","aria-label":"Alchemy output options",onPointerEnter:cancelPointerClose,onPointerLeave:schedulePointerClose,onCloseAutoFocus:()=>triggerRef.current?.focus(),children:palette})]}):null,paletteTarget&&paletteOpen?createPortal2(jsx7("div",{className:"matrx-alchemy-menu matrx-alchemy-palette",role:"dialog","aria-label":"Alchemy output options",children:palette}),paletteTarget):null,notice&&feedbackOwner?createPortal2(jsxs6("div",{className:"matrx-alchemy-feedback",onPointerEnter:clearNoticeTimer,onPointerLeave:startNoticeTimer,children:[jsx7("span",{role:"status",children:notice}),jsx7(ReceiptLink,{target:receiptTarget}),jsx7("button",{type:"button","aria-label":"Dismiss Alchemy feedback",onClick:()=>setNotice(null),children:"\xD7"})]}),feedbackOwner.ownerDocument.body):null,Object.values(workspaces).map(saved=>jsx7(PreparationWorkspace,{promptFocus:workspaceKey===saved.key?promptFocus:0,restoreFocus:()=>restoreFocusRef.current?.()??triggerRef.current?.focus(),frame:windowPort?"host":"dialog",windowNode:windowNodes[saved.key]??null,open:workspaceOpen&&workspaceKey===saved.key,state:saved,scopes,scopeLabels:table?.scopeLabels,onClose:()=>setWorkspaceOpen(!1),onChange:next=>setWorkspaces(current=>({...current,[saved.key]:next})),transport,adapters,actions:preparedActions,captureScope:workspaceCaptures.current.get(saved.key)??capturePrimary,...ai?{ai}:{},onOutcome:report},saved.key)),emailReview]})}export{ALCHEMY_COPY_TRANSFORM_SVG,ALCHEMY_GLYPH_SVG,AlchemyGlyph,AlchemyTableCopyControls,ContentTransferCapabilitiesProvider,ContentTransferMenu,ContentTransferSurfaceProvider,GROOMER_LEVELS,MatrxCopyMenu,NOTICE_ERROR_MS,NOTICE_MS,PALETTE_HEADINGS,applyGroomerPreset,buildGroomerPresetPayload,createTransferEmailActions,createTransferHtmlPreviewAction,defaultGroomerSelections,groomerPresetVariants,tableDataFormat,tableSchemaFormat,useContentTransferCapabilities,useContentTransferSurface2 as useContentTransferSurface};
6
+ `);return jsxs4("div",{className:"matrx-alchemy-prep-group",children:[jsxs4("div",{className:"matrx-alchemy-prep-rowbar",children:[jsxs4("label",{className:"matrx-alchemy-prep-field",children:["Search",jsx4("input",{type:"search","aria-label":"Search",value:controls.search,placeholder:"Every shown column",onChange:e=>change({...controls,search:e.target.value})})]}),jsx4("button",{type:"button",className:"matrx-alchemy-prep-chip","aria-pressed":controls.searchMode==="whole_words",title:"Match whole words only: \u201Care\u201D finds \u201Cwe are ready\u201D, never \u201Chardware\u201D",onClick:()=>change({...controls,searchMode:controls.searchMode==="whole_words"?"contains":"whole_words"}),children:"Whole words"}),jsxs4("label",{className:"matrx-alchemy-prep-field",children:["Sort",jsxs4("select",{"aria-label":"Sort",value:controls.sort,onChange:e=>change({...controls,sort:e.target.value}),children:[jsx4("option",{value:"",children:"None"}),visibleDefs.map(column=>jsx4("option",{value:column.id,children:column.label},column.id))]})]}),jsxs4("label",{className:"matrx-alchemy-prep-field",children:["Direction",jsxs4("select",{"aria-label":"Direction",value:controls.direction,disabled:!controls.sort,onChange:e=>change({...controls,direction:e.target.value}),children:[jsx4("option",{value:"asc",children:"Ascending"}),jsx4("option",{value:"desc",children:"Descending"})]})]}),jsxs4("label",{className:"matrx-alchemy-prep-field",children:["Top rows",jsx4("input",{type:"number","aria-label":"Top rows",min:"0",value:controls.top??"",onChange:e=>change({...controls,top:Number.isNaN(e.target.valueAsNumber)?null:e.target.valueAsNumber})})]}),jsx4(LayeredFilterBuilder,{fields:layeredFields,rules:controls.layeredFilters,onChange:layeredFilters=>change({...controls,layeredFilters}),label:"Advanced row filters"})]}),controls.search.trim()?jsxs4("small",{className:"matrx-alchemy-prep-hint",role:"status",children:[formatCount3(matched.length)," of ",formatCount3(rows.rows.length)," rows match \xB7 ",formatCount3(matchesInPreview)," in the preview"]}):null,jsxs4("fieldset",{className:"matrx-alchemy-prep-group","aria-label":"Columns and filters",children:[jsxs4("legend",{className:"matrx-alchemy-prep-legend",children:[visibleDefs.length," of ",rows.columns.length," columns",filterCount?` \xB7 ${filterCount} filter${filterCount===1?"":"s"}`:""]}),rows.columns.length>6?jsx4("input",{className:"matrx-alchemy-prep-search",type:"search","aria-label":"Find a column",placeholder:"Find a column",value:columnSearch,onChange:e=>setColumnSearch(e.target.value)}):null,shownColumns.map(column=>{let exportable=exportableColumn(column),on=exportable&&shown.has(column.id);return jsxs4("div",{className:"matrx-alchemy-prep-node matrx-alchemy-column","data-focused":focusKey===`column:${column.id}`||void 0,children:[jsxs4("div",{className:"matrx-alchemy-tree-row matrx-alchemy-column-head",children:[exportable?jsx4("input",{type:"checkbox",className:"matrx-alchemy-tree-check","aria-label":column.label,checked:on,onChange:e=>setColumnShown(column,e.target.checked)}):jsx4("span",{className:"matrx-alchemy-tree-lock",role:"img","aria-label":`${column.label} is declared ${column.classification==="secret"||column.classification==="credential"?column.classification:"not exportable"} and never leaves this page`,title:"Declared not exportable \u2014 it never leaves this page",children:jsx4(LockGlyph,{})}),jsx4("button",{type:"button",className:"matrx-alchemy-tree-label","aria-label":`Highlight ${column.label}`,"aria-pressed":focusKey===`column:${column.id}`,onClick:()=>onFocus("column",column.id),children:jsx4("span",{className:"matrx-alchemy-tree-name",children:column.label})}),on?jsx4("select",{className:"matrx-alchemy-tree-limit","aria-label":`Limit ${column.label}`,value:encodeLimit(controls.columnLimits[column.id]),onChange:e=>{let limit=decodeLimit(e.target.value),{[column.id]:_old,...rest}=controls.columnLimits;change({...controls,columnLimits:limit&&e.target.value!==KEEP?{...rest,[column.id]:limit}:rest})},children:CELL_LIMITS.map(choice=>jsx4("option",{value:choice.value,children:choice.label},choice.value))}):null]}),jsxs4("div",{className:"matrx-alchemy-column-meta",children:[jsx4(SizeNote,{chars:sizes[column.id]??0,whole}),on?jsx4("input",{"aria-label":`Filter ${column.label}`,placeholder:"Filter",value:controls.filters[column.id]??"",onChange:e=>change({...controls,filters:{...controls.filters,[column.id]:e.target.value}})}):null]})]},column.id)})]}),jsxs4("div",{className:"matrx-alchemy-prep-group",role:"group","aria-label":"Rows",children:[jsxs4("div",{className:"matrx-alchemy-tree-row matrx-alchemy-rows-head",children:[jsx4(RowsCheckbox,{state:everyRow,onChange:toggleEveryRow}),jsxs4("span",{className:"matrx-alchemy-prep-legend",children:["Rows \u2014 ",formatCount3(included)," of ",formatCount3(matched.length)," included",matched.length<rows.rows.length?` (${formatCount3(rows.rows.length)} captured)`:""]})]}),jsxs4(ContextMenu,{children:[jsx4(ContextMenuTrigger,{asChild:!0,children:jsx4("div",{onContextMenu:event=>{let index=event.target.closest("[data-row-index]")?.getAttribute("data-row-index");setMenuRow(index==null?null:Number(index))},children:jsx4(StructureTreeList,{label:"Rows",items:rowItems,whole:rowWhole,focusKey,handlers:rowHandlers,maxHeight:"min(24rem, 50dvh)"})})}),jsx4(ContextMenuContent,{children:menuRow===null?jsx4(ContextMenuLabel,{children:"Right-click a row to copy it"}):jsxs4(Fragment2,{children:[jsxs4(ContextMenuLabel,{children:["Row ",menuRow+1]}),jsx4(ContextMenuItem,{onSelect:()=>onCopyRow(rowCopy(menuRow)),children:"Copy this row\u2019s shown columns"}),jsx4(ContextMenuItem,{onSelect:()=>setRowIncluded(menuRow,left.has(menuRow)),children:left.has(menuRow)?"Include this row":"Leave this row out"})]})})]})]})]})}function RowsCheckbox({state,onChange}){let ref=React4.useRef(null);return React4.useEffect(()=>{ref.current&&(ref.current.indeterminate=state==="mixed")},[state]),jsx4("input",{ref,type:"checkbox",className:"matrx-alchemy-tree-check","aria-label":"Include every matching row",checked:state==="on","aria-checked":state==="mixed"?"mixed":state==="on",onChange})}function cellText(value){return value==null?"":typeof value=="string"?value:typeof value=="number"||typeof value=="boolean"?String(value):JSON.stringify(value)??""}var liveSessions=new Set,sessionListeners=new Set;function setWorkspaceSessionLive(key,live){live?liveSessions.add(key):liveSessions.delete(key),sessionListeners.forEach(listener=>listener())}var subscribeSessions=listener=>(sessionListeners.add(listener),()=>{sessionListeners.delete(listener)});function WorkspaceWindowSlot({onNode,sessionKey,onClose}){return React4.useSyncExternalStore(subscribeSessions,()=>sessionKey===void 0||liveSessions.has(sessionKey),()=>!0)?jsx4("div",{className:"matrx-alchemy-prep-slot",ref:onNode}):jsxs4("div",{className:"matrx-alchemy-prep-released",role:"status",children:[jsx4("p",{children:jsx4("strong",{children:"The rows this held were released."})}),jsx4("p",{children:"The page that opened this preparation closed or reloaded, so what it captured is gone. Reopen Prepare from the table or page to start again."}),onClose?jsx4(Button2,{type:"button",variant:"outline",className:"matrx-alchemy-workspace-secondary",onClick:onClose,children:"Close"}):null]})}import{Popover,PopoverContent,PopoverTrigger}from"@ai-matrx/design-system";import{TapTargetButton,TapTargetButtonTransparent}from"@ai-matrx/design-system/tap-target";import{ALCHEMY_GLYPH_VIEWBOX,ALCHEMY_GLYPH_PATHS}from"@ai-matrx/design-system/content-transfer/icon";import{ALCHEMY_GLYPH_SVG,ALCHEMY_COPY_TRANSFORM_SVG}from"@ai-matrx/design-system/content-transfer/icon";import{ContentTransferError,readTransferCell as readTransferCell3,sealTransferArtifact as sealTransferArtifact3,serialize as serialize3}from"@ai-matrx/alchemy/operate";var exportableColumns=payload=>payload.columns.filter(column=>column.visible&&column.exportable!==!1&&column.classification!=="secret"&&column.classification!=="credential"),tableSchemaFormat={id:"table-schema",label:"Schema",supports:payload=>payload.kind==="rows",extension:"json",mime:"application/json",modes:["copy","download"],runsOn:"client",load:async()=>({async build(draft,_options,signal){if(signal.aborted)throw new DOMException("Cancelled","AbortError");if(draft.payload.kind!=="rows")throw new ContentTransferError("unsupported-format","Schema + rows requires tabular content; manually edited text cannot carry a table schema.");let rowColumns=exportableColumns(draft.payload),columns=rowColumns.map(column=>({id:column.id,label:column.label,path:column.path,...column.schema===void 0?{}:{schema:column.schema}})),body={sourceId:draft.sourceId,columns,rows:draft.payload.rows.map(row=>Object.fromEntries(rowColumns.map(column=>[column.id,readTransferCell3(row,column)??null])))},plainText=JSON.stringify(body,null,2);return sealTransferArtifact3({snapshotId:draft.snapshotId,draftRevision:draft.revision,format:"table-schema",plainText,file:{filename:"table-schema.json",mime:"application/json",bytes:new TextEncoder().encode(plainText)},omissions:[...draft.omissions]})}})};function displayLabels(payload){let columns=exportableColumns(payload),counts=new Map;for(let column of columns)counts.set(column.label,(counts.get(column.label)??0)+1);let used=new Set;return columns.map(column=>{let base=counts.get(column.label)===1?column.label:`${column.label} [${column.id}]`,label=base;for(let suffix=2;used.has(label);suffix+=1)label=`${base} (${suffix})`;return used.add(label),[label,column]})}var tableDataFormat={id:"table-data",label:"Table JSON",supports:payload=>payload.kind==="rows",extension:"json",mime:"application/json;charset=utf-8",modes:["copy","download"],runsOn:"client",load:async()=>({async build(draft,_options,signal){if(signal.aborted)throw new DOMException("Cancelled","AbortError");if(draft.payload.kind!=="rows")throw new ContentTransferError("unsupported-format","Display-label JSON requires tabular content.");let columns=displayLabels(draft.payload),plainText=JSON.stringify(draft.payload.rows.map(row=>Object.fromEntries(columns.map(([label,column])=>[label,readTransferCell3(row,column)??null]))),null,2);return sealTransferArtifact3({snapshotId:draft.snapshotId,draftRevision:draft.revision,format:"json",plainText,file:{filename:"data.json",mime:"application/json;charset=utf-8",bytes:new TextEncoder().encode(plainText)},omissions:[...draft.omissions]})}})},emailArtifact=(draft,format,signal,jsonFormat)=>format==="json"&&jsonFormat?.supports(draft.payload)?jsonFormat.load().then(engine=>engine.build(draft,{},signal)):Promise.resolve(serialize3(draft,format));function createTransferEmailActions(email,options={}){return["csv","json","markdown"].map(format=>({id:`email-${format}`,label:`Email ${format==="csv"?"CSV":format==="json"?"JSON":"Markdown"}`,prepared:!0,group:"email",supports:(_snapshot,draft)=>!!draft&&(format!=="csv"||draft?.payload.kind==="rows"),async run({draft,signal,snapshot}){if(signal.aborted)return{status:"cancelled"};let artifact=await emailArtifact(draft,format,signal,options.jsonFormat);return email.send(artifact,{label:snapshot.label,signal})}}))}function createTransferHtmlPreviewAction(port){return{id:"html-preview",label:"HTML preview",supports:(snapshot,draft)=>{let kind=(draft?.payload??snapshot.payload).kind;return kind==="markdown"||kind==="text"},async run({draft,snapshot,signal}){if(signal.aborted)return{status:"cancelled"};if(draft.payload.kind!=="markdown"&&draft.payload.kind!=="text")throw new ContentTransferError("unsupported-format","HTML preview requires text.");return await port.open({content:draft.payload.text,title:snapshot.label}),{status:"success",delivered:"action",mimeTypes:[],message:"HTML preview opened"}}}}import{ContentTransferSurfaceProvider,useContentTransferSurface as useContentTransferSurface2}from"@ai-matrx/alchemy/react/surface";import*as React5 from"react";import{buildAgentPayload,capture,createBrowserTransport,createDraft as createDraft2,serialize as serialize4,directSource as directSource2,hasThinking,stripThinking,normalizeTransferJson as normalizeTransferJson2,sealTransferArtifact as sealTransferArtifact4}from"@ai-matrx/alchemy/operate";import{cn as cn2}from"@ai-matrx/design-system";import{Fragment as Fragment3,jsx as jsx5,jsxs as jsxs5}from"react/jsx-runtime";var TWIN_CHECK_MAX_CHARS=2e4,resolve=value=>typeof value=="function"?value():value,asPayload=value=>({kind:"markdown",text:typeof value=="string"?value:buildAgentPayload(value)}),structuredPayload=value=>payloadForEnvelope(value),actionDone=message=>({status:"success",delivered:"action",mimeTypes:[],message}),isSafeFilename=filename=>filename===filename.trim()&&filename.length>0&&!/^\.+$/.test(filename)&&!/[\\/\x00-\x1F\x7F]/.test(filename),sourceFor=(id,label,build,shape)=>({id,label,...shape?{shape}:{},capture:async({signal})=>{signal.throwIfAborted();let payload=await build();return signal.throwIfAborted(),directSource2(payload,{sourceId:id,label})}});function MatrxCopyMenu(props){let inherited=useContentTransferCapabilities();return jsx5(MatrxCopyMenuSession,{...props},JSON.stringify([inherited.identityKey??null,props.sourceId??props.label]))}function MatrxCopyMenuSession(props){let instance=React5.useId(),controller=React5.useRef(null),transport=useContentTransferCapabilities().transport??createBrowserTransport(),[modal,setModal]=React5.useState(null),copyVisible=!props.hide?.includes("copy"),humanSource=()=>{let text=resolve(props.human);return props.stripThinking?stripThinking(text):text},richText=props.contentFlavor==="markdown"&&props.human!==void 0&&copyVisible,richCopy=richText?async flavor=>{let markdown=humanSource();if(props.richCopy)return props.richCopy(markdown,flavor);let signal=new AbortController().signal,{snapshot}=await capture({kind:"markdown",text:markdown},signal),draft=createDraft2(snapshot),artifact=flavor==="default"||flavor==="formatted"?await markdownRichArtifact(draft):serialize4(draft,"markdown");return transport.copy(artifact,signal)}:void 0,aiVisible=!props.hide?.includes("ai"),exportVisible=!props.hide?.includes("export"),make=(suffix,build,label=props.label,shape)=>sourceFor(`${props.sourceId??`${instance}:${props.label}`}:${suffix}`,label,build,shape),humanCheap=typeof props.human=="string"&&props.human.length<=TWIN_CHECK_MAX_CHARS,human=copyVisible&&props.human!==void 0?make("human",()=>({kind:"text",text:humanSource()}),props.label,{kind:"text",cheap:humanCheap}):void 0,humanMarkdown=copyVisible&&props.human!==void 0?make("human-markdown",()=>({kind:"markdown",text:humanSource()}),props.label,{kind:"markdown",cheap:humanCheap}):void 0,humanText=copyVisible&&props.human!==void 0?make("human-text",()=>({kind:"markdown",text:humanSource()}),props.label,{kind:"markdown",cheap:humanCheap}):void 0,json=aiVisible&&props.json!==void 0?make("json",()=>({kind:"json",value:normalizeTransferJson2(resolve(props.json),{omitUndefinedObjectProperties:!0})}),props.label,{kind:"json"}):void 0,agent=aiVisible&&props.agent!==void 0?make("agent",()=>asPayload(resolve(props.agent))):void 0,structuredAgent=aiVisible&&props.agent!==void 0?make("structured-agent",()=>structuredPayload(resolve(props.agent)).payload):void 0,table=(exportVisible||props.primarySource==="table")&&props.export?.sheetRows?make("rows",async()=>{let value=normalizeTransferJson2(await props.export.sheetRows(),{omitUndefinedObjectProperties:!0});if(!Array.isArray(value)||value.some(row=>row===null||typeof row!="object"||Array.isArray(row)))throw new Error("Sheet rows must be JSON objects.");let rows=value,columns=props.export.sheetColumns?.()??[...new Set(rows.flatMap(row=>Object.keys(row)))].map(id=>({id,label:id})),ids=new Set;for(let column of columns){if(!column.id||!column.label||ids.has(column.id))throw new Error("Sheet columns require unique nonempty ids and labels.");ids.add(column.id)}for(let row of rows)for(let key of Object.keys(row))if(!ids.has(key))throw new Error("Table data contains a field outside its declared columns.");return{kind:"rows",rows,columns:columns.map(column=>({id:column.id,label:column.label,path:`/${column.id.replace(/~/g,"~0").replace(/\//g,"~1")}`,visible:!0}))}}):void 0,builderVariants=aiVisible?(props.aiVariants??[]).filter(variant=>variant.build&&!variant.onSelect&&!variant.modal&&!variant.prepare).map(variant=>({...variant,copyLabel:variant.label,source:make(`variant:${variant.id}`,async()=>asPayload(await variant.build()),variant.label)})):[],faithful=agent?[{id:props.agentVariant?.id??"faithful",label:props.agentVariant?.label??"Full AI context",source:agent,copyLabel:props.agentVariant?.label??"Copy for AI",...props.agentVariant?.hint?{hint:props.agentVariant.hint}:{}}]:[],thinkingVariants=copyVisible&&props.stripThinking&&typeof props.human=="string"&&hasThinking(props.human)?[{id:"include-thinking",label:"Including thinking",copyLabel:"Copy including thinking",hint:"Includes the original reasoning content",section:"copy",source:make("include-thinking",()=>({kind:"markdown",text:props.human}),props.label,{kind:"markdown",cheap:!1})}]:[],variants=props.agentVariant?.position==="last"?[...thinkingVariants,...builderVariants,...faithful]:[...thinkingVariants,...faithful,...builderVariants],actions=[];if(aiVisible)for(let variant of props.aiVariants??[])!variant.onSelect&&!variant.modal&&!variant.prepare||actions.push({...variant,id:`variant-action:${variant.id}`,label:variant.label,...variant.prepare?{placement:"prepare"}:{},supports:()=>!0,run:async()=>{if(variant.prepare){if(!controller.current)throw new Error("Alchemy is no longer mounted.");let prepared=variant.prepare();await controller.current.prepare(prepared.payload,{id:`${instance}:${variant.id}`,label:prepared.label,...prepared.envelope?{envelope:prepared.envelope}:{}})}else variant.onSelect?await variant.onSelect():setModal(variant);return actionDone(`Opened ${variant.label}`)}});if(aiVisible&&props.aiCustom&&actions.push({id:"configure-source",label:props.aiCustom.label??"Customize source",...props.aiCustom.hint?{hint:props.aiCustom.hint}:{},supports:()=>!0,run:async()=>{if(!controller.current)throw new Error("Alchemy is no longer mounted.");return await controller.current.prepareLevers(customLevers(props.aiCustom),{id:`${instance}:custom`,label:props.aiCustom.dialogTitle??props.label}),actionDone("Source options opened")}}),aiVisible&&props.groomer&&actions.push({id:"groom-source",label:"Customize sections",supports:()=>!0,run:async()=>{if(!controller.current)throw new Error("Alchemy is no longer mounted.");let config=props.groomer();return await controller.current.prepareLevers(groomerLevers(config),{id:`${instance}:groomer`,label:config.label}),actionDone("Section options opened")}}),exportVisible)for(let item of props.export?.items??[])actions.push({id:`export:${item.id}`,label:item.label,supports:()=>!0,...item.build&&!item.onSelect?{placement:"download",source:make(`export:${item.id}`,async()=>{let file=item.build(),bytes=new Uint8Array(await new Blob([file.content],{type:file.mime}).arrayBuffer());return{kind:"registered",format:"matrx-file",value:{bytes:Array.from(bytes),mime:file.mime,extension:file.extension,...file.filename!==void 0?{filename:file.filename}:{}}}},item.label)}:{},run:async({snapshot,draft,signal})=>{if(item.onSelect)return await item.onSelect(),actionDone(`Opened ${item.label}`);let value=draft.payload.kind==="registered"?draft.payload.value:null;if(!value||Array.isArray(value)||typeof value!="object"||!Array.isArray(value.bytes)||typeof value.mime!="string"||typeof value.extension!="string"||value.bytes.some(byte=>typeof byte!="number"||!Number.isInteger(byte)||byte<0||byte>255))throw new Error(`${item.label} did not capture a valid file.`);if(value.filename!==void 0&&(typeof value.filename!="string"||!isSafeFilename(value.filename)))throw new Error(`${item.label} has an unsafe filename. Use a nonempty basename without leading or trailing whitespace, dots only, path separators, or control characters.`);if(draft.omissions.some(omission=>omission.reason!=="duplicate"))throw new Error("This custom file exceeds the configured export limits or contains excluded content. Use a standard format or revise the source options.");let bytes=new Uint8Array(value.bytes),filename=typeof value.filename=="string"?value.filename:`${props.label.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"export"}.${value.extension.replace(/[^a-zA-Z0-9.-]/g,"")||"bin"}`;return transport.download(sealTransferArtifact4({snapshotId:snapshot.id,draftRevision:draft.revision,format:`export:${item.id}`,plainText:"",file:{filename,mime:value.mime,bytes},omissions:[...draft.omissions]}),signal)}});exportVisible&&table&&props.sendToSheet&&actions.push({id:"send-google-sheet",label:"Send to Google Sheet",source:table,supports:()=>!0,run:async({draft})=>{if(draft.payload.kind!=="rows")throw new Error("Google Sheets requires captured rows.");return props.sendToSheet(draft.payload.rows,props.label)}});let source=(props.primarySource==="table"?table:void 0)??json??table??structuredAgent??human??builderVariants[0]?.source;if(!source&&!actions.length)return null;let target=source??make("actions",()=>({kind:"text",text:props.label}));return jsxs5(Fragment3,{children:[jsx5(ContentTransferMenu,{triggerSize:props.size==="xs"||props.size==="toolbar"?"compact":"default",source:target,...source&&source===structuredAgent?{envelope:()=>structuredPayload(resolve(props.agent)).envelope}:{},...props.references?{references:props.references}:{},...props.referenceActions?{referenceActions:props.referenceActions}:{},...props.icon!==void 0?{icon:props.icon}:{},...props.triggerVariant!==void 0?{triggerVariant:props.triggerVariant}:{},controllerRef:value=>{controller.current=value,typeof props.controllerRef=="function"?props.controllerRef(value):props.controllerRef&&(props.controllerRef.current=value)},...props.triggerHidden?{triggerHidden:!0}:{},...richCopy?{richCopy,...props.richCopyFlavors?{richCopyFlavors:props.richCopyFlavors}:props.richCopy?{}:{richCopyFlavors:["markdown"]}}:{},label:props.label,...aiVisible&&props.aiCustom?{copyWithPrompt:async()=>{if(!controller.current)throw new Error("Alchemy is no longer mounted.");await controller.current.prepareLevers(customLevers(props.aiCustom),{id:`${instance}:custom`,label:props.aiCustom.dialogTitle??props.label})}}:{},variants,actions,...richText&&props.htmlPreview!==!1?{htmlPreview:!0}:{},sourceFormats:!!source,hide:[...!copyVisible||!source?["copy"]:[],...!aiVisible||!source?["prepare"]:[],...exportVisible?[]:["download"]],formatSources:{...human?{plain:humanText,markdown:humanMarkdown,html:humanMarkdown}:{},...json?{json,"compact-json":json}:{},...table&&exportVisible?{csv:table,tsv:table}:{}},...props.disabled!==void 0?{disabled:props.disabled}:{},className:cn2(props.className,props.size==="xs"&&"matrx-alchemy-xs",props.size==="sm"&&"matrx-alchemy-sm",props.size==="toolbar"&&"matrx-alchemy-toolbar-target"),...props.stopPropagation!==void 0?{stopPropagation:props.stopPropagation}:{}}),modal?.modal?.({open:!0,onOpenChange:open=>{open||setModal(null)}})]})}var GROOMER_LEVELS=["full","compact","brief"];function defaultGroomerSelections(sections){return Object.fromEntries(sections.map(section=>[section.id,section.defaultSelection??"full"]))}function buildGroomerPresetPayload(config,preset){let selections=applyGroomerPreset(preset,config.sections),data={},dropped=[];for(let section of config.sections){let selection=selections[section.id]??"full";if(selection==="off"){dropped.push(section.id);continue}let value=section.build(selection);value!=null&&(data[section.id]=value)}return{kind:config.kind,location:config.location,description:preset==="everything"?config.description:`${config.description} (${preset} detail)`,data,...config.summary!==void 0?{summary:config.summary}:{},attributes:{...config.attributes,detail:preset,...dropped.length?{dropped_sections:dropped.join(",")}:{}},...config.context?{context:config.context}:{}}}function groomerPresetVariants(getConfig){return[{id:"balanced",label:"Balanced",hint:"Compact sections",build:()=>buildGroomerPresetPayload(getConfig(),"balanced")},{id:"minimal",label:"Minimal",hint:"Brief sections with optional detail excluded",build:()=>buildGroomerPresetPayload(getConfig(),"minimal")}]}import{jsx as jsx6}from"react/jsx-runtime";function AlchemyTableCopyControls(props){return jsx6(MatrxCopyMenu,{...props})}import{Fragment as Fragment4,jsx as jsx7,jsxs as jsxs6}from"react/jsx-runtime";function AlchemyGlyph({icon="portal",...props}){return jsx7("svg",{width:"18",height:"18",viewBox:ALCHEMY_GLYPH_VIEWBOX[icon],fill:"none",stroke:"currentColor",strokeWidth:"1.75",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",...props,children:ALCHEMY_GLYPH_PATHS[icon].map(d=>jsx7("path",{d},d))})}var CapabilityContext=React6.createContext({});function ContentTransferCapabilitiesProvider({value,children}){return jsx7(CapabilityContext.Provider,{value,children})}var useContentTransferCapabilities=()=>React6.useContext(CapabilityContext),PALETTE_HEADINGS=["Copy as","Download as","Quick copy","Copy for AI","Edit and prepare","Other sources","References","Save to Matrx","Continue with AI","Email to me"],DESTINATION_HEADING={save:"Save to Matrx",chat:"Continue with AI",email:"Email to me"};function PaletteRows({title,items,onRun,extra,ai=!1,glyphKind,fallbackHint}){return!items.length&&!extra?null:jsxs6("section",{className:"matrx-alchemy-palette-section",children:[jsx7("h3",{children:title}),items.map(item=>{let label=item.copyLabel??item.label,hint=item.hint??fallbackHint;return jsxs6("button",{type:"button",className:cn3("matrx-alchemy-palette-row",ai&&"matrx-alchemy-palette-row-ai"),"aria-label":item.ariaLabel??`${label}${hint?` ${hint}`:""}`,onClick:()=>onRun?.(item),children:[item.icon?jsx7(item.icon,{className:"matrx-alchemy-menu-icon"}):jsx7(PaletteGlyph,{ai,...glyphKind?{kind:glyphKind}:{}}),jsxs6("span",{children:[label,hint?jsx7("small",{className:"matrx-alchemy-menu-hint",children:hint}):null]})]},item.id)}),extra]})}var RICH_COPY_LABELS={markdown:"Copy as Markdown",text:"Copy content",formatted:"Copy formatted"};function ContentTransferMenu(props){let inherited=React6.useContext(CapabilityContext),identityKey=props.capabilities?.identityKey??inherited.identityKey;return jsx7(ContentTransferMenuSession,{...props},identityKey??"anonymous")}var shapeOf=material=>material&&!("kind"in material)&&!("instanceId"in material)?material.shape:void 0,shapePayload=shape=>shape.kind==="json"?{kind:"json",value:{}}:shape.kind==="markdown"?{kind:"markdown",text:""}:{kind:"text",text:"",...shape.language?{language:shape.language}:{}},NOTICE_MS=4e3,NOTICE_ERROR_MS=8e3;function ContentTransferMenuSession({references=[],referenceActions=[],source,surface,label,projection,sections,preferences,table,formatSources,sourceFormats=!0,variants=EMPTY_VARIANTS,actions=[],htmlPreview=!1,capabilities:local,disabled,enabled=!0,className,stopPropagation=!0,hide=[],controllerRef,icon="portal",triggerVariant="transparent",triggerSize="default",triggerHidden=!1,envelope:primaryEnvelope,richCopy,richCopyFlavors=["markdown","text","formatted"],copyWithPrompt}){let[promptFocus,setPromptFocus]=React6.useState(0),triggerRef=React6.useRef(null),restoreFocusRef=React6.useRef(null),inherited=React6.useContext(CapabilityContext),nearestSurface=useContentTransferSurface(),fence=useFence(),inspectionFence=useFence(),[copiedFormat,setCopiedFormat]=React6.useState(null),copiedTimer=React6.useRef(null),leaveTimer=React6.useRef(null),clipboardQueue=React6.useRef(Promise.resolve());React6.useEffect(()=>()=>{copiedTimer.current&&clearTimeout(copiedTimer.current),leaveTimer.current&&clearTimeout(leaveTimer.current)},[]);let confirmCopy=React6.useCallback(format=>{copiedTimer.current&&clearTimeout(copiedTimer.current),setCopiedFormat(format),copiedTimer.current=setTimeout(()=>setCopiedFormat(null),3e3)},[]),[menuCapture,setMenuCapture]=React6.useState(null),[menuStatus,setMenuStatus]=React6.useState("idle"),[workspaces,setWorkspaces]=React6.useState({}),[workspaceKey,setWorkspaceKey]=React6.useState(null),[workspaceOpen,setWorkspaceOpen]=React6.useState(!1),workspaceCaptures=React6.useRef(new Map),externalWorkspaceKeys=React6.useRef(new Set),[notice,setNotice]=React6.useState(null),[receiptTarget,setReceiptTarget]=React6.useState(),[paletteOpen,setPaletteOpen]=React6.useState(!1),[paletteTarget,setPaletteTarget]=React6.useState(null),externalPaletteClose=React6.useRef(null),externalPaletteRestoreFocus=React6.useRef(null),feedbackDocument=React6.useRef(null),[mode,setMode]=React6.useState("copy"),scopes=React6.useMemo(()=>table?.availableScopes??["target"],[table]),[requestedScope,setRequestedScope]=React6.useState(table?.initialScope??"target"),initialScope=scopes.includes(requestedScope)?requestedScope:table?.initialScope??"target";if(!scopes.includes(initialScope))throw new Error("Alchemy initialScope must be included in availableScopes.");let primary=surface??source??nearestSurface,sourceLabel=label??surface?.surfaceName??(source&&"label"in source?source.label:nearestSurface?.surfaceName)??"content",primaryWorkspaceBase=`primary:${materialIdentity(primary)}`,primaryWorkspaceKey=`${primaryWorkspaceBase}:${initialScope}`;React6.useEffect(()=>(setCopiedFormat(null),setNotice(null),copiedTimer.current&&clearTimeout(copiedTimer.current),fence.abortAll),[primaryWorkspaceBase,initialScope,fence.abortAll]);let nearestWorkspaceKey=source&&!surface&&nearestSurface?`surface:${materialIdentity(nearestSurface)}`:null,variantWorkspaceKeys=React6.useMemo(()=>new Map(variants.map(variant=>[variant.id,`variant:${variant.id}:${materialIdentity(variant.source)}`])),[variants]),baseTransport=local?.transport??inherited.transport??createBrowserTransport2(),transport={download:(artifact,signal)=>baseTransport.download(artifact,signal),copy:(artifact,signal)=>{let deliver=()=>signal.aborted?Promise.resolve({status:"cancelled"}):baseTransport.copy(artifact,signal),pending=clipboardQueue.current.then(deliver,deliver);return clipboardQueue.current=pending,pending}},ai=local?.ai??inherited.ai,referencePort=local?.reference??inherited.reference,{email:emailPort,review:emailReview}=useReviewedTransferEmail(local?.email??inherited.email),providerPreferences=React6.useMemo(()=>resolveTransferPreferences2(inherited.preferences,local?.preferences),[inherited.preferences,local?.preferences]),windowPort=local?.window??inherited.window,sessionId=React6.useId(),windowHandles=React6.useRef(new Map),sessionKeys=React6.useRef(new Set),[windowNodes,setWindowNodes]=React6.useState({}),slotRefs=React6.useRef(new Map),slotRef=key=>{let ref=slotRefs.current.get(key);return ref||(ref=node=>setWindowNodes(current=>{if(node)return current[key]===node?current:{...current,[key]:node};if(!(key in current))return current;let{[key]:_gone,...rest}=current;return rest}),slotRefs.current.set(key,ref)),ref},[duplicateFormats,setDuplicateFormats]=React6.useState(()=>new Set),adapters=React6.useMemo(()=>{let hostIds=new Set([...inherited.formats??[],...local?.formats??[]].map(format=>format.id));return resolveTransferRegistry(BUILT_INS.filter(builtIn=>!hostIds.has(builtIn.id)),inherited.formats??[],local?.formats??[]).filter(x=>"load"in x)},[inherited.formats,local?.formats]),emailJsonFormat=adapters.find(adapter=>adapter.id==="table-data"),emailActions=React6.useMemo(()=>emailPort?createTransferEmailActions(emailPort,emailJsonFormat?{jsonFormat:emailJsonFormat}:{}):[],[emailPort,emailJsonFormat]),htmlPreviewPort=local?.htmlPreview??inherited.htmlPreview,htmlPreviewActions=React6.useMemo(()=>htmlPreview&&htmlPreviewPort?[createTransferHtmlPreviewAction(htmlPreviewPort)]:[],[htmlPreview,htmlPreviewPort]),registeredActions=React6.useMemo(()=>resolveTransferRegistry(emailActions,htmlPreviewActions,inherited.actions??[],local?.actions??[],actions),[actions,emailActions,htmlPreviewActions,inherited.actions,local?.actions]);React6.useMemo(()=>resolveTransferRegistry(variants),[variants]);let noticeTimer=React6.useRef(null),noticeLife=React6.useRef(NOTICE_MS),clearNoticeTimer=React6.useCallback(()=>{noticeTimer.current&&clearTimeout(noticeTimer.current),noticeTimer.current=null},[]),startNoticeTimer=React6.useCallback(()=>{clearNoticeTimer(),noticeTimer.current=setTimeout(()=>setNotice(null),noticeLife.current)},[clearNoticeTimer]);React6.useEffect(()=>clearNoticeTimer,[clearNoticeTimer]);let report=React6.useCallback(result=>{inherited.onOutcome?.(result),local?.onOutcome?.(result),setReceiptTarget("target"in result?result.target:void 0);let delivered=result.status==="success"?result.delivered:void 0;if(result.status==="success"&&delivered==="clipboard"&&!("target"in result&&result.target)){clearNoticeTimer(),setNotice(null);return}noticeLife.current=result.status==="error"?NOTICE_ERROR_MS:NOTICE_MS,setNotice(outcomeMessage(result)),startNoticeTimer()},[inherited,local,clearNoticeTimer,startNoticeTimer]);React6.useEffect(()=>{let valid=new Set([...scopes.map(scope=>`${primaryWorkspaceBase}:${scope}`),...nearestWorkspaceKey?[nearestWorkspaceKey]:[],...variantWorkspaceKeys.values(),...externalWorkspaceKeys.current]);setWorkspaces(current=>Object.fromEntries(Object.entries(current).filter(([key])=>valid.has(key))));for(let key of workspaceCaptures.current.keys())valid.has(key)||workspaceCaptures.current.delete(key);workspaceKey&&!valid.has(workspaceKey)&&(setWorkspaceKey(null),setWorkspaceOpen(!1))},[nearestWorkspaceKey,primaryWorkspaceBase,scopes,variantWorkspaceKeys,workspaceKey]);let captureOne=React6.useCallback(async(material,scope,signal,applyMenuProjection=!1,collectPages=!0)=>{if(!material)throw new Error("Alchemy needs a source or a mounted transfer surface.");let sourceMaterial;if("instanceId"in material){if(!material.isMounted())throw new Error("The requested transfer surface is no longer mounted.");let captured=await material.capture(signal);sourceMaterial={id:captured.snapshot.sourceId,label:captured.snapshot.label,capture:async()=>captured}}else"kind"in material?sourceMaterial={id:materialIdentity(material),label:sourceLabel,capture:async()=>directSource3(material,{sourceId:materialIdentity(material),label:sourceLabel,...applyMenuProjection&&projection?{projection}:{},...applyMenuProjection&&sections?{sections}:{}})}:applyMenuProjection&&(projection||sections)?sourceMaterial={id:material.id,label:material.label,capture:async request=>{let captured=await material.capture(request);return{...captured,projection:{rules:[...captured.projection.rules,...projection?.rules??[]]},snapshot:{...captured.snapshot,...sections?{sections}:{}}}}}:sourceMaterial=material;let raw=await sourceMaterial.capture({scope,signal}),constrained=resolveTransferPreferences2(providerPreferences,preferences,raw.snapshot.limits),result=await capture2({id:raw.snapshot.sourceId,label:raw.snapshot.label,capture:async()=>({...raw,snapshot:{...raw.snapshot,limits:constrained.limits}})},signal,scope);if(scope!=="all-matching"||!collectPages)return result;if(!result.allMatching)throw new Error("This source cannot provide a stable all-matching export.");let collected=await collectAllMatching(result.allMatching,signal);if(result.snapshot.payload.kind!=="rows")throw new Error("All-matching export requires tabular content.");return{snapshot:projectSnapshot2({...result.snapshot,payload:{kind:"rows",rows:collected.rows,columns:result.snapshot.payload.columns},coverage:collected.coverage,omissions:[...collected.omissions]},{rules:[]}),allMatching:result.allMatching,...collected.error?{collectionError:collected.error.message}:{}}},[preferences,projection,providerPreferences,sections,sourceLabel]),capturePrimary=React6.useCallback((scope,signal)=>captureOne(primary,scope,signal,!0),[captureOne,primary]);workspaceCaptures.current.set(primaryWorkspaceKey,capturePrimary),nearestWorkspaceKey&&nearestSurface&&workspaceCaptures.current.set(nearestWorkspaceKey,(scope,signal)=>captureOne(nearestSurface,scope,signal,!0));for(let variant of variants){let key=variantWorkspaceKeys.get(variant.id);workspaceCaptures.current.set(key,(scope,signal)=>captureOne(variant.source,scope,signal,!0))}let runRich=React6.useCallback(async flavor=>{if(richCopy){copiedTimer.current&&clearTimeout(copiedTimer.current),setCopiedFormat(null),setNotice(null);try{let result=await richCopy(flavor);if(result===!1)return;result&&typeof result=="object"?(result.status==="success"&&confirmCopy(`rich-${flavor}`),report(result)):confirmCopy(`rich-${flavor}`)}catch(error){report({status:"error",code:"prepare-failed",message:errorMessage(error,"Copy failed"),retryable:!0})}}},[confirmCopy,report,richCopy]),preflight=React6.useCallback(async(scope=initialScope)=>{let{controller,id}=inspectionFence.begin();setMenuCapture(null),setMenuStatus("loading");try{let probe=primary??formatSources?.plain??formatSources?.markdown??formatSources?.json??null,shape=shapeOf(probe),result=await captureOne(shape?shapePayload(shape):probe,scope,controller.signal,!0,!1);inspectionFence.valid(id,controller)&&(setMenuCapture(result),setMenuStatus("idle"));let explicit=COPIES.filter(format=>formatSources?.[format]),duplicates=new Set,comparable=explicit.every(format=>{let declared=shapeOf(formatSources[format]);return!declared||declared.cheap===!0});if(explicit.length>1&&comparable){let seen=new Set;for(let format of explicit)try{let captured=await captureOne(formatSources[format],scope,controller.signal,!0,!1),artifact=await buildFormat(createDraft3(captured.snapshot),format,captured.snapshot.label,adapters,controller.signal),signature=`${artifact.plainText}\0${artifact.html??""}`;seen.has(signature)?(duplicates.add(format),inspectionFence.valid(id,controller)&&setDuplicateFormats(new Set(duplicates))):seen.add(signature)}catch{}}inspectionFence.valid(id,controller)&&setDuplicateFormats(duplicates)}catch(error){inspectionFence.valid(id,controller)&&(setMenuCapture(null),setMenuStatus(errorMessage(error,"Could not inspect content")))}finally{inspectionFence.finish(controller)}},[adapters,captureOne,inspectionFence,formatSources,initialScope,primary]),closePalette=React6.useCallback(()=>{leaveTimer.current&&clearTimeout(leaveTimer.current),leaveTimer.current=null;let onClose=externalPaletteClose.current,restoreFocus=externalPaletteRestoreFocus.current;externalPaletteClose.current=null,externalPaletteRestoreFocus.current=null,onClose?.(),restoreFocus?.(),setPaletteTarget(null),setPaletteOpen(!1)},[]),mountPalette=React6.useCallback((target,onClose,restoreFocus)=>{if(!target){externalPaletteClose.current=null,externalPaletteRestoreFocus.current=null,setPaletteTarget(null),setPaletteOpen(!1);return}if(!enabled)throw new Error("Alchemy is not enabled for this record.");if(disabled)throw new Error("Alchemy is disabled for this record.");externalPaletteClose.current=onClose??null,externalPaletteRestoreFocus.current=restoreFocus??null,feedbackDocument.current=target.ownerDocument,restoreFocusRef.current=restoreFocus??(()=>target.focus()),setPaletteTarget(target),setPaletteOpen(!0),setMode("copy"),preflight()},[closePalette,disabled,enabled,preflight]);React6.useEffect(()=>{if(!paletteTarget||!paletteOpen)return;paletteTarget.querySelector("button:not([disabled]), select:not([disabled]), input:not([disabled]), textarea:not([disabled]), [href]")?.focus()},[paletteOpen,paletteTarget]);let transfer=React6.useCallback(async(format,download,alternate)=>{fence.abortAll();let{controller,id}=fence.begin();copiedTimer.current&&clearTimeout(copiedTimer.current),setCopiedFormat(null),setNotice(null);try{let explicit=alternate?.source??(format==="default"?formatSources?.plain??(primary?void 0:formatSources?.markdown??formatSources?.json):typeof format=="string"&&format!=="xlsx"?formatSources?.[format]:void 0),result=await(explicit?captureOne(explicit,initialScope,controller.signal,!0):capturePrimary(initialScope,controller.signal));if(result.collectionError)throw new Error(`The complete source could not be collected: ${result.collectionError}`);if(result.snapshot.coverage.status!=="complete"||result.snapshot.omissions.length>0){let reason=result.snapshot.coverage.reason??`${result.snapshot.omissions.length} omission${result.snapshot.omissions.length===1?"":"s"}`;throw new Error(`Quick transfer is partial (${reason}). Open Prepare for AI to review it before delivery.`)}let resolved=resolveTransferPreferences2(providerPreferences,preferences,result.snapshot.limits),draft=applyTransferLimits2(createDraft3(result.snapshot),resolved.limits),revision=draft.revision;if(draft.omissions.length>result.snapshot.omissions.length)throw new Error("Quick transfer requires content reductions. Open Prepare for AI to review them before delivery.");let defaultFormat=formatSources?.plain?"plain":result.snapshot.payload.kind==="markdown"?"markdown":["json","registered","rows"].includes(result.snapshot.payload.kind)?"json":"plain",deliveryFormat=format==="default"?defaultFormat:format;if(format==="default"&&!formatSources?.[defaultFormat]&&!offersFormat(defaultFormat,result.snapshot.payload,adapters))return;let artifact=typeof deliveryFormat=="string"?await buildFormat(draft,deliveryFormat,result.snapshot.label,adapters,controller.signal):await buildWithAdapter(deliveryFormat,draft,controller.signal);if(artifact.omissions.length>draft.omissions.length)throw new Error(`Quick format requires ${artifact.omissions.length-draft.omissions.length} adjustment${artifact.omissions.length-draft.omissions.length===1?"":"s"}. Open Prepare for AI to review before delivery.`);if(!fence.valid(id,controller)||artifact.snapshotId!==result.snapshot.id||artifact.draftRevision!==revision)return;let outcome=await transport[download?"download":"copy"](artifact,controller.signal);fence.valid(id,controller)&&(!download&&outcome.status==="success"&&outcome.delivered==="clipboard"?confirmCopy(alternate?.id??(typeof deliveryFormat=="string"?deliveryFormat:deliveryFormat.id)):!download&&outcome.status==="degraded"&&outcome.delivered==="plain-text"&&confirmCopy("plain"),report(outcome.status==="success"&&alternate?.successMessage?{...outcome,message:alternate.successMessage}:outcome))}catch(error){fence.valid(id,controller)&&report({status:"error",code:"prepare-failed",message:errorMessage(error,"Preparation failed"),retryable:!0})}finally{fence.finish(controller)}},[adapters,captureOne,capturePrimary,confirmCopy,fence,formatSources,initialScope,preferences,primary,providerPreferences,report,transport]),openWorkspace=React6.useCallback(async(key=primaryWorkspaceKey,variant)=>{let variantMaterial=variant&&"kind"in variant.source?{id:`variant:${key}`,label:variant.label,capture:async()=>directSource3(variant.source,{sourceId:`variant:${key}`,label:variant.label})}:variant?.source,captureWorkspace=(scope,signal,collectPages=!0)=>captureOne(variantMaterial??primary,scope,signal,!0,collectPages);workspaceCaptures.current.set(key,captureWorkspace);let existing=workspaces[key],{controller,id}=fence.begin();if(existing){try{let scopeChanged=existing.scope!==initialScope,allMatching=initialScope==="all-matching",fresh=await captureWorkspace(initialScope,controller.signal,scopeChanged||!allMatching);if(!fence.valid(id,controller)||!workspaceCaptures.current.has(key))return;if(allMatching&&(!fresh.allMatching||!scopeChanged&&!existing.allMatching))throw new Error("This source can no longer provide an all-matching snapshot.");let collectionIdentity=value=>value&&{query:value.source.query,projection:value.projection,columns:value.columns,limits:value.limits},changed=scopeChanged||(allMatching?JSON.stringify(collectionIdentity(existing.allMatching))!==JSON.stringify(collectionIdentity(fresh.allMatching)):snapshotContent(existing.snapshot)!==snapshotContent(fresh.snapshot));setWorkspaces(current=>{let retained=current[key];return retained?{...current,[key]:{...retained,error:fresh.collectionError,...allMatching&&!scopeChanged?{sourceStale:changed}:changed?{pending:{...fresh,scope:initialScope}}:{pending:void 0}}}:current}),setWorkspaceKey(key),setWorkspaceOpen(!0)}catch(error){fence.valid(id,controller)&&workspaceCaptures.current.has(key)&&(setWorkspaces(current=>current[key]?{...current,[key]:{...current[key],error:errorMessage(error,"Could not refresh source")}}:current),setWorkspaceKey(key),setWorkspaceOpen(!0))}finally{fence.finish(controller)}return}try{let result=await captureWorkspace(initialScope,controller.signal);if(!fence.valid(id,controller))return;let resolved=resolveTransferPreferences2(providerPreferences,preferences,result.snapshot.limits),original=createDraft3(result.snapshot),envelope=variant?.envelope??(key===primaryWorkspaceKey?primaryEnvelope?.():void 0),base={...result,key,original,draft:original,scope:initialScope,preferences:resolved,...result.collectionError?{error:result.collectionError}:{},...envelope?{envelope}:{}};setWorkspaces(current=>({...current,[key]:{...base,draft:rebuild(base,initialControls(base))}})),setWorkspaceKey(key),setWorkspaceOpen(!0)}catch(error){fence.valid(id,controller)&&(setReceiptTarget(void 0),noticeLife.current=NOTICE_ERROR_MS,setNotice(errorMessage(error,"Could not capture content")),startNoticeTimer())}finally{fence.finish(controller)}},[captureOne,capturePrimary,fence,initialScope,preferences,primaryWorkspaceKey,primary,primaryEnvelope,providerPreferences,startNoticeTimer,workspaces]),prepareLevers=React6.useCallback(async(levers,options)=>{let key=`levers:${options.id}`;if(externalWorkspaceKeys.current.add(key),!workspaces[key]){let sourceId=`levers:${sessionId}:${options.id}`,built=null,buildError;try{built=levers.build(levers.initial)}catch(cause){buildError=errorMessage(cause,"This source could not be prepared with these options.")}let snapshot=leverSnapshot(built?.payload??{kind:"text",text:""},sourceId,options.label),original=createDraft3(snapshot),base={snapshot,key,original,draft:original,scope:initialScope,preferences:resolveTransferPreferences2(providerPreferences,preferences,snapshot.limits),levers,leverValues:levers.initial,...built?.meta?{leverMeta:built.meta}:{},...built?.sectionSizes?{leverSizes:built.sectionSizes}:{},...built?{envelope:built.envelope}:{},...buildError?{buildError}:{}};setWorkspaces(current=>({...current,[key]:{...base,draft:rebuild(base,initialControls(base))}}))}setWorkspaceKey(key),setWorkspaceOpen(!0)},[initialScope,preferences,providerPreferences,sessionId,workspaces]);React6.useImperativeHandle(controllerRef,()=>({focusTrigger:()=>triggerRef.current?.focus(),mountPalette,preparePrimary:async options=>{if(!enabled)throw new Error("Alchemy is not enabled for this record.");if(disabled)throw new Error("Alchemy is disabled for this record.");if(hide.includes("prepare"))throw new Error("Alchemy preparation is unavailable for this record.");if(!primary)throw new Error("Alchemy has no source to prepare.");restoreFocusRef.current=options?.restoreFocus??null,await openWorkspace(primaryWorkspaceKey,{source:primary,label:sourceLabel})},prepare:async(requestedSource,options)=>{let requestedLabel=options?.label??("label"in requestedSource?requestedSource.label:"content"),requestedKey=`controller:${options?.id??"source"}:${materialIdentity(requestedSource)}`;externalWorkspaceKeys.current.add(requestedKey),await openWorkspace(requestedKey,{source:requestedSource,label:requestedLabel,envelope:options?.envelope})},prepareLevers}),[disabled,enabled,hide,mountPalette,openWorkspace,prepareLevers,primary,primaryWorkspaceKey,sourceLabel]),React6.useEffect(()=>{if(!windowPort)return;let openKey=workspaceOpen?workspaceKey:null;for(let[key,handle2]of[...windowHandles.current])key!==openKey&&(windowHandles.current.delete(key),handle2.close());if(!openKey||windowHandles.current.has(openKey))return;let label2=workspaces[openKey]?.snapshot.label??sourceLabel,instanceId=`alchemy-prepare${sessionId}${openKey}`.replace(/[^A-Za-z0-9_-]+/g,"-");setWorkspaceSessionLive(instanceId,!0),sessionKeys.current.add(instanceId);let handle=windowPort.open(()=>jsx7(WorkspaceWindowSlot,{onNode:slotRef(openKey),sessionKey:instanceId,onClose:()=>handle.close()}),{title:`Prepare ${label2}`,size:"full",instanceId,onClose:()=>{windowHandles.current.get(openKey)===handle&&(windowHandles.current.delete(openKey),setWorkspaceOpen(!1))}});windowHandles.current.set(openKey,handle)},[windowPort,workspaceOpen,workspaceKey]),React6.useEffect(()=>()=>{for(let key of sessionKeys.current)setWorkspaceSessionLive(key,!1);sessionKeys.current.clear();let handles=[...windowHandles.current.values()];windowHandles.current.clear();for(let handle of handles)handle.close()},[]);let runAction=React6.useCallback(async action=>{let{controller,id}=fence.begin();try{let actionSource=action.source,{snapshot}=actionSource?await captureOne(actionSource,initialScope,controller.signal,!0):await capturePrimary(initialScope,controller.signal),resolved=resolveTransferPreferences2(providerPreferences,preferences,snapshot.limits),draft=applyTransferLimits2(createDraft3(snapshot),resolved.limits);if(snapshot.coverage.status!=="complete"||draft.omissions.length)throw new Error("This content is partial or requires reductions. Open Prepare for AI to review it before sending it to a destination.");if(!action.supports(snapshot,draft))throw new Error(`${action.label} is unavailable for this content.`);let result=await action.run({snapshot,draft,signal:controller.signal});fence.valid(id,controller)&&draft.snapshotId===snapshot.id&&report(result)}catch(error){fence.valid(id,controller)&&report({status:"error",code:"action-failed",message:errorMessage(error,"Action failed"),retryable:!0})}finally{fence.finish(controller)}},[captureOne,capturePrimary,fence,initialScope,preferences,providerPreferences,report]),copyReference=async reference=>{let{controller,id}=fence.begin();closePalette();try{if(!referencePort?.supports(reference))throw new Error("This reference is not registered or its identity is incomplete.");let text=await referencePort.build(reference);if(!text.trim())throw new Error("The reference serializer returned no content.");let artifact=sealTransferArtifact5({snapshotId:`reference:${reference.id}`,draftRevision:0,format:"matrx-reference",plainText:text,omissions:[]});if(!fence.valid(id,controller))return;let outcome=await transport.copy(artifact,controller.signal);fence.valid(id,controller)&&(outcome.status==="success"&&outcome.delivered==="clipboard"&&confirmCopy(`reference:${reference.id}`),report(outcome))}catch(error){fence.valid(id,controller)&&report({status:"error",code:"reference-failed",message:errorMessage(error,"Could not copy reference"),retryable:!0})}finally{fence.finish(controller)}},openReference=async action=>{closePalette();try{await action.run()}catch(error){report({status:"error",code:"reference-failed",message:errorMessage(error,"Could not open reference picker"),retryable:!0})}},cancelPointerClose=()=>{leaveTimer.current&&clearTimeout(leaveTimer.current),leaveTimer.current=null},schedulePointerClose=event=>{event.pointerType!=="mouse"||!paletteOpen||(cancelPointerClose(),leaveTimer.current=setTimeout(()=>closePalette(),200))},visibleActions=React6.useMemo(()=>{if(!menuCapture)return[];let draft=applyTransferLimits2(createDraft3(menuCapture.snapshot),resolveTransferPreferences2(providerPreferences,preferences,menuCapture.snapshot.limits).limits);return registeredActions.filter(a=>a.supports(menuCapture.snapshot,draft))},[menuCapture,preferences,providerPreferences,registeredActions]);if(!enabled)return null;let payload=menuCapture?.snapshot.payload??(source&&"kind"in source?source:void 0),quickVariants=section=>variants.filter(v=>v.copyLabel&&(v.section??"ai")===section),visibleCopies=sourceFormats?COPIES.filter(f=>!duplicateFormats.has(f)&&(!!formatSources?.[f]||(payload?offersFormat(f,payload,adapters):!["csv","tsv"].includes(f)))):[],visibleDownloads=sourceFormats?DOWNLOADS.filter(f=>!duplicateFormats.has(f)&&(f!=="xlsx"&&!!formatSources?.[f]||(payload?offersFormat(f,payload,adapters):!["csv","tsv","xlsx"].includes(f)))):[],visibleAdapters=sourceFormats&&menuCapture?adapters.filter(a=>!isBuiltInFormat(a.id)&&a.supports(menuCapture.snapshot.payload)):[],downloadActions=visibleActions.filter(action=>action.placement==="download"),prepareActions=visibleActions.filter(action=>action.placement==="prepare"),ordinaryActions=visibleActions.filter(action=>action.placement===void 0),preparedActions=registeredActions.filter(action=>action.prepared&&!action.source),copyAvailable=!hide.includes("copy")&&(!!richCopy||visibleCopies.length+visibleAdapters.length+quickVariants("copy").length>0),downloadAvailable=!hide.includes("download")&&visibleDownloads.length+visibleAdapters.length+downloadActions.length>0,prepareAvailable=!hide.includes("prepare")&&(quickVariants("ai").length>0||!!primary||!!nearestWorkspaceKey||variants.length>0||prepareActions.length>0),resolvedMode=mode==="copy"&&!copyAvailable?"download":mode==="download"&&!downloadAvailable?"copy":mode,nativeAiFormat={id:"ai-context",label:"AI context",extension:"txt",mime:"text/plain;charset=utf-8",modes:["copy","download"],runsOn:"client",supports:()=>!0,load:async()=>({build:async draft=>{let envelope=primaryEnvelope?.()??{kind:"matrx_content",location:sourceLabel,description:"Captured content for an assistant",attributes:{source:draft.sourceId}};if(draft.payload.kind==="text"||draft.payload.kind==="markdown"){let text=serialize5(draft,draft.payload.kind==="markdown"?"markdown":"plain");return sealTransferArtifact5({snapshotId:draft.snapshotId,draftRevision:draft.revision,format:"ai-context",plainText:buildAgentPayload2({...envelope,data:text.plainText,dataFormat:draft.payload.kind==="markdown"?"markdown":"text"}),omissions:[...text.omissions]})}let json=serialize5(draft,"json");return sealTransferArtifact5({snapshotId:draft.snapshotId,draftRevision:draft.revision,format:"ai-context",plainText:buildAgentPayload2({...envelope,data:JSON.parse(json.plainText)}),omissions:[...json.omissions]})}})},copyFirst=sourceFormats&&!hide.includes("copy")&&!!(richCopy||primary||formatSources?.plain||formatSources?.markdown||formatSources?.json),copiedGlyph=jsx7("svg",{className:"matrx-alchemy-copied-check",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2","aria-hidden":"true",children:jsx7("path",{d:"m5 12 4 4L19 6"})}),triggerGlyph=copiedFormat?copiedGlyph:jsx7(AlchemyGlyph,{icon}),tile=(id,label2,onClick,options={})=>{let presentation=options.action,Icon=presentation?.icon,fallbackLabel=options.file&&!/^download\b/i.test(label2)?`Download ${label2}`:label2;return jsxs6("button",{type:"button",className:"matrx-alchemy-palette-tile","data-copied":resolvedMode==="copy"&&copiedFormat===id?"true":void 0,title:id==="table-data"?"JSON using column display names":id==="table-schema"?"Table schema and rows":label2,"aria-label":presentation?.ariaLabel??(presentation?fallbackLabel:options.ariaLabel??`${resolvedMode==="copy"?"Copy":"Download"} ${label2}`),onClick:()=>{closePalette(),onClick()},children:[resolvedMode==="copy"&&copiedFormat===id?copiedGlyph:Icon?jsx7(Icon,{className:"matrx-alchemy-menu-icon"}):jsx7(PaletteGlyph,{format:id,ai:!!options.ai,file:options.file||!!(options.custom&&id!=="table-data"&&id!=="table-schema")}),jsxs6("span",{children:[label2,resolvedMode==="copy"&&copiedFormat===id?jsx7("small",{className:"matrx-alchemy-copied-label",children:"Copied to clipboard"}):null,presentation?.hint?jsx7("small",{className:"matrx-alchemy-menu-hint",children:presentation.hint}):null]})]},id)},palette=jsxs6(Fragment4,{children:[menuStatus==="loading"?jsx7("p",{className:"matrx-alchemy-palette-status",children:"Inspecting content\u2026"}):menuStatus!=="idle"?jsx7("p",{className:"matrx-alchemy-error",children:menuStatus}):null,table&&scopes.length>1?jsxs6("label",{className:"matrx-alchemy-scope",children:["Content scope",jsx7("select",{"aria-label":"Content scope",value:initialScope,onChange:event=>{let next=scopes.find(scope=>scope===event.target.value);next&&(setRequestedScope(next),preflight(next))},children:scopes.map(scope=>jsx7("option",{value:scope,children:table.scopeLabels?.[scope]??SCOPE_LABEL[scope]},scope))})]}):null,copyAvailable||downloadAvailable?jsxs6("section",{className:"matrx-alchemy-output",children:[jsx7("h3",{children:resolvedMode==="copy"?"Copy as":"Download as"}),copyAvailable&&downloadAvailable?jsxs6("div",{className:"matrx-alchemy-mode","aria-label":"Output action",children:[jsx7("button",{type:"button","aria-label":"Copy mode","aria-pressed":resolvedMode==="copy",onClick:()=>setMode("copy"),children:"Copy"}),jsx7("button",{type:"button","aria-label":"Download mode","aria-pressed":resolvedMode==="download",onClick:()=>setMode("download"),children:"Download"})]}):null,resolvedMode==="copy"&&copyAvailable?jsxs6(Fragment4,{children:[jsxs6("div",{className:"matrx-alchemy-palette-grid",children:[richCopy?jsx7(Fragment4,{children:["markdown","text","formatted"].filter(flavor=>richCopyFlavors.includes(flavor)).map(flavor=>tile(`rich-${flavor}`,RICH_COPY_LABELS[flavor],()=>{runRich(flavor)},{ariaLabel:RICH_COPY_LABELS[flavor]}))}):null,visibleCopies.filter(format=>!richCopy||format!=="plain"&&format!=="markdown"&&!(format==="html"&&richCopyFlavors.includes("formatted"))&&(!["json","compact-json"].includes(format)||!!formatSources?.[format])).map(format=>tile(format,{plain:"Text",markdown:"Markdown",html:"Formatted",json:"JSON","compact-json":"Compact",csv:"CSV",tsv:"Sheets"}[format],()=>{transfer(format,!1)},{ariaLabel:`Copy ${LABEL[format]}`})),visibleAdapters.map(adapter=>tile(adapter.id,adapter.label,()=>{transfer(adapter,!1)},{custom:!0}))]}),quickVariants("copy").length?jsx7(PaletteRows,{title:"Quick copy",items:quickVariants("copy"),onRun:variant=>{closePalette(),transfer("markdown",!1,variant)}}):null]}):null,resolvedMode==="download"&&downloadAvailable?jsx7(Fragment4,{children:jsxs6("div",{className:"matrx-alchemy-palette-grid",children:[visibleDownloads.map(format=>tile(format,{plain:"Text",markdown:"Markdown",html:"Formatted",json:"JSON","compact-json":"Compact",csv:"CSV",tsv:"Sheets",xlsx:"Excel"}[format],()=>{transfer(format,!0)},{ariaLabel:`Download ${LABEL[format]}`})),visibleAdapters.map(adapter=>tile(adapter.id,adapter.label,()=>{transfer(adapter,!0)},{custom:!0})),downloadActions.map(action=>tile(action.id,action.label,()=>{runAction(action)},{custom:!0,action,file:!0}))]})}):null]}):null,prepareAvailable?jsxs6(Fragment4,{children:[jsx7(PaletteRows,{title:"Copy for AI",ai:!0,glyphKind:"ai-copy",fallbackHint:"Copies immediately",extra:jsxs6(Fragment4,{children:[sourceFormats?jsxs6("button",{type:"button",className:"matrx-alchemy-palette-row",onClick:()=>{closePalette(),transfer(nativeAiFormat,!1)},children:[jsx7(PaletteGlyph,{kind:"ai-copy"}),jsxs6("span",{children:["Copy with AI context",jsx7("small",{className:"matrx-alchemy-menu-hint",children:"Include source context"})]})]}):null,copyWithPrompt||primary?jsxs6("button",{type:"button",className:"matrx-alchemy-palette-row","aria-label":"Copy with prompt",onClick:()=>{closePalette(),(copyWithPrompt?copyWithPrompt():openWorkspace()).then(()=>setPromptFocus(n=>n+1))},children:[jsx7(PaletteGlyph,{kind:"ai-copy"}),jsxs6("span",{children:["Copy with prompt\u2026",jsx7("small",{className:"matrx-alchemy-menu-hint",children:"Add your instructions"})]})]}):null]}),items:quickVariants("ai"),onRun:variant=>{closePalette(),transfer("markdown",!1,variant)}}),jsx7(PaletteRows,{title:"Edit and prepare",items:[],extra:jsxs6(Fragment4,{children:[prepareActions.map(action=>{let presentation=action;return jsxs6("button",{type:"button",className:"matrx-alchemy-palette-row","aria-label":presentation.ariaLabel??`${action.label}${presentation.hint?` ${presentation.hint}`:""}`,onClick:()=>{closePalette(),runAction(action)},children:[jsx7(PaletteGlyph,{kind:"sliders"}),jsxs6("span",{children:[action.label,"\u2026",presentation.hint?jsx7("small",{className:"matrx-alchemy-menu-hint",children:presentation.hint}):null]})]},action.id)}),table?jsxs6("button",{type:"button",className:"matrx-alchemy-palette-row","aria-label":"Filter & sort before copying",onClick:()=>{closePalette(),openWorkspace()},children:[jsx7(PaletteGlyph,{kind:"sliders"}),jsxs6("span",{children:["Filter & sort before copying\u2026",jsx7("small",{className:"matrx-alchemy-menu-hint",children:table.size?`${table.size} \xB7 search, filter, sort, pick rows`:"Search, filter, sort, pick rows"})]})]}):null,jsxs6("button",{type:"button",className:"matrx-alchemy-palette-row","aria-label":"Prepare for AI",onClick:()=>{closePalette(),openWorkspace()},children:[jsx7(PaletteGlyph,{kind:"sliders"}),jsxs6("span",{children:["Prepare for AI",jsx7("small",{className:"matrx-alchemy-menu-hint",children:"Trim, edit or summarize"})]})]})]})})]}):null,prepareAvailable&&(nearestWorkspaceKey||variants.length)?jsx7(PaletteRows,{title:"Other sources",items:[],extra:jsxs6(Fragment4,{children:[nearestWorkspaceKey&&nearestSurface?jsxs6("button",{type:"button",className:"matrx-alchemy-palette-row",onClick:()=>{closePalette(),openWorkspace(nearestWorkspaceKey,{source:nearestSurface,label:nearestSurface.surfaceName})},children:[jsx7(PaletteGlyph,{kind:"surface"}),jsx7("span",{children:"Prepare this page"})]}):null,variants.map(variant=>jsx7("button",{type:"button",className:"matrx-alchemy-palette-row","aria-label":variant.ariaLabel,onClick:()=>{closePalette(),openWorkspace(variantWorkspaceKeys.get(variant.id),variant)},children:jsx7(MenuPresentation,{...variant,label:`Prepare ${variant.label}`})},variant.id))]})}):null,references.length||referenceActions.length?jsxs6("section",{className:"matrx-alchemy-palette-section",children:[jsx7("h3",{children:"References"}),referenceActions.map(action=>jsxs6("button",{type:"button",className:"matrx-alchemy-palette-row",onClick:()=>{openReference(action)},children:[jsx7(PaletteGlyph,{kind:"link"}),jsx7("span",{children:action.label}),jsx7("svg",{className:"matrx-alchemy-disclosure",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.5","aria-hidden":"true",children:jsx7("path",{d:"m6 4 4 4-4 4"})})]},action.id)),references.map(reference=>jsxs6("button",{type:"button",className:"matrx-alchemy-palette-row",title:"Copies a reference to saved data",onClick:()=>{copyReference(reference)},children:[jsx7(PaletteGlyph,{kind:"link"}),jsx7("span",{children:reference.label})]},reference.id))]}):null,["save","chat","email"].map(group=>{let entries=ordinaryActions.filter(action=>action.group===group);return entries.length?jsxs6("details",{className:"matrx-alchemy-palette-destinations",children:[jsxs6("summary",{children:[DESTINATION_HEADING[group],jsxs6("span",{className:"matrx-alchemy-disclosure-meta",children:[jsx7("span",{children:entries.length}),jsx7("svg",{className:"matrx-alchemy-disclosure",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.5","aria-hidden":"true",children:jsx7("path",{d:"m6 4 4 4-4 4"})})]})]}),jsx7("div",{children:entries.map(action=>jsx7("button",{type:"button",className:"matrx-alchemy-palette-row","aria-label":action.ariaLabel,onClick:()=>{closePalette(),runAction(action)},children:jsx7(DestinationPresentation,{action})},action.id))})]},group):null}),ordinaryActions.some(action=>!action.group)?jsx7("section",{className:"matrx-alchemy-palette-section","data-alchemy-inline-actions":"",children:ordinaryActions.filter(action=>!action.group).map(action=>jsx7("button",{type:"button",className:"matrx-alchemy-palette-row","aria-label":action.ariaLabel,onClick:()=>{closePalette(),runAction(action)},children:jsx7(DestinationPresentation,{action})},action.id))}):null]}),feedbackOwner=paletteTarget??triggerRef.current??feedbackDocument.current?.body??null;return jsxs6("span",{className:cn3("matrx-alchemy",className),onPointerEnter:cancelPointerClose,onPointerLeave:schedulePointerClose,onClick:stopPropagation?event=>event.stopPropagation():void 0,children:[!triggerHidden&&!paletteTarget?jsxs6(Popover,{open:paletteOpen,onOpenChange:open=>{open?(setPaletteOpen(!0),setMode("copy"),preflight(),copyFirst&&(richCopy?runRich("default"):transfer("default",!1))):(cancelPointerClose(),closePalette())},children:[jsx7(PopoverTrigger,{asChild:!0,children:triggerVariant==="outline"?jsx7(Button3,{ref:triggerRef,variant:"outline",size:"icon-sm","aria-label":`Copy, transform or export ${sourceLabel}`,"data-alchemy-trigger":"outline","data-copied":copiedFormat?"true":void 0,"aria-description":copiedFormat?"Copied to clipboard":void 0,disabled,children:triggerGlyph}):triggerVariant==="glass"?jsx7(TapTargetButton,{ref:triggerRef,icon:triggerGlyph,tooltip:!1,ariaLabel:`Copy, transform or export ${sourceLabel}`,"data-alchemy-trigger":"glass","data-alchemy-size":triggerSize,"data-copied":copiedFormat?"true":void 0,"aria-description":copiedFormat?"Copied to clipboard":void 0,disabled}):jsx7(TapTargetButtonTransparent,{ref:triggerRef,icon:triggerGlyph,tooltip:!1,ariaLabel:`Copy, transform or export ${sourceLabel}`,"data-alchemy-trigger":"transparent","data-alchemy-size":triggerSize,"data-copied":copiedFormat?"true":void 0,"aria-description":copiedFormat?"Copied to clipboard":void 0,disabled})}),jsx7(PopoverContent,{align:"end",className:"matrx-alchemy-menu matrx-alchemy-palette","aria-label":"Alchemy output options",onPointerEnter:cancelPointerClose,onPointerLeave:schedulePointerClose,onCloseAutoFocus:()=>triggerRef.current?.focus(),children:palette})]}):null,paletteTarget&&paletteOpen?createPortal2(jsx7("div",{className:"matrx-alchemy-menu matrx-alchemy-palette",role:"dialog","aria-label":"Alchemy output options",children:palette}),paletteTarget):null,notice&&feedbackOwner?createPortal2(jsxs6("div",{className:"matrx-alchemy-feedback",onPointerEnter:clearNoticeTimer,onPointerLeave:startNoticeTimer,children:[jsx7("span",{role:"status",children:notice}),jsx7(ReceiptLink,{target:receiptTarget}),jsx7("button",{type:"button","aria-label":"Dismiss Alchemy feedback",onClick:()=>setNotice(null),children:"\xD7"})]}),feedbackOwner.ownerDocument.body):null,Object.values(workspaces).map(saved=>jsx7(PreparationWorkspace,{promptFocus:workspaceKey===saved.key?promptFocus:0,restoreFocus:()=>restoreFocusRef.current?.()??triggerRef.current?.focus(),frame:windowPort?"host":"dialog",windowNode:windowNodes[saved.key]??null,open:workspaceOpen&&workspaceKey===saved.key,state:saved,scopes,scopeLabels:table?.scopeLabels,onClose:()=>setWorkspaceOpen(!1),onChange:next=>setWorkspaces(current=>({...current,[saved.key]:next})),transport,adapters,actions:preparedActions,captureScope:workspaceCaptures.current.get(saved.key)??capturePrimary,...ai?{ai}:{},onOutcome:report},saved.key)),emailReview]})}export{ALCHEMY_COPY_TRANSFORM_SVG,ALCHEMY_GLYPH_SVG,AlchemyGlyph,AlchemyTableCopyControls,ContentTransferCapabilitiesProvider,ContentTransferMenu,ContentTransferSurfaceProvider,GROOMER_LEVELS,MatrxCopyMenu,NOTICE_ERROR_MS,NOTICE_MS,PALETTE_HEADINGS,RICH_COPY_LABELS,applyGroomerPreset,buildGroomerPresetPayload,createTransferEmailActions,createTransferHtmlPreviewAction,defaultGroomerSelections,groomerPresetVariants,tableDataFormat,tableSchemaFormat,useContentTransferCapabilities,useContentTransferSurface2 as useContentTransferSurface};
7
7
  //# sourceMappingURL=react-workspace.js.map