diff --git a/README.md b/README.md index 07d19d5..de00785 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,8 @@ - GFM 表格:输入完整表头与分隔行后按 Enter、粘贴 Markdown 表格,或输入 `|3x3| ` 建立三列三行表格。顶部“表格与行列操作”提供增删行列、列对齐、删表和退出;表格内 Tab / Shift+Tab 导航,Ctrl+Enter 退出。 - Markdown 及富文本粘贴、统一撤销/重做;格式按钮和快捷键调用同一编辑内核命令。 +本轮块拖动、上下文菜单、完整斜杠菜单与紧凑查找栏的调整、验证范围和效果图见[编辑器交互复查](docs/editor-interaction-review.md)。 + 正文工具已补齐:`/` 双语过滤与键盘选择、块拖动/移动/复制/多选、大纲与标题折叠、`[toc]` 实时目录、查找替换与字数统计、图片/附件导入与可恢复清理、图片显示宽度、代码语言/高亮/复制、离线 Mermaid、KaTeX 行内/块公式、脚注、英文拼写检查,以及独立 HTML / PDF 导出与 PDF 打印预览。工具入口为格式栏“正文编辑与导出”;Ctrl+H 打开替换。公式可通过工具菜单或 `/` 插入,双击公式编辑。图片/表格宽度保存在应用偏好中,不扩展 Markdown 语法。折叠仅影响编辑视图,导出会展开全文。附件清理先等待正文保存,再检查磁盘引用,移入专用回收区,可恢复。 `web/editor/editor.js` 负责上游插件配置与命令适配;`qml/SourceEditor.qml` 通过 WebChannel 传递主题、焦点与工作区位置;`src/EditorSessionWeb.cpp` 缓存已提交 Markdown,并按文档代次和递增序号拒绝过期消息。现有 `EditorSession::execute/link/undo/redo` 和 controller 存储接口保留。切换笔记、切库和关闭前先向编辑区取得最新已提交状态;自动保存回包不重建编辑器或撤销栈。 diff --git a/docs/editor-interaction-review.md b/docs/editor-interaction-review.md new file mode 100644 index 0000000..742ddc5 --- /dev/null +++ b/docs/editor-interaction-review.md @@ -0,0 +1,57 @@ +# 编辑器交互调整(2026-11-11) + +目标是让正文保持安静,辅助操作在需要时可发现,并让操作反馈与实际结果一致。 + +## 本次调整 + +- 块拖动的插入线标记实际块边界,预览与松开使用同一个落点计算;折叠内容不成为不可见落点。靠近编辑区边缘停住鼠标时持续滚动,Escape、越界松开和失去编辑条件会取消拖动。 +- 右键菜单按本次点击的位置确定目标,不沿用上次悬停的块。不能上移、下移、转换或粘贴时,对应操作禁用;代码、公式和图片操作按目标内容显示。 +- `/` 菜单保留紧凑高度并提供完整 16 项插入入口;支持方向键访问后面的项目。取消只影响当前输入位置和查询;无匹配时保留普通编辑按键。列表内的 `/` 作为正文输入,退出列表后恢复插入菜单。 +- 正文查找默认只显示一行,需要时展开替换。导航和关闭采用紧凑图标,Escape 关闭查找;重新打开或切换笔记后恢复已有查询。 +- 任务框使用固定尺寸的边框与独立勾选标记,避免字体字符导致勾选前后尺寸、位置变化。 + +## 效果图 + +以下均为 VM 中实际应用窗口的截图,笔记内容为合成数据。 + +![正文与紧凑工具栏](../screenshots/editor-interaction-2026-11-11/body.png) + +正文查找默认一行;替换入口在需要时展开。输入 `01` 并点击下一个匹配后,计数为 `1/1`,正文选中对应文字。 + +![单行正文查找与匹配导航](../screenshots/editor-interaction-2026-11-11/find-query.png) + +展开替换后增加一行,正文区域随之下移;空查询时替换按钮禁用。 + +![按需展开替换](../screenshots/editor-interaction-2026-11-11/replace-native.png) + +输入 `01` 后,正文中的单处匹配高亮,匹配导航与替换动作启用。 + +![正文查询与匹配高亮](../screenshots/editor-interaction-2026-11-11/replace-query.png) + +块菜单中,首块的“上移块”和尚无块剪贴板内容时的“粘贴块”禁用;普通段落不提供代码语言等专用操作。 + +![按当前块启用操作](../screenshots/editor-interaction-2026-11-11/block-menu.png) + +复制后重开菜单,“粘贴块”随之启用。 + +![复制后的块菜单](../screenshots/editor-interaction-2026-11-11/copy-menu-after.png) + +## 验证 + +构建、测试、原生交互和截图均限定在 `kos-vm-dev`;使用独立设置和可丢弃的合成笔记。 + +网页 bundle 已在 VM 重新构建并回传,SHA-256 为 `b76af6b3adb816ccd930cdeb78b50c2b0015cb6c09e7878d07d1410b2a0af3a1`。块手柄状态回归和六项真实编辑器集成检查已通过,覆盖右键目标、落点预览与撤销、折叠落点、16 项斜杠菜单键盘访问、取消状态与无结果查询。集成检查中的拖动通过工具动作验证;原始输出、失败记录及 VM 源码指纹见[验证记录](../output/editor-interaction-2026-11-11/README.md)。 + +原生操作已确认:第四段拖到第二段之前、再连续拖回末尾,移动后手柄仍跟随原块;在编辑区外松手不改变内容。长文底部保持鼠标不动时,滚动位置连续从 `176` 增至 `432`、`624`。Escape 独立取消检查通过,但连续移动后再次拖动的取消出现失败,因此不计为全场景通过;最终源码让拖动手柄取得键盘焦点并直接处理 Escape,保持取消后松手不提交的门控,此修复待运行复验。 + +原生查找已完成打开、输入 `01`、导航到 `1/1` 和展开/收起替换,截图均经查看。复制块后立即重开同一手柄菜单,“粘贴块”启用。 + +斜杠菜单的编辑器状态可以选到第 16 项 `toc`,但 VM 的原生弹层仍停留在顶部并高亮“正文”。最终源码改为在打开菜单、条目增删完成后同步最新选择,并将该行滚入视野;该修复已完成源码复核,尚未运行。下图记录的是修复前失败,不能作为末项可见的通过证据。 + +![修复前:编辑器索引与弹层不同步](../screenshots/editor-interaction-2026-11-11/slash-settled.png) + +Advanced 原始回归因测试断言将整个文档的 `/\n` 与当前段落的 `/` 比较而失败;断言已修正。VM 临时副本增加 CDP 请求超时后顺序重跑,前九组通过,包括三种列表、任务框几何、块操作撤销、折叠/目录、查找替换、公式、脚注及 Mermaid。随后剪贴板图片导入等待超时,未执行后续表格宽度和最终元数据/schema 检查,因此完整套件未通过。原始失败、最终重跑输出及使用的临时驱动均保留。 + +最新 `Main.qml`、`SourceEditor.qml` 的跨文档查询恢复,以及 `EditorTools.qml` 的连续拖动 Escape 与斜杠菜单同步修复,均已完成源码复核。自动审批阻止向 VM 传入最新源码,因此这些修复没有运行验收。`source-hashes.json` 记录的是实际运行快照,不能当作最终提交的完整指纹。 + +PR 的三次 [Flatpak CI](https://github.com/NextKde/NkNotes/actions/runs/43035039939) 因 Ubuntu 软件源 DNS 解析失败,在依赖准备阶段满 60 分钟超时,未进入应用编译;日志和关联运行已保存在验证记录中。PR 暂不合入 `main`,待上述原生修复复验及最终源码构建完成。 diff --git a/output/editor-interaction-2026-11-11/AdvancedEditorRegression.safe-cdp.mjs b/output/editor-interaction-2026-11-11/AdvancedEditorRegression.safe-cdp.mjs new file mode 100644 index 0000000..7b02582 --- /dev/null +++ b/output/editor-interaction-2026-11-11/AdvancedEditorRegression.safe-cdp.mjs @@ -0,0 +1,84 @@ +// Manual VM-only integration test. This replaces the active disposable fixture. +import assert from 'node:assert/strict'; +import fs from 'node:fs'; +const endpoint=process.env.NEXTNOTES_CDP_URL||'http://127.0.0.1:9226'; +const fixture=process.env.NEXTNOTES_TEST_FILE; +assert.ok(fixture,'Provide NEXTNOTES_TEST_FILE for the disposable note open in the VM.'); +const target=(await (await fetch(endpoint+'/json/list')).json()).find(x=>x.url==='qrc:/editor/index.html'); +const ws=new WebSocket(target.webSocketDebuggerUrl);await new Promise((resolve,reject)=>{ws.onopen=resolve;ws.onerror=reject;}); +let sequence=0;const requests=new Map(),results=[]; +ws.onmessage=event=>{const response=JSON.parse(event.data),request=requests.get(response.id);if(request){requests.delete(response.id);response.error?request.reject(response.error):request.resolve(response.result);}}; +const call=(method,params={})=>new Promise((resolve,reject)=>{const id=++sequence;const timer=setTimeout(()=>{requests.delete(id);reject(Error('CDP timeout '+method+' '+JSON.stringify(params)))},8000);requests.set(id,{resolve:value=>{clearTimeout(timer);resolve(value)},reject:error=>{clearTimeout(timer);reject(error)}});ws.send(JSON.stringify({id,method,params}));}); +const run=async expression=>{const response=await call('Runtime.evaluate',{expression,awaitPromise:true,returnByValue:true});if(response.exceptionDetails)throw Error(JSON.stringify(response.exceptionDetails));return response.result.value;}; +const wait=ms=>new Promise(resolve=>setTimeout(resolve,ms)); +async function until(fn){const deadline=Date.now()+10000;while(Date.now()run('nextnotes.snapshot()'); +const doc=async()=> (await snapshot()).doc; +const action=(name,args={})=>run(`nextnotes.tools(${JSON.stringify(name)},${JSON.stringify(args)})`); +const command=name=>run(`(()=>{nextnotes.command(${JSON.stringify(name)});return true})()`); +const key=async(key,code,vk,modifiers=0,text)=>{await call('Input.dispatchKeyEvent',{type:'keyDown',key,code,windowsVirtualKeyCode:vk,modifiers,text});await call('Input.dispatchKeyEvent',{type:'keyUp',key,code,windowsVirtualKeyCode:vk,modifiers});await wait(30);}; +const text=value=>call('Input.insertText',{text:value}); +await until(()=>run('!!window.nextnotes')); +const active=await snapshot();assert.equal(decodeURIComponent(new URL(active.baseUrl).pathname),fixture);assert.ok(fs.readFileSync(fixture,'utf8').startsWith('---\ncustom: untouched\n---\n')); +async function load(source){await run(`nextnotes.load({epoch:nextnotes.snapshot().epoch,baseUrl:nextnotes.snapshot().baseUrl,source:${JSON.stringify(source)}})`);await until(()=>run('nextnotes.view().editable'));await wait(100);} +const plain=()=>run(`nextnotes.view().state.doc.textBetween(0,nextnotes.view().state.doc.content.size,${JSON.stringify('\n')})`); +const position=(type,value)=>run(`(()=>{let result;nextnotes.view().state.doc.descendants((node,pos)=>{if(result===undefined&&node.type.name===${JSON.stringify(type)}&&node.textContent===${JSON.stringify(value)})result=pos;});return result;})()`); +const ok=name=>{results.push({name,passed:true});console.log(name);}; +try{ + await load('');await run('nextnotes.view().focus()');await text('/');await text('h2');await wait(120); + assert.ok((await run('nextnotes.toolsState().slash.items')).some(x=>x.command==='heading2')); + await key('Enter','Enter',13);assert.equal((await doc()).content[0].type,'heading');assert.equal((await doc()).content[0].attrs.level,2); + await command('undo');assert.equal(await plain(),'/h2');await command('redo');await text('Slash title');ok('slash_filter_keyboard_conversion_single_undo'); + for(const kind of ['bullet','ordered','task']){ + await load('');await run('nextnotes.view().focus()');await text('/');await wait(120); + const entries=await run('nextnotes.toolsState().slash.items'); + await action('slashChoose',{index:entries.findIndex(entry=>entry.command===kind)});await wait(120); + assert.equal(await run('document.querySelectorAll("li .editor-empty-line").length'),0,'list items must not advertise slash insertion'); + await text('/');await wait(120); + assert.equal(await run('nextnotes.toolsState().slash'),null,'slash inside '+kind+' is literal text'); + assert.equal(await run('nextnotes.view().state.selection.$from.parent.textContent'),'/'); + await key('Backspace','Backspace',8);await key('Enter','Enter',13);await text('/');await wait(120); + assert.ok(await run('nextnotes.toolsState().slash'),'slash insertion returns after leaving '+kind); + } + ok('slash_lists_literal_input_and_exit'); + await load('- [ ] Task\n');await run('nextnotes.view().focus()'); + const taskBox=()=>run(`(()=>{const box=getComputedStyle(document.querySelector('li[data-checked]'),'::before');return {width:box.width,height:box.height,left:box.left,top:box.top,border:box.borderWidth};})()`); + const uncheckedBox=await taskBox();assert.ok(parseFloat(uncheckedBox.width)>0); + await command('check');assert.equal(await run('document.querySelector("li[data-checked]").dataset.checked'),'true'); + assert.deepEqual(await taskBox(),uncheckedBox,'checking a task must not resize or move its box'); + await command('check');assert.equal(await run('document.querySelector("li[data-checked]").dataset.checked'),'false'); + assert.deepEqual(await taskBox(),uncheckedBox);ok('task_checkbox_stable_geometry'); + await load('A\n\nB\n\nC\n');await action('duplicateBlock',{pos:3});assert.equal(await plain(),'A\nB\nB\nC');await command('undo');assert.equal(await plain(),'A\nB\nC'); + await action('moveBlock',{pos:3,direction:'up'});assert.equal(await plain(),'B\nA\nC');await command('undo'); + await action('moveBlock',{pos:3,direction:'down'});assert.equal(await plain(),'A\nC\nB');await command('undo'); + await action('selectBlock',{pos:0});await action('selectBlock',{pos:6,extend:true});await action('duplicateBlock',{pos:3,selection:true});assert.equal(await plain(),'A\nB\nC\nA\nB\nC'); + await command('undo');await action('deleteBlock',{pos:3});assert.equal(await plain(),'A\nC');await command('undo');ok('block_duplicate_move_multiselect_delete_undo'); + await load('# Main\n\nIntro\n\n## One\n\none\n\n## Two\n\ntwo\n');const one=await position('heading','One'),source=(await snapshot()).source; + await action('toggleFold',{pos:one});assert.ok(await run(`Array.from(document.querySelectorAll('.folded-content')).some(node=>getComputedStyle(node).display==='none')`));assert.equal((await snapshot()).source,source); + await action('jump',{pos:one});assert.equal(await run('document.querySelectorAll(".folded-content").length'),0); + await key('End','End',35,2);await key('Enter','Enter',13);await action('insertToc');await wait(100);assert.ok((await snapshot()).source.includes('[toc]'));assert.equal(await run('document.querySelectorAll(".editor-toc a").length'),3); + await run(`(()=>{const v=nextnotes.view();v.dispatch(v.state.tr.insertText('Changed ',1));})()`);await wait(100);assert.match(await run('document.querySelector(".editor-toc a").textContent'),/Changed Main/);const tocSource=(await snapshot()).source;await load(tocSource);assert.equal((await doc()).content.filter(n=>n.type==='toc').length,1);await load('\\[toc]\n');assert.equal((await doc()).content[0].type,'paragraph');ok('outline_folding_readonly_view_live_toc'); + await load('Alpha **alpha** ALPHA\n\nalpha\n');await action('search',{query:'alpha',caseSensitive:false});await wait(100);assert.equal((await run('nextnotes.toolsState().search')).total,4); + await action('replaceAll',{replacement:'Beta'});assert.equal(await plain(),'Beta Beta Beta\nBeta');assert.ok(JSON.stringify(await doc()).includes('"strong"'));await command('undo');assert.equal(await plain(),'Alpha alpha ALPHA\nalpha'); + await action('search',{query:'alpha',caseSensitive:true});await wait(80);assert.equal((await run('nextnotes.toolsState().search')).total,2);await action('findNext');await action('replace',{replacement:'one'});assert.match(await plain(),/one/); + await load('a.b a+b [x] İZ\n');await action('search',{query:'a.b'});await wait(80);assert.equal((await run('nextnotes.toolsState().search')).total,1);ok('literal_case_search_replace_all_preserves_marks_undo'); + await load('$E=mc^2$\n\n$$\n\\frac{a}{b}\n$$\n');assert.equal((await doc()).content[0].content[0].type,'math_inline');assert.equal((await doc()).content[1].type,'math_block');assert.equal(await run('document.querySelectorAll(".katex").length'),2); + await action('setMath',{pos:await position('math_block','\\frac{a}{b}'),display:true,source:'\\sum_{i=1}^n i'});assert.match((await snapshot()).source,/\\sum/);await command('undo');assert.match((await snapshot()).source,/\\frac/);ok('math_parse_render_edit_undo'); + await load('Note\n');await key('End','End',35,2);await action('footnote',{text:'Footnote text'});let content=await doc();assert.ok(JSON.stringify(content).includes('"footnote_reference"'));assert.ok(content.content.some(x=>x.type==='footnote_definition'));assert.match((await snapshot()).source,/Footnote text/);ok('footnote_insert_serialization'); + await load('```python\ndef hello(name):\n return "Hello " + name\n```\n\n```mermaid\nflowchart LR\n A[Write] --> B[Save]\n```\n');assert.ok(await run('document.querySelectorAll(".token").length')>0); + await until(()=>run('!!document.querySelector(".diagram-preview img")'));assert.ok(await run('document.querySelector(".diagram-preview img").src.startsWith("data:image/svg+xml")')); + const exported=await run('nextnotes.exportBody()');assert.ok(exported.includes('data:image/svg+xml'));assert.ok((await run(`new DOMParser().parseFromString(${JSON.stringify(exported)},'text/html').body.textContent`)).includes('def hello'));ok('code_highlighting_and_offline_mermaid_export'); + await load('Image: ');await key('End','End',35,2); + await run(`(async()=>{const canvas=document.createElement('canvas');canvas.width=240;canvas.height=80;const context=canvas.getContext('2d');context.fillStyle='#dfe9f4';context.fillRect(0,0,240,80);context.fillStyle='#234';context.font='22px sans-serif';context.fillText('Attachment',38,48);const blob=await new Promise(resolve=>canvas.toBlob(resolve));const transfer=new DataTransfer();transfer.items.add(new File([blob],'Clipboard.png',{type:'image/png'}));nextnotes.view().dom.dispatchEvent(new ClipboardEvent('paste',{clipboardData:transfer,bubbles:true,cancelable:true}));})()`); + await until(()=>run('!!document.querySelector("img[data-original-src]")&&!nextnotes.snapshot().composing')); + const image=(await doc()).content[0].content.find(n=>n.type==='image');assert.ok(image.attrs.src.startsWith('assets/')); + await until(()=>run('document.querySelector("img[data-original-src]").naturalWidth===240')); + await wait(1100);assert.ok(fs.readFileSync(fixture,'utf8').includes(image.attrs.src));ok('clipboard_image_import_file_storage_insert_and_autosave'); + await load('| A | B |\n| --- | --- |\n| a | b |\n');const original=(await snapshot()).source; + await run(`(()=>{const v=nextnotes.view();const cell=v.state.doc.firstChild.firstChild.firstChild;v.dispatch(v.state.tr.setNodeMarkup(2,undefined,{...cell.attrs,colwidth:[200]}));})()`); + assert.equal((await snapshot()).source,original);await wait(150);assert.deepEqual((await run('nextnotes.toolsState().tableWidths'))[0][0],[200]);ok('table_column_width_view_only_no_markdown_rewrite'); + await run('nextnotes.view().state.doc.check();true'); + await wait(1100);assert.ok(fs.readFileSync(fixture,'utf8').startsWith('---\ncustom: untouched\n---\n'));ok('metadata_and_schema_integrity'); + if(process.env.NEXTNOTES_TEST_REPORT)fs.writeFileSync(process.env.NEXTNOTES_TEST_REPORT,JSON.stringify({results,snapshot:await snapshot()},null,2)); +}catch(error){console.error(error);if(process.env.NEXTNOTES_TEST_REPORT)fs.writeFileSync(process.env.NEXTNOTES_TEST_REPORT,JSON.stringify({results,error:error.stack,snapshot:await snapshot()},null,2));process.exitCode=1;} +ws.close();setTimeout(()=>process.exit(process.exitCode||0),200); diff --git a/output/editor-interaction-2026-11-11/NativeEditorInteractionRegression.mjs b/output/editor-interaction-2026-11-11/NativeEditorInteractionRegression.mjs new file mode 100644 index 0000000..6c93fca --- /dev/null +++ b/output/editor-interaction-2026-11-11/NativeEditorInteractionRegression.mjs @@ -0,0 +1,49 @@ +import assert from 'node:assert/strict'; +import {execFileSync} from 'node:child_process'; +import fs from 'node:fs'; +const base='/home/amao/nknotes-review-agent-20261111',win='16777260'; +const env={...process.env,DISPLAY:':0',XAUTHORITY:'/run/user/1000/xauth_AlxRJL',XDG_RUNTIME_DIR:'/run/user/1000',DBUS_SESSION_BUS_ADDRESS:'unix:path=/run/user/1000/bus'}; +const xd=(...args)=>execFileSync('xdotool',args.map(String),{env,encoding:'utf8'}); +xd('windowactivate','--sync',win); +const target=(await(await fetch('http://127.0.0.1:9241/json/list')).json()).find(x=>x.url==='qrc:/editor/index.html'); +const ws=new WebSocket(target.webSocketDebuggerUrl);await new Promise(r=>ws.onopen=r); +let serial=0;const pending=new Map(); +ws.onmessage=e=>{const r=JSON.parse(e.data),p=pending.get(r.id);if(p){pending.delete(r.id);clearTimeout(p.timer);r.error?p.reject(r.error):p.resolve(r.result)}}; +const call=(method,params={})=>new Promise((resolve,reject)=>{const id=++serial,timer=setTimeout(()=>{pending.delete(id);reject(Error('Timeout '+method+' '+JSON.stringify(params)))},7000);pending.set(id,{resolve,reject,timer});ws.send(JSON.stringify({id,method,params}))}); +const run=async expression=>{const r=await call('Runtime.evaluate',{expression,returnByValue:true,awaitPromise:true});if(r.exceptionDetails)throw Error(JSON.stringify(r.exceptionDetails));return r.result.value}; +const wait=ms=>new Promise(r=>setTimeout(r,ms)); +const state=()=>run('nextnotes.toolsState()'); +const doc=()=>run('nextnotes.snapshot().source'); +const boxes=()=>run('(()=>{const v=nextnotes.view(),out=[];v.state.doc.forEach((node,pos)=>{const r=v.nodeDOM(pos).getBoundingClientRect();out.push({pos,title:node.textContent,x:r.left,y:r.top,height:r.height,bottom:r.bottom})});return out})()'); +const load=async text=>{await run('nextnotes.load({epoch:nextnotes.snapshot().epoch,baseUrl:nextnotes.snapshot().baseUrl,source:'+JSON.stringify(text)+'})');await wait(1200);await run('nextnotes.view().focus()');await wait(500)}; +let web={x:509,y:91,width:771,height:682}; +const move=async(x,y)=>{xd('mousemove','--window',win,Math.round(x),Math.round(y));await wait(420)}; +const click=async(x,y)=>{await move(x,y);xd('click','--window',win,1);await wait(220)}; +const key=async name=>{xd('keydown','--window',win,name);await wait(120);xd('keyup','--window',win,name);await wait(250)}; +const shot=async name=>{await wait(450);execFileSync('spectacle',['-b','-n','-a','-e','-S','-o',base+'/screenshots/'+name+'.png'],{env,stdio:'ignore'});await wait(100)}; +const hover=async title=>{const b=(await boxes()).find(x=>x.title===title);assert.ok(b,title);await move(web.x+b.x+70,web.y+b.y+b.height/2-2);await move(web.x+b.x+80,web.y+b.y+b.height/2);assert.equal((await state()).block.title,title);const s=(await state()).block;return {x:web.x+Math.max(12,s.x-34)+13,y:web.y+Math.max(0,s.y)+13}}; +const press=async title=>{const h=await hover(title);await move(h.x,h.y);execFileSync('ydotool',['key','272:1'],{env:{...env,YDOTOOL_SOCKET:'/run/user/1000/.ydotool_socket'}});await wait(100)}; +const release=async()=>{execFileSync('ydotool',['key','272:0'],{env:{...env,YDOTOOL_SOCKET:'/run/user/1000/.ydotool_socket'}});await wait(320)}; +const results=[]; +async function test(name,fn){try{await fn();results.push({name,passed:true});console.log('PASS',name)}catch(e){results.push({name,passed:false,error:e.stack});console.error('FAIL',name,e);execFileSync('ydotool',['key','272:0'],{env:{...env,YDOTOOL_SOCKET:'/run/user/1000/.ydotool_socket'}});await key('Escape')}fs.writeFileSync(base+'/native-drag-report.json',JSON.stringify({results},null,2))} +try{ +await key('Escape');await click(1219,104);await wait(400); +await test('native drag and repeated drag retain moved block handle',async()=>{ + await load('第一段\n\n第二段\n\n第三段\n\n第四段\n');await click(700,123); + let b=(await boxes()).find(x=>x.title==='第二段');await press('第四段');await move(web.x+45,web.y+b.y+2);assert.ok((await state()).dropTarget);await shot('drag-boundary');await release(); + assert.deepEqual((await boxes()).map(x=>x.title),['第一段','第四段','第二段','第三段']);assert.equal((await state()).block.title,'第四段'); + b=(await boxes()).find(x=>x.title==='第三段');await press('第四段');await move(web.x+45,web.y+b.bottom-2);await release();assert.deepEqual((await boxes()).map(x=>x.title),['第一段','第二段','第三段','第四段']);assert.equal((await state()).block.title,'第四段'); +}); +await test('Escape and release outside editor cancel native drag',async()=>{ + const before=await doc();let b=(await boxes()).find(x=>x.title==='第二段');await press('第四段');await move(web.x+45,web.y+b.y+2);assert.ok((await state()).dropTarget);await key('Escape');await release();assert.equal(await doc(),before);assert.equal((await state()).dropTarget,null); + await press('第四段');await move(web.x-30,web.y+200);await release();assert.equal(await doc(),before);assert.equal((await state()).dropTarget,null); +}); +await test('first-block menu disables move-up and empty clipboard paste',async()=>{ + const h=await hover('第一段');await click(h.x,h.y);await shot('block-menu');assert.equal((await state()).block.canMoveUp,false);assert.equal((await state()).canPasteBlock,false);await key('Escape'); +}); +await test('stationary pointer at edge keeps scrolling and Escape stops it',async()=>{ + await load(Array.from({length:65},(_,i)=>'段落 '+String(i+1).padStart(2,'0')).join('\n\n')+'\n');await press('段落 01');await move(web.x+45,web.y+web.height-18); + console.log('EDGE before',JSON.stringify(await state()));const s0=await run('scrollY');await wait(650);const s1=await run('scrollY');await wait(500);const s2=await run('scrollY');console.log('EDGE samples',JSON.stringify({s0,s1,s2}));assert.ok(s1>s0+50,{s0,s1,s2});assert.ok(s2>s1+50,{s0,s1,s2});await shot('edge-scroll');await key('Escape');await release();const stop=await run('scrollY');await wait(300);assert.equal(await run('scrollY'),stop);results.push({name:'edge scroll samples',passed:true,s0,s1,s2,stop}); +}); +}catch(e){console.error(e);results.push({name:'driver',passed:false,error:e.stack})} +finally{execFileSync('ydotool',['key','272:0'],{env:{...env,YDOTOOL_SOCKET:'/run/user/1000/.ydotool_socket'}});fs.writeFileSync(base+'/native-drag-report.json',JSON.stringify({results},null,2));ws.close();setTimeout(()=>process.exit(results.some(x=>x.passed===false)?1:0),200)} diff --git a/output/editor-interaction-2026-11-11/README.md b/output/editor-interaction-2026-11-11/README.md new file mode 100644 index 0000000..9556208 --- /dev/null +++ b/output/editor-interaction-2026-11-11/README.md @@ -0,0 +1,24 @@ +# VM 编辑器验证原始记录 + +运行环境为 `kos-vm-dev` 中的独立应用实例和合成笔记;本机未执行构建、测试或应用操作。面向使用者的说明与截图见 [编辑器交互复查](../../docs/editor-interaction-review.md)。 + +以 [final-native-summary.json](final-native-summary.json) 的逐项矩阵为准:独立检查的通过不能覆盖连续操作中的失败。它描述的是 VM 实际快照,不包含后来的本地修复。[pending-runtime-fixes.json](pending-runtime-fixes.json) 单独记录提交 `2133581` 中尚待运行的文件指纹及复验动作。 + +- `source-hashes.json`:VM 实际使用的文件 SHA-256,并非最终 Git 提交的完整指纹。 +- `configure.log`、`build.log`、`editor-build.log`:该快照的 CMake 配置、Qt Release 编译及 npm bundle 构建输出。CMake 有 QML 插件链接目标诊断,最终应用已链接并在独立实例运行。 +- `block-handle.log`:块手柄、选区、落点、取消、上下文目标与斜杠菜单的回归输出;退出码为 0。 +- `editor-interaction-report.json`、`editor-interaction.log`:实际 WebEngine 编辑器中的六组集成检查,退出码为 0。拖动部分通过工具动作调用验证 DOM 落点计算,不能代替原生鼠标操作。 +- `native.log`、`native-final.log`、`native-drag-report.json`:原生拖动、重复拖动与边缘滚动通过;连续移动后再次拖动的 Escape 取消失败。最终重跑中的“空剪贴板”断言在已经复制之后执行,前置条件不成立,不能据此认定产品回归。 +- `native-cancel-report.json`、`native-cancel-explicit.log`:独立短文拖动中,明确指定窗口的 Escape 清除预览且松手不移动;越界松开也不改变内容。它不覆盖连续拖动后的 Escape 失败。`native-report.json` 是独立取消检查留下的同内容副本,不是总矩阵。 +- `native-copy.log`、`native-copy-report.json`:点击实际复制行后,立即重开同一手柄菜单,粘贴块启用。 +- `slash-cdp.log`、`slash-cdp-report.json`:编辑器索引到达第 16 项 `toc`。原始用例名称含有“native popup”,但断言仅覆盖编辑器状态;原生弹层仍停顶部,失败见 `slash-settled.png`。`native-slash.*` 另外保留原生输入路径的未通过记录。 +- `advanced-editor-report.json`、`advanced-editor.log`:原始 Advanced 回归的断言失败。整个文档带合法尾部空段落,实际为 `/\n`;最终源码改为检查当前列表段落。 +- `advanced-final-report.json`、`advanced-final.log`:使用 `AdvancedEditorRegression.safe-cdp.mjs` 临时副本顺序重跑,前九组通过,随后剪贴板图片导入等待超时;后续表格与最终元数据检查未到达。一次与原生驱动重叠的中间运行已作废,不用作通过证据。 +- `app.log`:实际实例日志,未发现本轮弹层高度绑定循环或快捷键歧义,含 AT-SPI 能力警告。 +- `ci-provisioning-failure.log`、`ci-provisioning-failure.json`:GitHub Actions 的完整日志和关联运行终态。Ubuntu 软件源 DNS 解析反复失败,作业满 60 分钟后超时,未进入 Flatpak 安装、应用编译或回归步骤。该结果不能作为代码构建通过或失败的依据。 + +`NativeEditorInteractionRegression.mjs`、`native-cancel-explicit.mjs`、`native-copy.mjs`、`slash-cdp.mjs` 和 Advanced 临时副本保留了当时的驱动,含实例窗口号、坐标和端点。它们是验证记录,复用前必须重新校准并确认可丢弃笔记;不要直接针对其他应用或个人笔记运行。 + +最终提交中的 `Main.qml`、`SourceEditor.qml` 增加了跨文档查询恢复;`EditorTools.qml` 增加了拖动时的键盘焦点与 Escape 处理,以及弹层条目更新后的选择/滚动同步。这些改动晚于 VM 快照,源文件传输被自动审批阻止,因此未运行复验。`NotesPopover.qml` 与快照之间仅有注释调整。 + +拖动与边缘滚动过程截图存在 Qt 与 WebEngine 帧不同步现象,保留用于诊断,不能据图宣称落点像素通过;实际顺序与滚动数值见日志。斜杠菜单的可见选择不同步在等待后仍存在,已作为失败记录,不能用 CDP 通过替代。 diff --git a/output/editor-interaction-2026-11-11/advanced-editor-report.json b/output/editor-interaction-2026-11-11/advanced-editor-report.json new file mode 100644 index 0000000..2172735 --- /dev/null +++ b/output/editor-interaction-2026-11-11/advanced-editor-report.json @@ -0,0 +1,61 @@ +{ + "results": [ + { + "name": "slash_filter_keyboard_conversion_single_undo", + "passed": true + } + ], + "error": "AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:\n\n'/\\n' !== '/'\n\n at file:///home/amao/nknotes-review-agent-20261111/source/tests/AdvancedEditorRegression.mjs:39:10", + "snapshot": { + "epoch": 2, + "baseUrl": "file:///home/amao/nknotes-review-agent-20261111/fixture/review.md", + "source": "* /\n", + "fullSource": "---\ncustom: untouched\n---\n* /\n", + "sourceMode": false, + "doc": { + "type": "doc", + "attrs": { + "sourceContext": 0 + }, + "content": [ + { + "type": "bullet_list", + "attrs": { + "spread": false + }, + "content": [ + { + "type": "list_item", + "attrs": { + "label": "•", + "listType": "bullet", + "spread": true, + "checked": null + }, + "content": [ + { + "type": "paragraph", + "content": [ + { + "type": "text", + "text": "/" + } + ] + } + ] + } + ] + }, + { + "type": "paragraph" + } + ] + }, + "composing": false, + "selection": { + "type": "text", + "anchor": 4, + "head": 4 + } + } +} \ No newline at end of file diff --git a/output/editor-interaction-2026-11-11/advanced-editor.log b/output/editor-interaction-2026-11-11/advanced-editor.log new file mode 100644 index 0000000..64a20ce --- /dev/null +++ b/output/editor-interaction-2026-11-11/advanced-editor.log @@ -0,0 +1,13 @@ +slash_filter_keyboard_conversion_single_undo +AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + +'/\n' !== '/' + + at file:///home/amao/nknotes-review-agent-20261111/source/tests/AdvancedEditorRegression.mjs:39:10 { + generatedMessage: true, + code: 'ERR_ASSERTION', + actual: '/\n', + expected: '/', + operator: 'strictEqual', + diff: 'simple' +} diff --git a/output/editor-interaction-2026-11-11/advanced-final-report.json b/output/editor-interaction-2026-11-11/advanced-final-report.json new file mode 100644 index 0000000..ab0b27b --- /dev/null +++ b/output/editor-interaction-2026-11-11/advanced-final-report.json @@ -0,0 +1,71 @@ +{ + "results": [ + { + "name": "slash_filter_keyboard_conversion_single_undo", + "passed": true + }, + { + "name": "slash_lists_literal_input_and_exit", + "passed": true + }, + { + "name": "task_checkbox_stable_geometry", + "passed": true + }, + { + "name": "block_duplicate_move_multiselect_delete_undo", + "passed": true + }, + { + "name": "outline_folding_readonly_view_live_toc", + "passed": true + }, + { + "name": "literal_case_search_replace_all_preserves_marks_undo", + "passed": true + }, + { + "name": "math_parse_render_edit_undo", + "passed": true + }, + { + "name": "footnote_insert_serialization", + "passed": true + }, + { + "name": "code_highlighting_and_offline_mermaid_export", + "passed": true + } + ], + "error": "Error: Timed out waiting for editor state\n at until (file:///home/amao/nknotes-review-agent-20261111/AdvancedEditorRegression.safe-cdp.mjs:14:128)\n at async file:///home/amao/nknotes-review-agent-20261111/AdvancedEditorRegression.safe-cdp.mjs:73:2", + "snapshot": { + "epoch": 2, + "baseUrl": "file:///home/amao/nknotes-review-agent-20261111/fixture/review.md", + "source": "Image: ", + "fullSource": "---\ncustom: untouched\n---\nImage: ", + "sourceMode": false, + "doc": { + "type": "doc", + "attrs": { + "sourceContext": 0 + }, + "content": [ + { + "type": "paragraph", + "content": [ + { + "type": "text", + "text": "Image:" + } + ] + } + ] + }, + "composing": false, + "selection": { + "type": "text", + "anchor": 1, + "head": 1 + } + } +} \ No newline at end of file diff --git a/output/editor-interaction-2026-11-11/advanced-final.log b/output/editor-interaction-2026-11-11/advanced-final.log new file mode 100644 index 0000000..e63f2bd --- /dev/null +++ b/output/editor-interaction-2026-11-11/advanced-final.log @@ -0,0 +1,12 @@ +slash_filter_keyboard_conversion_single_undo +slash_lists_literal_input_and_exit +task_checkbox_stable_geometry +block_duplicate_move_multiselect_delete_undo +outline_folding_readonly_view_live_toc +literal_case_search_replace_all_preserves_marks_undo +math_parse_render_edit_undo +footnote_insert_serialization +code_highlighting_and_offline_mermaid_export +Error: Timed out waiting for editor state + at until (file:///home/amao/nknotes-review-agent-20261111/AdvancedEditorRegression.safe-cdp.mjs:14:128) + at async file:///home/amao/nknotes-review-agent-20261111/AdvancedEditorRegression.safe-cdp.mjs:73:2 diff --git a/output/editor-interaction-2026-11-11/app.log b/output/editor-interaction-2026-11-11/app.log new file mode 100644 index 0000000..700e1cf --- /dev/null +++ b/output/editor-interaction-2026-11-11/app.log @@ -0,0 +1,5 @@ + +DevTools listening on ws://127.0.0.1:9241/devtools/browser/9a4077f1-b7d8-47c8-b8cf-d5d52bb4fc70 +Remote debugging server started successfully. Try pointing a Chromium-based browser to http://127.0.0.1:9241 +qt.accessibility.atspi: AtSpiAdaptor::applicationInterface does not implement "GetApplicationBusAddress" "/org/a11y/atspi/accessible/root" +qt.accessibility.atspi: AtSpiAdaptor::applicationInterface does not implement "GetApplicationBusAddress" "/org/a11y/atspi/accessible/root" diff --git a/output/editor-interaction-2026-11-11/block-handle.log b/output/editor-interaction-2026-11-11/block-handle.log new file mode 100644 index 0000000..2e197e6 --- /dev/null +++ b/output/editor-interaction-2026-11-11/block-handle.log @@ -0,0 +1 @@ +PASS: block handles, selection, drop boundaries, cancellation, contextual targeting and slash discovery/dismissal. diff --git a/output/editor-interaction-2026-11-11/build.log b/output/editor-interaction-2026-11-11/build.log new file mode 100644 index 0000000..a5700be --- /dev/null +++ b/output/editor-interaction-2026-11-11/build.log @@ -0,0 +1,293 @@ +[0/2] Re-checking globbed directories... +[1/293] Copying kos_icons qml resources into build dir +[2/293] Copying kos_icons qml sources into build dir +[3/293] Automatic MOC and UIC for target kos_icons_plugin_init +[4/293] Building CXX object kos-ui/kos-icons/CMakeFiles/kos_icons_resources_2.dir/.qt/rcc/qrc_kos_icons_raw_qml_0_init.cpp.o +[5/293] Building CXX object kos-ui/kos-icons/CMakeFiles/kos_icons_resources_1.dir/.qt/rcc/qrc_qmake_Kos_Icons_init.cpp.o +[6/293] Running AUTOMOC file extraction for target kos_icons_plugin_init +[7/293] Populating .qmlls.ini file at /home/amao/nknotes-review-agent-20261111/build/.qt/.qmlls.build.ini +[8/293] Copying kos_ui qml resources into build dir +[9/293] Copying kos_ui qml sources into build dir +[10/293] Building CXX object kos-ui/kos-icons/CMakeFiles/kos_icons_resources_3.dir/.qt/rcc/qrc_kos_icons_raw_res_0_init.cpp.o +[11/293] Running moc --collect-json for target kos_icons_plugin_init +[12/293] Building CXX object kos-ui/kos-icons/CMakeFiles/kos_icons_plugin_init.dir/kos_icons_plugin_init_autogen/mocs_compilation.cpp.o +[13/293] Automatic MOC and UIC for target kos_icons +[14/293] Running AUTOMOC file extraction for target kos_icons +[15/293] Automatic MOC and UIC for target kos_ui_plugin_init +[16/293] Running moc --collect-json for target kos_icons +[17/293] Running rcc for resource qmake_Kos_Icons +[18/293] Generating .rcc/qmlcache/kos_icons_qmlcache_loader.cpp +[19/293] Running rcc for resource kos_icons_raw_qml_0 +[20/293] Automatic QML type registration for target kos_icons +[21/293] Generating .rcc/qmlcache/kos_icons_BatteryIcon_qml.cpp, .rcc/qmlcache/kos_icons_BatteryIcon_qml.cpp.aotstats +[22/293] Running rcc for resource kos_icons_raw_res_0 +[23/293] Generating .rcc/qmlcache/kos_icons_SignalIcon_qml.cpp, .rcc/qmlcache/kos_icons_SignalIcon_qml.cpp.aotstats +[24/293] Generating .rcc/qmlcache/kos_icons_VolumeIcon_qml.cpp, .rcc/qmlcache/kos_icons_VolumeIcon_qml.cpp.aotstats +[25/293] Generating .rcc/qmlcache/kos_icons_Icon_qml.cpp, .rcc/qmlcache/kos_icons_Icon_qml.cpp.aotstats +[26/293] Generating .rcc/qmlcache/kos_icons_IconRegistry_qml.cpp, .rcc/qmlcache/kos_icons_IconRegistry_qml.cpp.aotstats +[27/293] Generating .rcc/qmlcache/kos_icons_IconMap_js.cpp +[28/293] Building CXX object kos-ui/kos-icons/CMakeFiles/kos_icons.dir/kos_icons_autogen/mocs_compilation.cpp.o +[29/293] Building CXX object kos-ui/CMakeFiles/kos_ui_resources_1.dir/.qt/rcc/qrc_qmake_Kos_Ui_init.cpp.o +[30/293] Building CXX object kos-ui/kos-icons/CMakeFiles/kos_icons.dir/.qt/rcc/qrc_qmake_Kos_Icons.cpp.o +[31/293] Automatic MOC and UIC for target nextnotes-storage +[32/293] Building CXX object kos-ui/kos-icons/CMakeFiles/kos_icons_plugin_init.dir/kos_icons_plugin_init.cpp.o +[33/293] Building CXX object kos-ui/kos-icons/CMakeFiles/kos_icons.dir/kos_icons_qmltyperegistrations.cpp.o +[34/293] Building CXX object kos-ui/kos-icons/CMakeFiles/kos_icons.dir/.rcc/qmlcache/kos_icons_qmlcache_loader.cpp.o +[35/293] Building CXX object kos-ui/kos-icons/CMakeFiles/kos_icons.dir/.rcc/qmlcache/kos_icons_BatteryIcon_qml.cpp.o +[36/293] Building CXX object kos-ui/kos-icons/CMakeFiles/kos_icons.dir/.rcc/qmlcache/kos_icons_VolumeIcon_qml.cpp.o +[37/293] Building CXX object kos-ui/kos-icons/CMakeFiles/kos_icons.dir/.rcc/qmlcache/kos_icons_SignalIcon_qml.cpp.o +[38/293] Building CXX object kos-ui/kos-icons/CMakeFiles/kos_icons.dir/.qt/rcc/qrc_kos_icons_raw_qml_0.cpp.o +[39/293] Building CXX object kos-ui/kos-icons/CMakeFiles/kos_icons.dir/.qt/rcc/qrc_kos_icons_raw_res_0.cpp.o +[40/293] Running AUTOMOC file extraction for target nextnotes-storage +[41/293] Running moc --collect-json for target nextnotes-storage +[42/293] Building CXX object kos-ui/kos-icons/CMakeFiles/kos_icons.dir/.rcc/qmlcache/kos_icons_Icon_qml.cpp.o +[43/293] Building CXX object kos-ui/kos-icons/CMakeFiles/kos_icons.dir/.rcc/qmlcache/kos_icons_IconRegistry_qml.cpp.o +[44/293] Building CXX object kos-ui/kos-icons/CMakeFiles/kos_icons.dir/.rcc/qmlcache/kos_icons_IconMap_js.cpp.o +[45/293] Linking CXX static library kos-ui/kos-icons/libkos_icons.a +[46/293] Automatic MOC and UIC for target kos_icons_plugin +[47/293] Building CXX object kos-ui/kos-icons/CMakeFiles/kos_icons_plugin.dir/kos_icons_plugin_autogen/mocs_compilation.cpp.o +[48/293] Building CXX object CMakeFiles/nextnotes-storage.dir/nextnotes-storage_autogen/mocs_compilation.cpp.o +[49/293] Building CXX object CMakeFiles/nextnotes-storage.dir/src/storage/MarkdownFile.cpp.o +[50/293] Building CXX object kos-ui/CMakeFiles/kos_ui_resources_2.dir/.qt/rcc/qrc_kos_ui_raw_qml_0_init.cpp.o +[51/293] Building CXX object kos-ui/CMakeFiles/kos_ui_resources_3.dir/.qt/rcc/qrc_kos_ui_raw_res_0_init.cpp.o +[52/293] Building CXX object kos-ui/CMakeFiles/kos_ui_resources_4.dir/.qt/rcc/qrc_kos_ui_raw_qml_0_extra_qmldirs_init.cpp.o +[53/293] Running AUTOMOC file extraction for target kos_ui_plugin_init +[54/293] Copying nextnotes qml sources into build dir +[55/293] Copying nextnotes qml resources into build dir +[56/293] Building CXX object kos-ui/kos-icons/CMakeFiles/kos_icons_plugin.dir/kos_icons_plugin_Kos_IconsPlugin.cpp.o +[57/293] Linking CXX static library kos-ui/kos-icons/Kos/Icons/libkos_icons_plugin.a +[58/293] Automatic MOC and UIC for target kos_ui +[59/293] Running AUTOMOC file extraction for target kos_ui +[60/293] Running moc --collect-json for target kos_ui +[61/293] Automatic QML type registration for target kos_ui +[62/293] Running rcc for resource qmake_Kos_Ui +[63/293] Generating .rcc/qmlcache/kos_ui_qmlcache_loader.cpp +[64/293] Generating .rcc/qmlcache/kos_ui_i18n/I18n_qml.cpp, .rcc/qmlcache/kos_ui_i18n/I18n_qml.cpp.aotstats +[65/293] Generating .rcc/qmlcache/kos_ui_foundation/AppTheme_qml.cpp, .rcc/qmlcache/kos_ui_foundation/AppTheme_qml.cpp.aotstats +[66/293] Generating .rcc/qmlcache/kos_ui_foundation/KosSidebar_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosSidebar_qml.cpp.aotstats +[67/293] Generating .rcc/qmlcache/kos_ui_foundation/KosSidebarToggle_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosSidebarToggle_qml.cpp.aotstats +[68/293] Generating .rcc/qmlcache/kos_ui_foundation/KosCheckBox_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosCheckBox_qml.cpp.aotstats +[69/293] Generating .rcc/qmlcache/kos_ui_foundation/KosComboBox_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosComboBox_qml.cpp.aotstats +[70/293] Generating .rcc/qmlcache/kos_ui_foundation/KosTextArea_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosTextArea_qml.cpp.aotstats +[71/293] Generating .rcc/qmlcache/kos_ui_foundation/KosAppWindow_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosAppWindow_qml.cpp.aotstats +[72/293] Running qmlimportscanner for nextnotes +[73/293] Generating .rcc/qmlcache/kos_ui_foundation/KosApplicationWindow_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosApplicationWindow_qml.cpp.aotstats +[74/293] Generating .rcc/qmlcache/kos_ui_foundation/KosWindowResizeHandles_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosWindowResizeHandles_qml.cpp.aotstats +[75/293] Generating .rcc/qmlcache/kos_ui_foundation/KosWindowControls_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosWindowControls_qml.cpp.aotstats +[76/293] Generating .rcc/qmlcache/kos_ui_foundation/KosCard_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosCard_qml.cpp.aotstats +[77/293] Generating .rcc/qmlcache/kos_ui_foundation/KosButton_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosButton_qml.cpp.aotstats +[78/293] Generating .rcc/qmlcache/kos_ui_foundation/SettingsGroup_qml.cpp, .rcc/qmlcache/kos_ui_foundation/SettingsGroup_qml.cpp.aotstats +[79/293] Generating .rcc/qmlcache/kos_ui_foundation/SettingsItem_qml.cpp, .rcc/qmlcache/kos_ui_foundation/SettingsItem_qml.cpp.aotstats +[80/293] Generating .rcc/qmlcache/kos_ui_foundation/SettingsTextField_qml.cpp, .rcc/qmlcache/kos_ui_foundation/SettingsTextField_qml.cpp.aotstats +[81/293] Generating .rcc/qmlcache/kos_ui_foundation/SettingsTextArea_qml.cpp, .rcc/qmlcache/kos_ui_foundation/SettingsTextArea_qml.cpp.aotstats +[82/293] Generating .rcc/qmlcache/kos_ui_foundation/SettingsSwitch_qml.cpp, .rcc/qmlcache/kos_ui_foundation/SettingsSwitch_qml.cpp.aotstats +[83/293] Generating .rcc/qmlcache/kos_ui_foundation/SettingsDateField_qml.cpp, .rcc/qmlcache/kos_ui_foundation/SettingsDateField_qml.cpp.aotstats +[84/293] Generating .rcc/qmlcache/kos_ui_foundation/SettingsTimeField_qml.cpp, .rcc/qmlcache/kos_ui_foundation/SettingsTimeField_qml.cpp.aotstats +[85/293] Generating .rcc/qmlcache/kos_ui_foundation/SettingsAppearancePreview_qml.cpp, .rcc/qmlcache/kos_ui_foundation/SettingsAppearancePreview_qml.cpp.aotstats +[86/293] Generating .rcc/qmlcache/kos_ui_foundation/KosWorkspaceDialog_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosWorkspaceDialog_qml.cpp.aotstats +[87/293] Generating .rcc/qmlcache/kos_ui_foundation/KosItemDelegate_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosItemDelegate_qml.cpp.aotstats +[88/293] Generating .rcc/qmlcache/kos_ui_foundation/KosDialog_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosDialog_qml.cpp.aotstats +[89/293] Generating .rcc/qmlcache/kos_ui_foundation/KosEmptyState_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosEmptyState_qml.cpp.aotstats +[90/293] Generating .rcc/qmlcache/kos_ui_foundation/KosNavigationButton_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosNavigationButton_qml.cpp.aotstats +[91/293] Generating .rcc/qmlcache/kos_ui_foundation/KosPageMotion_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosPageMotion_qml.cpp.aotstats +[92/293] Generating .rcc/qmlcache/kos_ui_foundation/KosPageCache_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosPageCache_qml.cpp.aotstats +[93/293] Generating .rcc/qmlcache/kos_ui_foundation/KosRoundButton_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosRoundButton_qml.cpp.aotstats +[94/293] Generating .rcc/qmlcache/kos_ui_foundation/KosSlider_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosSlider_qml.cpp.aotstats +[95/293] Generating .rcc/qmlcache/kos_ui_foundation/KosSettingsDialog_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosSettingsDialog_qml.cpp.aotstats +[96/293] Generating .rcc/qmlcache/kos_ui_foundation/KosSurface_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosSurface_qml.cpp.aotstats +[97/293] Generating .rcc/qmlcache/kos_ui_foundation/KosSwitch_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosSwitch_qml.cpp.aotstats +[98/293] Generating .rcc/qmlcache/kos_ui_foundation/KosTextField_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosTextField_qml.cpp.aotstats +[99/293] Generating .rcc/qmlcache/kos_ui_foundation/KosToolButton_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosToolButton_qml.cpp.aotstats +[100/293] Generating .rcc/qmlcache/kos_ui_foundation/KosLyricLine_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosLyricLine_qml.cpp.aotstats +[101/293] Generating .rcc/qmlcache/kos_ui_foundation/KosToolTip_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosToolTip_qml.cpp.aotstats +[102/293] Generating .rcc/qmlcache/kos_ui_foundation/KosKineticScrollPhysics_mjs.cpp +[103/293] Generating .rcc/qmlcache/kos_ui_foundation/PageCachePolicy_js.cpp +[104/293] Generating .rcc/qmlcache/kos_ui_foundation/KosKineticScroll_qml.cpp, .rcc/qmlcache/kos_ui_foundation/KosKineticScroll_qml.cpp.aotstats +[105/293] Generating .rcc/qmlcache/kos_ui_controls/ControlForm_qml.cpp, .rcc/qmlcache/kos_ui_controls/ControlForm_qml.cpp.aotstats +[106/293] Generating .rcc/qmlcache/kos_ui_controls/ColorRampSlider_qml.cpp, .rcc/qmlcache/kos_ui_controls/ColorRampSlider_qml.cpp.aotstats +[107/293] Generating .rcc/qmlcache/kos_ui_controls/VectorIcon_qml.cpp, .rcc/qmlcache/kos_ui_controls/VectorIcon_qml.cpp.aotstats +[108/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidGlassButton_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidGlassButton_qml.cpp.aotstats +[109/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidStyle_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidStyle_qml.cpp.aotstats +[110/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidBackdrop_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidBackdrop_qml.cpp.aotstats +[111/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidSurface_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidSurface_qml.cpp.aotstats +[112/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidGlassNumber_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidGlassNumber_qml.cpp.aotstats +[113/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidOuterShadow_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidOuterShadow_qml.cpp.aotstats +[114/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidCard_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidCard_qml.cpp.aotstats +[115/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidActionButton_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidActionButton_qml.cpp.aotstats +[116/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidActionButtonGroup_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidActionButtonGroup_qml.cpp.aotstats +[117/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidNavigationButton_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidNavigationButton_qml.cpp.aotstats +[118/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidCheckBox_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidCheckBox_qml.cpp.aotstats +[119/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidContentPopover_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidContentPopover_qml.cpp.aotstats +[120/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidPopover_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidPopover_qml.cpp.aotstats +[121/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidPopoverItem_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidPopoverItem_qml.cpp.aotstats +[122/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidPopoverSurface_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidPopoverSurface_qml.cpp.aotstats +[123/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidFilePicker_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidFilePicker_qml.cpp.aotstats +[124/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidDialog_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidDialog_qml.cpp.aotstats +[125/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidDialogButton_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidDialogButton_qml.cpp.aotstats +[126/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidDialogSurface_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidDialogSurface_qml.cpp.aotstats +[127/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidPanelSurface_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidPanelSurface_qml.cpp.aotstats +[128/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidGlassSwitch_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidGlassSwitch_qml.cpp.aotstats +[129/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidSlider_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidSlider_qml.cpp.aotstats +[130/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidSelect_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidSelect_qml.cpp.aotstats +[131/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidNavBar_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidNavBar_qml.cpp.aotstats +[132/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidTextField_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidTextField_qml.cpp.aotstats +[133/293] Generating .rcc/qmlcache/kos_ui_controls/LiquidSegmentedControl_qml.cpp, .rcc/qmlcache/kos_ui_controls/LiquidSegmentedControl_qml.cpp.aotstats +[134/293] Generating .rcc/qmlcache/kos_ui_controls/SelectionHighlight_qml.cpp, .rcc/qmlcache/kos_ui_controls/SelectionHighlight_qml.cpp.aotstats +[135/293] Running rcc for resource kos_ui_raw_res_0 +[136/293] Running rcc for resource kos_ui_raw_qml_0_extra_qmldirs +[137/293] Running moc --collect-json for target kos_ui_plugin_init +[138/293] Building CXX object kos-ui/CMakeFiles/kos_ui_plugin_init.dir/kos_ui_plugin_init_autogen/mocs_compilation.cpp.o +[139/293] Running rcc for resource kos_ui_raw_qml_0 +[140/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/kos_ui_autogen/mocs_compilation.cpp.o +[141/293] Building CXX object kos-ui/CMakeFiles/kos_ui_plugin_init.dir/kos_ui_plugin_init.cpp.o +[142/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.qt/rcc/qrc_qmake_Kos_Ui.cpp.o +[143/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/kos_ui_qmltyperegistrations.cpp.o +[144/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_i18n/I18n_qml.cpp.o +[145/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_qmlcache_loader.cpp.o +[146/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosSidebar_qml.cpp.o +[147/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/AppTheme_qml.cpp.o +[148/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosSidebarToggle_qml.cpp.o +[149/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosCheckBox_qml.cpp.o +[150/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosComboBox_qml.cpp.o +[151/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosTextArea_qml.cpp.o +[152/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosAppWindow_qml.cpp.o +[153/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosApplicationWindow_qml.cpp.o +[154/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosWindowControls_qml.cpp.o +[155/293] Building CXX object CMakeFiles/nextnotes-storage.dir/src/storage/ManagedStore.cpp.o +[156/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosWindowResizeHandles_qml.cpp.o +[157/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosButton_qml.cpp.o +[158/293] Building CXX object CMakeFiles/nextnotes-storage.dir/src/storage/NotesRepository.cpp.o +[159/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosCard_qml.cpp.o +[160/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/SettingsGroup_qml.cpp.o +[161/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/SettingsTextField_qml.cpp.o +[162/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/SettingsTextArea_qml.cpp.o +[163/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/SettingsItem_qml.cpp.o +[164/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/SettingsSwitch_qml.cpp.o +[165/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/SettingsDateField_qml.cpp.o +[166/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/SettingsTimeField_qml.cpp.o +[167/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosWorkspaceDialog_qml.cpp.o +[168/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosItemDelegate_qml.cpp.o +[169/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosDialog_qml.cpp.o +[170/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/SettingsAppearancePreview_qml.cpp.o +[171/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosEmptyState_qml.cpp.o +[172/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosNavigationButton_qml.cpp.o +[173/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosPageCache_qml.cpp.o +[174/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosPageMotion_qml.cpp.o +[175/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosRoundButton_qml.cpp.o +[176/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosSettingsDialog_qml.cpp.o +[177/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosSlider_qml.cpp.o +[178/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosSwitch_qml.cpp.o +[179/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosSurface_qml.cpp.o +[180/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosTextField_qml.cpp.o +[181/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosToolButton_qml.cpp.o +[182/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosLyricLine_qml.cpp.o +[183/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosToolTip_qml.cpp.o +[184/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosKineticScrollPhysics_mjs.cpp.o +[185/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/KosKineticScroll_qml.cpp.o +[186/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_foundation/PageCachePolicy_js.cpp.o +[187/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/ControlForm_qml.cpp.o +[188/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/VectorIcon_qml.cpp.o +[189/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/ColorRampSlider_qml.cpp.o +[190/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidStyle_qml.cpp.o +[191/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidGlassButton_qml.cpp.o +[192/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidBackdrop_qml.cpp.o +[193/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidOuterShadow_qml.cpp.o +[194/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidGlassNumber_qml.cpp.o +[195/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidSurface_qml.cpp.o +[196/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidCard_qml.cpp.o +[197/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidActionButtonGroup_qml.cpp.o +[198/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidActionButton_qml.cpp.o +[199/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidCheckBox_qml.cpp.o +[200/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidNavigationButton_qml.cpp.o +[201/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidContentPopover_qml.cpp.o +[202/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidPopover_qml.cpp.o +[203/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidPopoverItem_qml.cpp.o +[204/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidDialog_qml.cpp.o +[205/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidFilePicker_qml.cpp.o +[206/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidDialogButton_qml.cpp.o +[207/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidPopoverSurface_qml.cpp.o +[208/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidDialogSurface_qml.cpp.o +[209/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidPanelSurface_qml.cpp.o +[210/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidGlassSwitch_qml.cpp.o +[211/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidSlider_qml.cpp.o +[212/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidSelect_qml.cpp.o +[213/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidNavBar_qml.cpp.o +[214/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidTextField_qml.cpp.o +[215/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.qt/rcc/qrc_kos_ui_raw_qml_0.cpp.o +[216/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.qt/rcc/qrc_kos_ui_raw_qml_0_extra_qmldirs.cpp.o +[217/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.qt/rcc/qrc_kos_ui_raw_res_0.cpp.o +[218/293] Linking CXX static library libnextnotes-storage.a +[219/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/SelectionHighlight_qml.cpp.o +[220/293] Building CXX object kos-ui/CMakeFiles/kos_ui.dir/.rcc/qmlcache/kos_ui_controls/LiquidSegmentedControl_qml.cpp.o +[221/293] Linking CXX static library kos-ui/libkos_ui.a +[222/293] Automatic MOC and UIC for target kos_ui_plugin +[223/293] Building CXX object kos-ui/CMakeFiles/kos_ui_plugin.dir/kos_ui_plugin_autogen/mocs_compilation.cpp.o +[224/293] Building CXX object kos-ui/CMakeFiles/kos_ui_plugin.dir/kos_ui_plugin_Kos_UiPlugin.cpp.o +[225/293] Linking CXX static library kos-ui/libkos_ui_plugin.a +[226/293] Automatic MOC and UIC for target nextnotes +[227/293] Running AUTOMOC file extraction for target nextnotes +[228/293] Running rcc for resource qmake_NextNotes +[229/293] Running rcc for resource nextnotes_raw_qml_0_extra_qmldirs +[230/293] Generating .rcc/qmlcache/nextnotes_qmlcache_loader.cpp +[231/293] Running moc --collect-json for target nextnotes +[232/293] Running rcc for resource window-controls +[233/293] Running rcc for resource app-icon +[234/293] Automatic QML type registration for target nextnotes +[235/293] Running rcc for resource nextnotes_raw_qml_0 +[236/293] Generating .rcc/qmlcache/nextnotes_qml/FolderIcons_js.cpp +[237/293] Generating .rcc/qmlcache/nextnotes_qml/PopupPlacement_js.cpp +[238/293] Generating .rcc/qmlcache/nextnotes_qml/NotesSelectionBox_qml.cpp, .rcc/qmlcache/nextnotes_qml/NotesSelectionBox_qml.cpp.aotstats +[239/293] Generating .rcc/qmlcache/nextnotes_qml/NotesPopover_qml.cpp, .rcc/qmlcache/nextnotes_qml/NotesPopover_qml.cpp.aotstats +[240/293] Generating .rcc/qmlcache/nextnotes_qml/NotesContentPopover_qml.cpp, .rcc/qmlcache/nextnotes_qml/NotesContentPopover_qml.cpp.aotstats +[241/293] Generating .rcc/qmlcache/nextnotes_qml/NotesSettings_qml.cpp, .rcc/qmlcache/nextnotes_qml/NotesSettings_qml.cpp.aotstats +[242/293] Generating .rcc/qmlcache/nextnotes_qml/NotesWindowControls_qml.cpp, .rcc/qmlcache/nextnotes_qml/NotesWindowControls_qml.cpp.aotstats +[243/293] Generating .rcc/qmlcache/nextnotes_qml/LibraryActions_qml.cpp, .rcc/qmlcache/nextnotes_qml/LibraryActions_qml.cpp.aotstats +[244/293] Generating .rcc/qmlcache/nextnotes_qml/RecycleBin_qml.cpp, .rcc/qmlcache/nextnotes_qml/RecycleBin_qml.cpp.aotstats +[245/293] Generating .rcc/qmlcache/nextnotes_qml/KnowledgePanel_qml.cpp, .rcc/qmlcache/nextnotes_qml/KnowledgePanel_qml.cpp.aotstats +[246/293] Generating .rcc/qmlcache/nextnotes_qml/NoteNameEditor_qml.cpp, .rcc/qmlcache/nextnotes_qml/NoteNameEditor_qml.cpp.aotstats +[247/293] Generating .rcc/qmlcache/nextnotes_qml/SourceEditor_qml.cpp, .rcc/qmlcache/nextnotes_qml/SourceEditor_qml.cpp.aotstats +[248/293] Generating .rcc/qmlcache/nextnotes_qml/NotesOrganizer_qml.cpp, .rcc/qmlcache/nextnotes_qml/NotesOrganizer_qml.cpp.aotstats +[249/293] Generating .rcc/qmlcache/nextnotes_qml/CommandRegistry_qml.cpp, .rcc/qmlcache/nextnotes_qml/CommandRegistry_qml.cpp.aotstats +[250/293] Generating .rcc/qmlcache/nextnotes_qml/EditorTools_qml.cpp, .rcc/qmlcache/nextnotes_qml/EditorTools_qml.cpp.aotstats +[251/293] Generating .rcc/qmlcache/nextnotes_qml/NotesTokens_qml.cpp, .rcc/qmlcache/nextnotes_qml/NotesTokens_qml.cpp.aotstats +[252/293] Generating .rcc/qmlcache/nextnotes_qml/NoteReadingView_qml.cpp, .rcc/qmlcache/nextnotes_qml/NoteReadingView_qml.cpp.aotstats +[253/293] Generating .rcc/qmlcache/nextnotes_qml/Main_qml.cpp, .rcc/qmlcache/nextnotes_qml/Main_qml.cpp.aotstats +[254/293] Running rcc for resource editor-assets +[255/293] Building CXX object CMakeFiles/nextnotes.dir/src/EditorSessionWeb.cpp.o +[256/293] Building CXX object CMakeFiles/nextnotes.dir/src/EditorSession.cpp.o +[257/293] Building CXX object CMakeFiles/nextnotes.dir/src/main.cpp.o +[258/293] Building CXX object CMakeFiles/nextnotes.dir/nextnotes_autogen/mocs_compilation.cpp.o +[259/293] Building CXX object CMakeFiles/nextnotes.dir/src/EditorExport.cpp.o +[260/293] Building CXX object CMakeFiles/nextnotes.dir/src/PdfExport.cpp.o +[261/293] Building CXX object CMakeFiles/nextnotes.dir/src/NotesLibrary.cpp.o +[262/293] Building CXX object CMakeFiles/nextnotes.dir/src/NotesOrganizer.cpp.o +[263/293] Building CXX object CMakeFiles/nextnotes.dir/src/NotesKnowledge.cpp.o +[264/293] Building CXX object CMakeFiles/nextnotes.dir/.qt/rcc/qrc_qmake_NextNotes.cpp.o +[265/293] Building CXX object CMakeFiles/nextnotes.dir/src/EditorRenderLifecycle.cpp.o +[266/293] Building CXX object CMakeFiles/nextnotes.dir/nextnotes_qmltyperegistrations.cpp.o +[267/293] Building CXX object CMakeFiles/nextnotes.dir/src/NotesController.cpp.o +[268/293] Building CXX object CMakeFiles/nextnotes.dir/.rcc/qmlcache/nextnotes_qml/NotesSelectionBox_qml.cpp.o +[269/293] Building CXX object CMakeFiles/nextnotes.dir/.rcc/qmlcache/nextnotes_qmlcache_loader.cpp.o +[270/293] Building CXX object CMakeFiles/nextnotes.dir/.rcc/qmlcache/nextnotes_qml/FolderIcons_js.cpp.o +[271/293] Building CXX object CMakeFiles/nextnotes.dir/.rcc/qmlcache/nextnotes_qml/PopupPlacement_js.cpp.o +[272/293] Building CXX object CMakeFiles/nextnotes.dir/.rcc/qmlcache/nextnotes_qml/NotesPopover_qml.cpp.o +[273/293] Building CXX object CMakeFiles/nextnotes.dir/.rcc/qmlcache/nextnotes_qml/NotesContentPopover_qml.cpp.o +[274/293] Building CXX object CMakeFiles/nextnotes.dir/.rcc/qmlcache/nextnotes_qml/NotesSettings_qml.cpp.o +[275/293] Building CXX object CMakeFiles/nextnotes.dir/.rcc/qmlcache/nextnotes_qml/NotesWindowControls_qml.cpp.o +[276/293] Building CXX object CMakeFiles/nextnotes.dir/.rcc/qmlcache/nextnotes_qml/LibraryActions_qml.cpp.o +[277/293] Building CXX object CMakeFiles/nextnotes.dir/.rcc/qmlcache/nextnotes_qml/KnowledgePanel_qml.cpp.o +[278/293] Building CXX object CMakeFiles/nextnotes.dir/.rcc/qmlcache/nextnotes_qml/RecycleBin_qml.cpp.o +[279/293] Building CXX object CMakeFiles/nextnotes.dir/.rcc/qmlcache/nextnotes_qml/NoteNameEditor_qml.cpp.o +[280/293] Building CXX object CMakeFiles/nextnotes.dir/.rcc/qmlcache/nextnotes_qml/NotesOrganizer_qml.cpp.o +[281/293] Building CXX object CMakeFiles/nextnotes.dir/.rcc/qmlcache/nextnotes_qml/EditorTools_qml.cpp.o +[282/293] Building CXX object CMakeFiles/nextnotes.dir/.rcc/qmlcache/nextnotes_qml/SourceEditor_qml.cpp.o +[283/293] Building CXX object CMakeFiles/nextnotes.dir/.rcc/qmlcache/nextnotes_qml/CommandRegistry_qml.cpp.o +[284/293] Building CXX object CMakeFiles/nextnotes.dir/.qt/rcc/qrc_nextnotes_raw_qml_0.cpp.o +[285/293] Building CXX object CMakeFiles/nextnotes.dir/.qt/rcc/qrc_nextnotes_raw_qml_0_extra_qmldirs.cpp.o +[286/293] Building CXX object CMakeFiles/nextnotes.dir/.qt/rcc/qrc_window-controls.cpp.o +[287/293] Building CXX object CMakeFiles/nextnotes.dir/.qt/rcc/qrc_app-icon.cpp.o +[288/293] Building CXX object CMakeFiles/nextnotes.dir/.rcc/qmlcache/nextnotes_qml/Main_qml.cpp.o +[289/293] Building CXX object CMakeFiles/nextnotes.dir/.qt/rcc/qrc_editor-assets.cpp.o +[290/293] Building CXX object CMakeFiles/nextnotes.dir/.rcc/qmlcache/nextnotes_qml/NotesTokens_qml.cpp.o +[291/293] Building CXX object CMakeFiles/nextnotes.dir/.rcc/qmlcache/nextnotes_qml/NoteReadingView_qml.cpp.o +[292/293] Linking CXX executable nextnotes diff --git a/output/editor-interaction-2026-11-11/ci-provisioning-failure.json b/output/editor-interaction-2026-11-11/ci-provisioning-failure.json new file mode 100644 index 0000000..dbb4182 --- /dev/null +++ b/output/editor-interaction-2026-11-11/ci-provisioning-failure.json @@ -0,0 +1,220 @@ +{ + "conclusion": "cancelled", + "createdAt": "2026-11-11T14:04:58Z", + "databaseId": 43035039939, + "headSha": "1a187cbcc101f766e3c2a2b5ca5db5f8d341cb87", + "jobs": [ + { + "completedAt": "2026-11-11T15:05:16Z", + "conclusion": "cancelled", + "databaseId": 130571532818, + "name": "build", + "startedAt": "2026-11-11T14:05:01Z", + "status": "completed", + "steps": [ + { + "completedAt": "2026-11-11T14:05:03Z", + "conclusion": "success", + "name": "Set up job", + "number": 1, + "startedAt": "2026-11-11T14:05:02Z", + "status": "completed" + }, + { + "completedAt": "2026-11-11T14:05:05Z", + "conclusion": "success", + "name": "Run actions/checkout@v4", + "number": 2, + "startedAt": "2026-11-11T14:05:03Z", + "status": "completed" + }, + { + "completedAt": "2026-11-11T15:05:14Z", + "conclusion": "cancelled", + "name": "Provision isolated SDK and runtime", + "number": 3, + "startedAt": "2026-11-11T14:05:05Z", + "status": "completed" + }, + { + "completedAt": "2026-11-11T15:05:14Z", + "conclusion": "skipped", + "name": "Pin source and record environment", + "number": 4, + "startedAt": "2026-11-11T15:05:14Z", + "status": "completed" + }, + { + "completedAt": "2026-11-11T15:05:14Z", + "conclusion": "skipped", + "name": "Build application and corresponding sources", + "number": 5, + "startedAt": "2026-11-11T15:05:14Z", + "status": "completed" + }, + { + "completedAt": "2026-11-11T15:05:14Z", + "conclusion": "skipped", + "name": "Run targeted regressions inside SDK", + "number": 6, + "startedAt": "2026-11-11T15:05:14Z", + "status": "completed" + }, + { + "completedAt": "2026-11-11T15:05:14Z", + "conclusion": "skipped", + "name": "Export bundle and exact release plan", + "number": 7, + "startedAt": "2026-11-11T15:05:14Z", + "status": "completed" + }, + { + "completedAt": "2026-11-11T15:05:14Z", + "conclusion": "skipped", + "name": "Install and exercise offline in disposable profile", + "number": 8, + "startedAt": "2026-11-11T15:05:14Z", + "status": "completed" + }, + { + "completedAt": "2026-11-11T15:05:14Z", + "conclusion": "skipped", + "name": "Retain evidence and checksums", + "number": 9, + "startedAt": "2026-11-11T15:05:14Z", + "status": "completed" + }, + { + "completedAt": "2026-11-11T15:05:14Z", + "conclusion": "skipped", + "name": "Run actions/upload-artifact@v4", + "number": 10, + "startedAt": "2026-11-11T15:05:14Z", + "status": "completed" + }, + { + "completedAt": "2026-11-11T15:05:14Z", + "conclusion": "skipped", + "name": "Run actions/upload-artifact@v4", + "number": 11, + "startedAt": "2026-11-11T15:05:14Z", + "status": "completed" + }, + { + "completedAt": "2026-11-11T15:05:14Z", + "conclusion": "success", + "name": "Post Run actions/checkout@v4", + "number": 22, + "startedAt": "2026-11-11T15:05:14Z", + "status": "completed" + }, + { + "completedAt": "2026-11-11T15:05:14Z", + "conclusion": "success", + "name": "Complete job", + "number": 23, + "startedAt": "2026-11-11T15:05:14Z", + "status": "completed" + } + ], + "url": "https://github.com/NextKde/NkNotes/actions/runs/43035039939/job/130571532818" + } + ], + "status": "completed", + "updatedAt": "2026-11-11T15:05:17Z", + "url": "https://github.com/NextKde/NkNotes/actions/runs/43035039939", + "retrievedAt": "2026-11-11T15:12:00.442319+00:00", + "classification": "infrastructure_failure", + "failureCause": "Runner Ubuntu APT provisioning repeatedly failed DNS resolution for azure.archive.ubuntu.com; job terminated at the configured 60-minute timeout before Flatpak SDK install or application build.", + "annotations": [ + { + "path": ".github", + "blob_href": "https://github.com/NextKde/NkNotes/blob/1a187cbcc101f766e3c2a2b5ca5db5f8d341cb87/.github", + "start_line": 1, + "start_column": null, + "end_line": 1, + "end_column": null, + "annotation_level": "failure", + "title": "", + "message": "The job has exceeded the maximum execution time of 1h0m0s", + "raw_details": "" + }, + { + "path": ".github", + "blob_href": "https://github.com/NextKde/NkNotes/blob/1a187cbcc101f766e3c2a2b5ca5db5f8d341cb87/.github", + "start_line": 2, + "start_column": null, + "end_line": 2, + "end_column": null, + "annotation_level": "warning", + "title": "", + "message": "Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/", + "raw_details": "" + }, + { + "path": ".github", + "blob_href": "https://github.com/NextKde/NkNotes/blob/1a187cbcc101f766e3c2a2b5ca5db5f8d341cb87/.github", + "start_line": 346, + "start_column": null, + "end_line": 346, + "end_column": null, + "annotation_level": "failure", + "title": "", + "message": "The operation was canceled.", + "raw_details": "" + } + ], + "logFile": "ci-provisioning-failure.log", + "relatedRuns": [ + { + "databaseId": 43037636394, + "url": "https://github.com/NextKde/NkNotes/actions/runs/43037636394", + "jobUrl": "https://github.com/NextKde/NkNotes/actions/runs/43037636394/job/130580623956", + "headSha": "e49ccf7f31ad9a7c17a7c19ad84c75dd1456fd68", + "startedAt": "2026-11-11T14:21:14Z", + "completedAt": "2026-11-11T15:21:30Z", + "status": "completed", + "conclusion": "cancelled", + "classification": "infrastructure_failure", + "failureCause": "Same Ubuntu APT DNS resolution failure as run 43035039939; provisioning did not finish before the 60-minute job timeout. Application build and SDK regressions were skipped.", + "firstDnsFailureAt": "2026-11-11T14:23:41.5233732Z", + "lastDnsFailureAt": "2026-11-11T15:21:09.6859122Z", + "provisioningCanceledAt": "2026-11-11T15:21:26.9322196Z", + "logExcerpts": [ + "build\tProvision isolated SDK and runtime\t2026-11-11T14:23:41.5233732Z Temporary failure resolving 'azure.archive.ubuntu.com'", + "build\tProvision isolated SDK and runtime\t2026-11-11T14:24:48.3130957Z W: Failed to fetch mirror+file:/etc/apt/apt-mirrors.txt/dists/noble/InRelease Temporary failure resolving 'azure.archive.ubuntu.com'", + "build\tProvision isolated SDK and runtime\t2026-11-11T15:21:09.6859122Z Temporary failure resolving 'azure.archive.ubuntu.com'", + "build\tProvision isolated SDK and runtime\t2026-11-11T15:21:26.9322196Z ##[error]The operation was canceled." + ], + "failureAnnotations": [ + "The job has exceeded the maximum execution time of 1h0m0s", + "The operation was canceled." + ] + }, + { + "databaseId": 43042696213, + "url": "https://github.com/NextKde/NkNotes/actions/runs/43042696213", + "jobUrl": "https://github.com/NextKde/NkNotes/actions/runs/43042696213/job/130598388314", + "headSha": "8e13e6f4f767f072679f0bce32bd16796243435e", + "startedAt": "2026-11-11T14:52:36Z", + "completedAt": "2026-11-11T15:52:51Z", + "status": "completed", + "conclusion": "cancelled", + "classification": "infrastructure_failure", + "failureCause": "Same Ubuntu APT DNS resolution failure as the two earlier runs; provisioning did not finish before the 60-minute job timeout. No Flatpak SDK download occurred; application build and SDK regressions were skipped.", + "firstDnsFailureAt": "2026-11-11T14:55:01.3256722Z", + "lastDnsFailureAt": "2026-11-11T15:52:43.1301904Z", + "provisioningCanceledAt": "2026-11-11T15:52:48.8404887Z", + "logExcerpts": [ + "build\tProvision isolated SDK and runtime\t2026-11-11T14:55:01.3256722Z Temporary failure resolving 'azure.archive.ubuntu.com'", + "build\tProvision isolated SDK and runtime\t2026-11-11T14:56:04.7428956Z W: Failed to fetch mirror+file:/etc/apt/apt-mirrors.txt/dists/noble/InRelease Temporary failure resolving 'azure.archive.ubuntu.com'", + "build\tProvision isolated SDK and runtime\t2026-11-11T15:52:43.1301904Z Temporary failure resolving 'azure.archive.ubuntu.com'", + "build\tProvision isolated SDK and runtime\t2026-11-11T15:52:48.8404887Z ##[error]The operation was canceled." + ], + "failureAnnotations": [ + "The job has exceeded the maximum execution time of 1h0m0s", + "The operation was canceled." + ] + } + ] +} diff --git a/output/editor-interaction-2026-11-11/ci-provisioning-failure.log b/output/editor-interaction-2026-11-11/ci-provisioning-failure.log new file mode 100644 index 0000000..97ed9ac --- /dev/null +++ b/output/editor-interaction-2026-11-11/ci-provisioning-failure.log @@ -0,0 +1,518 @@ +build Set up job 2026-11-11T14:05:02.5323801Z Current runner version: '2.338.2' +build Set up job 2026-11-11T14:05:02.5361100Z ##[group]Runner Image Provisioner +build Set up job 2026-11-11T14:05:02.5362487Z Hosted Compute Agent +build Set up job 2026-11-11T14:05:02.5363493Z Version: 20261028.624 +build Set up job 2026-11-11T14:05:02.5364606Z Commit: 54898b74c23fde5556c9b3c3a2290865feef0dfe +build Set up job 2026-11-11T14:05:02.5365928Z Build Date: 2026-10-28T21:51:42Z +build Set up job 2026-11-11T14:05:02.5367189Z Worker ID: {e36f421a-1a17-47fd-8128-783587109adc} +build Set up job 2026-11-11T14:05:02.5368385Z Region: eastus2 +build Set up job 2026-11-11T14:05:02.5369638Z Cloud: Azure +build Set up job 2026-11-11T14:05:02.5370648Z ##[endgroup] +build Set up job 2026-11-11T14:05:02.5373494Z ##[group]Operating System +build Set up job 2026-11-11T14:05:02.5374657Z Ubuntu +build Set up job 2026-11-11T14:05:02.5375525Z 24.04.5 +build Set up job 2026-11-11T14:05:02.5376396Z LTS +build Set up job 2026-11-11T14:05:02.5377389Z ##[endgroup] +build Set up job 2026-11-11T14:05:02.5378260Z ##[group]Runner Image +build Set up job 2026-11-11T14:05:02.5379660Z Image: ubuntu-24.04 +build Set up job 2026-11-11T14:05:02.5380661Z Version: 20261101.360.1 +build Set up job 2026-11-11T14:05:02.5382595Z Included Software: https://github.com/actions/runner-images/blob/ubuntu24/20261101.360/images/ubuntu/Ubuntu2404-Readme.md +build Set up job 2026-11-11T14:05:02.5385723Z Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20261101.360 +build Set up job 2026-11-11T14:05:02.5387454Z ##[endgroup] +build Set up job 2026-11-11T14:05:02.5389552Z ##[group]GITHUB_TOKEN Permissions +build Set up job 2026-11-11T14:05:02.5392505Z Contents: read +build Set up job 2026-11-11T14:05:02.5393500Z Metadata: read +build Set up job 2026-11-11T14:05:02.5394515Z ##[endgroup] +build Set up job 2026-11-11T14:05:02.5397486Z Secret source: Actions +build Set up job 2026-11-11T14:05:02.5399305Z Cache mode: write +build Set up job 2026-11-11T14:05:02.5400598Z Prepare workflow directory +build Set up job 2026-11-11T14:05:02.5976861Z Prepare all required actions +build Set up job 2026-11-11T14:05:02.6049973Z Getting action download info +build Set up job 2026-11-11T14:05:02.8275365Z Download action repository 'actions/checkout@v4' (SHA:11d5960a326750d5838078e36cf38b85af677262) +build Set up job 2026-11-11T14:05:03.0147177Z Download action repository 'actions/upload-artifact@v4' (SHA:ea165f8d65b6e75b540449e92b4886f43607fa02) +build Set up job 2026-11-11T14:05:03.2238328Z Complete job name: build +build Run actions/checkout@v4 2026-11-11T14:05:03.3174270Z ##[group]Run actions/checkout@v4 +build Run actions/checkout@v4 2026-11-11T14:05:03.3175194Z with: +build Run actions/checkout@v4 2026-11-11T14:05:03.3175680Z ref: 1a187cbcc101f766e3c2a2b5ca5db5f8d341cb87 +build Run actions/checkout@v4 2026-11-11T14:05:03.3176277Z submodules: recursive +build Run actions/checkout@v4 2026-11-11T14:05:03.3176760Z persist-credentials: false +build Run actions/checkout@v4 2026-11-11T14:05:03.3177274Z repository: NextKde/NkNotes +build Run actions/checkout@v4 2026-11-11T14:05:03.3181489Z token: *** +build Run actions/checkout@v4 2026-11-11T14:05:03.3181931Z ssh-strict: true +build Run actions/checkout@v4 2026-11-11T14:05:03.3182466Z ssh-user: git +build Run actions/checkout@v4 2026-11-11T14:05:03.3182883Z clean: true +build Run actions/checkout@v4 2026-11-11T14:05:03.3183326Z sparse-checkout-cone-mode: true +build Run actions/checkout@v4 2026-11-11T14:05:03.3183847Z fetch-depth: 1 +build Run actions/checkout@v4 2026-11-11T14:05:03.3184265Z fetch-tags: false +build Run actions/checkout@v4 2026-11-11T14:05:03.3184697Z show-progress: true +build Run actions/checkout@v4 2026-11-11T14:05:03.3185135Z lfs: false +build Run actions/checkout@v4 2026-11-11T14:05:03.3185560Z set-safe-directory: true +build Run actions/checkout@v4 2026-11-11T14:05:03.3186068Z allow-unsafe-pr-checkout: false +build Run actions/checkout@v4 2026-11-11T14:05:03.3186852Z ##[endgroup] +build Run actions/checkout@v4 2026-11-11T14:05:03.6726664Z Syncing repository: NextKde/NkNotes +build Run actions/checkout@v4 2026-11-11T14:05:03.6730027Z ##[group]Getting Git version info +build Run actions/checkout@v4 2026-11-11T14:05:03.6731543Z Working directory is '/home/runner/work/NkNotes/NkNotes' +build Run actions/checkout@v4 2026-11-11T14:05:03.6733131Z [command]/usr/bin/git version +build Run actions/checkout@v4 2026-11-11T14:05:03.6849117Z git version 2.56.0 +build Run actions/checkout@v4 2026-11-11T14:05:03.6871690Z ##[endgroup] +build Run actions/checkout@v4 2026-11-11T14:05:03.6888420Z Temporarily overriding HOME='/home/runner/work/_temp/74cfe893-69ca-4ab6-96c7-2cbd85c0cacf' before making global git config changes +build Run actions/checkout@v4 2026-11-11T14:05:03.6891274Z Adding repository directory to the temporary git global config as a safe directory +build Run actions/checkout@v4 2026-11-11T14:05:03.6901153Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/NkNotes/NkNotes +build Run actions/checkout@v4 2026-11-11T14:05:03.6963147Z Deleting the contents of '/home/runner/work/NkNotes/NkNotes' +build Run actions/checkout@v4 2026-11-11T14:05:03.6969158Z ##[group]Initializing the repository +build Run actions/checkout@v4 2026-11-11T14:05:03.6999698Z [command]/usr/bin/git init /home/runner/work/NkNotes/NkNotes +build Run actions/checkout@v4 2026-11-11T14:05:03.7141533Z hint: Using 'master' as the name for the initial branch. This default branch name +build Run actions/checkout@v4 2026-11-11T14:05:03.7143984Z hint: will change to "main" in Git 3.0. To configure the initial branch name +build Run actions/checkout@v4 2026-11-11T14:05:03.7146587Z hint: to use in all of your new repositories, which will suppress this warning, +build Run actions/checkout@v4 2026-11-11T14:05:03.7148256Z hint: call: +build Run actions/checkout@v4 2026-11-11T14:05:03.7149612Z hint: +build Run actions/checkout@v4 2026-11-11T14:05:03.7150913Z hint: git config --global init.defaultBranch +build Run actions/checkout@v4 2026-11-11T14:05:03.7152368Z hint: +build Run actions/checkout@v4 2026-11-11T14:05:03.7153742Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and +build Run actions/checkout@v4 2026-11-11T14:05:03.7155920Z hint: 'development'. The just-created branch can be renamed via this command: +build Run actions/checkout@v4 2026-11-11T14:05:03.7157784Z hint: +build Run actions/checkout@v4 2026-11-11T14:05:03.7159022Z hint: git branch -m +build Run actions/checkout@v4 2026-11-11T14:05:03.7160310Z hint: +build Run actions/checkout@v4 2026-11-11T14:05:03.7163011Z hint: Disable this message with "git config set advice.defaultBranchName false" +build Run actions/checkout@v4 2026-11-11T14:05:03.7165393Z Initialized empty Git repository in /home/runner/work/NkNotes/NkNotes/.git/ +build Run actions/checkout@v4 2026-11-11T14:05:03.7170709Z [command]/usr/bin/git remote add origin https://github.com/NextKde/NkNotes +build Run actions/checkout@v4 2026-11-11T14:05:03.7226562Z ##[endgroup] +build Run actions/checkout@v4 2026-11-11T14:05:03.7228169Z ##[group]Disabling automatic garbage collection +build Run actions/checkout@v4 2026-11-11T14:05:03.7229956Z [command]/usr/bin/git config --local gc.auto 0 +build Run actions/checkout@v4 2026-11-11T14:05:03.7269463Z ##[endgroup] +build Run actions/checkout@v4 2026-11-11T14:05:03.7271518Z ##[group]Setting up auth +build Run actions/checkout@v4 2026-11-11T14:05:03.7277509Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +build Run actions/checkout@v4 2026-11-11T14:05:03.7321914Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +build Run actions/checkout@v4 2026-11-11T14:05:03.7801391Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +build Run actions/checkout@v4 2026-11-11T14:05:03.7851859Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +build Run actions/checkout@v4 2026-11-11T14:05:03.8098836Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +build Run actions/checkout@v4 2026-11-11T14:05:03.8146406Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +build Run actions/checkout@v4 2026-11-11T14:05:03.8395561Z [command]/usr/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic *** +build Run actions/checkout@v4 2026-11-11T14:05:03.8446947Z ##[endgroup] +build Run actions/checkout@v4 2026-11-11T14:05:03.8448010Z ##[group]Fetching the repository +build Run actions/checkout@v4 2026-11-11T14:05:03.8461257Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --depth=1 origin 1a187cbcc101f766e3c2a2b5ca5db5f8d341cb87 +build Run actions/checkout@v4 2026-11-11T14:05:04.4375794Z From https://github.com/NextKde/NkNotes +build Run actions/checkout@v4 2026-11-11T14:05:04.4378317Z * branch 1a187cbcc101f766e3c2a2b5ca5db5f8d341cb87 -> FETCH_HEAD +build Run actions/checkout@v4 2026-11-11T14:05:04.4382844Z ##[endgroup] +build Run actions/checkout@v4 2026-11-11T14:05:04.4384212Z ##[group]Determining the checkout info +build Run actions/checkout@v4 2026-11-11T14:05:04.4385785Z ##[endgroup] +build Run actions/checkout@v4 2026-11-11T14:05:04.4392273Z [command]/usr/bin/git sparse-checkout disable +build Run actions/checkout@v4 2026-11-11T14:05:04.4456457Z [command]/usr/bin/git config --local --unset-all extensions.worktreeConfig +build Run actions/checkout@v4 2026-11-11T14:05:04.4494693Z ##[group]Checking out the ref +build Run actions/checkout@v4 2026-11-11T14:05:04.4498002Z [command]/usr/bin/git checkout --progress --force 1a187cbcc101f766e3c2a2b5ca5db5f8d341cb87 +build Run actions/checkout@v4 2026-11-11T14:05:04.5369301Z Note: switching to '1a187cbcc101f766e3c2a2b5ca5db5f8d341cb87'. +build Run actions/checkout@v4 2026-11-11T14:05:04.5370776Z +build Run actions/checkout@v4 2026-11-11T14:05:04.5371762Z You are in 'detached HEAD' state. You can look around, make experimental +build Run actions/checkout@v4 2026-11-11T14:05:04.5374090Z changes and commit them, and you can discard any commits you make in this +build Run actions/checkout@v4 2026-11-11T14:05:04.5376339Z state without impacting any branches by switching back to a branch. +build Run actions/checkout@v4 2026-11-11T14:05:04.5377773Z +build Run actions/checkout@v4 2026-11-11T14:05:04.5379073Z If you want to create a new branch to retain commits you create, you may +build Run actions/checkout@v4 2026-11-11T14:05:04.5381728Z do so (now or later) by using -c with the switch command. Example: +build Run actions/checkout@v4 2026-11-11T14:05:04.5383245Z +build Run actions/checkout@v4 2026-11-11T14:05:04.5384067Z git switch -c +build Run actions/checkout@v4 2026-11-11T14:05:04.5385830Z +build Run actions/checkout@v4 2026-11-11T14:05:04.5386721Z Or undo this operation with: +build Run actions/checkout@v4 2026-11-11T14:05:04.5387872Z +build Run actions/checkout@v4 2026-11-11T14:05:04.5388925Z git switch - +build Run actions/checkout@v4 2026-11-11T14:05:04.5390012Z +build Run actions/checkout@v4 2026-11-11T14:05:04.5391571Z Turn off this advice by setting config variable advice.detachedHead to false +build Run actions/checkout@v4 2026-11-11T14:05:04.5393632Z +build Run actions/checkout@v4 2026-11-11T14:05:04.5395169Z HEAD is now at 1a187cb fix(editor): align block feedback and simplify search controls +build Run actions/checkout@v4 2026-11-11T14:05:04.5401592Z ##[endgroup] +build Run actions/checkout@v4 2026-11-11T14:05:04.5404378Z ##[group]Setting up auth for fetching submodules +build Run actions/checkout@v4 2026-11-11T14:05:04.5408082Z [command]/usr/bin/git config --global http.https://github.com/.extraheader AUTHORIZATION: basic *** +build Run actions/checkout@v4 2026-11-11T14:05:04.5449331Z [command]/usr/bin/git config --global --unset-all url.https://github.com/.insteadOf +build Run actions/checkout@v4 2026-11-11T14:05:04.5577939Z [command]/usr/bin/git config --global --add url.https://github.com/.insteadOf git@github.com: +build Run actions/checkout@v4 2026-11-11T14:05:04.5584846Z [command]/usr/bin/git config --global --add url.https://github.com/.insteadOf org-332737949@github.com: +build Run actions/checkout@v4 2026-11-11T14:05:04.5589999Z ##[endgroup] +build Run actions/checkout@v4 2026-11-11T14:05:04.5591942Z ##[group]Fetching submodules +build Run actions/checkout@v4 2026-11-11T14:05:04.5593648Z [command]/usr/bin/git submodule sync --recursive +build Run actions/checkout@v4 2026-11-11T14:05:04.5835490Z [command]/usr/bin/git -c protocol.version=2 submodule update --init --force --depth=1 --recursive +build Run actions/checkout@v4 2026-11-11T14:05:04.6073506Z Submodule 'third_party/nextkdeAppDemo' (https://github.com/NextKde/nextkdeAppDemo.git) registered for path 'third_party/nextkdeAppDemo' +build Run actions/checkout@v4 2026-11-11T14:05:04.6098348Z Cloning into '/home/runner/work/NkNotes/NkNotes/third_party/nextkdeAppDemo'... +build Run actions/checkout@v4 2026-11-11T14:05:05.3479789Z Submodule path 'third_party/nextkdeAppDemo': checked out '40c6007a95db864683924056adbf0f6385dcb7e3' +build Run actions/checkout@v4 2026-11-11T14:05:05.3511594Z [command]/usr/bin/git submodule foreach --recursive git config --local gc.auto 0 +build Run actions/checkout@v4 2026-11-11T14:05:05.3740192Z Entering 'third_party/nextkdeAppDemo' +build Run actions/checkout@v4 2026-11-11T14:05:05.3804030Z ##[endgroup] +build Run actions/checkout@v4 2026-11-11T14:05:05.3856855Z [command]/usr/bin/git log -1 --format=%H +build Run actions/checkout@v4 2026-11-11T14:05:05.3890833Z 1a187cbcc101f766e3c2a2b5ca5db5f8d341cb87 +build Run actions/checkout@v4 2026-11-11T14:05:05.3902089Z ##[group]Removing auth +build Run actions/checkout@v4 2026-11-11T14:05:05.3906304Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +build Run actions/checkout@v4 2026-11-11T14:05:05.3946562Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +build Run actions/checkout@v4 2026-11-11T14:05:05.4169707Z Entering 'third_party/nextkdeAppDemo' +build Run actions/checkout@v4 2026-11-11T14:05:05.4232416Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +build Run actions/checkout@v4 2026-11-11T14:05:05.4268215Z http.https://github.com/.extraheader +build Run actions/checkout@v4 2026-11-11T14:05:05.4280049Z [command]/usr/bin/git config --local --unset-all http.https://github.com/.extraheader +build Run actions/checkout@v4 2026-11-11T14:05:05.4333447Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +build Run actions/checkout@v4 2026-11-11T14:05:05.4556719Z Entering 'third_party/nextkdeAppDemo' +build Run actions/checkout@v4 2026-11-11T14:05:05.4614701Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +build Run actions/checkout@v4 2026-11-11T14:05:05.4657110Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +build Run actions/checkout@v4 2026-11-11T14:05:05.4884289Z Entering 'third_party/nextkdeAppDemo' +build Run actions/checkout@v4 2026-11-11T14:05:05.4916065Z file:/home/runner/work/NkNotes/NkNotes/.git/modules/third_party/nextkdeAppDemo/config remote.origin.url +build Run actions/checkout@v4 2026-11-11T14:05:05.4956960Z [command]/usr/bin/git config --file /home/runner/work/NkNotes/NkNotes/.git/modules/third_party/nextkdeAppDemo/config --name-only --get-regexp ^includeIf\.gitdir: +build Run actions/checkout@v4 2026-11-11T14:05:05.4995204Z ##[endgroup] +build Provision isolated SDK and runtime 2026-11-11T14:05:05.5218245Z ##[group]Run sudo apt-get update +build Provision isolated SDK and runtime 2026-11-11T14:05:05.5219069Z ^[[36;1msudo apt-get update^[[0m +build Provision isolated SDK and runtime 2026-11-11T14:05:05.5219743Z ^[[36;1msudo apt-get install -y flatpak flatpak-builder ostree python3-gi gir1.2-flatpak-1.0 xvfb xdotool dbus-x11 imagemagick^[[0m +build Provision isolated SDK and runtime 2026-11-11T14:05:05.5220868Z ^[[36;1mflatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo^[[0m +build Provision isolated SDK and runtime 2026-11-11T14:05:05.5221771Z ^[[36;1mflatpak install --user --noninteractive --assumeyes flathub org.kde.Sdk//6.11 org.kde.Platform//6.11 io.qt.qtwebengine.BaseApp//6.11^[[0m +build Provision isolated SDK and runtime 2026-11-11T14:05:05.5246381Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +build Provision isolated SDK and runtime 2026-11-11T14:05:05.5246817Z ##[endgroup] +build Provision isolated SDK and runtime 2026-11-11T14:05:05.6112349Z Get:1 file:/etc/apt/apt-mirrors.txt Mirrorlist [144 B] +build Provision isolated SDK and runtime 2026-11-11T14:05:05.6436576Z Get:6 https://packages.microsoft.com/ubuntu/24.04/prod noble InRelease [3600 B] +build Provision isolated SDK and runtime 2026-11-11T14:05:05.7371686Z Get:7 https://packages.microsoft.com/ubuntu/24.04/prod noble/main amd64 Packages [760 kB] +build Provision isolated SDK and runtime 2026-11-11T14:05:05.7572833Z Get:8 https://packages.microsoft.com/ubuntu/24.04/prod noble/main armhf Packages [12.6 kB] +build Provision isolated SDK and runtime 2026-11-11T14:05:05.7614877Z Get:9 https://packages.microsoft.com/ubuntu/24.04/prod noble/main arm64 Packages [690 kB] +build Provision isolated SDK and runtime 2026-11-11T14:05:25.3657644Z Ign:2 http://azure.archive.ubuntu.com/ubuntu noble InRelease +build Provision isolated SDK and runtime 2026-11-11T14:05:45.2579845Z Ign:3 http://azure.archive.ubuntu.com/ubuntu noble-updates InRelease +build Provision isolated SDK and runtime 2026-11-11T14:06:05.2792968Z Ign:4 http://azure.archive.ubuntu.com/ubuntu noble-backports InRelease +build Provision isolated SDK and runtime 2026-11-11T14:06:25.1420093Z Ign:5 http://azure.archive.ubuntu.com/ubuntu noble-security InRelease +build Provision isolated SDK and runtime 2026-11-11T14:06:44.5874664Z Ign:2 http://azure.archive.ubuntu.com/ubuntu noble InRelease +build Provision isolated SDK and runtime 2026-11-11T14:07:04.6107237Z Ign:2 https://archive.ubuntu.com/ubuntu noble InRelease +build Provision isolated SDK and runtime 2026-11-11T14:07:04.6162563Z Ign:3 http://azure.archive.ubuntu.com/ubuntu noble-updates InRelease +build Provision isolated SDK and runtime 2026-11-11T14:07:24.1497622Z Ign:4 http://azure.archive.ubuntu.com/ubuntu noble-backports InRelease +build Provision isolated SDK and runtime 2026-11-11T14:07:24.6359176Z Err:2 https://security.ubuntu.com/ubuntu noble InRelease +build Provision isolated SDK and runtime 2026-11-11T14:07:24.6359974Z Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T14:07:24.6401896Z Ign:3 https://archive.ubuntu.com/ubuntu noble-updates InRelease +build Provision isolated SDK and runtime 2026-11-11T14:07:44.1698556Z Ign:5 http://azure.archive.ubuntu.com/ubuntu noble-security InRelease +build Provision isolated SDK and runtime 2026-11-11T14:07:44.6645016Z Err:3 https://security.ubuntu.com/ubuntu noble-updates InRelease +build Provision isolated SDK and runtime 2026-11-11T14:07:44.6645714Z Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T14:07:44.6685062Z Ign:4 https://archive.ubuntu.com/ubuntu noble-backports InRelease +build Provision isolated SDK and runtime 2026-11-11T14:08:00.4686198Z Ign:5 https://archive.ubuntu.com/ubuntu noble-security InRelease +build Provision isolated SDK and runtime 2026-11-11T14:08:04.6930376Z Err:4 https://security.ubuntu.com/ubuntu noble-backports InRelease +build Provision isolated SDK and runtime 2026-11-11T14:08:04.6931146Z Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T14:08:24.7149949Z Err:5 https://security.ubuntu.com/ubuntu noble-security InRelease +build Provision isolated SDK and runtime 2026-11-11T14:08:24.7150931Z Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T14:08:27.2213507Z Fetched 1467 kB in 3min 19s (7365 B/s) +build Provision isolated SDK and runtime 2026-11-11T14:08:28.3896132Z Reading package lists... +build Provision isolated SDK and runtime 2026-11-11T14:08:28.4050547Z W: Failed to fetch mirror+file:/etc/apt/apt-mirrors.txt/dists/noble/InRelease Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T14:08:28.4052910Z W: Failed to fetch mirror+file:/etc/apt/apt-mirrors.txt/dists/noble-updates/InRelease Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T14:08:28.4054599Z W: Failed to fetch mirror+file:/etc/apt/apt-mirrors.txt/dists/noble-backports/InRelease Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T14:08:28.4056464Z W: Failed to fetch mirror+file:/etc/apt/apt-mirrors.txt/dists/noble-security/InRelease Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T14:08:28.4057801Z W: Some index files failed to download. They have been ignored, or old ones used instead. +build Provision isolated SDK and runtime 2026-11-11T14:08:28.4267073Z Reading package lists... +build Provision isolated SDK and runtime 2026-11-11T14:08:28.6451888Z Building dependency tree... +build Provision isolated SDK and runtime 2026-11-11T14:08:28.6459539Z Reading state information... +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7934642Z python3-gi is already the newest version (3.48.2-1). +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7935853Z python3-gi set to manually installed. +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7936415Z xvfb is already the newest version (2:21.1.12-1ubuntu1.9). +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7937044Z The following additional packages will be installed: +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7937759Z appstream-compose bubblewrap desktop-file-utils elfutils ffmpeg +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7938584Z fonts-droid-fallback fonts-noto-mono fonts-urw-base35 ghostscript +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7939612Z gsettings-desktop-schemas i965-va-driver imagemagick-6.q16 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7940441Z intel-media-va-driver libaacs0 libappstream-compose0 libasm1t64 libass9 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7941269Z libasyncns0 libavahi-glib1 libavc1394-0 libavcodec60 libavdevice60 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7942108Z libavfilter9 libavformat60 libavutil58 libbdplus0 libblas3 libbluray2 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7942971Z libbs2b0 libcaca0 libcdio-cdda2t64 libcdio-paranoia2t64 libcdio19t64 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7943868Z libchromaprint1 libcjson1 libcodec2-1.2 libdav1d7 libdc1394-25 libdecor-0-0 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7944784Z libdecor-0-plugin-1-gtk libdjvulibre-text libdjvulibre21 libflac12t64 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7945605Z libflatpak0 libflite1 libgme0 libgs-common libgs10 libgs10-common libgsm1 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7946440Z libhwy1t64 libidn12 libiec61883-0 libigdgmm12 libijs-0.35 libimath-3-1-29t64 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7947295Z libjack-jackd2-0 libjbig2dec0 libjxl0.7 libjxr-tools libjxr0t64 liblapack3 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7948143Z liblilv-0-0 libmagickcore-6.q16-7-extra libmalcontent-0-0 libmbedcrypto7t64 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7949161Z libmp3lame0 libmpg123-0t64 libmysofa1 libnetpbm11t64 libopenal-data +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7949924Z libopenal1 libopenexr-3-1-30 libopenmpt0t64 libopus0 libostree-1-1 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7950788Z libpaper-utils libpaper1 libpipewire-0.3-0t64 libpipewire-0.3-common +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7951628Z libplacebo338 libpocketsphinx3 libpostproc57 libpulse0 librav1e0 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7952384Z libraw1394-11 librist4 librsvg2-2 librsvg2-common librubberband2 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7953219Z libsamplerate0 libsdl2-2.0-0 libserd-0-0 libshine3 libsndfile1 libsndio7.0 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7954025Z libsord-0-0 libsoxr0 libspa-0.2-modules libspeex1 libsphinxbase3t64 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7954767Z libsratom-0-0 libsrt1.5-gnutls libssh-gcrypt-4 libsvtav1enc1d1 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7955492Z libswresample4 libswscale7 libtheora0 libtwolame0 libudfread0 libunibreak5 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7956156Z libva-drm2 libva-x11-2 libva2 libvdpau1 libvidstab1.1 libvorbisenc2 libvpl2 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7956693Z libvpx9 libwebrtc-audio-processing1 libwmflite-0.2-7 libx264-164 libx265-199 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7957220Z libxcb-shape0 libxdo3 libxv1 libxvidcore4 libzimg2 libzix-0-0 libzvbi-common +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7957752Z libzvbi0t64 mesa-va-drivers mesa-vdpau-drivers netpbm ocl-icd-libopencl1 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7958263Z optipng pocketsphinx-en-us poppler-data session-migration va-driver-all +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7959305Z vdpau-driver-all xdg-dbus-proxy xdg-desktop-portal xdg-desktop-portal-gtk +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7959757Z xfonts-encodings xfonts-utils +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7960009Z Suggested packages: +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7960313Z ffmpeg-doc avahi-daemon malcontent-gui brz subversion fonts-noto +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7960783Z fonts-freefont-otf | fonts-freefont-ttf fonts-texgyre texlive-binaries +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7961431Z i965-va-driver-shaders imagemagick-6-doc autotrace cups-bsd | lpr | lprng +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7961965Z enscript gimp gnuplot grads graphviz hp2xx html2ps libwmf-bin mplayer povray +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7962442Z radiance sane-utils texlive-base-bin transfig libraw-bin libcuda1 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7962907Z libnvcuvid1 libnvidia-encode1 libbluray-bdj jackd2 inkscape libportaudio2 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7963401Z opus-tools pipewire pulseaudio libraw1394-doc librsvg2-bin serdi sndiod +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7964373Z sordi speex opencl-icd poppler-utils fonts-japanese-mincho +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7965110Z | fonts-ipafont-mincho fonts-japanese-gothic | fonts-ipafont-gothic +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7966153Z fonts-arphic-ukai fonts-arphic-uming fonts-nanum libvdpau-va-gl1 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.7966850Z accountsservice evince xdg-desktop-portal-gnome +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8574342Z The following NEW packages will be installed: +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8575242Z appstream-compose bubblewrap dbus-x11 desktop-file-utils elfutils ffmpeg +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8576179Z flatpak flatpak-builder fonts-droid-fallback fonts-noto-mono +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8577078Z fonts-urw-base35 ghostscript gir1.2-flatpak-1.0 gsettings-desktop-schemas +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8578104Z i965-va-driver imagemagick imagemagick-6.q16 intel-media-va-driver libaacs0 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8579324Z libappstream-compose0 libasm1t64 libass9 libasyncns0 libavahi-glib1 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8580224Z libavc1394-0 libavcodec60 libavdevice60 libavfilter9 libavformat60 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8581092Z libavutil58 libbdplus0 libblas3 libbluray2 libbs2b0 libcaca0 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8581971Z libcdio-cdda2t64 libcdio-paranoia2t64 libcdio19t64 libchromaprint1 libcjson1 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8583027Z libcodec2-1.2 libdav1d7 libdc1394-25 libdecor-0-0 libdecor-0-plugin-1-gtk +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8584010Z libdjvulibre-text libdjvulibre21 libflac12t64 libflatpak0 libflite1 libgme0 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8584932Z libgs-common libgs10 libgs10-common libgsm1 libhwy1t64 libidn12 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8585801Z libiec61883-0 libigdgmm12 libijs-0.35 libimath-3-1-29t64 libjack-jackd2-0 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8586676Z libjbig2dec0 libjxl0.7 libjxr-tools libjxr0t64 liblapack3 liblilv-0-0 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8587601Z libmagickcore-6.q16-7-extra libmalcontent-0-0 libmbedcrypto7t64 libmp3lame0 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8588510Z libmpg123-0t64 libmysofa1 libnetpbm11t64 libopenal-data libopenal1 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8589521Z libopenexr-3-1-30 libopenmpt0t64 libopus0 libostree-1-1 libpaper-utils +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8590410Z libpaper1 libpipewire-0.3-0t64 libpipewire-0.3-common libplacebo338 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8591287Z libpocketsphinx3 libpostproc57 libpulse0 librav1e0 libraw1394-11 librist4 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8592204Z librsvg2-2 librsvg2-common librubberband2 libsamplerate0 libsdl2-2.0-0 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8593140Z libserd-0-0 libshine3 libsndfile1 libsndio7.0 libsord-0-0 libsoxr0 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8594067Z libspa-0.2-modules libspeex1 libsphinxbase3t64 libsratom-0-0 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8594975Z libsrt1.5-gnutls libssh-gcrypt-4 libsvtav1enc1d1 libswresample4 libswscale7 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8595853Z libtheora0 libtwolame0 libudfread0 libunibreak5 libva-drm2 libva-x11-2 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8596643Z libva2 libvdpau1 libvidstab1.1 libvorbisenc2 libvpl2 libvpx9 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8597458Z libwebrtc-audio-processing1 libwmflite-0.2-7 libx264-164 libx265-199 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8598336Z libxcb-shape0 libxdo3 libxv1 libxvidcore4 libzimg2 libzix-0-0 libzvbi-common +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8599434Z libzvbi0t64 mesa-va-drivers mesa-vdpau-drivers netpbm ocl-icd-libopencl1 +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8600335Z optipng ostree pocketsphinx-en-us poppler-data session-migration +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8601176Z va-driver-all vdpau-driver-all xdg-dbus-proxy xdg-desktop-portal +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8602036Z xdg-desktop-portal-gtk xdotool xfonts-encodings xfonts-utils +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8839395Z 0 upgraded, 153 newly installed, 0 to remove and 3 not upgraded. +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8840376Z Need to get 124 MB of archives. +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8840953Z After this operation, 332 MB of additional disk space will be used. +build Provision isolated SDK and runtime 2026-11-11T14:08:28.8841678Z Get:1 file:/etc/apt/apt-mirrors.txt Mirrorlist [144 B] +build Provision isolated SDK and runtime 2026-11-11T14:08:48.9154465Z Ign:2 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 fonts-droid-fallback all 1:6.0.1r16-1.1build1 +build Provision isolated SDK and runtime 2026-11-11T14:09:08.8700574Z Ign:3 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 poppler-data all 0.4.12-1 +build Provision isolated SDK and runtime 2026-11-11T14:09:28.8942991Z Ign:4 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 librsvg2-2 amd64 2.58.0+dfsg-1ubuntu0.1 +build Provision isolated SDK and runtime 2026-11-11T14:09:48.9187774Z Ign:5 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libappstream-compose0 amd64 1.0.2-1build6 +build Provision isolated SDK and runtime 2026-11-11T14:10:08.9398446Z Ign:6 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 appstream-compose amd64 1.0.2-1build6 +build Provision isolated SDK and runtime 2026-11-11T14:10:28.9643954Z Ign:7 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 bubblewrap amd64 0.9.0-1ubuntu0.3 +build Provision isolated SDK and runtime 2026-11-11T14:10:48.9891475Z Ign:8 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 dbus-x11 amd64 1.14.10-4ubuntu4.1 +build Provision isolated SDK and runtime 2026-11-11T14:11:09.0148333Z Ign:9 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 desktop-file-utils amd64 0.27-2build1 +build Provision isolated SDK and runtime 2026-11-11T14:11:29.0388153Z Ign:10 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libasm1t64 amd64 0.190-1.1ubuntu0.1 +build Provision isolated SDK and runtime 2026-11-11T14:11:49.0636730Z Ign:11 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 elfutils amd64 0.190-1.1ubuntu0.1 +build Provision isolated SDK and runtime 2026-11-11T14:12:09.0861089Z Ign:12 http://azure.archive.ubuntu.com/ubuntu noble-updates/universe amd64 libva2 amd64 2.20.0-2ubuntu0.2 +build Provision isolated SDK and runtime 2026-11-11T14:12:29.1055140Z Ign:13 http://azure.archive.ubuntu.com/ubuntu noble-updates/universe amd64 libva-drm2 amd64 2.20.0-2ubuntu0.2 +build Provision isolated SDK and runtime 2026-11-11T14:12:46.2300051Z Ign:14 http://azure.archive.ubuntu.com/ubuntu noble-updates/universe amd64 libva-x11-2 amd64 2.20.0-2ubuntu0.2 +build Provision isolated SDK and runtime 2026-11-11T14:13:05.8843626Z Ign:15 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libvdpau1 amd64 1.5-2build1 +build Provision isolated SDK and runtime 2026-11-11T14:13:25.9052128Z Ign:16 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libvpl2 amd64 2023.3.0-1build1 +build Provision isolated SDK and runtime 2026-11-11T14:13:45.9350327Z Ign:17 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 ocl-icd-libopencl1 amd64 2.3.2-1build1 +build Provision isolated SDK and runtime 2026-11-11T14:14:05.9551148Z Ign:18 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libavutil58 amd64 7:6.1.1-3ubuntu5 +build Provision isolated SDK and runtime 2026-11-11T14:14:25.6780132Z Ign:19 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libcodec2-1.2 amd64 1.2.0-2build1 +build Provision isolated SDK and runtime 2026-11-11T14:14:45.7023921Z Ign:20 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libdav1d7 amd64 1.4.1-1build1 +build Provision isolated SDK and runtime 2026-11-11T14:15:05.7253932Z Ign:21 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libgsm1 amd64 1.0.22-1build1 +build Provision isolated SDK and runtime 2026-11-11T14:15:25.4677737Z Ign:22 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libhwy1t64 amd64 1.0.7-8.1build1 +build Provision isolated SDK and runtime 2026-11-11T14:15:45.4874060Z Ign:23 http://azure.archive.ubuntu.com/ubuntu noble-updates/universe amd64 libjxl0.7 amd64 0.7.0-10.2ubuntu6.1 +build Provision isolated SDK and runtime 2026-11-11T14:16:05.5119938Z Ign:24 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libmp3lame0 amd64 3.100-6build1 +build Provision isolated SDK and runtime 2026-11-11T14:16:25.3675716Z Ign:25 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libopus0 amd64 1.4-1build1 +build Provision isolated SDK and runtime 2026-11-11T14:16:45.3922292Z Ign:26 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 librav1e0 amd64 0.7.1-2 +build Provision isolated SDK and runtime 2026-11-11T14:17:05.1617777Z Ign:27 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libshine3 amd64 3.1.1-2build1 +build Provision isolated SDK and runtime 2026-11-11T14:17:25.1883577Z Ign:28 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libspeex1 amd64 1.2.1-2ubuntu2.24.04.1 +build Provision isolated SDK and runtime 2026-11-11T14:17:45.2107950Z Ign:29 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libsvtav1enc1d1 amd64 1.7.0+dfsg-2build1 +build Provision isolated SDK and runtime 2026-11-11T14:18:05.2332337Z Ign:30 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libsoxr0 amd64 0.1.3-4build3 +build Provision isolated SDK and runtime 2026-11-11T14:18:25.2586386Z Ign:31 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libswresample4 amd64 7:6.1.1-3ubuntu5 +build Provision isolated SDK and runtime 2026-11-11T14:18:45.2811458Z Ign:32 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libtheora0 amd64 1.1.1+dfsg.1-16.1build3 +build Provision isolated SDK and runtime 2026-11-11T14:19:05.3058077Z Ign:33 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libtwolame0 amd64 0.4.0-2build3 +build Provision isolated SDK and runtime 2026-11-11T14:19:25.3267433Z Ign:34 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libvorbisenc2 amd64 1.3.7-1build3 +build Provision isolated SDK and runtime 2026-11-11T14:19:45.3509673Z Ign:35 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libvpx9 amd64 1.14.0-1ubuntu2.3 +build Provision isolated SDK and runtime 2026-11-11T14:20:05.3748386Z Ign:36 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libx264-164 amd64 2:0.164.3108+git31e19f9-1 +build Provision isolated SDK and runtime 2026-11-11T14:20:25.3993124Z Ign:37 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libx265-199 amd64 3.5-2build1 +build Provision isolated SDK and runtime 2026-11-11T14:20:45.4240919Z Ign:38 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libxvidcore4 amd64 2:1.3.7-1build1 +build Provision isolated SDK and runtime 2026-11-11T14:21:05.4497832Z Ign:39 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libzvbi-common all 0.2.42-2 +build Provision isolated SDK and runtime 2026-11-11T14:21:25.4802351Z Ign:40 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libzvbi0t64 amd64 0.2.42-2 +build Provision isolated SDK and runtime 2026-11-11T14:21:45.5028033Z Ign:41 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libavcodec60 amd64 7:6.1.1-3ubuntu5 +build Provision isolated SDK and runtime 2026-11-11T14:22:05.5274828Z Ign:42 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libraw1394-11 amd64 2.1.2-2build3 +build Provision isolated SDK and runtime 2026-11-11T14:22:25.5498690Z Ign:43 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libavc1394-0 amd64 0.5.4-5build3 +build Provision isolated SDK and runtime 2026-11-11T14:22:45.5709933Z Ign:44 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libunibreak5 amd64 5.1-2build1 +build Provision isolated SDK and runtime 2026-11-11T14:23:05.3087348Z Ign:45 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libass9 amd64 1:0.17.1-2build1 +build Provision isolated SDK and runtime 2026-11-11T14:23:25.3297391Z Ign:46 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libudfread0 amd64 1.1.2-1build1 +build Provision isolated SDK and runtime 2026-11-11T14:23:45.3522675Z Ign:47 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libbluray2 amd64 1:1.3.4-1build1 +build Provision isolated SDK and runtime 2026-11-11T14:24:05.3836137Z Ign:48 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libchromaprint1 amd64 1.5.1-5 +build Provision isolated SDK and runtime 2026-11-11T14:24:25.3204132Z Ign:49 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libgme0 amd64 0.6.3-7build1 +build Provision isolated SDK and runtime 2026-11-11T14:24:45.3449305Z Ign:50 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libmpg123-0t64 amd64 1.32.5-1ubuntu1.1 +build Provision isolated SDK and runtime 2026-11-11T14:25:05.3703564Z Ign:51 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libopenmpt0t64 amd64 0.7.3-1.1build3 +build Provision isolated SDK and runtime 2026-11-11T14:25:25.2085005Z Ign:52 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libcjson1 amd64 1.7.17-1 +build Provision isolated SDK and runtime 2026-11-11T14:25:45.2464734Z Ign:53 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libmbedcrypto7t64 amd64 2.28.8-1 +build Provision isolated SDK and runtime 2026-11-11T14:26:05.2717017Z Ign:54 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 librist4 amd64 0.2.10+dfsg-2 +build Provision isolated SDK and runtime 2026-11-11T14:26:25.2965206Z Ign:55 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libsrt1.5-gnutls amd64 1.5.3-1build2 +build Provision isolated SDK and runtime 2026-11-11T14:26:45.3115816Z Ign:56 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libssh-gcrypt-4 amd64 0.10.6-2ubuntu0.5 +build Provision isolated SDK and runtime 2026-11-11T14:27:05.3431730Z Ign:57 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libavformat60 amd64 7:6.1.1-3ubuntu5 +build Provision isolated SDK and runtime 2026-11-11T14:27:25.3596544Z Ign:58 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libbs2b0 amd64 3.1.0+dfsg-7build1 +build Provision isolated SDK and runtime 2026-11-11T14:27:45.3847864Z Ign:59 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libflite1 amd64 2.2-6build3 +build Provision isolated SDK and runtime 2026-11-11T14:28:05.4138976Z Ign:60 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libserd-0-0 amd64 0.32.2-1 +build Provision isolated SDK and runtime 2026-11-11T14:28:25.4387606Z Ign:61 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libzix-0-0 amd64 0.4.2-2build1 +build Provision isolated SDK and runtime 2026-11-11T14:28:45.4595432Z Ign:62 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libsord-0-0 amd64 0.16.16-2build1 +build Provision isolated SDK and runtime 2026-11-11T14:29:05.4825775Z Ign:63 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libsratom-0-0 amd64 0.6.16-1build1 +build Provision isolated SDK and runtime 2026-11-11T14:29:25.5080416Z Ign:64 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 liblilv-0-0 amd64 0.24.22-1build1 +build Provision isolated SDK and runtime 2026-11-11T14:29:45.5175424Z Ign:65 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libmysofa1 amd64 1.3.2+dfsg-2ubuntu2 +build Provision isolated SDK and runtime 2026-11-11T14:30:05.5400860Z Ign:66 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libplacebo338 amd64 6.338.2-2build1 +build Provision isolated SDK and runtime 2026-11-11T14:30:25.5648121Z Ign:67 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libblas3 amd64 3.12.0-3build1.1 +build Provision isolated SDK and runtime 2026-11-11T14:30:45.5911282Z Ign:68 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 liblapack3 amd64 3.12.0-3build1.1 +build Provision isolated SDK and runtime 2026-11-11T14:31:05.6145807Z Ign:69 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libasyncns0 amd64 0.8-6build4 +build Provision isolated SDK and runtime 2026-11-11T14:31:25.6376998Z Ign:70 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libflac12t64 amd64 1.4.3+ds-2.1ubuntu2 +build Provision isolated SDK and runtime 2026-11-11T14:31:45.6540042Z Ign:71 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libsndfile1 amd64 1.2.2-1ubuntu5.24.04.1 +build Provision isolated SDK and runtime 2026-11-11T14:32:05.6799776Z Ign:72 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libpulse0 amd64 1:16.1+dfsg1-2ubuntu10.1 +build Provision isolated SDK and runtime 2026-11-11T14:32:25.6968522Z Ign:73 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libsphinxbase3t64 amd64 0.8+5prealpha+1-17build2 +build Provision isolated SDK and runtime 2026-11-11T14:32:45.7153327Z Ign:74 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libpocketsphinx3 amd64 0.8.0+real5prealpha+1-15ubuntu5 +build Provision isolated SDK and runtime 2026-11-11T14:33:05.7371087Z Ign:75 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libpostproc57 amd64 7:6.1.1-3ubuntu5 +build Provision isolated SDK and runtime 2026-11-11T14:33:25.7614302Z Ign:76 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libsamplerate0 amd64 0.2.2-4build1 +build Provision isolated SDK and runtime 2026-11-11T14:33:45.7980889Z Ign:77 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 librubberband2 amd64 3.3.0+dfsg-2build1 +build Provision isolated SDK and runtime 2026-11-11T14:34:05.8269169Z Ign:78 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libswscale7 amd64 7:6.1.1-3ubuntu5 +build Provision isolated SDK and runtime 2026-11-11T14:34:25.8502985Z Ign:79 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libvidstab1.1 amd64 1.1.0-2build1 +build Provision isolated SDK and runtime 2026-11-11T14:34:45.8748860Z Ign:80 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libzimg2 amd64 3.0.5+ds1-1build1 +build Provision isolated SDK and runtime 2026-11-11T14:35:05.8994371Z Ign:81 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libavfilter9 amd64 7:6.1.1-3ubuntu5 +build Provision isolated SDK and runtime 2026-11-11T14:35:25.9263590Z Ign:82 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libcaca0 amd64 0.99.beta20-4ubuntu0.2 +build Provision isolated SDK and runtime 2026-11-11T14:35:45.9506218Z Ign:83 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libcdio19t64 amd64 2.1.0-4.1ubuntu1.2 +build Provision isolated SDK and runtime 2026-11-11T14:36:05.9749467Z Ign:84 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libcdio-cdda2t64 amd64 10.2+2.0.1-1.1build2 +build Provision isolated SDK and runtime 2026-11-11T14:36:25.9987967Z Ign:85 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libcdio-paranoia2t64 amd64 10.2+2.0.1-1.1build2 +build Provision isolated SDK and runtime 2026-11-11T14:36:46.0237811Z Ign:86 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libdc1394-25 amd64 2.2.6-4build1 +build Provision isolated SDK and runtime 2026-11-11T14:37:06.0479956Z Ign:87 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libiec61883-0 amd64 1.2.0-6build1 +build Provision isolated SDK and runtime 2026-11-11T14:37:26.0847362Z Ign:88 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libjack-jackd2-0 amd64 1.9.21~dfsg-3ubuntu3 +build Provision isolated SDK and runtime 2026-11-11T14:37:46.1122859Z Ign:89 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libopenal-data all 1:1.23.1-4build1 +build Provision isolated SDK and runtime 2026-11-11T14:38:06.1376511Z Ign:90 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libsndio7.0 amd64 1.9.0-0.3build3 +build Provision isolated SDK and runtime 2026-11-11T14:38:26.1606495Z Ign:91 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libopenal1 amd64 1:1.23.1-4build1 +build Provision isolated SDK and runtime 2026-11-11T14:38:46.1796155Z Ign:92 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libdecor-0-0 amd64 0.2.2-1build2 +build Provision isolated SDK and runtime 2026-11-11T14:39:06.2064124Z Ign:93 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libsdl2-2.0-0 amd64 2.30.0+dfsg-1ubuntu3.1 +build Provision isolated SDK and runtime 2026-11-11T14:39:26.2313091Z Ign:94 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libxcb-shape0 amd64 1.15-1ubuntu2 +build Provision isolated SDK and runtime 2026-11-11T14:39:46.2134456Z Ign:95 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libxv1 amd64 2:1.0.11-1.1build1 +build Provision isolated SDK and runtime 2026-11-11T14:40:06.2370392Z Ign:96 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libavdevice60 amd64 7:6.1.1-3ubuntu5 +build Provision isolated SDK and runtime 2026-11-11T14:40:26.2582053Z Ign:97 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 ffmpeg amd64 7:6.1.1-3ubuntu5 +build Provision isolated SDK and runtime 2026-11-11T14:40:46.2797083Z Ign:98 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 xdg-dbus-proxy amd64 0.1.5-1ubuntu0.2 +build Provision isolated SDK and runtime 2026-11-11T14:41:05.8220935Z Ign:99 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libmalcontent-0-0 amd64 0.11.1-1ubuntu1.3 +build Provision isolated SDK and runtime 2026-11-11T14:41:25.8345172Z Ign:100 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libavahi-glib1 amd64 0.8-13ubuntu6.2 +build Provision isolated SDK and runtime 2026-11-11T14:41:45.8588338Z Ign:101 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libostree-1-1 amd64 2024.5-1build2 +build Provision isolated SDK and runtime 2026-11-11T14:42:05.8804453Z Ign:102 http://azure.archive.ubuntu.com/ubuntu noble-updates/universe amd64 flatpak amd64 1.14.6-1ubuntu0.1 +build Provision isolated SDK and runtime 2026-11-11T14:42:25.8956928Z Ign:103 http://azure.archive.ubuntu.com/ubuntu noble-updates/universe amd64 libflatpak0 amd64 1.14.6-1ubuntu0.1 +build Provision isolated SDK and runtime 2026-11-11T14:42:45.9203239Z Ign:104 http://azure.archive.ubuntu.com/ubuntu noble-updates/universe amd64 gir1.2-flatpak-1.0 amd64 1.14.6-1ubuntu0.1 +build Provision isolated SDK and runtime 2026-11-11T14:43:05.9427311Z Ign:105 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 ostree amd64 2024.5-1build2 +build Provision isolated SDK and runtime 2026-11-11T14:43:25.9624560Z Ign:106 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 flatpak-builder amd64 1.4.2-1build2 +build Provision isolated SDK and runtime 2026-11-11T14:43:45.9870677Z Ign:107 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 fonts-noto-mono all 20201225-2 +build Provision isolated SDK and runtime 2026-11-11T14:44:06.0173191Z Ign:108 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 xfonts-encodings all 1:1.0.5-0ubuntu2 +build Provision isolated SDK and runtime 2026-11-11T14:44:26.0381353Z Ign:109 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 xfonts-utils amd64 1:7.7+6build3 +build Provision isolated SDK and runtime 2026-11-11T14:44:46.0566712Z Ign:110 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 fonts-urw-base35 all 20200910-8 +build Provision isolated SDK and runtime 2026-11-11T14:45:06.0742255Z Ign:111 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libgs-common all 10.02.1~dfsg1-0ubuntu7.10 +build Provision isolated SDK and runtime 2026-11-11T14:45:26.0906844Z Ign:112 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libgs10-common all 10.02.1~dfsg1-0ubuntu7.10 +build Provision isolated SDK and runtime 2026-11-11T14:45:46.1101484Z Ign:113 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libidn12 amd64 1.42-1ubuntu0.1 +build Provision isolated SDK and runtime 2026-11-11T14:46:06.1315977Z Ign:114 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libijs-0.35 amd64 0.35-15.1build1 +build Provision isolated SDK and runtime 2026-11-11T14:46:26.1518523Z Ign:115 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libjbig2dec0 amd64 0.20-1ubuntu0.24.04.1 +build Provision isolated SDK and runtime 2026-11-11T14:46:46.1733691Z Ign:116 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libpaper1 amd64 1.1.29build1 +build Provision isolated SDK and runtime 2026-11-11T14:47:06.2011566Z Ign:117 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libgs10 amd64 10.02.1~dfsg1-0ubuntu7.10 +build Provision isolated SDK and runtime 2026-11-11T14:47:26.2209009Z Ign:118 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 ghostscript amd64 10.02.1~dfsg1-0ubuntu7.10 +build Provision isolated SDK and runtime 2026-11-11T14:47:46.2410351Z Ign:119 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 session-migration amd64 0.3.9build1 +build Provision isolated SDK and runtime 2026-11-11T14:48:06.1097437Z Ign:120 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 gsettings-desktop-schemas all 46.1-0ubuntu1 +build Provision isolated SDK and runtime 2026-11-11T14:48:26.1342009Z Ign:121 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 imagemagick-6.q16 amd64 8:6.9.12.98+dfsg1-5.2build2 +build Provision isolated SDK and runtime 2026-11-11T14:48:46.0902978Z Ign:122 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 imagemagick amd64 8:6.9.12.98+dfsg1-5.2build2 +build Provision isolated SDK and runtime 2026-11-11T14:49:06.1182689Z Ign:123 http://azure.archive.ubuntu.com/ubuntu noble-updates/universe amd64 libigdgmm12 amd64 22.3.17+ds1-1ubuntu1 +build Provision isolated SDK and runtime 2026-11-11T14:49:26.1354845Z Ign:124 http://azure.archive.ubuntu.com/ubuntu noble-updates/universe amd64 intel-media-va-driver amd64 24.1.0+dfsg1-1ubuntu0.2 +build Provision isolated SDK and runtime 2026-11-11T14:49:46.1586851Z Ign:125 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libaacs0 amd64 0.11.1-2build1 +build Provision isolated SDK and runtime 2026-11-11T14:50:06.1910542Z Ign:126 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libbdplus0 amd64 0.2.0-3build1 +build Provision isolated SDK and runtime 2026-11-11T14:50:26.2172479Z Ign:127 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libdecor-0-plugin-1-gtk amd64 0.2.2-1build2 +build Provision isolated SDK and runtime 2026-11-11T14:50:46.2362200Z Ign:128 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libdjvulibre-text all 3.5.28-2ubuntu0.24.04.2 +build Provision isolated SDK and runtime 2026-11-11T14:51:06.2643948Z Ign:129 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libdjvulibre21 amd64 3.5.28-2ubuntu0.24.04.2 +build Provision isolated SDK and runtime 2026-11-11T14:51:26.2873086Z Ign:130 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libimath-3-1-29t64 amd64 3.1.9-3.1ubuntu2 +build Provision isolated SDK and runtime 2026-11-11T14:51:46.3329792Z Ign:131 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libjxr0t64 amd64 1.2~git20170615.f752187-5.1ubuntu2 +build Provision isolated SDK and runtime 2026-11-11T14:52:06.3486713Z Ign:132 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libjxr-tools amd64 1.2~git20170615.f752187-5.1ubuntu2 +build Provision isolated SDK and runtime 2026-11-11T14:52:25.9855774Z Ign:133 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libopenexr-3-1-30 amd64 3.1.5-5.1build3 +build Provision isolated SDK and runtime 2026-11-11T14:52:46.0060089Z Ign:134 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libwmflite-0.2-7 amd64 0.2.13-1.1build3 +build Provision isolated SDK and runtime 2026-11-11T14:53:06.0300142Z Ign:135 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libmagickcore-6.q16-7-extra amd64 8:6.9.12.98+dfsg1-5.2build2 +build Provision isolated SDK and runtime 2026-11-11T14:53:26.0508013Z Ign:136 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libnetpbm11t64 amd64 2:11.05.02-1.1build1 +build Provision isolated SDK and runtime 2026-11-11T14:53:46.0994942Z Ign:137 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libpaper-utils amd64 1.1.29build1 +build Provision isolated SDK and runtime 2026-11-11T14:54:06.1229661Z Ign:138 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libwebrtc-audio-processing1 amd64 0.3.1-0ubuntu6 +build Provision isolated SDK and runtime 2026-11-11T14:54:26.1501514Z Ign:139 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libspa-0.2-modules amd64 1.0.5-1ubuntu3.3 +build Provision isolated SDK and runtime 2026-11-11T14:54:46.1652664Z Ign:140 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libpipewire-0.3-0t64 amd64 1.0.5-1ubuntu3.3 +build Provision isolated SDK and runtime 2026-11-11T14:55:06.1856389Z Ign:141 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libpipewire-0.3-common all 1.0.5-1ubuntu3.3 +build Provision isolated SDK and runtime 2026-11-11T14:55:26.2109361Z Ign:142 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 librsvg2-common amd64 2.58.0+dfsg-1ubuntu0.1 +build Provision isolated SDK and runtime 2026-11-11T14:55:46.2361711Z Ign:143 http://azure.archive.ubuntu.com/ubuntu noble-updates/universe amd64 mesa-va-drivers amd64 25.2.8-0ubuntu0.24.04.4 +build Provision isolated SDK and runtime 2026-11-11T14:56:06.2605748Z Ign:144 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 mesa-vdpau-drivers amd64 25.2.8-0ubuntu0.24.04.4 +build Provision isolated SDK and runtime 2026-11-11T14:56:26.2981846Z Ign:145 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 netpbm amd64 2:11.05.02-1.1build1 +build Provision isolated SDK and runtime 2026-11-11T14:56:46.3200336Z Ign:146 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 optipng amd64 0.7.8+ds-1build2 +build Provision isolated SDK and runtime 2026-11-11T14:57:06.3457211Z Ign:147 http://azure.archive.ubuntu.com/ubuntu noble-updates/universe amd64 i965-va-driver amd64 2.4.1+dfsg1-1ubuntu0.2 +build Provision isolated SDK and runtime 2026-11-11T14:57:26.3650788Z Ign:148 http://azure.archive.ubuntu.com/ubuntu noble-updates/universe amd64 va-driver-all amd64 2.20.0-2ubuntu0.2 +build Provision isolated SDK and runtime 2026-11-11T14:57:46.3899833Z Ign:149 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 vdpau-driver-all amd64 1.5-2build1 +build Provision isolated SDK and runtime 2026-11-11T14:58:06.4095843Z Ign:150 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 xdg-desktop-portal amd64 1.18.4-1ubuntu2.24.04.3 +build Provision isolated SDK and runtime 2026-11-11T14:58:26.4343058Z Ign:151 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 xdg-desktop-portal-gtk amd64 1.15.1-1build2 +build Provision isolated SDK and runtime 2026-11-11T14:58:46.4590574Z Ign:152 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libxdo3 amd64 1:3.20160805.1-5build1 +build Provision isolated SDK and runtime 2026-11-11T14:59:06.4820546Z Ign:153 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 pocketsphinx-en-us all 0.8.0+real5prealpha+1-15ubuntu5 +build Provision isolated SDK and runtime 2026-11-11T14:59:26.4984019Z Ign:154 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 xdotool amd64 1:3.20160805.1-5build1 +build Provision isolated SDK and runtime 2026-11-11T14:59:46.5253370Z Ign:2 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 fonts-droid-fallback all 1:6.0.1r16-1.1build1 +build Provision isolated SDK and runtime 2026-11-11T15:00:06.5494613Z Ign:3 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 poppler-data all 0.4.12-1 +build Provision isolated SDK and runtime 2026-11-11T15:00:06.5548812Z Ign:2 https://archive.ubuntu.com/ubuntu noble/main amd64 fonts-droid-fallback all 1:6.0.1r16-1.1build1 +build Provision isolated SDK and runtime 2026-11-11T15:00:26.5673330Z Ign:4 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 librsvg2-2 amd64 2.58.0+dfsg-1ubuntu0.1 +build Provision isolated SDK and runtime 2026-11-11T15:00:26.5769373Z Ign:3 https://archive.ubuntu.com/ubuntu noble/main amd64 poppler-data all 0.4.12-1 +build Provision isolated SDK and runtime 2026-11-11T15:00:26.5891104Z Err:2 https://security.ubuntu.com/ubuntu noble/main amd64 fonts-droid-fallback all 1:6.0.1r16-1.1build1 +build Provision isolated SDK and runtime 2026-11-11T15:00:26.5892172Z Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T15:00:46.5910699Z Ign:5 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libappstream-compose0 amd64 1.0.2-1build6 +build Provision isolated SDK and runtime 2026-11-11T15:00:46.5962219Z Ign:4 https://archive.ubuntu.com/ubuntu noble-updates/main amd64 librsvg2-2 amd64 2.58.0+dfsg-1ubuntu0.1 +build Provision isolated SDK and runtime 2026-11-11T15:00:46.6130708Z Err:3 https://security.ubuntu.com/ubuntu noble/main amd64 poppler-data all 0.4.12-1 +build Provision isolated SDK and runtime 2026-11-11T15:00:46.6131647Z Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T15:01:06.6075826Z Ign:6 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 appstream-compose amd64 1.0.2-1build6 +build Provision isolated SDK and runtime 2026-11-11T15:01:06.6212689Z Ign:5 https://archive.ubuntu.com/ubuntu noble/main amd64 libappstream-compose0 amd64 1.0.2-1build6 +build Provision isolated SDK and runtime 2026-11-11T15:01:06.6346407Z Ign:4 https://security.ubuntu.com/ubuntu noble-updates/main amd64 librsvg2-2 amd64 2.58.0+dfsg-1ubuntu0.1 +build Provision isolated SDK and runtime 2026-11-11T15:01:06.6348100Z Err:4 mirror+file:/etc/apt/apt-mirrors.txt noble-updates/main amd64 librsvg2-2 amd64 2.58.0+dfsg-1ubuntu0.1 +build Provision isolated SDK and runtime 2026-11-11T15:01:06.6349500Z Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T15:01:26.6313774Z Ign:7 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 bubblewrap amd64 0.9.0-1ubuntu0.3 +build Provision isolated SDK and runtime 2026-11-11T15:01:26.6453167Z Ign:6 https://archive.ubuntu.com/ubuntu noble/universe amd64 appstream-compose amd64 1.0.2-1build6 +build Provision isolated SDK and runtime 2026-11-11T15:01:26.6562427Z Err:5 https://security.ubuntu.com/ubuntu noble/main amd64 libappstream-compose0 amd64 1.0.2-1build6 +build Provision isolated SDK and runtime 2026-11-11T15:01:26.6563690Z Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T15:01:46.6559312Z Ign:8 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 dbus-x11 amd64 1.14.10-4ubuntu4.1 +build Provision isolated SDK and runtime 2026-11-11T15:01:46.6692087Z Ign:7 https://archive.ubuntu.com/ubuntu noble-updates/main amd64 bubblewrap amd64 0.9.0-1ubuntu0.3 +build Provision isolated SDK and runtime 2026-11-11T15:01:46.6881447Z Err:6 https://security.ubuntu.com/ubuntu noble/universe amd64 appstream-compose amd64 1.0.2-1build6 +build Provision isolated SDK and runtime 2026-11-11T15:01:46.6882287Z Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T15:02:06.6794137Z Ign:9 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 desktop-file-utils amd64 0.27-2build1 +build Provision isolated SDK and runtime 2026-11-11T15:02:06.6898515Z Ign:8 https://archive.ubuntu.com/ubuntu noble-updates/main amd64 dbus-x11 amd64 1.14.10-4ubuntu4.1 +build Provision isolated SDK and runtime 2026-11-11T15:02:06.7158617Z Ign:7 https://security.ubuntu.com/ubuntu noble-updates/main amd64 bubblewrap amd64 0.9.0-1ubuntu0.3 +build Provision isolated SDK and runtime 2026-11-11T15:02:06.7160296Z Err:7 mirror+file:/etc/apt/apt-mirrors.txt noble-updates/main amd64 bubblewrap amd64 0.9.0-1ubuntu0.3 +build Provision isolated SDK and runtime 2026-11-11T15:02:06.7161125Z Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T15:02:26.7035292Z Ign:10 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 libasm1t64 amd64 0.190-1.1ubuntu0.1 +build Provision isolated SDK and runtime 2026-11-11T15:02:26.7242265Z Ign:9 https://archive.ubuntu.com/ubuntu noble/main amd64 desktop-file-utils amd64 0.27-2build1 +build Provision isolated SDK and runtime 2026-11-11T15:02:26.7400757Z Err:8 https://security.ubuntu.com/ubuntu noble-updates/main amd64 dbus-x11 amd64 1.14.10-4ubuntu4.1 +build Provision isolated SDK and runtime 2026-11-11T15:02:26.7401787Z Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T15:02:46.7274076Z Ign:11 http://azure.archive.ubuntu.com/ubuntu noble-updates/main amd64 elfutils amd64 0.190-1.1ubuntu0.1 +build Provision isolated SDK and runtime 2026-11-11T15:02:46.7439883Z Ign:10 https://archive.ubuntu.com/ubuntu noble-updates/main amd64 libasm1t64 amd64 0.190-1.1ubuntu0.1 +build Provision isolated SDK and runtime 2026-11-11T15:02:46.7592653Z Err:9 https://security.ubuntu.com/ubuntu noble/main amd64 desktop-file-utils amd64 0.27-2build1 +build Provision isolated SDK and runtime 2026-11-11T15:02:46.7593327Z Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T15:03:06.7490392Z Ign:12 http://azure.archive.ubuntu.com/ubuntu noble-updates/universe amd64 libva2 amd64 2.20.0-2ubuntu0.2 +build Provision isolated SDK and runtime 2026-11-11T15:03:06.7654815Z Ign:11 https://archive.ubuntu.com/ubuntu noble-updates/main amd64 elfutils amd64 0.190-1.1ubuntu0.1 +build Provision isolated SDK and runtime 2026-11-11T15:03:06.7836852Z Ign:10 https://security.ubuntu.com/ubuntu noble-updates/main amd64 libasm1t64 amd64 0.190-1.1ubuntu0.1 +build Provision isolated SDK and runtime 2026-11-11T15:03:06.7838079Z Err:10 mirror+file:/etc/apt/apt-mirrors.txt noble-updates/main amd64 libasm1t64 amd64 0.190-1.1ubuntu0.1 +build Provision isolated SDK and runtime 2026-11-11T15:03:06.7839211Z Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T15:03:26.7727832Z Ign:13 http://azure.archive.ubuntu.com/ubuntu noble-updates/universe amd64 libva-drm2 amd64 2.20.0-2ubuntu0.2 +build Provision isolated SDK and runtime 2026-11-11T15:03:26.7894384Z Ign:12 https://archive.ubuntu.com/ubuntu noble-updates/universe amd64 libva2 amd64 2.20.0-2ubuntu0.2 +build Provision isolated SDK and runtime 2026-11-11T15:03:26.8022460Z Ign:11 https://security.ubuntu.com/ubuntu noble-updates/main amd64 elfutils amd64 0.190-1.1ubuntu0.1 +build Provision isolated SDK and runtime 2026-11-11T15:03:26.8023766Z Err:11 mirror+file:/etc/apt/apt-mirrors.txt noble-updates/main amd64 elfutils amd64 0.190-1.1ubuntu0.1 +build Provision isolated SDK and runtime 2026-11-11T15:03:26.8024753Z Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T15:03:46.7969978Z Ign:14 http://azure.archive.ubuntu.com/ubuntu noble-updates/universe amd64 libva-x11-2 amd64 2.20.0-2ubuntu0.2 +build Provision isolated SDK and runtime 2026-11-11T15:03:46.8127083Z Ign:13 https://archive.ubuntu.com/ubuntu noble-updates/universe amd64 libva-drm2 amd64 2.20.0-2ubuntu0.2 +build Provision isolated SDK and runtime 2026-11-11T15:03:46.8252636Z Ign:12 https://security.ubuntu.com/ubuntu noble-updates/universe amd64 libva2 amd64 2.20.0-2ubuntu0.2 +build Provision isolated SDK and runtime 2026-11-11T15:03:46.8253714Z Err:12 mirror+file:/etc/apt/apt-mirrors.txt noble-updates/universe amd64 libva2 amd64 2.20.0-2ubuntu0.2 +build Provision isolated SDK and runtime 2026-11-11T15:03:46.8254383Z Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T15:04:06.8193469Z Ign:15 http://azure.archive.ubuntu.com/ubuntu noble/main amd64 libvdpau1 amd64 1.5-2build1 +build Provision isolated SDK and runtime 2026-11-11T15:04:06.8366292Z Ign:14 https://archive.ubuntu.com/ubuntu noble-updates/universe amd64 libva-x11-2 amd64 2.20.0-2ubuntu0.2 +build Provision isolated SDK and runtime 2026-11-11T15:04:06.8509856Z Ign:13 https://security.ubuntu.com/ubuntu noble-updates/universe amd64 libva-drm2 amd64 2.20.0-2ubuntu0.2 +build Provision isolated SDK and runtime 2026-11-11T15:04:06.8511200Z Err:13 mirror+file:/etc/apt/apt-mirrors.txt noble-updates/universe amd64 libva-drm2 amd64 2.20.0-2ubuntu0.2 +build Provision isolated SDK and runtime 2026-11-11T15:04:06.8512101Z Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T15:04:26.8051479Z Ign:15 https://archive.ubuntu.com/ubuntu noble/main amd64 libvdpau1 amd64 1.5-2build1 +build Provision isolated SDK and runtime 2026-11-11T15:04:26.8376362Z Ign:16 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libvpl2 amd64 2023.3.0-1build1 +build Provision isolated SDK and runtime 2026-11-11T15:04:26.8752111Z Ign:14 https://security.ubuntu.com/ubuntu noble-updates/universe amd64 libva-x11-2 amd64 2.20.0-2ubuntu0.2 +build Provision isolated SDK and runtime 2026-11-11T15:04:26.8753248Z Err:14 mirror+file:/etc/apt/apt-mirrors.txt noble-updates/universe amd64 libva-x11-2 amd64 2.20.0-2ubuntu0.2 +build Provision isolated SDK and runtime 2026-11-11T15:04:26.8753854Z Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T15:04:46.8597748Z Ign:16 https://archive.ubuntu.com/ubuntu noble/universe amd64 libvpl2 amd64 2023.3.0-1build1 +build Provision isolated SDK and runtime 2026-11-11T15:04:46.8599419Z Ign:17 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 ocl-icd-libopencl1 amd64 2.3.2-1build1 +build Provision isolated SDK and runtime 2026-11-11T15:04:46.8956595Z Err:15 https://security.ubuntu.com/ubuntu noble/main amd64 libvdpau1 amd64 1.5-2build1 +build Provision isolated SDK and runtime 2026-11-11T15:04:46.8957508Z Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T15:05:06.8829382Z Ign:18 http://azure.archive.ubuntu.com/ubuntu noble/universe amd64 libavutil58 amd64 7:6.1.1-3ubuntu5 +build Provision isolated SDK and runtime 2026-11-11T15:05:06.8834748Z Ign:17 https://archive.ubuntu.com/ubuntu noble/universe amd64 ocl-icd-libopencl1 amd64 2.3.2-1build1 +build Provision isolated SDK and runtime 2026-11-11T15:05:06.9144059Z Err:16 https://security.ubuntu.com/ubuntu noble/universe amd64 libvpl2 amd64 2023.3.0-1build1 +build Provision isolated SDK and runtime 2026-11-11T15:05:06.9144974Z Temporary failure resolving 'azure.archive.ubuntu.com' +build Provision isolated SDK and runtime 2026-11-11T15:05:14.5081985Z ##[error]The operation was canceled. +build Post Run actions/checkout@v4 2026-11-11T15:05:14.5244585Z Post job cleanup. +build Post Run actions/checkout@v4 2026-11-11T15:05:14.6140254Z [command]/usr/bin/git version +build Post Run actions/checkout@v4 2026-11-11T15:05:14.6184681Z git version 2.56.0 +build Post Run actions/checkout@v4 2026-11-11T15:05:14.6228294Z Temporarily overriding HOME='/home/runner/work/_temp/b9432e8b-ebac-46b3-9bd0-a52d674baa11' before making global git config changes +build Post Run actions/checkout@v4 2026-11-11T15:05:14.6229871Z Adding repository directory to the temporary git global config as a safe directory +build Post Run actions/checkout@v4 2026-11-11T15:05:14.6234641Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/NkNotes/NkNotes +build Post Run actions/checkout@v4 2026-11-11T15:05:14.6274710Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +build Post Run actions/checkout@v4 2026-11-11T15:05:14.6312808Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +build Post Run actions/checkout@v4 2026-11-11T15:05:14.6549415Z Entering 'third_party/nextkdeAppDemo' +build Post Run actions/checkout@v4 2026-11-11T15:05:14.6644344Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +build Post Run actions/checkout@v4 2026-11-11T15:05:14.6689800Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +build Post Run actions/checkout@v4 2026-11-11T15:05:14.6947488Z Entering 'third_party/nextkdeAppDemo' +build Post Run actions/checkout@v4 2026-11-11T15:05:14.7099672Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +build Post Run actions/checkout@v4 2026-11-11T15:05:14.7101716Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +build Post Run actions/checkout@v4 2026-11-11T15:05:14.7318109Z Entering 'third_party/nextkdeAppDemo' +build Post Run actions/checkout@v4 2026-11-11T15:05:14.7337726Z file:/home/runner/work/NkNotes/NkNotes/.git/modules/third_party/nextkdeAppDemo/config remote.origin.url +build Post Run actions/checkout@v4 2026-11-11T15:05:14.7373126Z [command]/usr/bin/git config --file /home/runner/work/NkNotes/NkNotes/.git/modules/third_party/nextkdeAppDemo/config --name-only --get-regexp ^includeIf\.gitdir: +build Complete job 2026-11-11T15:05:14.7584326Z Cleaning up orphan processes +build Complete job 2026-11-11T15:05:14.7998420Z ##[warning]Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/ diff --git a/output/editor-interaction-2026-11-11/configure.log b/output/editor-interaction-2026-11-11/configure.log new file mode 100644 index 0000000..ae54e23 --- /dev/null +++ b/output/editor-interaction-2026-11-11/configure.log @@ -0,0 +1,454 @@ +-- The CXX compiler identification is GNU 15.2.0 +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Check for working CXX compiler: /usr/bin/c++ - skipped +-- Detecting CXX compile features +-- Detecting CXX compile features - done +-- Performing Test CMAKE_HAVE_LIBC_PTHREAD +-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success +-- Found Threads: TRUE +-- Performing Test HAVE_STDATOMIC +-- Performing Test HAVE_STDATOMIC - Success +-- Found WrapAtomic: TRUE +-- Found OpenGL: /usr/lib/x86_64-linux-gnu/libOpenGL.so +-- Found WrapOpenGL: TRUE +-- Found WrapVulkanHeaders: /usr/include +-- Found SQLite3: /usr/lib/x86_64-linux-gnu/libsqlite3.so (found version "3.46.1") +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4343 (message): + The kos_ui target is a QML module with target path Kos/Ui. It uses an + OUTPUT_DIRECTORY of /home/amao/nknotes-review-agent-20261111/build/kos-ui, + which should end in the same target path, but doesn't. Tooling such as + qmllint may not work correctly. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4371 (_qt_internal_collect_target_qml_import_paths) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:1601 (_qt_internal_collect_qml_import_paths) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:3577 (_qt_internal_target_enable_qmllint) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:960 (qt6_target_qml_sources) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:1417 (qt6_add_qml_module) + third_party/nextkdeAppDemo/shared/qml/CMakeLists.txt:13 (qt_add_qml_module) + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4343 (message): + The kos_ui target is a QML module with target path Kos/Ui. It uses an + OUTPUT_DIRECTORY of /home/amao/nknotes-review-agent-20261111/build/kos-ui, + which should end in the same target path, but doesn't. Tooling such as + qmllint may not work correctly. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4371 (_qt_internal_collect_target_qml_import_paths) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:1361 (_qt_internal_collect_qml_import_paths) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:1099:EVAL:1 (_qt_internal_write_deferred_qmlls_build_ini_file) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtquick2plugin' is a dependency of 'nextnotes', but the + link target it defines (Qt6::qtquick2plugin) does not exist in the current + scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qmlplugin' is a dependency of 'nextnotes', but the link + target it defines (Qt6::qmlplugin) does not exist in the current scope. + The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'modelsplugin' is a dependency of 'nextnotes', but the link + target it defines (Qt6::modelsplugin) does not exist in the current scope. + The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'workerscriptplugin' is a dependency of 'nextnotes', but the + link target it defines (Qt6::workerscriptplugin) does not exist in the + current scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'quickwindowplugin' is a dependency of 'nextnotes', but the + link target it defines (Qt6::quickwindow) does not exist in the current + scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtwebenginequickplugin' is a dependency of 'nextnotes', but + the link target it defines (Qt6::qtwebenginequickplugin) does not exist in + the current scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'webchannelquickplugin' is a dependency of 'nextnotes', but + the link target it defines (Qt6::WebChannelQuickplugin) does not exist in + the current scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtwebenginequickdelegatesplugin' is a dependency of + 'nextnotes', but the link target it defines + (Qt6::qtwebenginequickdelegatesplugin) does not exist in the current scope. + The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtquickcontrols2plugin' is a dependency of 'nextnotes', but + the link target it defines (Qt6::qtquickcontrols2plugin) does not exist in + the current scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qquicklayoutsplugin' is a dependency of 'nextnotes', but + the link target it defines (Qt6::qquicklayoutsplugin) does not exist in the + current scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtquickdialogsplugin' is a dependency of 'nextnotes', but + the link target it defines (Qt6::qtquickdialogsplugin) does not exist in + the current scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtquickcontrols2fusionstyleplugin' is a dependency of + 'nextnotes', but the link target it defines + (Qt6::qtquickcontrols2fusionstyleplugin) does not exist in the current + scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtquickcontrols2materialstyleplugin' is a dependency of + 'nextnotes', but the link target it defines + (Qt6::qtquickcontrols2materialstyleplugin) does not exist in the current + scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtquickcontrols2imaginestyleplugin' is a dependency of + 'nextnotes', but the link target it defines + (Qt6::qtquickcontrols2imaginestyleplugin) does not exist in the current + scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtquickcontrols2universalstyleplugin' is a dependency of + 'nextnotes', but the link target it defines + (Qt6::qtquickcontrols2universalstyleplugin) does not exist in the current + scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtquickcontrols2basicstyleplugin' is a dependency of + 'nextnotes', but the link target it defines + (Qt6::qtquickcontrols2basicstyleplugin) does not exist in the current + scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtquickdialogs2quickimplplugin' is a dependency of + 'nextnotes', but the link target it defines + (Qt6::qtquickdialogs2quickimplplugin) does not exist in the current scope. + The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtquicktemplates2plugin' is a dependency of 'nextnotes', + but the link target it defines (Qt6::qtquicktemplates2plugin) does not + exist in the current scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtquickcontrols2implplugin' is a dependency of 'nextnotes', + but the link target it defines (Qt6::qtquickcontrols2implplugin) does not + exist in the current scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtquickcontrols2fusionstyleimplplugin' is a dependency of + 'nextnotes', but the link target it defines + (Qt6::qtquickcontrols2fusionstyleimplplugin) does not exist in the current + scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtquickcontrols2materialstyleimplplugin' is a dependency of + 'nextnotes', but the link target it defines + (Qt6::qtquickcontrols2materialstyleimplplugin) does not exist in the + current scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtquickcontrols2imaginestyleimplplugin' is a dependency of + 'nextnotes', but the link target it defines + (Qt6::qtquickcontrols2imaginestyleimplplugin) does not exist in the current + scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtquickcontrols2universalstyleimplplugin' is a dependency + of 'nextnotes', but the link target it defines + (Qt6::qtquickcontrols2universalstyleimplplugin) does not exist in the + current scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtquickcontrols2basicstyleimplplugin' is a dependency of + 'nextnotes', but the link target it defines + (Qt6::qtquickcontrols2basicstyleimplplugin) does not exist in the current + scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qmlshapesplugin' is a dependency of 'nextnotes', but the + link target it defines (Qt6::qmlshapesplugin) does not exist in the current + scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'labsmodelsplugin' is a dependency of 'nextnotes', but the + link target it defines (Qt6::labsmodelsplugin) does not exist in the + current scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qmlfolderlistmodelplugin' is a dependency of 'nextnotes', + but the link target it defines (Qt6::qmlfolderlistmodelplugin) does not + exist in the current scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'quicktestplugin' is a dependency of 'nextnotes', but the + link target it defines (Qt6::QuickTestplugin) does not exist in the current + scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'effectsplugin' is a dependency of 'nextnotes', but the link + target it defines (Qt6::effectsplugin) does not exist in the current scope. + The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtqmlcoreplugin' is a dependency of 'nextnotes', but the + link target it defines (Qt6::qtqmlcoreplugin) does not exist in the current + scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtgraphicaleffectsplugin' is a dependency of 'nextnotes', + but the link target it defines (Qt6::qtgraphicaleffectsplugin) does not + exist in the current scope. The plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4669 (message): + The qml plugin 'qtgraphicaleffectsprivateplugin' is a dependency of + 'nextnotes', but the link target it defines + (Qt6::qtgraphicaleffectsprivate) does not exist in the current scope. The + plugin will not be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +CMake Warning at /usr/lib/x86_64-linux-gnu/cmake/Qt6Qml/Qt6QmlMacros.cmake:4682 (message): + The qml plugin 'kos_surface_shape' is a dependency of 'nextnotes', but + there is no target by that name in the current scope. The plugin will not + be linked. +Call Stack (most recent call first): + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (qt6_import_qml_plugins) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:801 (cmake_language) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:879 (_qt_internal_finalize_executable) + /usr/lib/x86_64-linux-gnu/cmake/Qt6Core/Qt6CoreMacros.cmake:848:EVAL:1 (qt6_finalize_target) + CMakeLists.txt:DEFERRED + + +-- Configuring done (3.5s) +-- Generating done (0.2s) +-- Build files have been written to: /home/amao/nknotes-review-agent-20261111/build diff --git a/output/editor-interaction-2026-11-11/editor-build.log b/output/editor-interaction-2026-11-11/editor-build.log new file mode 100644 index 0000000..5772a21 --- /dev/null +++ b/output/editor-interaction-2026-11-11/editor-build.log @@ -0,0 +1,9 @@ + +> nextnotes-markdown-editor@0.1.0 build +> node build.mjs + + + dist/diagram.js 11.9mb ⚠️ + dist/editor.js 3.2mb ⚠️ + +⚡ Done in 1250ms diff --git a/output/editor-interaction-2026-11-11/editor-interaction-report.json b/output/editor-interaction-2026-11-11/editor-interaction-report.json new file mode 100644 index 0000000..09a064b --- /dev/null +++ b/output/editor-interaction-2026-11-11/editor-interaction-report.json @@ -0,0 +1,10 @@ +{ + "results": [ + "context target follows the click independently of previous hover", + "real DOM drop preview agrees with release; cancellation and undo preserve content", + "folded content is skipped when computing insertion boundaries", + "all slash entries are keyboard reachable, including the final insertion", + "dismissal preserves uppercase/space queries and does not leak across paragraphs or document loads", + "an empty slash result does not trap ordinary Enter navigation" + ] +} \ No newline at end of file diff --git a/output/editor-interaction-2026-11-11/editor-interaction.log b/output/editor-interaction-2026-11-11/editor-interaction.log new file mode 100644 index 0000000..64aabbf --- /dev/null +++ b/output/editor-interaction-2026-11-11/editor-interaction.log @@ -0,0 +1,6 @@ +PASS: context target follows the click independently of previous hover +PASS: real DOM drop preview agrees with release; cancellation and undo preserve content +PASS: folded content is skipped when computing insertion boundaries +PASS: all slash entries are keyboard reachable, including the final insertion +PASS: dismissal preserves uppercase/space queries and does not leak across paragraphs or document loads +PASS: an empty slash result does not trap ordinary Enter navigation diff --git a/output/editor-interaction-2026-11-11/final-native-summary.json b/output/editor-interaction-2026-11-11/final-native-summary.json new file mode 100644 index 0000000..d95955d --- /dev/null +++ b/output/editor-interaction-2026-11-11/final-native-summary.json @@ -0,0 +1,201 @@ +{ + "instance": { + "base": "/home/amao/nknotes-review-agent-20261111", + "pid": 6318, + "window": 16777260, + "CDP": "http://127.0.0.1:9241", + "platform": "xcb on DISPLAY=:0", + "viewportOffset": { + "x": 509, + "y": 91 + }, + "fixture": "/home/amao/nknotes-review-agent-20261111/fixture/review.md" + }, + "scope": { + "source": "copied old VM source; file SHA256 compared to local; only Main.qml and SourceEditor.qml latest search fix absent", + "submodule": "40c6007a95db864683924056adbf0f6385dcb7e3, all snapshot files matched", + "sourceHashes": "source-hashes.json", + "bundleSHA256": "b76af6b3adb816ccd930cdeb78b50c2b0015cb6c09e7878d07d1410b2a0af3a1", + "newLocalSlashFix": "not transferred or run; source transfer denied by automatic approval" + }, + "results": [ + { + "name": "npm editor build and Qt Release app build", + "status": "pass", + "evidence": [ + "editor-build.log", + "configure.log", + "build.log" + ] + }, + { + "name": "BlockHandleRegression original", + "status": "pass", + "evidence": [ + "block-handle.log" + ] + }, + { + "name": "EditorInteractionRegression original six checks", + "status": "pass", + "evidence": [ + "editor-interaction.log", + "editor-interaction-report.json" + ], + "limit": "CDP editor behavior; does not establish native popup visibility" + }, + { + "name": "real mouse drag and repeat drag", + "status": "pass", + "evidence": [ + "native.log", + "native-final.log", + "native-drag-report.json" + ], + "expectedOrders": [ + [ + "第一段", + "第四段", + "第二段", + "第三段" + ], + [ + "第一段", + "第二段", + "第三段", + "第四段" + ] + ] + }, + { + "name": "outside release cancellation", + "status": "pass", + "evidence": [ + "native-cancel-explicit.log", + "native-cancel-report.json" + ] + }, + { + "name": "Escape cancellation independent drag", + "status": "pass", + "evidence": [ + "native-cancel-explicit.log" + ], + "input": "xdotool keydown/keyup --window, after real body click" + }, + { + "name": "Escape cancellation following repeat drag", + "status": "fail", + "evidence": [ + "native-final.log" + ], + "observed": "preview survived Escape; releasing moved fourth paragraph before second; independent case passes" + }, + { + "name": "stationary edge scroll and timer stop", + "status": "pass", + "evidence": [ + "native.log", + "native-final.log" + ], + "samples": [ + { + "s0": 176, + "s1": 432, + "s2": 624 + }, + { + "s0": 32, + "s1": 304, + "s2": 512 + } + ] + }, + { + "name": "block menu first block move-up and empty paste disabled", + "status": "pass", + "evidence": [ + "screenshots/copy-menu-before.png" + ], + "limit": "final rerun paste assertion expected false after preceding copy and failed due test precondition; initial no-copy state was visually disabled" + }, + { + "name": "native copy immediately reopen enables paste", + "status": "pass", + "evidence": [ + "native-copy.log", + "native-copy-report.json", + "screenshots/copy-menu-after.png" + ], + "canPasteBlockAfterCopy": false, + "canPasteBlockAfterReopen": true + }, + { + "name": "find empty state and opt-in replacement", + "status": "pass", + "evidence": [ + "screenshots/find-native.png", + "screenshots/replace-native.png" + ] + }, + { + "name": "native query 01 highlight and enabled navigation/replacement", + "status": "pass", + "evidence": [ + "screenshots/replace-query.png", + "screenshots/find-query.png" + ], + "limit": "01 query matching and native next click observed; replacement mutation not exercised in this path" + }, + { + "name": "slash final command editor state", + "status": "pass", + "evidence": [ + "slash-cdp.log", + "slash-cdp-report.json" + ], + "index": 15, + "command": "toc", + "limit": "raw report says native popup; only editor state was asserted" + }, + { + "name": "slash native popup final item visible and highlighted", + "status": "fail", + "evidence": [ + "screenshots/slash-settled.png" + ], + "observed": "popup stays at top, highlights paragraph; toc not visible while CDP slash.index=15" + }, + { + "name": "latest cross-document query restoration", + "status": "not run", + "reason": "Main/SourceEditor transfer denied by automatic approval" + }, + { + "name": "AdvancedEditorRegression corrected VM copy sequential run", + "status": "fail", + "passedChecks": 9, + "evidence": [ + "advanced-final.log", + "advanced-final-report.json" + ], + "error": "Error: Timed out waiting for editor state\n at until (file:///home/amao/nknotes-review-agent-20261111/AdvancedEditorRegression.safe-cdp.mjs:14:128)\n at async file:///home/amao/nknotes-review-agent-20261111/AdvancedEditorRegression.safe-cdp.mjs:73:2", + "limit": "clipboard image import wait timed out; table width, metadata/schema final checks not reached" + } + ], + "diagnostics": { + "input": "xdotool mousemove absolute works; XTEST button/key without --window did not deliver. ydotool key272 press/release supports real drag; xdotool explicit-window button supports menus; discrete ydotool keyboard works for Ctrl+f/query; Escape/Down delivery varies by focus path.", + "screenshot": "Qt native and web frames sometimes differ; drag screenshot has missing third-row raster and edge screenshot may lag, so use state/order assertions as evidence. Native slash mismatch persisted on separately captured settled screenshot.", + "warnings": "No implicitHeight binding loop or ambiguous shortcut in app.log; AT-SPI GetApplicationBusAddress unsupported warnings only.", + "originalAdvancedFailure": "plain() all-doc includes legal trailing paragraph, yielding /\\n rather than /. VM test copy asserts active paragraph text; original failure retained.", + "overlap": "One advanced run overlapped native-final due operator mistake; that run is discarded. advanced-final.log/report will contain sequential rerun." + }, + "drivers": [ + "NativeEditorInteractionRegression.mjs", + "native-cancel-explicit.mjs", + "native-copy.mjs", + "slash-cdp.mjs", + "native-slash.mjs" + ], + "restrictions": "No existing app stopped, no system settings changed, no commit/push, no local app/tests/build executed; only dist editor.js and authorized evidence artifacts retrieved locally." +} \ No newline at end of file diff --git a/output/editor-interaction-2026-11-11/native-cancel-explicit.log b/output/editor-interaction-2026-11-11/native-cancel-explicit.log new file mode 100644 index 0000000..200b3a9 --- /dev/null +++ b/output/editor-interaction-2026-11-11/native-cancel-explicit.log @@ -0,0 +1,4 @@ +PASS outside release cancels without changing content +KEY EVENTS [] +AFTER ESCAPE {"epoch":2,"outline":[],"stats":{"characters":12,"words":8,"approximate":false,"minutes":1,"selected":0},"block":{"x":48,"pos":15,"end":20,"type":"paragraph","title":"第四段","y":133.171875,"height":26.390625,"canMoveUp":true,"canMoveDown":false,"canConvert":true},"blockHandleVisible":true,"slash":null,"search":{"total":0,"current":0},"pending":0,"canPasteBlock":false,"dropTarget":null,"context":null,"tableWidths":[]} +PASS Escape cancels preview before mouse release diff --git a/output/editor-interaction-2026-11-11/native-cancel-explicit.mjs b/output/editor-interaction-2026-11-11/native-cancel-explicit.mjs new file mode 100644 index 0000000..d4400f1 --- /dev/null +++ b/output/editor-interaction-2026-11-11/native-cancel-explicit.mjs @@ -0,0 +1,38 @@ +import assert from 'node:assert/strict'; +import {execFileSync} from 'node:child_process'; +import fs from 'node:fs'; +const base='/home/amao/nknotes-review-agent-20261111',win='16777260'; +const env={...process.env,DISPLAY:':0',XAUTHORITY:'/run/user/1000/xauth_AlxRJL',XDG_RUNTIME_DIR:'/run/user/1000',DBUS_SESSION_BUS_ADDRESS:'unix:path=/run/user/1000/bus'}; +const xd=(...args)=>execFileSync('xdotool',args.map(String),{env,encoding:'utf8'}); +xd('windowactivate','--sync',win); +const target=(await(await fetch('http://127.0.0.1:9241/json/list')).json()).find(x=>x.url==='qrc:/editor/index.html'); +const ws=new WebSocket(target.webSocketDebuggerUrl);await new Promise(r=>ws.onopen=r); +let serial=0;const pending=new Map(); +ws.onmessage=e=>{const r=JSON.parse(e.data),p=pending.get(r.id);if(p){pending.delete(r.id);clearTimeout(p.timer);r.error?p.reject(r.error):p.resolve(r.result)}}; +const call=(method,params={})=>new Promise((resolve,reject)=>{const id=++serial,timer=setTimeout(()=>{pending.delete(id);reject(Error('Timeout '+method+' '+JSON.stringify(params)))},7000);pending.set(id,{resolve,reject,timer});ws.send(JSON.stringify({id,method,params}))}); +const run=async expression=>{const r=await call('Runtime.evaluate',{expression,returnByValue:true,awaitPromise:true});if(r.exceptionDetails)throw Error(JSON.stringify(r.exceptionDetails));return r.result.value}; +const wait=ms=>new Promise(r=>setTimeout(r,ms)); +const state=()=>run('nextnotes.toolsState()'); +const doc=()=>run('nextnotes.snapshot().source'); +const boxes=()=>run('(()=>{const v=nextnotes.view(),out=[];v.state.doc.forEach((node,pos)=>{const r=v.nodeDOM(pos).getBoundingClientRect();out.push({pos,title:node.textContent,x:r.left,y:r.top,height:r.height,bottom:r.bottom})});return out})()'); +const load=async text=>{await run('nextnotes.load({epoch:nextnotes.snapshot().epoch,baseUrl:nextnotes.snapshot().baseUrl,source:'+JSON.stringify(text)+'})');await wait(1200);await run('nextnotes.view().focus()');await wait(500)}; +let web={x:509,y:91,width:771,height:682}; +const move=async(x,y)=>{xd('mousemove','--window',win,Math.round(x),Math.round(y));await wait(420)}; +const click=async(x,y)=>{await move(x,y);xd('click','--window',win,1);await wait(220)}; +const key=async name=>{assert.equal(name,'Escape');execFileSync('ydotool',['key','1:1','1:0'],{env:{...env,YDOTOOL_SOCKET:'/run/user/1000/.ydotool_socket'}});await wait(220)}; +const shot=async name=>{await wait(450);execFileSync('spectacle',['-b','-n','-a','-e','-S','-o',base+'/screenshots/'+name+'.png'],{env,stdio:'ignore'});await wait(100)}; +const hover=async title=>{const b=(await boxes()).find(x=>x.title===title);assert.ok(b,title);await move(web.x+b.x+70,web.y+b.y+b.height/2-2);await move(web.x+b.x+80,web.y+b.y+b.height/2);assert.equal((await state()).block.title,title);const s=(await state()).block;return {x:web.x+Math.max(12,s.x-34)+13,y:web.y+Math.max(0,s.y)+13}}; +const press=async title=>{const h=await hover(title);await move(h.x,h.y);execFileSync('ydotool',['key','272:1'],{env:{...env,YDOTOOL_SOCKET:'/run/user/1000/.ydotool_socket'}});await wait(100)}; +const release=async()=>{execFileSync('ydotool',['key','272:0'],{env:{...env,YDOTOOL_SOCKET:'/run/user/1000/.ydotool_socket'}});await wait(320)}; +const results=[]; +async function test(name,fn){try{await fn();results.push({name,passed:true});console.log('PASS',name)}catch(e){results.push({name,passed:false,error:e.stack});console.error('FAIL',name,e);execFileSync('ydotool',['key','272:0'],{env:{...env,YDOTOOL_SOCKET:'/run/user/1000/.ydotool_socket'}});await key('Escape')}fs.writeFileSync(base+'/native-report.json',JSON.stringify({results},null,2))} +try{ +await load('第一段\n\n第二段\n\n第三段\n\n第四段\n');execFileSync('ydotool',['key','29:0','42:0','54:0','56:0','97:0','100:0'],{env:{...env,YDOTOOL_SOCKET:'/run/user/1000/.ydotool_socket'}});await click(700,123);await run('window.cancelEvents=[];document.addEventListener("keydown",e=>cancelEvents.push({key:e.key,type:e.type}),true);true'); +await test('outside release cancels without changing content',async()=>{ + const before=await doc();await press('第四段');await move(web.x+45,web.y+55);assert.ok((await state()).dropTarget);await move(web.x-40,web.y+160);await release();assert.equal(await doc(),before);assert.equal((await state()).dropTarget,null); +}); +await test('Escape cancels preview before mouse release',async()=>{ + const before=await doc();await press('第四段');await move(web.x+45,web.y+55);assert.ok((await state()).dropTarget);xd('keydown','--window',win,'Escape');await wait(160);xd('keyup','--window',win,'Escape');await wait(600);console.log('KEY EVENTS',JSON.stringify(await run('cancelEvents')));const afterEscape=await state();console.log('AFTER ESCAPE',JSON.stringify(afterEscape));await release();assert.equal(await doc(),before);assert.equal(afterEscape.dropTarget,null); +}); +}catch(e){console.error(e);results.push({name:'driver',passed:false,error:e.stack})} +finally{execFileSync('ydotool',['key','272:0'],{env:{...env,YDOTOOL_SOCKET:'/run/user/1000/.ydotool_socket'}});fs.writeFileSync(base+'/native-cancel-report.json',JSON.stringify({results},null,2));ws.close();setTimeout(()=>process.exit(results.some(x=>x.passed===false)?1:0),200)} diff --git a/output/editor-interaction-2026-11-11/native-cancel-report.json b/output/editor-interaction-2026-11-11/native-cancel-report.json new file mode 100644 index 0000000..fb554cb --- /dev/null +++ b/output/editor-interaction-2026-11-11/native-cancel-report.json @@ -0,0 +1,12 @@ +{ + "results": [ + { + "name": "outside release cancels without changing content", + "passed": true + }, + { + "name": "Escape cancels preview before mouse release", + "passed": true + } + ] +} \ No newline at end of file diff --git a/output/editor-interaction-2026-11-11/native-copy-report.json b/output/editor-interaction-2026-11-11/native-copy-report.json new file mode 100644 index 0000000..2a16fb4 --- /dev/null +++ b/output/editor-interaction-2026-11-11/native-copy-report.json @@ -0,0 +1,10 @@ +{ + "results": [ + { + "name": "copy and reopen paste availability", + "passed": true, + "afterCopy": false, + "afterReopen": true + } + ] +} \ No newline at end of file diff --git a/output/editor-interaction-2026-11-11/native-copy.log b/output/editor-interaction-2026-11-11/native-copy.log new file mode 100644 index 0000000..8f98c8e --- /dev/null +++ b/output/editor-interaction-2026-11-11/native-copy.log @@ -0,0 +1,2 @@ +AFTER COPY {"epoch":2,"outline":[],"stats":{"characters":9,"words":6,"approximate":false,"minutes":1,"selected":0},"block":{"x":48,"pos":0,"end":5,"type":"paragraph","title":"第一段","y":18,"height":26.390625,"canMoveUp":false,"canMoveDown":true,"canConvert":true},"blockHandleVisible":true,"slash":null,"search":{"total":0,"current":0},"pending":0,"canPasteBlock":false,"dropTarget":null,"context":null,"tableWidths":[]} +AFTER REOPEN {"epoch":2,"outline":[],"stats":{"characters":9,"words":6,"approximate":false,"minutes":1,"selected":0},"block":{"x":48,"pos":0,"end":5,"type":"paragraph","title":"第一段","y":18,"height":26.390625,"canMoveUp":false,"canMoveDown":true,"canConvert":true},"blockHandleVisible":true,"slash":null,"search":{"total":0,"current":0},"pending":0,"canPasteBlock":true,"dropTarget":null,"context":null,"tableWidths":[]} diff --git a/output/editor-interaction-2026-11-11/native-copy.mjs b/output/editor-interaction-2026-11-11/native-copy.mjs new file mode 100644 index 0000000..e7a609c --- /dev/null +++ b/output/editor-interaction-2026-11-11/native-copy.mjs @@ -0,0 +1,35 @@ +import assert from 'node:assert/strict'; +import {execFileSync} from 'node:child_process'; +import fs from 'node:fs'; +const base='/home/amao/nknotes-review-agent-20261111',win='16777260'; +const env={...process.env,DISPLAY:':0',XAUTHORITY:'/run/user/1000/xauth_AlxRJL',XDG_RUNTIME_DIR:'/run/user/1000',DBUS_SESSION_BUS_ADDRESS:'unix:path=/run/user/1000/bus'}; +const xd=(...args)=>execFileSync('xdotool',args.map(String),{env,encoding:'utf8'}); +xd('windowactivate','--sync',win); +const target=(await(await fetch('http://127.0.0.1:9241/json/list')).json()).find(x=>x.url==='qrc:/editor/index.html'); +const ws=new WebSocket(target.webSocketDebuggerUrl);await new Promise(r=>ws.onopen=r); +let serial=0;const pending=new Map(); +ws.onmessage=e=>{const r=JSON.parse(e.data),p=pending.get(r.id);if(p){pending.delete(r.id);clearTimeout(p.timer);r.error?p.reject(r.error):p.resolve(r.result)}}; +const call=(method,params={})=>new Promise((resolve,reject)=>{const id=++serial,timer=setTimeout(()=>{pending.delete(id);reject(Error('Timeout '+method+' '+JSON.stringify(params)))},7000);pending.set(id,{resolve,reject,timer});ws.send(JSON.stringify({id,method,params}))}); +const run=async expression=>{const r=await call('Runtime.evaluate',{expression,returnByValue:true,awaitPromise:true});if(r.exceptionDetails)throw Error(JSON.stringify(r.exceptionDetails));return r.result.value}; +const wait=ms=>new Promise(r=>setTimeout(r,ms)); +const state=()=>run('nextnotes.toolsState()'); +const doc=()=>run('nextnotes.snapshot().source'); +const boxes=()=>run('(()=>{const v=nextnotes.view(),out=[];v.state.doc.forEach((node,pos)=>{const r=v.nodeDOM(pos).getBoundingClientRect();out.push({pos,title:node.textContent,x:r.left,y:r.top,height:r.height,bottom:r.bottom})});return out})()'); +const load=async text=>{await run('nextnotes.load({epoch:nextnotes.snapshot().epoch,baseUrl:nextnotes.snapshot().baseUrl,source:'+JSON.stringify(text)+'})');await wait(1200);await run('nextnotes.view().focus()');await wait(500)}; +let web={x:509,y:91,width:771,height:682}; +const move=async(x,y)=>{xd('mousemove','--window',win,Math.round(x),Math.round(y));await wait(420)}; +const click=async(x,y)=>{await move(x,y);xd('click','--window',win,1);await wait(220)}; +const key=async name=>{assert.equal(name,'Escape');execFileSync('ydotool',['key','1:1','1:0'],{env:{...env,YDOTOOL_SOCKET:'/run/user/1000/.ydotool_socket'}});await wait(220)}; +const shot=async name=>{await wait(450);execFileSync('spectacle',['-b','-n','-a','-e','-S','-o',base+'/screenshots/'+name+'.png'],{env,stdio:'ignore'});await wait(100)}; +const hover=async title=>{const b=(await boxes()).find(x=>x.title===title);assert.ok(b,title);await move(web.x+b.x+80,web.y+b.y+b.height/2);assert.equal((await state()).block.title,title);const s=(await state()).block;return {x:web.x+Math.max(12,s.x-34)+13,y:web.y+Math.max(0,s.y)+13}}; +const press=async title=>{const h=await hover(title);await move(h.x,h.y);execFileSync('ydotool',['key','272:1'],{env:{...env,YDOTOOL_SOCKET:'/run/user/1000/.ydotool_socket'}});await wait(100)}; +const release=async()=>{execFileSync('ydotool',['key','272:0'],{env:{...env,YDOTOOL_SOCKET:'/run/user/1000/.ydotool_socket'}});await wait(320)}; +const results=[]; +async function test(name,fn){try{await fn();results.push({name,passed:true});console.log('PASS',name)}catch(e){results.push({name,passed:false,error:e.stack});console.error('FAIL',name,e);execFileSync('ydotool',['key','272:0'],{env:{...env,YDOTOOL_SOCKET:'/run/user/1000/.ydotool_socket'}});await key('Escape')}fs.writeFileSync(base+'/native-report.json',JSON.stringify({results},null,2))} +try{ +xd('keydown','--window',win,'Escape');xd('keyup','--window',win,'Escape');await load('第一段\n\n第二段\n\n第三段\n');await click(700,123); +const h=await hover('第一段');await click(h.x,h.y);await shot('copy-menu-before'); +await click(500,198);await wait(400);const afterCopy=await state();console.log('AFTER COPY',JSON.stringify(afterCopy)); +await click(h.x,h.y);await shot('copy-menu-after');const afterReopen=await state();console.log('AFTER REOPEN',JSON.stringify(afterReopen));results.push({name:'copy and reopen paste availability',passed:afterReopen.canPasteBlock,afterCopy:afterCopy.canPasteBlock,afterReopen:afterReopen.canPasteBlock}); +}catch(e){console.error(e);results.push({name:'copy',passed:false,error:e.stack})} +finally{fs.writeFileSync(base+'/native-copy-report.json',JSON.stringify({results},null,2));ws.close();setTimeout(()=>process.exit(results.some(x=>x.passed===false)?1:0),200)} diff --git a/output/editor-interaction-2026-11-11/native-drag-report.json b/output/editor-interaction-2026-11-11/native-drag-report.json new file mode 100644 index 0000000..e618a51 --- /dev/null +++ b/output/editor-interaction-2026-11-11/native-drag-report.json @@ -0,0 +1,30 @@ +{ + "results": [ + { + "name": "native drag and repeated drag retain moved block handle", + "passed": true + }, + { + "name": "Escape and release outside editor cancel native drag", + "passed": false, + "error": "AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:\n+ actual - expected\n\n+ '第一段\\n\\n第四段\\n\\n第二段\\n\\n第三段\\n'\n- '第一段\\n\\n第二段\\n\\n第三段\\n\\n第四段\\n'\n ^\n\n at file:///home/amao/nknotes-review-agent-20261111/NativeEditorInteractionRegression.mjs:38:207\n at async test (file:///home/amao/nknotes-review-agent-20261111/NativeEditorInteractionRegression.mjs:28:34)\n at async file:///home/amao/nknotes-review-agent-20261111/NativeEditorInteractionRegression.mjs:37:1" + }, + { + "name": "first-block menu disables move-up and empty clipboard paste", + "passed": false, + "error": "AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:\n\ntrue !== false\n\n at file:///home/amao/nknotes-review-agent-20261111/NativeEditorInteractionRegression.mjs:42:134\n at async test (file:///home/amao/nknotes-review-agent-20261111/NativeEditorInteractionRegression.mjs:28:34)\n at async file:///home/amao/nknotes-review-agent-20261111/NativeEditorInteractionRegression.mjs:41:1" + }, + { + "name": "edge scroll samples", + "passed": true, + "s0": 32, + "s1": 304, + "s2": 512, + "stop": 1168 + }, + { + "name": "stationary pointer at edge keeps scrolling and Escape stops it", + "passed": true + } + ] +} \ No newline at end of file diff --git a/output/editor-interaction-2026-11-11/native-final.log b/output/editor-interaction-2026-11-11/native-final.log new file mode 100644 index 0000000..76e296d --- /dev/null +++ b/output/editor-interaction-2026-11-11/native-final.log @@ -0,0 +1,35 @@ +PASS native drag and repeated drag retain moved block handle +FAIL Escape and release outside editor cancel native drag AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: ++ actual - expected + ++ '第一段\n\n第四段\n\n第二段\n\n第三段\n' +- '第一段\n\n第二段\n\n第三段\n\n第四段\n' + ^ + + at file:///home/amao/nknotes-review-agent-20261111/NativeEditorInteractionRegression.mjs:38:207 + at async test (file:///home/amao/nknotes-review-agent-20261111/NativeEditorInteractionRegression.mjs:28:34) + at async file:///home/amao/nknotes-review-agent-20261111/NativeEditorInteractionRegression.mjs:37:1 { + generatedMessage: true, + code: 'ERR_ASSERTION', + actual: '第一段\n\n第四段\n\n第二段\n\n第三段\n', + expected: '第一段\n\n第二段\n\n第三段\n\n第四段\n', + operator: 'strictEqual', + diff: 'simple' +} +FAIL first-block menu disables move-up and empty clipboard paste AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + +true !== false + + at file:///home/amao/nknotes-review-agent-20261111/NativeEditorInteractionRegression.mjs:42:134 + at async test (file:///home/amao/nknotes-review-agent-20261111/NativeEditorInteractionRegression.mjs:28:34) + at async file:///home/amao/nknotes-review-agent-20261111/NativeEditorInteractionRegression.mjs:41:1 { + generatedMessage: true, + code: 'ERR_ASSERTION', + actual: true, + expected: false, + operator: 'strictEqual', + diff: 'simple' +} +EDGE before {"epoch":2,"outline":[],"stats":{"characters":260,"words":130,"approximate":false,"minutes":1,"selected":0},"block":{"x":48,"pos":0,"end":7,"type":"paragraph","title":"段落 01","y":2,"height":26.390625,"canMoveUp":false,"canMoveDown":true,"canConvert":true},"blockHandleVisible":true,"slash":null,"search":{"total":0,"current":0},"pending":0,"canPasteBlock":true,"dropTarget":{"pos":119,"x":48,"y":648.640625,"width":660},"context":null,"tableWidths":[]} +EDGE samples {"s0":32,"s1":304,"s2":512} +PASS stationary pointer at edge keeps scrolling and Escape stops it diff --git a/output/editor-interaction-2026-11-11/native-report.json b/output/editor-interaction-2026-11-11/native-report.json new file mode 100644 index 0000000..fb554cb --- /dev/null +++ b/output/editor-interaction-2026-11-11/native-report.json @@ -0,0 +1,12 @@ +{ + "results": [ + { + "name": "outside release cancels without changing content", + "passed": true + }, + { + "name": "Escape cancels preview before mouse release", + "passed": true + } + ] +} \ No newline at end of file diff --git a/output/editor-interaction-2026-11-11/native-slash-report.json b/output/editor-interaction-2026-11-11/native-slash-report.json new file mode 100644 index 0000000..a2430ae --- /dev/null +++ b/output/editor-interaction-2026-11-11/native-slash-report.json @@ -0,0 +1,9 @@ +{ + "results": [ + { + "name": "native keyboard reaches final slash entry", + "passed": false, + "error": "AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:\n\n0 !== 15\n\n at file:///home/amao/nknotes-review-agent-20261111/native-slash.mjs:34:59" + } + ] +} \ No newline at end of file diff --git a/output/editor-interaction-2026-11-11/native-slash.log b/output/editor-interaction-2026-11-11/native-slash.log new file mode 100644 index 0000000..cfb496c --- /dev/null +++ b/output/editor-interaction-2026-11-11/native-slash.log @@ -0,0 +1,28 @@ +DOWN 0 0 +DOWN 1 0 +DOWN 2 0 +DOWN 3 0 +DOWN 4 0 +DOWN 5 0 +DOWN 6 0 +DOWN 7 0 +DOWN 8 0 +DOWN 9 0 +DOWN 10 0 +DOWN 11 0 +DOWN 12 0 +DOWN 13 0 +DOWN 14 0 +SLASH {"epoch":2,"outline":[],"stats":{"characters":1,"words":0,"approximate":false,"minutes":1,"selected":0},"block":{"x":48,"pos":0,"end":3,"type":"paragraph","title":"/","y":18,"height":26.390625,"canMoveUp":false,"canMoveDown":false,"canConvert":true},"blockHandleVisible":true,"slash":{"query":"","items":[{"command":"paragraph","label":"正文"},{"command":"heading1","label":"标题 1"},{"command":"heading2","label":"标题 2"},{"command":"heading3","label":"标题 3"},{"command":"bullet","label":"项目列表"},{"command":"ordered","label":"编号列表"},{"command":"task","label":"任务清单"},{"command":"quote","label":"引用"},{"command":"codeblock","label":"代码块"},{"command":"mermaid","label":"Mermaid 图表"},{"command":"table","label":"表格"},{"command":"rule","label":"分隔线"},{"command":"math","label":"数学公式"},{"command":"footnote","label":"脚注"},{"command":"attachment","label":"图片或附件"},{"command":"toc","label":"插入目录"}],"index":0,"from":1,"to":2,"x":54.28125,"y":43},"search":{"total":0,"current":0},"pending":0,"canPasteBlock":false,"dropTarget":null,"context":null,"tableWidths":[]} +AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + +0 !== 15 + + at file:///home/amao/nknotes-review-agent-20261111/native-slash.mjs:34:59 { + generatedMessage: true, + code: 'ERR_ASSERTION', + actual: 0, + expected: 15, + operator: 'strictEqual', + diff: 'simple' +} diff --git a/output/editor-interaction-2026-11-11/native.log b/output/editor-interaction-2026-11-11/native.log new file mode 100644 index 0000000..3eba4ca --- /dev/null +++ b/output/editor-interaction-2026-11-11/native.log @@ -0,0 +1,22 @@ +PASS native drag and repeated drag retain moved block handle +FAIL Escape and release outside editor cancel native drag AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: ++ actual - expected + ++ '第一段\n\n第四段\n\n第二段\n\n第三段\n' +- '第一段\n\n第二段\n\n第三段\n\n第四段\n' + ^ + + at file:///home/amao/nknotes-review-agent-20261111/native.mjs:38:207 + at async test (file:///home/amao/nknotes-review-agent-20261111/native.mjs:28:34) + at async file:///home/amao/nknotes-review-agent-20261111/native.mjs:37:1 { + generatedMessage: true, + code: 'ERR_ASSERTION', + actual: '第一段\n\n第四段\n\n第二段\n\n第三段\n', + expected: '第一段\n\n第二段\n\n第三段\n\n第四段\n', + operator: 'strictEqual', + diff: 'simple' +} +PASS first-block menu disables move-up and empty clipboard paste +EDGE before {"epoch":2,"outline":[],"stats":{"characters":260,"words":130,"approximate":false,"minutes":1,"selected":0},"block":{"x":48,"pos":0,"end":7,"type":"paragraph","title":"段落 01","y":-142,"height":26.390625,"canMoveUp":false,"canMoveDown":true,"canConvert":true},"blockHandleVisible":true,"slash":null,"search":{"total":0,"current":0},"pending":0,"canPasteBlock":false,"dropTarget":{"pos":147,"x":48,"y":658.203125,"width":660},"context":null,"tableWidths":[]} +EDGE samples {"s0":176,"s1":432,"s2":624} +PASS stationary pointer at edge keeps scrolling and Escape stops it diff --git a/output/editor-interaction-2026-11-11/pending-runtime-fixes.json b/output/editor-interaction-2026-11-11/pending-runtime-fixes.json new file mode 100644 index 0000000..bb08644 --- /dev/null +++ b/output/editor-interaction-2026-11-11/pending-runtime-fixes.json @@ -0,0 +1,21 @@ +{ + "codeCommit": "2133581", + "runtimeStatus": "not_run", + "reason": "Automatic approval blocked transferring updated source files into kos-vm-dev. No alternate transfer path was used.", + "files": { + "qml/Main.qml": "813422b43a5c493f1bae7ded896e4c8396168fe39aa13c4cf2a66c5cfeef12e4", + "qml/SourceEditor.qml": "7bb5ca24bbd6ffb8549fca87233d1158c6a83d86972dd1c008da8c2a91e0e9aa", + "qml/EditorTools.qml": "ae5f5eb3e7ac68b9d7ded2d1825313c4ef379b9af0ff13ec045beb4dae4ede7c" + }, + "changes": [ + "Reapply a visible document search after the next document finishes loading.", + "Take native handle focus at drag start, accept Escape on that handle, preserve canceled release gating, and restore editor focus only while visible/editable without an active tool popup.", + "Synchronize slash menu selection after opening and item recreation, then scroll the selected row into view." + ], + "sourceReview": "completed; no confirmed blocking defect found", + "requiredAcceptance": [ + "Native move, repeat move, drag again, Escape, release: preview clears and content remains unchanged.", + "Native slash menu: 15 ArrowDown presses make toc visibly selected and fully in view; wrap, filtering and reopening preserve selection consistency.", + "Keep document find open while switching notes: existing query and count restore after load." + ] +} diff --git a/output/editor-interaction-2026-11-11/slash-cdp-report.json b/output/editor-interaction-2026-11-11/slash-cdp-report.json new file mode 100644 index 0000000..6773946 --- /dev/null +++ b/output/editor-interaction-2026-11-11/slash-cdp-report.json @@ -0,0 +1,8 @@ +{ + "results": [ + { + "name": "CDP keyboard reaches final slash entry in native popup", + "passed": true + } + ] +} \ No newline at end of file diff --git a/output/editor-interaction-2026-11-11/slash-cdp.log b/output/editor-interaction-2026-11-11/slash-cdp.log new file mode 100644 index 0000000..b014f76 --- /dev/null +++ b/output/editor-interaction-2026-11-11/slash-cdp.log @@ -0,0 +1 @@ +SLASH {"epoch":2,"outline":[],"stats":{"characters":1,"words":0,"approximate":false,"minutes":1,"selected":0},"block":{"x":48,"pos":0,"end":3,"type":"paragraph","title":"/","y":18,"height":26.390625,"canMoveUp":false,"canMoveDown":false,"canConvert":true},"blockHandleVisible":false,"slash":{"query":"","items":[{"command":"paragraph","label":"正文"},{"command":"heading1","label":"标题 1"},{"command":"heading2","label":"标题 2"},{"command":"heading3","label":"标题 3"},{"command":"bullet","label":"项目列表"},{"command":"ordered","label":"编号列表"},{"command":"task","label":"任务清单"},{"command":"quote","label":"引用"},{"command":"codeblock","label":"代码块"},{"command":"mermaid","label":"Mermaid 图表"},{"command":"table","label":"表格"},{"command":"rule","label":"分隔线"},{"command":"math","label":"数学公式"},{"command":"footnote","label":"脚注"},{"command":"attachment","label":"图片或附件"},{"command":"toc","label":"插入目录"}],"index":15,"from":1,"to":2,"x":54.28125,"y":43},"search":{"total":0,"current":0},"pending":0,"canPasteBlock":true,"dropTarget":null,"context":null,"tableWidths":[]} diff --git a/output/editor-interaction-2026-11-11/slash-cdp.mjs b/output/editor-interaction-2026-11-11/slash-cdp.mjs new file mode 100644 index 0000000..104361d --- /dev/null +++ b/output/editor-interaction-2026-11-11/slash-cdp.mjs @@ -0,0 +1,35 @@ +import assert from 'node:assert/strict'; +import {execFileSync} from 'node:child_process'; +import fs from 'node:fs'; +const base='/home/amao/nknotes-review-agent-20261111',win='16777260'; +const env={...process.env,DISPLAY:':0',XAUTHORITY:'/run/user/1000/xauth_AlxRJL',XDG_RUNTIME_DIR:'/run/user/1000',DBUS_SESSION_BUS_ADDRESS:'unix:path=/run/user/1000/bus'}; +const xd=(...args)=>execFileSync('xdotool',args.map(String),{env,encoding:'utf8'}); +xd('windowactivate','--sync',win); +const target=(await(await fetch('http://127.0.0.1:9241/json/list')).json()).find(x=>x.url==='qrc:/editor/index.html'); +const ws=new WebSocket(target.webSocketDebuggerUrl);await new Promise(r=>ws.onopen=r); +let serial=0;const pending=new Map(); +ws.onmessage=e=>{const r=JSON.parse(e.data),p=pending.get(r.id);if(p){pending.delete(r.id);clearTimeout(p.timer);r.error?p.reject(r.error):p.resolve(r.result)}}; +const call=(method,params={})=>new Promise((resolve,reject)=>{const id=++serial,timer=setTimeout(()=>{pending.delete(id);reject(Error('Timeout '+method+' '+JSON.stringify(params)))},7000);pending.set(id,{resolve,reject,timer});ws.send(JSON.stringify({id,method,params}))}); +const run=async expression=>{const r=await call('Runtime.evaluate',{expression,returnByValue:true,awaitPromise:true});if(r.exceptionDetails)throw Error(JSON.stringify(r.exceptionDetails));return r.result.value}; +const wait=ms=>new Promise(r=>setTimeout(r,ms)); +const state=()=>run('nextnotes.toolsState()'); +const doc=()=>run('nextnotes.snapshot().source'); +const boxes=()=>run('(()=>{const v=nextnotes.view(),out=[];v.state.doc.forEach((node,pos)=>{const r=v.nodeDOM(pos).getBoundingClientRect();out.push({pos,title:node.textContent,x:r.left,y:r.top,height:r.height,bottom:r.bottom})});return out})()'); +const load=async text=>{await run('nextnotes.load({epoch:nextnotes.snapshot().epoch,baseUrl:nextnotes.snapshot().baseUrl,source:'+JSON.stringify(text)+'})');await wait(1200);await run('nextnotes.view().focus()');await wait(500)}; +let web={x:509,y:91,width:771,height:682}; +const move=async(x,y)=>{xd('mousemove','--window',win,Math.round(x),Math.round(y));await wait(420)}; +const click=async(x,y)=>{await move(x,y);xd('click','--window',win,1);await wait(220)}; +const key=async name=>{assert.equal(name,'Escape');execFileSync('ydotool',['key','1:1','1:0'],{env:{...env,YDOTOOL_SOCKET:'/run/user/1000/.ydotool_socket'}});await wait(220)}; +const shot=async name=>{await wait(450);execFileSync('spectacle',['-b','-n','-a','-e','-S','-o',base+'/screenshots/'+name+'.png'],{env,stdio:'ignore'});await wait(100)}; +const hover=async title=>{const b=(await boxes()).find(x=>x.title===title);assert.ok(b,title);await move(web.x+b.x+80,web.y+b.y+b.height/2);assert.equal((await state()).block.title,title);const s=(await state()).block;return {x:web.x+Math.max(12,s.x-34)+13,y:web.y+Math.max(0,s.y)+13}}; +const press=async title=>{const h=await hover(title);await move(h.x,h.y);execFileSync('ydotool',['key','272:1'],{env:{...env,YDOTOOL_SOCKET:'/run/user/1000/.ydotool_socket'}});await wait(100)}; +const release=async()=>{execFileSync('ydotool',['key','272:0'],{env:{...env,YDOTOOL_SOCKET:'/run/user/1000/.ydotool_socket'}});await wait(320)}; +const results=[]; +async function test(name,fn){try{await fn();results.push({name,passed:true});console.log('PASS',name)}catch(e){results.push({name,passed:false,error:e.stack});console.error('FAIL',name,e);execFileSync('ydotool',['key','272:0'],{env:{...env,YDOTOOL_SOCKET:'/run/user/1000/.ydotool_socket'}});await key('Escape')}fs.writeFileSync(base+'/native-report.json',JSON.stringify({results},null,2))} +try{ +await key('Escape');await click(1219,104);await load('/\n'); +await run('(()=>{const v=nextnotes.view();v.dispatch(v.state.tr.setSelection(v.state.selection.constructor.create(v.state.doc,2)));v.focus();return true})()');await wait(500); +for(let i=0;i<15;i++){await call('Input.dispatchKeyEvent',{type:'keyDown',key:'ArrowDown',code:'ArrowDown',windowsVirtualKeyCode:40});await call('Input.dispatchKeyEvent',{type:'keyUp',key:'ArrowDown',code:'ArrowDown',windowsVirtualKeyCode:40});await wait(180)} +assert.equal((await state()).slash.index,15);await shot('slash-last-cdp');console.log('SLASH',JSON.stringify(await state()));results.push({name:'CDP keyboard reaches final slash entry in native popup',passed:true}); +}catch(e){console.error(e);results.push({name:'CDP slash',passed:false,error:e.stack})} +finally{fs.writeFileSync(base+'/slash-cdp-report.json',JSON.stringify({results},null,2));ws.close();setTimeout(()=>process.exit(results.some(x=>x.passed===false)?1:0),200)} diff --git a/output/editor-interaction-2026-11-11/source-hashes.json b/output/editor-interaction-2026-11-11/source-hashes.json new file mode 100644 index 0000000..cd1e68a --- /dev/null +++ b/output/editor-interaction-2026-11-11/source-hashes.json @@ -0,0 +1,12 @@ +{ + "qml/Main.qml": "7ebb4fc9d20d07deea3c8332788d70db95b320e6acb9194a1501a377c061cbfb", + "qml/SourceEditor.qml": "981dd691e9fbc9aee7eb14160a1756c3c6c4c783e7f83c4fa671120d9bb2d40a", + "qml/NotesPopover.qml": "2e04245b94692424a5168e5a8604ba4fcc75385ff9daef91ffa951c176dd0eb0", + "qml/EditorTools.qml": "a8fd7001a7c5fc69f9083f9e2db960a2e9d8d20b65dd74ca730fcda53f2906f4", + "web/editor/tools.js": "90381dd8e7f81e1cc4cbf8b553cee95c57b457a4cae7e9e886cc6090f9105840", + "web/editor/editor.css": "eca19aa131e6404546f4d24b3b53a27d538b7d86e142913304a14ffe58bac1e4", + "web/editor/dist/editor.js": "b76af6b3adb816ccd930cdeb78b50c2b0015cb6c09e7878d07d1410b2a0af3a1", + "tests/BlockHandleRegression.mjs": "c816023520116f9e193b6501950d72d87d744d7c256c5bfb5c3fc0d6701a2dcb", + "tests/EditorInteractionRegression.mjs": "8526c0064d051cc1d5ebb1e57a9abf3624c27975d79e0124d1dcf09d43296475", + "tests/AdvancedEditorRegression.mjs": "c67774aa52f1dfc01442fe9e95589efc40d17e58e979d162f910cefb60fd5651" +} \ No newline at end of file diff --git a/qml/EditorTools.qml b/qml/EditorTools.qml index e618175..cf1aba4 100644 --- a/qml/EditorTools.qml +++ b/qml/EditorTools.qml @@ -18,8 +18,24 @@ Item { property var spellSuggestions: [] property int documentEpoch: -1 property bool dragging: false + property real dragX: 0 property real dragY: 0 - function closeSlash() { slashMenu.close() } + property var pressedBlock: null + property var pendingContext: null + property int contextSequence: 0 + readonly property var handleBlock: pressedBlock || state.block + readonly property bool dragInside: dragX >= 0 && dragX < width - outlineWidth && dragY >= 0 && dragY < height + function cancelDrag(restoreFocus) { + const restore = restoreFocus && handle.activeFocus && visible && editable && !popupActive + if (handlePointer && handlePointer.pressed) handlePointer.gestureCanceled = true + dragging = false; pressedBlock = null; post("cancelBlockMove") + if (restore) source.editor.forceActiveFocus() + } + function previewDrag() { + if (dragInside) post("previewBlockMove", {pos: pressedBlock.pos, y: dragY}) + else post("cancelBlockMove") + } + function closeSlash() { slashMenu.suppressOnClose = false; slashMenu.close() } function post(name, args) { source.action(name, args || {}) } function toggleOutline(anchor, originMenu) { if (width > 600) { outlineVisible = !outlineVisible; controller.setPreference("editorOutline", outlineVisible) } @@ -29,8 +45,8 @@ Item { function showShortcuts(anchor) { helpPanel.openFromButton(anchor) } function openMenu(anchor) { toolsMenu.openFromButton(anchor) } function openContext(x, y, suggestions) { - block = state.block || {}; spellSuggestions = suggestions || [] - blockMenu.openAtPoint(root, Qt.point(x, y)) + pendingContext = {x: x, y: y, suggestions: suggestions || [], request: ++contextSequence} + post("contextBlock", {x: x, y: y, request: contextSequence}) } function openMath(originMenu) { const value = state.math || {}; mathPanel.targetPos = value.pos === undefined ? -1 : value.pos @@ -38,7 +54,8 @@ Item { if (originMenu) mathPanel.openFromMenu(originMenu); else mathPanel.openFromButton(handle.visible ? handle : caretAnchor) } function openCode(originMenu) { - const value = state.code || {}; codePanel.targetPos = value.pos === undefined ? (state.block ? state.block.pos : 0) : value.pos + const value = originMenu === blockMenu ? block : (state.code || {}) + codePanel.targetPos = value.pos === undefined ? 0 : value.pos const index = language.model.indexOf(value.language || "plain"); language.currentIndex = index < 0 ? 0 : index if (originMenu) codePanel.openFromMenu(originMenu); else codePanel.openFromButton(handle.visible ? handle : caretAnchor) } @@ -51,55 +68,94 @@ Item { function uiChanged() { if (state.epoch !== undefined && documentEpoch !== state.epoch) { documentEpoch = state.epoch - slashMenu.close(); blockMenu.close(); toolsMenu.close(); mathPanel.close(); codePanel.close(); imagePanel.close(); helpPanel.close(); attachmentsPanel.close(); outlinePanel.close() - dragging = false + closeSlash(); blockMenu.close(); toolsMenu.close(); mathPanel.close(); codePanel.close(); imagePanel.close(); helpPanel.close(); attachmentsPanel.close(); outlinePanel.close() + dragging = false; pressedBlock = null; pendingContext = null + } + if (pendingContext && state.context && state.context.request === pendingContext.request) { + const pending = pendingContext; pendingContext = null + block = state.context.block || {}; spellSuggestions = pending.suggestions + if (state.context.block) blockMenu.openAtPoint(root, Qt.point(pending.x, pending.y)) } const slash = state.slash if (slash && slash.items.length && editable) { caretAnchor.x = Math.max(0, Math.min(width - outlineWidth - 30, slash.x)); caretAnchor.y = Math.max(0, Math.min(height - 22, slash.y)) - slashMenu.currentIndex = slash.index if (!slashMenu.visible) slashMenu.openForCaret(caretAnchor) - } else if (slashMenu.visible) slashMenu.close() + Qt.callLater(slashMenu.syncSelection) + } else if (slashMenu.visible) closeSlash() } onStateChanged: uiChanged() + onEditableChanged: if (!editable) cancelDrag() + onVisibleChanged: if (!visible) cancelDrag() Item { id: caretAnchor; width: 8; height: 18; x: 32; y: 18 } LiquidActionButton { id: handle + objectName: "editorBlockHandle" // Only a fresh paragraph's first editing session suppresses its handle. - visible: !!root.state.blockHandleVisible - && !!root.state.block && root.state.block.y >= 0 && root.state.block.y < root.height && root.editable - x: Math.max(12, root.state.block ? root.state.block.x - width - 8 : 12); y: Math.max(0, root.state.block ? root.state.block.y : 0) + visible: (root.dragging || !!root.state.blockHandleVisible) + && !!root.handleBlock && root.handleBlock.y >= 0 && root.handleBlock.y < root.height && root.editable + x: Math.max(12, root.handleBlock ? root.handleBlock.x - width - 8 : 12); y: Math.max(0, root.handleBlock ? root.handleBlock.y : 0) implicitWidth: 26; implicitHeight: 26; iconOnly: true; iconName: "more"; iconSize: 16 materialForm: true Accessible.name: "块操作,可拖动块,或使用 Alt+Shift+方向键移动" + Keys.onShortcutOverride: function(event) { + if (root.dragging && event.key === Qt.Key_Escape) event.accepted = true + } + Keys.onEscapePressed: function(event) { + if (root.dragging) { root.cancelDrag(true); event.accepted = true } + else event.accepted = false + } onClicked: { root.block = root.state.block; root.spellSuggestions = []; blockMenu.openFromButton(handle) } MouseArea { anchors.fill: parent + id: handlePointer cursorShape: pressed ? Qt.ClosedHandCursor : Qt.OpenHandCursor property real startY: 0 property int startPos: 0 - onPressed: function(mouse) { startY = mapToItem(root, mouse.x, mouse.y).y; startPos = root.state.block.pos; root.dragging = false } + property bool gestureCanceled: false + onPressed: function(mouse) { + gestureCanceled = false + root.pressedBlock = root.state.block + startY = mapToItem(root, mouse.x, mouse.y).y; startPos = root.pressedBlock.pos; root.dragging = false + } onPositionChanged: function(mouse) { - if (!pressed) return + if (!pressed || gestureCanceled) return const point = mapToItem(root, mouse.x, mouse.y) - if (Math.abs(point.y - startY) > 6) root.dragging = true + if (!root.dragging && Math.abs(point.y - startY) > 6) { + handle.forceActiveFocus(Qt.MouseFocusReason) + root.dragging = true + } if (root.dragging) { - root.dragY = point.y - if (point.y < 35) root.post("dragScroll", {delta: -20}) - else if (point.y > root.height - 35) root.post("dragScroll", {delta: 20}) + root.dragX = point.x; root.dragY = point.y + root.previewDrag() } } onReleased: function(mouse) { - if (root.dragging) root.post("moveBlock", {pos: startPos, y: root.dragY}) + if (gestureCanceled) { root.cancelDrag(); return } + if (root.dragging) { + const point = mapToItem(root, mouse.x, mouse.y) + root.dragX = point.x; root.dragY = point.y + if (root.dragInside) root.post("moveBlock", {pos: startPos, y: point.y}) + } else if (mouse.modifiers & Qt.ShiftModifier) root.post("selectBlock", {pos: startPos, extend: true}) - else { root.block = root.state.block; root.spellSuggestions = []; blockMenu.openFromButton(handle) } - root.dragging = false + else if (containsMouse) { root.block = root.pressedBlock; root.spellSuggestions = []; blockMenu.openFromButton(handle) } + root.cancelDrag(true) } - onCanceled: root.dragging = false + onCanceled: root.cancelDrag(true) } KosToolTip { target: handle; text: "拖动移动块,点击打开块操作" } } - Rectangle { visible: root.dragging; x: root.source.inset; y: root.dragY; width: Math.max(0, root.width - root.outlineWidth - root.source.inset * 2); height: 2; color: AppTheme.border } + Timer { + interval: 40; repeat: true + running: root.dragging && root.dragInside && (root.dragY < 35 || root.dragY > root.height - 35) + onTriggered: { root.post("dragScroll", {delta: root.dragY < 35 ? -16 : 16}); root.previewDrag() } + } + Rectangle { + objectName: "editorBlockDropIndicator" + readonly property var target: root.state.dropTarget + visible: root.dragging && root.dragInside && !!target && target.y >= 0 && target.y < root.height + x: target ? target.x : 0; y: target ? target.y : 0 + width: target ? target.width : 0; height: 2; radius: 1; color: AppTheme.mutedText + } Component { id: outlineView ColumnLayout { @@ -141,7 +197,19 @@ Item { } NotesPopover { id: slashMenu; sourceItem: root.sceneItem; anchorItem: caretAnchor; focus: false - onClosed: root.post("dismissSlash") + maxHeight: 320 + property bool suppressOnClose: true + function syncSelection() { + const slash = root.state.slash + if (!visible || !slash || !slash.items.length) return + currentIndex = slash.index + if (contentItem && contentItem.positionViewAtIndex) + contentItem.positionViewAtIndex(currentIndex, ListView.Contain) + } + onOpened: { suppressOnClose = true; Qt.callLater(syncSelection) } + // Filtering, applying an entry and changing documents also close this menu. + // Only an explicit dismissal should suppress the current slash query. + onClosed: if (suppressOnClose && root.state.slash && root.state.slash.items.length && root.editable) root.post("dismissSlash") Instantiator { model: root.state.slash ? root.state.slash.items : [] delegate: LiquidPopoverItem { @@ -150,8 +218,8 @@ Item { text: modelData.label; highlighted: slashMenu.currentIndex === index onTriggered: root.post("slashChoose", {index: index}) } - onObjectAdded: function(index, object) { slashMenu.insertItem(index, object) } - onObjectRemoved: function(index, object) { slashMenu.removeItem(object) } + onObjectAdded: function(index, object) { slashMenu.insertItem(index, object); Qt.callLater(slashMenu.syncSelection) } + onObjectRemoved: function(index, object) { slashMenu.removeItem(object); Qt.callLater(slashMenu.syncSelection) } } } NotesPopover { @@ -160,16 +228,16 @@ Item { LiquidPopoverItem { text: "选择块"; enabled: root.editable; onTriggered: root.post("selectBlock", {pos: root.block.pos}) } LiquidPopoverItem { text: "复制块"; enabled: root.editable; onTriggered: root.post("copyBlock", {pos: root.block.pos, selection: true}) } LiquidPopoverItem { text: "创建块副本"; enabled: root.editable; onTriggered: root.post("duplicateBlock", {pos: root.block.pos, selection: true}) } - LiquidPopoverItem { text: "粘贴块"; enabled: root.editable; onTriggered: root.post("pasteBlock", {pos: root.block.pos}) } - LiquidPopoverItem { text: "上移块 Alt+Shift+↑"; enabled: root.editable; onTriggered: root.post("moveBlock", {pos: root.block.pos, direction: "up", selection: true}) } - LiquidPopoverItem { text: "下移块 Alt+Shift+↓"; enabled: root.editable; onTriggered: root.post("moveBlock", {pos: root.block.pos, direction: "down", selection: true}) } - LiquidPopoverItem { text: "转换为正文"; enabled: root.editable; onTriggered: root.post("blockType", {pos: root.block.pos, command: "paragraph"}) } - LiquidPopoverItem { text: "转换为二级标题"; enabled: root.editable; onTriggered: root.post("blockType", {pos: root.block.pos, command: "heading2"}) } + LiquidPopoverItem { text: "粘贴块"; enabled: root.editable && !!root.state.canPasteBlock; onTriggered: root.post("pasteBlock", {pos: root.block.pos}) } + LiquidPopoverItem { text: "上移块 Alt+Shift+↑"; enabled: root.editable && !!root.block.canMoveUp; onTriggered: root.post("moveBlock", {pos: root.block.pos, direction: "up", selection: true}) } + LiquidPopoverItem { text: "下移块 Alt+Shift+↓"; enabled: root.editable && !!root.block.canMoveDown; onTriggered: root.post("moveBlock", {pos: root.block.pos, direction: "down", selection: true}) } + LiquidPopoverItem { text: "转换为正文"; enabled: root.editable && !!root.block.canConvert; onTriggered: root.post("blockType", {pos: root.block.pos, command: "paragraph"}) } + LiquidPopoverItem { text: "转换为二级标题"; enabled: root.editable && !!root.block.canConvert; onTriggered: root.post("blockType", {pos: root.block.pos, command: "heading2"}) } LiquidPopoverItem { text: "折叠 / 展开标题"; enabled: root.block.type === "heading"; onTriggered: root.post("toggleFold", {pos: root.block.pos}) } LiquidPopoverItem { text: "删除块"; enabled: root.editable; onTriggered: root.post("deleteBlock", {pos: root.block.pos, selection: true}) } - LiquidPopoverItem { text: "代码语言与复制…"; visible: !!root.state.code; onTriggered: root.openCode(blockMenu) } - LiquidPopoverItem { text: "编辑数学公式…"; visible: !!root.state.math; enabled: root.editable; onTriggered: root.openMath(blockMenu) } - LiquidPopoverItem { text: "图片属性…"; visible: !!root.state.image; onTriggered: root.openImage(blockMenu) } + LiquidPopoverItem { text: "代码语言与复制…"; visible: root.block.type === "code_block"; onTriggered: root.openCode(blockMenu) } + LiquidPopoverItem { text: "编辑数学公式…"; visible: !!root.state.math && root.state.math.pos >= root.block.pos && root.state.math.pos < root.block.end; enabled: root.editable; onTriggered: root.openMath(blockMenu) } + LiquidPopoverItem { text: "图片属性…"; visible: !!root.state.image && root.state.image.pos >= root.block.pos && root.state.image.pos < root.block.end; onTriggered: root.openImage(blockMenu) } Instantiator { model: root.spellSuggestions.slice(0, 5) delegate: LiquidPopoverItem { required property string modelData; text: "更正为:" + modelData; onTriggered: root.source.correctSpelling(modelData) } diff --git a/qml/Main.qml b/qml/Main.qml index 97d8f39..d6817ce 100644 --- a/qml/Main.qml +++ b/qml/Main.qml @@ -100,8 +100,8 @@ ApplicationWindow { onSidebarRequested: root.toggleNavigation() onSearchRequested: root.openGlobalSearch() onNewNoteRequested: root.newNote() - onFindRequested: { findBar.visible = true; localFind.forceActiveFocus() } - onReplaceRequested: { findBar.visible = true; replacement.forceActiveFocus() } + onFindRequested: root.openFind(false) + onReplaceRequested: root.openFind(true) } // One Tab stop per list; arrows move the keyboard cursor without opening a // document. Activation still goes through the controller's save/drain path. @@ -652,6 +652,7 @@ ApplicationWindow { x: root.editorX; y: 8 + (controller.externalDocument ? 36 : noteNameEditor.height + 8) + (findBar.visible ? findBar.implicitHeight + 8 : 0) width: Math.max(0, parent.width - x); height: Math.max(0, parent.height - y - statusArea.height) bodySize: notesSettings.bodySize; readingWidth: tokens.readingWidth; inset: tokens.editorInset + onDocumentReady: if (findBar.visible) root.updateSearch() } @@ -1037,20 +1038,27 @@ ApplicationWindow { } ColumnLayout { id: findBar; visible: false; x: tokens.editorInset; y: 8 + (controller.externalDocument ? 36 : noteNameEditor.height + 8); width: Math.max(0, parent.width - tokens.editorInset * 2); spacing: 4 + property bool replaceVisible: false + readonly property bool hasMatches: !!source.editorState.search && source.editorState.search.total > 0 + Keys.onEscapePressed: function(event) { + if (localFind.inputMethodComposing || replacement.inputMethodComposing) { event.accepted = false; return } + root.closeFind() + } RowLayout { Layout.fillWidth: true; spacing: 4 LiquidTextField { id: localFind; Layout.fillWidth: true; implicitHeight: 26; materialForm: true; placeholderText: "查找当前正文"; Accessible.name: "正文查找"; onTextEdited: if (!inputMethodComposing) root.updateSearch(); onInputMethodComposingChanged: if (!inputMethodComposing) root.updateSearch(); onAccepted: root.findNext() } Label { text: (source.editorState.search ? source.editorState.search.current : 0) + "/" + (source.editorState.search ? source.editorState.search.total : 0); font.pixelSize: 11; color: AppTheme.mutedText } - LiquidActionButton { id: caseSensitive; text: "Aa"; checkable: true; materialForm: true; implicitHeight: 26; Accessible.name: "区分大小写"; onToggled: root.updateSearch() } - LiquidActionButton { text: "上一个"; materialForm: true; implicitHeight: 26; onClicked: source.action("findNext", {direction: -1}) } - LiquidActionButton { text: "下一个"; materialForm: true; implicitHeight: 26; onClicked: root.findNext() } - LiquidActionButton { text: "关闭"; materialForm: true; implicitHeight: 26; onClicked: { findBar.visible = false; source.action("search", {query: ""}); source.editor.forceActiveFocus() } } + LiquidActionButton { id: caseSensitive; text: "Aa"; checkable: true; materialForm: true; implicitWidth: 30; implicitHeight: 26; leftPadding: 0; rightPadding: 0; Accessible.name: "区分大小写"; onToggled: root.updateSearch(); KosToolTip { target: caseSensitive; text: "区分大小写" } } + ToolbarAction { iconName: "chevron"; contentItem.rotation: 180; help: "上一个匹配"; materialForm: true; implicitHeight: 26; enabled: findBar.hasMatches; onClicked: source.action("findNext", {direction: -1}) } + ToolbarAction { iconName: "chevron"; help: "下一个匹配"; materialForm: true; implicitHeight: 26; enabled: findBar.hasMatches; onClicked: root.findNext() } + LiquidActionButton { text: "替换"; checkable: true; checked: findBar.replaceVisible; materialForm: true; implicitWidth: 48; implicitHeight: 26; leftPadding: 6; rightPadding: 6; enabled: root.canFormat; onClicked: findBar.replaceVisible = !findBar.replaceVisible } + ToolbarAction { iconName: "plus"; contentItem.rotation: 45; help: "关闭正文查找 · Escape"; materialForm: true; implicitHeight: 26; onClicked: root.closeFind() } } RowLayout { - Layout.fillWidth: true; spacing: 4 - LiquidTextField { id: replacement; Layout.fillWidth: true; implicitHeight: 26; materialForm: true; placeholderText: "替换为"; Accessible.name: "正文替换文本"; onAccepted: if (!inputMethodComposing) source.action("replace", {replacement: text}) } - LiquidActionButton { text: "替换"; materialForm: true; implicitHeight: 26; enabled: root.canFormat && !replacement.inputMethodComposing; onClicked: source.action("replace", {replacement: replacement.text}) } - LiquidActionButton { text: "全部替换"; materialForm: true; implicitHeight: 26; enabled: root.canFormat && !replacement.inputMethodComposing; onClicked: source.action("replaceAll", {replacement: replacement.text}) } + Layout.fillWidth: true; spacing: 4; visible: findBar.replaceVisible && root.canFormat + LiquidTextField { id: replacement; Layout.fillWidth: true; implicitHeight: 26; materialForm: true; placeholderText: "替换为"; Accessible.name: "正文替换文本"; onAccepted: if (root.canFormat && findBar.hasMatches && !inputMethodComposing) source.action("replace", {replacement: text}) } + LiquidActionButton { text: "替换"; materialForm: true; implicitHeight: 26; enabled: root.canFormat && findBar.hasMatches && !replacement.inputMethodComposing; onClicked: source.action("replace", {replacement: replacement.text}) } + LiquidActionButton { text: "全部替换"; materialForm: true; implicitHeight: 26; enabled: root.canFormat && findBar.hasMatches && !replacement.inputMethodComposing; onClicked: source.action("replaceAll", {replacement: replacement.text}) } } } RowLayout { @@ -1102,6 +1110,18 @@ ApplicationWindow { source.editor.forceActiveFocus(Qt.OtherFocusReason) } function updateSearch() { source.action("search", {query: localFind.text, caseSensitive: caseSensitive.checked}) } + function openFind(withReplacement) { + findBar.replaceVisible = withReplacement && canFormat + findBar.visible = true + updateSearch() + if (findBar.replaceVisible) replacement.forceActiveFocus() + else { localFind.forceActiveFocus(); localFind.selectAll() } + } + function closeFind() { + findBar.visible = false + source.action("search", {query: ""}) + source.editor.forceActiveFocus() + } function findNext() { if (localFind.text) { updateSearch(); source.action("findNext", {direction: 1}) } } function showRecovery() { controller.inspectRecovery(); recoveryDialog.open() } function askName(kind, anchor, originMenu) { diff --git a/qml/NotesPopover.qml b/qml/NotesPopover.qml index 3ecae4e..0650b83 100644 --- a/qml/NotesPopover.qml +++ b/qml/NotesPopover.qml @@ -11,7 +11,9 @@ LiquidPopover { preferredSide: "bottom" anchorAlignment: "center" arrowEnabled: invocation === "button" - height: Math.min(implicitHeight, parent ? parent.height - margins * 2 : implicitHeight) + // Keep height limits in one binding for both caret and button menus. + property real maxHeight: Number.POSITIVE_INFINITY + height: Math.min(implicitHeight, maxHeight, parent ? parent.height - margins * 2 : implicitHeight) closePolicy: Popup.CloseOnEscape | Popup.CloseOnReleaseOutside function updatePosition() { diff --git a/qml/SourceEditor.qml b/qml/SourceEditor.qml index 2f43728..fdc057d 100644 --- a/qml/SourceEditor.qml +++ b/qml/SourceEditor.qml @@ -15,6 +15,7 @@ Item { property alias editor: editorFacade required property Item sceneItem property var editorState: ({outline: [], stats: {}, block: null, slash: null, search: {total: 0, current: 0}}) + signal documentReady() readonly property bool popupActive: tools.popupActive || attachmentDialog.visible || exportDialog.visible property bool exporting: false onExportingChanged: controller.setEditorExporting(exporting) @@ -121,8 +122,10 @@ Item { function publish(json) { const state = JSON.parse(json) if (state.epoch !== root.session.webDocument().epoch) return + const wasLoading = root.session.webLoading root.session.acceptWebState(state) if (!state.loaded) return + if (wasLoading && !root.session.webLoading) root.documentReady() if (root.pendingRestore) { const position = root.pendingRestore root.pendingRestore = null diff --git a/screenshots/editor-interaction-2026-11-11/block-menu.png b/screenshots/editor-interaction-2026-11-11/block-menu.png new file mode 100644 index 0000000..82f14a1 Binary files /dev/null and b/screenshots/editor-interaction-2026-11-11/block-menu.png differ diff --git a/screenshots/editor-interaction-2026-11-11/body.png b/screenshots/editor-interaction-2026-11-11/body.png new file mode 100644 index 0000000..37074b2 Binary files /dev/null and b/screenshots/editor-interaction-2026-11-11/body.png differ diff --git a/screenshots/editor-interaction-2026-11-11/copy-menu-after.png b/screenshots/editor-interaction-2026-11-11/copy-menu-after.png new file mode 100644 index 0000000..f5690f2 Binary files /dev/null and b/screenshots/editor-interaction-2026-11-11/copy-menu-after.png differ diff --git a/screenshots/editor-interaction-2026-11-11/copy-menu-before.png b/screenshots/editor-interaction-2026-11-11/copy-menu-before.png new file mode 100644 index 0000000..3223df6 Binary files /dev/null and b/screenshots/editor-interaction-2026-11-11/copy-menu-before.png differ diff --git a/screenshots/editor-interaction-2026-11-11/drag-boundary.png b/screenshots/editor-interaction-2026-11-11/drag-boundary.png new file mode 100644 index 0000000..a8a5842 Binary files /dev/null and b/screenshots/editor-interaction-2026-11-11/drag-boundary.png differ diff --git a/screenshots/editor-interaction-2026-11-11/edge-scroll.png b/screenshots/editor-interaction-2026-11-11/edge-scroll.png new file mode 100644 index 0000000..e0bca87 Binary files /dev/null and b/screenshots/editor-interaction-2026-11-11/edge-scroll.png differ diff --git a/screenshots/editor-interaction-2026-11-11/find-native.png b/screenshots/editor-interaction-2026-11-11/find-native.png new file mode 100644 index 0000000..f71131a Binary files /dev/null and b/screenshots/editor-interaction-2026-11-11/find-native.png differ diff --git a/screenshots/editor-interaction-2026-11-11/find-query.png b/screenshots/editor-interaction-2026-11-11/find-query.png new file mode 100644 index 0000000..6dcf238 Binary files /dev/null and b/screenshots/editor-interaction-2026-11-11/find-query.png differ diff --git a/screenshots/editor-interaction-2026-11-11/replace-native.png b/screenshots/editor-interaction-2026-11-11/replace-native.png new file mode 100644 index 0000000..6c301ed Binary files /dev/null and b/screenshots/editor-interaction-2026-11-11/replace-native.png differ diff --git a/screenshots/editor-interaction-2026-11-11/replace-query.png b/screenshots/editor-interaction-2026-11-11/replace-query.png new file mode 100644 index 0000000..d8f3672 Binary files /dev/null and b/screenshots/editor-interaction-2026-11-11/replace-query.png differ diff --git a/screenshots/editor-interaction-2026-11-11/slash-last-cdp.png b/screenshots/editor-interaction-2026-11-11/slash-last-cdp.png new file mode 100644 index 0000000..47f0205 Binary files /dev/null and b/screenshots/editor-interaction-2026-11-11/slash-last-cdp.png differ diff --git a/screenshots/editor-interaction-2026-11-11/slash-settled.png b/screenshots/editor-interaction-2026-11-11/slash-settled.png new file mode 100644 index 0000000..3cf2b50 Binary files /dev/null and b/screenshots/editor-interaction-2026-11-11/slash-settled.png differ diff --git a/tests/AdvancedEditorRegression.mjs b/tests/AdvancedEditorRegression.mjs index ca92453..7339dbc 100644 --- a/tests/AdvancedEditorRegression.mjs +++ b/tests/AdvancedEditorRegression.mjs @@ -29,6 +29,25 @@ try{ assert.ok((await run('nextnotes.toolsState().slash.items')).some(x=>x.command==='heading2')); await key('Enter','Enter',13);assert.equal((await doc()).content[0].type,'heading');assert.equal((await doc()).content[0].attrs.level,2); await command('undo');assert.equal(await plain(),'/h2');await command('redo');await text('Slash title');ok('slash_filter_keyboard_conversion_single_undo'); + for(const kind of ['bullet','ordered','task']){ + await load('');await run('nextnotes.view().focus()');await text('/');await wait(120); + const entries=await run('nextnotes.toolsState().slash.items'); + await action('slashChoose',{index:entries.findIndex(entry=>entry.command===kind)});await wait(120); + assert.equal(await run('document.querySelectorAll("li .editor-empty-line").length'),0,'list items must not advertise slash insertion'); + await text('/');await wait(120); + assert.equal(await run('nextnotes.toolsState().slash'),null,'slash inside '+kind+' is literal text'); + assert.equal(await run('nextnotes.view().state.selection.$from.parent.textContent'),'/','literal slash stays in the active list paragraph'); + await key('Backspace','Backspace',8);await key('Enter','Enter',13);await text('/');await wait(120); + assert.ok(await run('nextnotes.toolsState().slash'),'slash insertion returns after leaving '+kind); + } + ok('slash_lists_literal_input_and_exit'); + await load('- [ ] Task\n');await run('nextnotes.view().focus()'); + const taskBox=()=>run(`(()=>{const box=getComputedStyle(document.querySelector('li[data-checked]'),'::before');return {width:box.width,height:box.height,left:box.left,top:box.top,border:box.borderWidth};})()`); + const uncheckedBox=await taskBox();assert.ok(parseFloat(uncheckedBox.width)>0); + await command('check');assert.equal(await run('document.querySelector("li[data-checked]").dataset.checked'),'true'); + assert.deepEqual(await taskBox(),uncheckedBox,'checking a task must not resize or move its box'); + await command('check');assert.equal(await run('document.querySelector("li[data-checked]").dataset.checked'),'false'); + assert.deepEqual(await taskBox(),uncheckedBox);ok('task_checkbox_stable_geometry'); await load('A\n\nB\n\nC\n');await action('duplicateBlock',{pos:3});assert.equal(await plain(),'A\nB\nB\nC');await command('undo');assert.equal(await plain(),'A\nB\nC'); await action('moveBlock',{pos:3,direction:'up'});assert.equal(await plain(),'B\nA\nC');await command('undo'); await action('moveBlock',{pos:3,direction:'down'});assert.equal(await plain(),'A\nC\nB');await command('undo'); diff --git a/tests/BlockHandleRegression.mjs b/tests/BlockHandleRegression.mjs index d44ad3c..ea586b7 100644 --- a/tests/BlockHandleRegression.mjs +++ b/tests/BlockHandleRegression.mjs @@ -4,16 +4,17 @@ import {Schema} from '../web/editor/node_modules/@milkdown/prose/lib/model.js'; import {EditorState,TextSelection} from '../web/editor/node_modules/@milkdown/prose/lib/state.js'; import {makeTools} from '../web/editor/tools.js'; -// Geometry is irrelevant to this interaction-state regression. -globalThis.Element=class {getBoundingClientRect(){return {left:48,top:20,height:26,bottom:46};}}; +// Deterministic block boxes let us compare the advertised drop boundary to the move. +globalThis.Element=class {constructor(index=0){this.index=index;}getBoundingClientRect(){return {left:48,top:20+this.index*40,height:26,bottom:46+this.index*40,width:400};}}; globalThis.ResizeObserver=class {observe(){} disconnect(){}}; const schema=new Schema({nodes:{doc:{content:'paragraph+'},paragraph:{content:'text*'},text:{}}}); let focused=true,hitPos=1; -const tools=makeTools({canEdit:()=>true,busy:()=>false,bridge:()=>({ui(){}}),epoch:()=>1,report(){}}); +const tools=makeTools({canEdit:()=>true,busy:()=>false,bridge:()=>({ui(){},dismissSlash(){}}),epoch:()=>1,report(){}}); const paragraph=text=>schema.node('paragraph',null,text?schema.text(text):null); const view={ state:EditorState.create({schema,doc:schema.node('doc',null,[paragraph('第一段'),paragraph('第二段')]),plugins:[tools.plugin]}), - dom:new Element(),nodeDOM:()=>new Element(),posAtCoords:()=>({pos:hitPos}),hasFocus:()=>focused, + dom:new Element(),nodeDOM(pos){let index=0;this.state.doc.forEach((node,at,i)=>{if(at===pos)index=i;});return new Element(index);},posAtCoords:()=>({pos:hitPos}),hasFocus:()=>focused, + coordsAtPos:()=>({left:48,bottom:46}), dispatch(tr){this.state=this.state.apply(tr);},focus(){focused=true;}, }; const lifecycle=tools.plugin.spec.view(view); @@ -52,17 +53,31 @@ try{ const expectHandle=text=>{tools.uiNow();assert.equal(tools.state().block.pos,position(text));assert.equal(tools.state().block.title,text);assert.equal(tools.state().blockHandleVisible,true,'moved content remains draggable with editor focus');}; hover(position('DDDD')+1); hitPos=position('BB')+1; - assert.equal(tools.run('moveBlock',{pos:position('DDDD'),y:20}),true); + assert.equal(tools.run('moveBlock',{pos:position('DDDD'),y:60}),true); expectHandle('DDDD'); assert.deepEqual(Array.from({length:view.state.doc.childCount},(_,i)=>view.state.doc.child(i).textContent),['A','DDDD','BB','CCC']); hitPos=position('CCC')+1; - assert.equal(tools.run('moveBlock',{pos:position('DDDD'),y:46}),true); + assert.equal(tools.run('moveBlock',{pos:position('DDDD'),y:166}),true); expectHandle('DDDD'); assert.equal(tools.run('moveBlock',{pos:position('DDDD'),direction:'up'}),true);expectHandle('DDDD'); assert.equal(tools.run('moveBlock',{pos:position('DDDD'),direction:'down'}),true);expectHandle('DDDD'); // Moving a different block must preserve the actual hovered block too. hover(position('BB')+1); assert.equal(tools.run('moveBlock',{pos:position('DDDD'),direction:'up'}),true);expectHandle('BB'); + tools.run('previewBlockMove',{pos:position('DDDD'),y:61});tools.uiNow(); + assert.equal(tools.state().dropTarget.pos,position('BB')); + assert.equal(tools.state().dropTarget.y,53,'indicator sits between blocks, not at the pointer'); + const beforeCancel=view.state.doc; + tools.run('cancelBlockMove');tools.uiNow();assert.equal(tools.state().dropTarget,null); + assert.equal(view.state.doc,beforeCancel,'cancelling a preview never changes content'); + tools.run('previewBlockMove',{pos:0,y:21});tools.uiNow(); + assert.equal(tools.state().dropTarget,null,'a no-op drop does not advertise a move'); + hitPos=position('CCC')+1; + tools.run('contextBlock',{x:70,y:145,request:7});tools.uiNow(); + assert.equal(tools.state().context.request,7); + assert.equal(tools.state().context.block.title,'CCC','context menu resolves its click, not the last hovered block'); + assert.equal(tools.state().context.block.canMoveDown,false); + assert.equal(tools.state().canPasteBlock,false,'paste is unavailable before a block is copied'); tools.reset(); const freshDoc=schema.node('doc',null,[paragraph('Existing'),paragraph()]); view.state=EditorState.create({schema,doc:freshDoc,selection:TextSelection.create(freshDoc,11),plugins:[tools.plugin]}); @@ -81,5 +96,18 @@ try{ assert.equal(hover(view.state.selection.from),false,'first input is tracked without waiting for a UI report'); focused=false;events.blur();assert.equal(visible(),true,'leaving editing restores the new content handle'); focused=true;events.focus();assert.equal(visible(),true,'existing content stays draggable after refocus'); - console.log('PASS: new-paragraph typing suppression; existing and moved blocks remain draggable; selection styling.'); + tools.reset(); + const slashDoc=schema.node('doc',null,[paragraph('/'),paragraph('/H2 ')]); + view.state=EditorState.create({schema,doc:slashDoc,selection:TextSelection.create(slashDoc,2),plugins:[tools.plugin]}); + tools.uiNow();assert.equal(tools.state().slash.items.length,16,'all insertions remain discoverable without a keyword'); + const key=key=>tools.plugin.props.handleKeyDown(view,{key}); + key('Escape');tools.uiNow();assert.equal(tools.state().slash,null); + view.dispatch(view.state.tr.setSelection(TextSelection.create(view.state.doc,8))); + tools.uiNow();assert.equal(tools.state().slash.items[0].command,'heading2','dismissal belongs to one query and location'); + key('Escape');tools.uiNow();assert.equal(tools.state().slash,null,'Escape preserves uppercase and whitespace when suppressing a query'); + tools.reset();tools.uiNow();assert.ok(tools.state().slash,'a document reset clears suppression'); + view.dispatch(view.state.tr.insertText('no-match'));tools.uiNow(); + assert.equal(tools.state().slash.items.length,0); + assert.equal(key('ArrowDown'),false,'an invisible empty menu must not consume caret navigation'); + console.log('PASS: block handles, selection, drop boundaries, cancellation, contextual targeting and slash discovery/dismissal.'); }finally{lifecycle.destroy();} diff --git a/tests/EditorInteractionRegression.mjs b/tests/EditorInteractionRegression.mjs new file mode 100644 index 0000000..9346cbe --- /dev/null +++ b/tests/EditorInteractionRegression.mjs @@ -0,0 +1,84 @@ +// VM-only integration against an isolated running app and disposable note. +import assert from 'node:assert/strict'; +import fs from 'node:fs'; +const endpoint=process.env.NEXTNOTES_CDP_URL||'http://127.0.0.1:9237'; +const fixture=process.env.NEXTNOTES_TEST_FILE; +assert.ok(fixture,'Provide the disposable NEXTNOTES_TEST_FILE opened in the VM.'); +const target=(await (await fetch(endpoint+'/json/list')).json()).find(item=>item.url==='qrc:/editor/index.html'); +assert.ok(target,'The isolated editor must be running.'); +const ws=new WebSocket(target.webSocketDebuggerUrl); +await new Promise((resolve,reject)=>{ws.onopen=resolve;ws.onerror=reject;}); +let sequence=0;const requests=new Map(); +ws.onmessage=event=>{const result=JSON.parse(event.data),request=requests.get(result.id);if(request){requests.delete(result.id);result.error?request.reject(result.error):request.resolve(result.result);}}; +const call=(method,params={})=>new Promise((resolve,reject)=>{const id=++sequence;requests.set(id,{resolve,reject});ws.send(JSON.stringify({id,method,params}));}); +const run=async expression=>{const result=await call('Runtime.evaluate',{expression,awaitPromise:true,returnByValue:true});if(result.exceptionDetails)throw Error(JSON.stringify(result.exceptionDetails));return result.result.value;}; +const wait=ms=>new Promise(resolve=>setTimeout(resolve,ms)); +const action=(name,args={})=>run('nextnotes.tools('+JSON.stringify(name)+','+JSON.stringify(args)+')'); +const state=()=>run('nextnotes.toolsState()'); +const source=()=>run('nextnotes.snapshot().source'); +const command=name=>run('nextnotes.command('+JSON.stringify(name)+')'); +const key=async(key,code,vk)=>{await call('Input.dispatchKeyEvent',{type:'keyDown',key,code,windowsVirtualKeyCode:vk});await call('Input.dispatchKeyEvent',{type:'keyUp',key,code,windowsVirtualKeyCode:vk});await wait(100);}; +const select=pos=>run('(()=>{const v=nextnotes.view();v.dispatch(v.state.tr.setSelection(v.state.selection.constructor.create(v.state.doc,'+pos+')));v.focus();})()'); +const boxes=()=>run('(()=>{const v=nextnotes.view(),out=[];v.state.doc.forEach((node,pos)=>{const r=v.nodeDOM(pos).getBoundingClientRect();out.push({pos,title:node.textContent,top:r.top,bottom:r.bottom,height:r.height,left:r.left,width:r.width});});return out;})()'); +async function load(text){ + await run('nextnotes.load({epoch:nextnotes.snapshot().epoch,baseUrl:nextnotes.snapshot().baseUrl,source:'+JSON.stringify(text)+'})'); + await wait(250);await run('nextnotes.view().focus()');await wait(80); +} +const results=[]; +function pass(name){results.push(name);console.log('PASS: '+name);} +try{ + assert.equal(decodeURIComponent(new URL(await run('nextnotes.snapshot().baseUrl')).pathname),fixture); + assert.ok(fs.existsSync(fixture)); + await load('A\n\nBB\n\nCCC\n\nDDDD\n'); + let rects=await boxes(); + await call('Input.dispatchMouseEvent',{type:'mouseMoved',x:rects[0].left+50,y:rects[0].top+10}); + await wait(80);assert.equal((await state()).block.title,'A'); + await action('contextBlock',{x:rects[2].left+50,y:rects[2].top+10,request:1}); + assert.equal((await state()).context.block.title,'CCC'); + assert.equal((await state()).block.title,'A'); + pass('context target follows the click independently of previous hover'); + const pointerY=rects[1].top+2; + await action('previewBlockMove',{pos:rects[3].pos,y:pointerY});await wait(80); + const preview=(await state()).dropTarget; + assert.equal(preview.pos,rects[1].pos); + assert.equal(preview.y,(rects[0].bottom+rects[1].top)/2); + assert.equal(preview.width,rects[1].width); + const original=await source(); + await action('cancelBlockMove');await wait(80); + assert.equal((await state()).dropTarget,null);assert.equal(await source(),original); + await action('moveBlock',{pos:rects[3].pos,y:pointerY});await action('cancelBlockMove'); + assert.deepEqual((await boxes()).map(item=>item.title),['A','DDDD','BB','CCC']); + await command('undo');assert.equal(await source(),original); + pass('real DOM drop preview agrees with release; cancellation and undo preserve content'); + await load('# Heading\n\nHidden paragraph\n\n# Next\n\nLast\n'); + rects=await boxes();await action('toggleFold',{pos:0});await wait(80); + assert.equal((await boxes())[1].height,0); + await action('previewBlockMove',{pos:rects[3].pos,y:(await boxes())[2].top+1});await wait(80); + assert.equal((await state()).dropTarget.pos,rects[2].pos,'hidden content does not become an invisible target'); + await action('cancelBlockMove'); + pass('folded content is skipped when computing insertion boundaries'); + await load('/\n');await select(2);await wait(100); + assert.equal((await state()).slash.items.length,16); + for(let i=0;i<15;i++)await key('ArrowDown','ArrowDown',40); + assert.equal((await state()).slash.items[(await state()).slash.index].command,'toc'); + await key('Enter','Enter',13);assert.ok((await source()).includes('[toc]')); + pass('all slash entries are keyboard reachable, including the final insertion'); + await load('/H2\n\n/\n');await select(4); + await call('Input.insertText',{text:' '});await wait(100); + assert.equal((await state()).slash.items[0].command,'heading2'); + await key('Escape','Escape',27);await wait(150); + assert.equal((await state()).slash,null,'Escape must not reopen after the native menu closes'); + await select(8);await wait(100);assert.ok((await state()).slash); + await key('Escape','Escape',27); + await load('/\n');await select(2);await wait(100);assert.ok((await state()).slash); + pass('dismissal preserves uppercase/space queries and does not leak across paragraphs or document loads'); + await load('/not-a-command\n');await select(15);await wait(100); + assert.equal((await state()).slash.items.length,0); + await key('Enter','Enter',13); + assert.ok((await boxes()).length>=2,'no-result query must allow ordinary editing'); + pass('an empty slash result does not trap ordinary Enter navigation'); + await load('A\n\nBB\n\nCCC\n\nDDDD\n'); +}finally{ + if(process.env.NEXTNOTES_TEST_REPORT)fs.writeFileSync(process.env.NEXTNOTES_TEST_REPORT,JSON.stringify({results},null,2)); + ws.close(); +} diff --git a/web/editor/dist/editor.js b/web/editor/dist/editor.js index d52fe5f..7d98c0e 100644 --- a/web/editor/dist/editor.js +++ b/web/editor/dist/editor.js @@ -88189,7 +88189,7 @@ function makeTools(env) { let view2, hover = 0, blockHandleVisible = false, collapsed = /* @__PURE__ */ new Set(), query = "", caseSensitive = false, searchIndex = -1, slashIndex = 0, lastSlash = "", uiTimer, lastUI = "", layoutToken = 0; let cachedDoc, cachedText = "", cachedStats = {}, cachedOutline = [], cachedMatchesDoc, cachedMatchesQuery, cachedMatchesCase, cachedMatches = []; - let suppressedSlash = null, blockSelection = false, newParagraphPos = null; + let suppressedSlash = null, blockSelection = false, newParagraphPos = null, dragPreview = null, contextRequest = null; let pending = 0, request = 0, clipboardBlock = null; const imports = /* @__PURE__ */ new Map(), bookmarks = /* @__PURE__ */ new Map(); const key4 = new PluginKey("nextnotesTools"); @@ -88293,17 +88293,21 @@ if (query && !env.busy()) for (const m of matches2(state.doc)) items.push(Decoration.inline(m.from, m.to, { class: "editor-search-match" }, { sourceSearch: true })); return DecorationSet.create(state.doc, items); } + function slashParagraph($from) { + if ($from.parent.type.name !== "paragraph") return false; + for (let depth = $from.depth - 1; depth > 0; depth--) if ($from.node(depth).type.name === "list_item") return false; + return true; + } function slash() { if (!view2 || !editable2() || !view2.state.selection.empty) return null; const { $from } = view2.state.selection; - if ($from.parent.type.name !== "paragraph") return null; const text6 = $from.parent.textBetween(0, $from.parentOffset, "\n", "\uFFFC"); + if (suppressedSlash && ($from.pos !== suppressedSlash.pos || text6 !== suppressedSlash.text)) suppressedSlash = null; + if (!slashParagraph($from) || suppressedSlash) return null; const match = /^\/([^/\n]{0,40})$/.exec(text6); if (!match) return null; - if (text6 === suppressedSlash) return null; - if (text6 !== suppressedSlash) suppressedSlash = null; const term = match[1].trim().toLocaleLowerCase(); - const items = slashEntries.filter((entry) => entry[2].includes(term) || entry[1].includes(term)).slice(0, 10).map(([command3, label]) => ({ command: command3, label })); + const items = slashEntries.filter((entry) => entry[2].includes(term) || entry[1].includes(term)).map(([command3, label]) => ({ command: command3, label })); if (text6 !== lastSlash) { lastSlash = text6; slashIndex = 0; @@ -88318,7 +88322,20 @@ if (!(dom instanceof Element)) return null; const r2 = dom.getBoundingClientRect(); if (r2.height <= 0) return null; - return { x: r2.left, pos: block.pos, type: block.node.type.name, title: block.node.textContent.slice(0, 40), y: r2.top, height: r2.height }; + const selectedRange = range({ pos: block.pos, selection: true }); + return { + x: r2.left, + pos: block.pos, + end: block.pos + block.node.nodeSize, + type: block.node.type.name, + title: block.node.textContent.slice(0, 40), + y: r2.top, + height: r2.height, + canMoveUp: selectedRange.from > 0, + canMoveDown: selectedRange.to < view2.state.doc.content.size, + canConvert: block.node.isTextblock, + ...block.node.type.name === "code_block" ? { source: block.node.textContent, language: block.node.attrs.language || "" } : {} + }; } function ui() { uiTimer = null; @@ -88349,7 +88366,10 @@ blockHandleVisible: blockHandleVisible && editable2() && editingBlock?.pos !== hover, slash: slash(), search: { total: matches2().length, current: searchIndex + 1 }, - pending + pending, + canPasteBlock: !!clipboardBlock, + dropTarget: dragPreview && editable2() ? dropTarget(dragPreview) : null, + context: contextRequest ? { request: contextRequest.request, block: geometry(topBlock(contextRequest.pos)) } : null }; const block = topBlock(view2.state.selection.from); if (block?.node.type.name === "code_block") state.code = { pos: block.pos, source: block.node.textContent, language: block.node.attrs.language || "" }; @@ -88401,6 +88421,18 @@ } return { from: block.pos, to: block.pos + block.node.nodeSize }; } + function dropTarget(args) { + const r2 = range(args); + if (!r2 || !Number.isFinite(args.y)) return null; + const blocks = rootBlocks().map((block) => ({ block, rect: view2.nodeDOM(block.pos)?.getBoundingClientRect() })).filter((item) => item.rect?.height > 0); + if (!blocks.length) return null; + const before = blocks.findIndex((item) => args.y < item.rect.top + item.rect.height / 2); + const next = before >= 0 ? blocks[before] : null, previous4 = before > 0 ? blocks[before - 1] : before < 0 ? blocks.at(-1) : null; + const pos = next ? next.block.pos : view2.state.doc.content.size; + if (pos >= r2.from && pos <= r2.to) return null; + const rect = next?.rect || previous4.rect; + return { pos, x: rect.left, y: next ? previous4 ? (previous4.rect.bottom + rect.top) / 2 : rect.top : rect.bottom, width: rect.width }; + } function moveBlock(args) { const r2 = range(args); if (!r2) return false; @@ -88410,11 +88442,7 @@ else if (args.direction === "down") { const after = blocks.find((b) => b.pos >= r2.to); target = after ? after.pos + after.node.nodeSize : void 0; - } else if (typeof args.y === "number") { - const hit = view2.posAtCoords({ left: view2.dom.getBoundingClientRect().left + 24, top: args.y }); - const b = hit ? topBlock(hit.pos) : null; - target = b ? args.y > view2.nodeDOM(b.pos).getBoundingClientRect().top + view2.nodeDOM(b.pos).getBoundingClientRect().height / 2 ? b.pos + b.node.nodeSize : b.pos : args.y < 0 ? 0 : view2.state.doc.content.size; - } + } else if (typeof args.y === "number") target = dropTarget(args)?.pos; if (target === void 0 || target >= r2.from && target <= r2.to) return false; const content4 = view2.state.doc.slice(r2.from, r2.to).content; let tr = view2.state.tr.delete(r2.from, r2.to); @@ -88511,7 +88539,18 @@ if (typeof args === "string") args = { value: args }; if (name2 === "dismissSlash") { const p = view2.state.selection.$from; - suppressedSlash = p.parent.textBetween(0, p.parentOffset); + suppressedSlash = { pos: p.pos, text: p.parent.textBetween(0, p.parentOffset, "\n", "\uFFFC") }; + schedule(); + return true; + } + if (name2 === "contextBlock") { + const hit = view2.posAtCoords({ left: args.x, top: args.y }); + contextRequest = { request: args.request, pos: hit?.pos ?? view2.state.selection.from }; + ui(); + return true; + } + if (name2 === "cancelBlockMove") { + dragPreview = null; schedule(); return true; } @@ -88565,6 +88604,11 @@ return true; } if (!editable2()) return false; + if (name2 === "previewBlockMove") { + dragPreview = args; + schedule(); + return true; + } if (name2 === "slashChoose") return applySlash(args.index); if (name2 === "selectBlock") { const b = targetBlock(args); @@ -88727,6 +88771,7 @@ const plugin = new Plugin({ key: key4, state: { init: () => DecorationSet.empty, apply(tr, old, oldState, newState) { + if (tr.selectionSet || tr.docChanged) suppressedSlash = null; trackNewParagraph(oldState, !!view2?.hasFocus()); if (newParagraphPos !== null && tr.docChanged) { const mapped = tr.mapping.mapResult(newParagraphPos); @@ -88754,7 +88799,7 @@ }); return base2.add(state.doc, items); } - if (!editable2() || !empty3 || $from.parent.type.name !== "paragraph" || $from.parent.content.size) return base2; + if (!editable2() || !empty3 || !slashParagraph($from) || $from.parent.content.size) return base2; const pos = $from.before(); return base2.add(state.doc, [Decoration.node( pos, @@ -88765,11 +88810,10 @@ handleKeyDown(v2, event) { if (env.busy()) return false; const state = slash(); - if (state && ["ArrowDown", "ArrowUp", "Enter", "Escape"].includes(event.key)) { + if (state && (state.items.length || event.key === "Escape") && ["ArrowDown", "ArrowUp", "Enter", "Escape"].includes(event.key)) { if (event.key === "Escape") { - suppressedSlash = "/" + state.query; + run2("dismissSlash"); lastSlash = ""; - view2.dispatch(view2.state.tr.setSelection(TextSelection.near(view2.state.doc.resolve(view2.state.selection.to)))); env.bridge()?.dismissSlash(); return true; } @@ -88778,7 +88822,7 @@ schedule(); return true; } - if (event.altKey && event.shiftKey && ["ArrowUp", "ArrowDown"].includes(event.key)) return moveBlock({ pos: topBlock(v2.state.selection.from)?.pos, direction: event.key === "ArrowUp" ? "up" : "down", selection: true }); + if (editable2() && event.altKey && event.shiftKey && ["ArrowUp", "ArrowDown"].includes(event.key)) return moveBlock({ pos: topBlock(v2.state.selection.from)?.pos, direction: event.key === "ArrowUp" ? "up" : "down", selection: true }); return false; }, handleDOMEvents: { @@ -88839,6 +88883,10 @@ blockHandleVisible = false; blockSelection = false; newParagraphPos = null; + dragPreview = null; + contextRequest = null; + suppressedSlash = null; + slashIndex = 0; query = ""; lastUI = ""; searchIndex = -1; diff --git a/web/editor/editor.css b/web/editor/editor.css index f794608..3fb1022 100644 --- a/web/editor/editor.css +++ b/web/editor/editor.css @@ -3,7 +3,12 @@ #editor { max-width:calc(var(--width) + 2 * var(--inset));padding:18px var(--inset) 72px;margin:auto; } .ProseMirror { outline:none;min-height:calc(100vh - 90px);overflow-wrap:anywhere;white-space:pre-wrap; } p { margin:0 0 .75em; }h1,h2,h3,h4,h5,h6 { font-weight:650;line-height:1.35;margin:1.2em 0 .5em; }h1 {font-size:2em;}h2{font-size:1.55em;}h3{font-size:1.25em;}h4,h5,h6{font-size:1.05em;} .ProseMirror>:first-child{margin-top:0;} -blockquote { margin:1em 0;padding:0 1em;border-left:3px solid var(--border);color:var(--muted); }ul,ol {padding-left:1.7em;}li>p{margin:.15em 0;}li>ul,li>ol{margin:.2em 0;}li[data-checked]{list-style:none;position:relative;}li[data-checked]::before{content:'☐';position:absolute;left:-1.4em;cursor:pointer;color:var(--muted);}li[data-checked=true]::before{content:'☑';color:var(--accent);}li[data-checked=true]>p{color:var(--muted);} +blockquote { margin:1em 0;padding:0 1em;border-left:3px solid var(--border);color:var(--muted); }ul,ol {padding-left:1.7em;}li>p{margin:.15em 0;}li>ul,li>ol{margin:.2em 0;}li[data-checked]{list-style:none;position:relative;} +/* Keep the task box identical in both states, independent of font glyphs. */ +li[data-checked]::before{content:'';position:absolute;left:-1.4em;top:.325em;width:1em;height:1em;box-sizing:border-box;border:1.5px solid var(--muted);border-radius:3px;cursor:pointer;} +li[data-checked=true]::before{border-color:var(--accent);} +li[data-checked=true]::after{content:'';position:absolute;left:-1.04em;top:.5em;width:.28em;height:.5em;box-sizing:border-box;border:solid var(--accent);border-width:0 1.5px 1.5px 0;transform:rotate(45deg);pointer-events:none;} +li[data-checked=true]>p{color:var(--muted);} pre {padding:.8em 1em;border-radius:6px;background:color-mix(in srgb,var(--text) 6%,transparent);overflow-x:auto;white-space:pre;}code{font-family:monospace;font-size:.92em;} :not(pre)>code{padding:.12em .3em;border-radius:3px;background:color-mix(in srgb,var(--text) 7%,transparent);} a{color:var(--accent);text-decoration:underline;}img{max-width:100%;height:auto;}hr{border:0;border-top:1px solid var(--border);margin:1.5em 0;}table{border-collapse:collapse;width:100%;table-layout:fixed;margin:1em 0;}td,th{border:1px solid var(--border);padding:.4em .65em;vertical-align:top;min-width:3em;position:relative;}th{font-weight:600;background:color-mix(in srgb,var(--text) 5%,transparent);}td>p,th>p{margin:0;}.selectedCell::after{position:absolute;inset:0;background:var(--selection);opacity:.45;content:'';pointer-events:none;}.column-resize-handle{position:absolute;right:-2px;top:0;bottom:-2px;width:4px;background:var(--accent);pointer-events:none;}.resize-cursor{cursor:col-resize;}::selection{background:var(--selection);color:var(--selectionText,white);}#error{padding:0 20px;color:var(--muted);}.ProseMirror-selectednode{outline:none;}.ProseMirror-gapcursor{display:none;pointer-events:none;position:absolute;}.ProseMirror-gapcursor:after{content:'';display:block;position:absolute;top:-2px;width:20px;border-top:1px solid var(--text);animation:blink 1s steps(2,start) infinite;}.ProseMirror-focused .ProseMirror-gapcursor{display:block;}@keyframes blink{to{visibility:hidden;}} /* Editing aids never alter the Markdown document. */ diff --git a/web/editor/tools.js b/web/editor/tools.js index 27e778a..8add318 100644 --- a/web/editor/tools.js +++ b/web/editor/tools.js @@ -14,7 +14,7 @@ const slashEntries=[ export function makeTools(env){ let view,hover=0,blockHandleVisible=false,collapsed=new Set(),query='',caseSensitive=false,searchIndex=-1,slashIndex=0,lastSlash='',uiTimer,lastUI='',layoutToken=0; let cachedDoc,cachedText='',cachedStats={},cachedOutline=[],cachedMatchesDoc,cachedMatchesQuery,cachedMatchesCase,cachedMatches=[]; - let suppressedSlash=null,blockSelection=false,newParagraphPos=null;let pending=0,request=0,clipboardBlock=null;const imports=new Map(),bookmarks=new Map(); + let suppressedSlash=null,blockSelection=false,newParagraphPos=null,dragPreview=null,contextRequest=null;let pending=0,request=0,clipboardBlock=null;const imports=new Map(),bookmarks=new Map(); const key=new PluginKey('nextnotesTools'); const editable=()=>env.canEdit()&&!env.busy(); const notify=text=>env.bridge()?.notice(text); @@ -71,14 +71,20 @@ export function makeTools(env){ if(query&&!env.busy())for(const m of matches(state.doc))items.push(Decoration.inline(m.from,m.to,{class:'editor-search-match'},{sourceSearch:true})); return DecorationSet.create(state.doc,items); } + function slashParagraph($from){ + if($from.parent.type.name!=='paragraph')return false; + for(let depth=$from.depth-1;depth>0;depth--)if($from.node(depth).type.name==='list_item')return false; + return true; + } function slash(){ if(!view||!editable()||!view.state.selection.empty)return null; - const {$from}=view.state.selection;if($from.parent.type.name!=='paragraph')return null; - const text=$from.parent.textBetween(0,$from.parentOffset,'\n','\uFFFC');const match=/^\/([^/\n]{0,40})$/.exec(text);if(!match)return null; - if(text===suppressedSlash)return null; - if(text!==suppressedSlash)suppressedSlash=null; + const {$from}=view.state.selection; + const text=$from.parent.textBetween(0,$from.parentOffset,'\n','\uFFFC'); + if(suppressedSlash&&($from.pos!==suppressedSlash.pos||text!==suppressedSlash.text))suppressedSlash=null; + if(!slashParagraph($from)||suppressedSlash)return null; + const match=/^\/([^/\n]{0,40})$/.exec(text);if(!match)return null; const term=match[1].trim().toLocaleLowerCase(); - const items=slashEntries.filter(entry=>entry[2].includes(term)||entry[1].includes(term)).slice(0,10).map(([command,label])=>({command,label})); + const items=slashEntries.filter(entry=>entry[2].includes(term)||entry[1].includes(term)).map(([command,label])=>({command,label})); if(text!==lastSlash){lastSlash=text;slashIndex=0;} slashIndex=Math.max(0,Math.min(slashIndex,items.length-1)); const r=view.coordsAtPos($from.pos); @@ -86,7 +92,11 @@ export function makeTools(env){ } function geometry(block){ if(!block||block.node.type.name==='raw_source')return null;const dom=view.nodeDOM(block.pos);if(!(dom instanceof Element))return null; - const r=dom.getBoundingClientRect();if(r.height<=0)return null;return {x:r.left,pos:block.pos,type:block.node.type.name,title:block.node.textContent.slice(0,40),y:r.top,height:r.height}; + const r=dom.getBoundingClientRect();if(r.height<=0)return null; + const selectedRange=range({pos:block.pos,selection:true}); + return {x:r.left,pos:block.pos,end:block.pos+block.node.nodeSize,type:block.node.type.name,title:block.node.textContent.slice(0,40),y:r.top,height:r.height, + canMoveUp:selectedRange.from>0,canMoveDown:selectedRange.tob.node.type.name==='table').map(b=>Array.from({length:b.node.firstChild.childCount},(_,i)=>b.node.firstChild.child(i).attrs.colwidth)); @@ -130,17 +142,26 @@ export function makeTools(env){ if(args.selection&&!view.state.selection.empty){const first=topBlock(view.state.selection.from),last=topBlock(Math.max(view.state.selection.from,view.state.selection.to-1));if(block.pos>=first.pos&&block.pos<=last.pos)return {from:first.pos,to:last.pos+last.node.nodeSize};} return {from:block.pos,to:block.pos+block.node.nodeSize}; } + // Preview and release share one calculation: the line marks a real block boundary. + // Ignore folded nodes, and use the gap between visible blocks rather than pointer y. + function dropTarget(args){ + const r=range(args);if(!r||!Number.isFinite(args.y))return null; + const blocks=rootBlocks().map(block=>({block,rect:view.nodeDOM(block.pos)?.getBoundingClientRect()})).filter(item=>item.rect?.height>0); + if(!blocks.length)return null; + const before=blocks.findIndex(item=>args.y=0?blocks[before]:null,previous=before>0?blocks[before-1]:before<0?blocks.at(-1):null; + const pos=next?next.block.pos:view.state.doc.content.size; + if(pos>=r.from&&pos<=r.to)return null; + const rect=next?.rect||previous.rect; + return {pos,x:rect.left,y:next?(previous?(previous.rect.bottom+rect.top)/2:rect.top):rect.bottom,width:rect.width}; + } function moveBlock(args){ const r=range(args);if(!r)return false; let target; const blocks=rootBlocks(),idx=blocks.findIndex(b=>b.pos===r.from); if(args.direction==='up')target=blocks[idx-1]?.pos; else if(args.direction==='down'){const after=blocks.find(b=>b.pos>=r.to);target=after?after.pos+after.node.nodeSize:undefined;} - else if(typeof args.y==='number'){ - const hit=view.posAtCoords({left:view.dom.getBoundingClientRect().left+24,top:args.y}); - const b=hit?topBlock(hit.pos):null; - target=b?(args.y>view.nodeDOM(b.pos).getBoundingClientRect().top+view.nodeDOM(b.pos).getBoundingClientRect().height/2?b.pos+b.node.nodeSize:b.pos):(args.y<0?0:view.state.doc.content.size); - } + else if(typeof args.y==='number')target=dropTarget(args)?.pos; if(target===undefined||target>=r.from&&target<=r.to)return false; const content=view.state.doc.slice(r.from,r.to).content;let tr=view.state.tr.delete(r.from,r.to); const at=tr.mapping.map(target,-1);tr=tr.insert(at,content); @@ -188,7 +209,12 @@ export function makeTools(env){ function run(name,args={}){ if(!view)return false; if(typeof args==='string')args={value:args}; - if(name==='dismissSlash'){const p=view.state.selection.$from;suppressedSlash=p.parent.textBetween(0,p.parentOffset);schedule();return true;} + if(name==='dismissSlash'){const p=view.state.selection.$from;suppressedSlash={pos:p.pos,text:p.parent.textBetween(0,p.parentOffset,'\n','\uFFFC')};schedule();return true;} + if(name==='contextBlock'){ + const hit=view.posAtCoords({left:args.x,top:args.y}); + contextRequest={request:args.request,pos:hit?.pos??view.state.selection.from};ui();return true; + } + if(name==='cancelBlockMove'){dragPreview=null;schedule();return true;} if(name==='search'){query=args.query||'';caseSensitive=!!args.caseSensitive;searchIndex=-1;refresh();return true;} if(name==='findNext')return navigateSearch(args.direction||1); if(name==='dragScroll'){window.scrollBy(0,args.delta||0);schedule();return true;} @@ -203,6 +229,7 @@ export function makeTools(env){ let tr=view.state.tr;for(const m of [...chosen].reverse())tr=tr.insertText(args.replacement||'',m.from,m.to);commit(tr);notify(`已替换 ${chosen.length} 处`);return true; } if(!editable())return false; + if(name==='previewBlockMove'){dragPreview=args;schedule();return true;} if(name==='slashChoose')return applySlash(args.index); if(name==='selectBlock'){ const b=targetBlock(args);if(!b)return false; @@ -288,6 +315,7 @@ export function makeTools(env){ } const plugin=new Plugin({key, state:{init:()=>DecorationSet.empty,apply(tr,old,oldState,newState){ + if(tr.selectionSet||tr.docChanged)suppressedSlash=null; // Capture an empty paragraph before its first keystroke, even between UI reports. trackNewParagraph(oldState,!!view?.hasFocus()); if(newParagraphPos!==null&&tr.docChanged){ @@ -316,19 +344,19 @@ export function makeTools(env){ return base.add(state.doc,items); } // Decorate only the current empty paragraph; no text or document mutation. - if(!editable()||!empty||$from.parent.type.name!=='paragraph'||$from.parent.content.size)return base; + if(!editable()||!empty||!slashParagraph($from)||$from.parent.content.size)return base; const pos=$from.before(); return base.add(state.doc,[Decoration.node(pos,pos+$from.parent.nodeSize, {class:'editor-empty-line','data-placeholder':'输入"/"进入选择'})]); }, handleKeyDown(v,event){ if(env.busy())return false;const state=slash(); - if(state&&['ArrowDown','ArrowUp','Enter','Escape'].includes(event.key)){ - if(event.key==='Escape'){suppressedSlash='/'+state.query;lastSlash='';view.dispatch(view.state.tr.setSelection(TextSelection.near(view.state.doc.resolve(view.state.selection.to))));env.bridge()?.dismissSlash();return true;} + if(state&&(state.items.length||event.key==='Escape')&&['ArrowDown','ArrowUp','Enter','Escape'].includes(event.key)){ + if(event.key==='Escape'){run('dismissSlash');lastSlash='';env.bridge()?.dismissSlash();return true;} if(event.key==='Enter')return applySlash(); slashIndex=(slashIndex+(event.key==='ArrowDown'?1:-1)+Math.max(1,state.items.length))%Math.max(1,state.items.length);schedule();return true; } - if(event.altKey&&event.shiftKey&&['ArrowUp','ArrowDown'].includes(event.key))return moveBlock({pos:topBlock(v.state.selection.from)?.pos,direction:event.key==='ArrowUp'?'up':'down',selection:true}); + if(editable()&&event.altKey&&event.shiftKey&&['ArrowUp','ArrowDown'].includes(event.key))return moveBlock({pos:topBlock(v.state.selection.from)?.pos,direction:event.key==='ArrowUp'?'up':'down',selection:true}); return false; }, handleDOMEvents:{ @@ -346,7 +374,7 @@ export function makeTools(env){ view(v){view=v;const observer=new ResizeObserver(schedule);observer.observe(v.dom);schedule();return {update(){env.refreshToc?.();schedule();},destroy(){observer.disconnect();clearTimeout(uiTimer);uiTimer=null;}};} }); return {plugin,run,refresh,state:()=>lastUI?JSON.parse(lastUI):{},ui:schedule,uiNow:ui,uploader,importResult,exportReady,hasPending:()=>pending>0, - reset(){clearTimeout(uiTimer);uiTimer=null;collapsed.clear();hover=0;blockHandleVisible=false;blockSelection=false;newParagraphPos=null;query='';lastUI='';searchIndex=-1;lastSlash='';for(const item of imports.values())item.resolve({ok:false});imports.clear();bookmarks.clear();pending=0;}, + reset(){clearTimeout(uiTimer);uiTimer=null;collapsed.clear();hover=0;blockHandleVisible=false;blockSelection=false;newParagraphPos=null;dragPreview=null;contextRequest=null;suppressedSlash=null;slashIndex=0;query='';lastUI='';searchIndex=-1;lastSlash='';for(const item of imports.values())item.resolve({ok:false});imports.clear();bookmarks.clear();pending=0;}, selectedCode:()=>topBlock(view.state.selection.from), }; }