@rho-workspace/rho 0.5.3 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -5
- package/dist/capabilities.d.ts +27 -0
- package/dist/capabilities.js +73 -1
- package/dist/cli.js +150 -25
- package/dist/contract.generated.d.ts +112 -12
- package/dist/contracts/owners.generated.js +103 -8
- package/dist/conversation-presentation.d.ts +3 -1
- package/dist/conversation-presentation.js +16 -6
- package/dist/conversations.d.ts +10 -6
- package/dist/conversations.js +17 -13
- package/dist/installs.d.ts +11 -0
- package/dist/installs.js +179 -0
- package/dist/project-notes.js +2 -0
- package/dist/protocol.js +7 -5
- package/dist/screen-check-skill.d.ts +2 -0
- package/dist/screen-check-skill.js +39 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +50 -7
- package/dist/web/.vite/manifest.json +51 -51
- package/dist/web/assets/{choices-B-y2OYvE.js → choices-DU9kHlyQ.js} +1 -1
- package/dist/web/assets/{console-e1P5qYQ5.js → console-Dbdo-5oO.js} +1 -1
- package/dist/web/assets/{dist-Dd3iAGFy.js → dist-B2V0VDO0.js} +1 -1
- package/dist/web/assets/{dist-CH56yNDn.js → dist-BV3hWfn_.js} +1 -1
- package/dist/web/assets/{dist-CBM2oq6g.js → dist-CLNF2g-E.js} +1 -1
- package/dist/web/assets/{dist-DEorbOW0.js → dist-D25Vn17i.js} +1 -1
- package/dist/web/assets/{explore-in-muWXOGOY.js → explore-in-8Q5ftt-E.js} +1 -1
- package/dist/web/assets/{graph-CK-df5lh.js → graph-hS2kvHTI.js} +1 -1
- package/dist/web/assets/{index-BYuKpyoi.js → index-BHQIaDsx.js} +220 -121
- package/dist/web/assets/index-Cj1_iqyK.css +1 -0
- package/dist/web/assets/{notes-meaning-B3HFbh84.js → notes-meaning-DdPbtNzJ.js} +1 -1
- package/dist/web/assets/{overview-D1Ev2OC_.js → overview-BV6ZO5TO.js} +3 -3
- package/dist/web/assets/{preview-HbmQKUGY.js → preview-n5lOOdjN.js} +1 -1
- package/dist/web/assets/{review-BVh9jWMB.js → review-CmWou4Iv.js} +1 -1
- package/dist/web/assets/{skills-DPaEYkln.js → skills-Dy7n3L9d.js} +1 -1
- package/dist/web/assets/{skills-work-dvjfy_tu.js → skills-work-Cj0W6b-I.js} +1 -1
- package/dist/web/assets/{studio-process-BYm8mjRJ.js → studio-process-QOY_n2_8.js} +1 -1
- package/dist/web/assets/{timeline-events-CDZ7wiJX.js → timeline-events-DmX1BCh3.js} +1 -1
- package/dist/web/assets/{work-turns-BeCt303c.js → work-turns-Co0C71rJ.js} +1 -1
- package/dist/web/assets/{workspace-d5Hw_ClZ.js → workspace-BKFefRfJ.js} +2 -2
- package/dist/web/composition.json +73 -73
- package/dist/web/index.html +2 -2
- package/dist/web/renderer.json +1 -1
- package/docs/FRONTEND.md +30 -14
- package/docs/HEADLESS.md +59 -13
- package/example/pa14-qs/.rho/rho/conversations/c-67f77cfebaba2cea.json +1 -1
- package/example/pa14-qs/.rho/rho/conversations/c-91aa2e46b1ac1a6c.json +1 -1
- package/example/pa14-qs/.rho/rho/conversations/c-fa24dfd80dfe4bcb.json +1 -1
- package/node_modules/@hono/node-server/dist/index.js +11 -0
- package/node_modules/@hono/node-server/dist/index.mjs +11 -0
- package/node_modules/@hono/node-server/dist/listener.js +11 -0
- package/node_modules/@hono/node-server/dist/listener.mjs +11 -0
- package/node_modules/@hono/node-server/dist/request.js +11 -0
- package/node_modules/@hono/node-server/dist/request.mjs +11 -0
- package/node_modules/@hono/node-server/dist/server.js +11 -0
- package/node_modules/@hono/node-server/dist/server.mjs +11 -0
- package/node_modules/@hono/node-server/dist/vercel.js +11 -0
- package/node_modules/@hono/node-server/dist/vercel.mjs +11 -0
- package/node_modules/@hono/node-server/package.json +1 -1
- package/node_modules/@rho-workspace/plugin-agent/README.md +3 -1
- package/node_modules/@rho-workspace/plugin-agent/dist/acp-conversation.js +14 -3
- package/node_modules/@rho-workspace/plugin-agent/dist/conversation.d.ts +1 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/conversation.js +1 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/generic-acp.d.ts +11 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/generic-acp.js +7 -0
- package/node_modules/@rho-workspace/plugin-agent/dist/mcp.js +5 -1
- package/node_modules/@rho-workspace/plugin-agent/package.json +1 -1
- package/node_modules/@rho-workspace/plugin-annotations/package.json +1 -1
- package/node_modules/@rho-workspace/plugin-documents/README.md +4 -0
- package/node_modules/@rho-workspace/plugin-documents/dist/index.d.ts +3 -0
- package/node_modules/@rho-workspace/plugin-documents/dist/index.js +1 -1
- package/node_modules/@rho-workspace/plugin-documents/package.json +1 -1
- package/node_modules/@rho-workspace/plugin-kernel/README.md +71 -10
- package/node_modules/@rho-workspace/plugin-kernel/dist/code.d.ts +2 -0
- package/node_modules/@rho-workspace/plugin-kernel/dist/code.js +4 -1
- package/node_modules/@rho-workspace/plugin-kernel/dist/contract.js +5 -0
- package/node_modules/@rho-workspace/plugin-kernel/dist/index.d.ts +7 -0
- package/node_modules/@rho-workspace/plugin-kernel/dist/index.js +55 -8
- package/node_modules/@rho-workspace/plugin-kernel/dist/lineage.d.ts +9 -6
- package/node_modules/@rho-workspace/plugin-kernel/dist/lineage.js +18 -41
- package/node_modules/@rho-workspace/plugin-kernel/dist/operations.js +5 -2
- package/node_modules/@rho-workspace/plugin-kernel/dist/script-flow.d.ts +39 -0
- package/node_modules/@rho-workspace/plugin-kernel/dist/script-flow.js +661 -0
- package/node_modules/@rho-workspace/plugin-kernel/dist/ui-base.d.ts +3 -0
- package/node_modules/@rho-workspace/plugin-kernel/dist/ui-base.js +10 -0
- package/node_modules/@rho-workspace/plugin-kernel/dist/ui-flow.d.ts +38 -4
- package/node_modules/@rho-workspace/plugin-kernel/dist/ui-flow.js +194 -97
- package/node_modules/@rho-workspace/plugin-kernel/dist/ui-notebook-work.js +1 -2
- package/node_modules/@rho-workspace/plugin-kernel/dist/ui-notebook.d.ts +10 -2
- package/node_modules/@rho-workspace/plugin-kernel/dist/ui-notebook.js +79 -18
- package/node_modules/@rho-workspace/plugin-kernel/dist/ui-styles.js +115 -45
- package/node_modules/@rho-workspace/plugin-kernel/dist/ui.d.ts +1 -1
- package/node_modules/@rho-workspace/plugin-kernel/dist/ui.js +1 -1
- package/node_modules/@rho-workspace/plugin-kernel/dist/value-graph.d.ts +63 -0
- package/node_modules/@rho-workspace/plugin-kernel/dist/value-graph.js +344 -0
- package/node_modules/@rho-workspace/plugin-kernel/package.json +1 -1
- package/node_modules/@rho-workspace/plugin-kernel/runners/runner.R +6 -3
- package/node_modules/@rho-workspace/plugin-kernel/runners/runner.py +6 -3
- package/node_modules/express-rate-limit/dist/index.cjs +1 -1
- package/node_modules/express-rate-limit/dist/index.mjs +1 -1
- package/node_modules/express-rate-limit/package.json +1 -1
- package/node_modules/ip-address/dist/ipv6.js +1 -1
- package/node_modules/ip-address/package.json +1 -1
- package/node_modules/playwright-core/LICENSE +202 -0
- package/node_modules/playwright-core/NOTICE +5 -0
- package/node_modules/playwright-core/ThirdPartyNotices.txt +13 -0
- package/node_modules/playwright-core/bin/install_media_pack.ps1 +5 -0
- package/node_modules/playwright-core/bin/install_webkit_wsl.ps1 +33 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_beta_linux.sh +42 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_beta_mac.sh +13 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_beta_win.ps1 +24 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_stable_linux.sh +42 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_stable_mac.sh +12 -0
- package/node_modules/playwright-core/bin/reinstall_chrome_stable_win.ps1 +24 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_beta_linux.sh +48 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_beta_mac.sh +11 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_beta_win.ps1 +23 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_dev_linux.sh +48 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_dev_mac.sh +11 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_dev_win.ps1 +23 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_stable_linux.sh +48 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_stable_mac.sh +11 -0
- package/node_modules/playwright-core/bin/reinstall_msedge_stable_win.ps1 +24 -0
- package/node_modules/playwright-core/browsers.json +52 -0
- package/node_modules/playwright-core/cli.js +22 -0
- package/node_modules/playwright-core/index.js +17 -0
- package/node_modules/playwright-core/index.mjs +28 -0
- package/node_modules/playwright-core/lib/bootstrap.js +149 -0
- package/node_modules/playwright-core/lib/coreBundle.js +78041 -0
- package/node_modules/playwright-core/lib/entry/cliDaemon.js +5 -0
- package/node_modules/playwright-core/lib/entry/dashboardApp.js +3 -0
- package/node_modules/playwright-core/lib/entry/mcp.js +10 -0
- package/node_modules/playwright-core/lib/entry/oopBrowserDownload.js +3 -0
- package/node_modules/playwright-core/lib/package.js +50 -0
- package/node_modules/playwright-core/lib/server/chromium/appIcon.png +0 -0
- package/node_modules/playwright-core/lib/server/electron/loader.js +123 -0
- package/node_modules/playwright-core/lib/serverRegistry.js +1939 -0
- package/node_modules/playwright-core/lib/serverRegistry.js.LICENSE +65 -0
- package/node_modules/playwright-core/lib/tools/cli-client/channelSessions.js +141 -0
- package/node_modules/playwright-core/lib/tools/cli-client/cli.js +7 -0
- package/node_modules/playwright-core/lib/tools/cli-client/help.json +808 -0
- package/node_modules/playwright-core/lib/tools/cli-client/minimist.js +128 -0
- package/node_modules/playwright-core/lib/tools/cli-client/output.js +352 -0
- package/node_modules/playwright-core/lib/tools/cli-client/program.js +422 -0
- package/node_modules/playwright-core/lib/tools/cli-client/registry.js +180 -0
- package/node_modules/playwright-core/lib/tools/cli-client/session.js +261 -0
- package/node_modules/playwright-core/lib/tools/dashboard/appIcon.png +0 -0
- package/node_modules/playwright-core/lib/tools/utils/extension.js +112 -0
- package/node_modules/playwright-core/lib/tools/utils/socketConnection.js +108 -0
- package/node_modules/playwright-core/lib/utilsBundle.js +86078 -0
- package/node_modules/playwright-core/lib/utilsBundle.js.LICENSE +1890 -0
- package/node_modules/playwright-core/lib/vite/dashboard/assets/codeMirrorModule--QdMvsKi.css +1 -0
- package/node_modules/playwright-core/lib/vite/dashboard/assets/codeMirrorModule-CQ8RZGBm.js +32 -0
- package/node_modules/playwright-core/lib/vite/dashboard/assets/codicon-DCmgc-ay.ttf +0 -0
- package/node_modules/playwright-core/lib/vite/dashboard/assets/firefox-1bWoP6pv.svg +1 -0
- package/node_modules/playwright-core/lib/vite/dashboard/assets/firefox-beta-k3eOH_eK.svg +1 -0
- package/node_modules/playwright-core/lib/vite/dashboard/assets/firefox-nightly-Cp5nfeDT.svg +1 -0
- package/node_modules/playwright-core/lib/vite/dashboard/assets/index-AwgwcYie.css +1 -0
- package/node_modules/playwright-core/lib/vite/dashboard/assets/index-hRvO4yU2.js +12 -0
- package/node_modules/playwright-core/lib/vite/dashboard/assets/safari-na3_-uQk.svg +1 -0
- package/node_modules/playwright-core/lib/vite/dashboard/index.html +29 -0
- package/node_modules/playwright-core/lib/vite/dashboard/playwright-logo.svg +24 -0
- package/node_modules/playwright-core/lib/vite/htmlReport/index.html +16 -0
- package/node_modules/playwright-core/lib/vite/htmlReport/report.css +2 -0
- package/node_modules/playwright-core/lib/vite/htmlReport/report.js +32 -0
- package/node_modules/playwright-core/lib/vite/recorder/assets/codeMirrorModule--QdMvsKi.css +1 -0
- package/node_modules/playwright-core/lib/vite/recorder/assets/codeMirrorModule-DK72OMRi.js +32 -0
- package/node_modules/playwright-core/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +0 -0
- package/node_modules/playwright-core/lib/vite/recorder/assets/index-BZpYJZ-P.css +1 -0
- package/node_modules/playwright-core/lib/vite/recorder/assets/index-Cn0mmDuv.js +129 -0
- package/node_modules/playwright-core/lib/vite/recorder/index.html +29 -0
- package/node_modules/playwright-core/lib/vite/recorder/playwright-logo.svg +9 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/assets/codeMirrorModule-BEB2e8M3.js +32 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-D-g2vrvf.js +184 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/assets/urlMatch-L3liM589.js +1 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/assets/xtermModule-B794rD2Z.js +7 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/codeMirrorModule.-QdMvsKi.css +1 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/defaultSettingsView.C8BeHuxd.css +1 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/index.B_TqY17P.css +1 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/index.html +44 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/index.oNry3Hjv.js +1 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/manifest.webmanifest +16 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/playwright-logo.svg +9 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/snapshot.B_Jk1wbt.js +1 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/snapshot.html +10 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/sw.bundle.js +4 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/uiMode.CYwC_gH1.js +5 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/uiMode.CyMfwkXJ.css +1 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/uiMode.html +18 -0
- package/node_modules/playwright-core/lib/vite/traceViewer/xtermModule.kHJ-D0s7.css +1 -0
- package/node_modules/playwright-core/lib/webp_codec.LICENSE +173 -0
- package/node_modules/playwright-core/lib/webp_codec.wasm +0 -0
- package/node_modules/playwright-core/lib/xdg-open +1267 -0
- package/node_modules/playwright-core/package.json +34 -0
- package/package.json +10 -6
- package/protocol/index.json +17 -17
- package/protocol/operations/conversation.settings.check.json +147 -4
- package/protocol/operations/conversation.settings.read.json +145 -3
- package/protocol/operations/conversation.settings.update.json +166 -4
- package/protocol/operations/conversation.start.json +2 -1
- package/protocol/operations/kernel.interrupt.json +20 -0
- package/protocol/operations/kernel.read.json +30 -0
- package/protocol/operations/kernel.run.json +36 -1
- package/protocol/operations/kernel.stop.json +10 -0
- package/scripts/browser-checks.mjs +53 -0
- package/scripts/screen-check.mjs +193 -0
- package/vendor/composition.json +102 -102
- package/vendor/rho-workspace-plugin-agent-0.4.28.tgz +0 -0
- package/vendor/rho-workspace-plugin-annotations-0.5.2.tgz +0 -0
- package/vendor/rho-workspace-plugin-documents-0.4.11.tgz +0 -0
- package/vendor/rho-workspace-plugin-kernel-0.5.5.tgz +0 -0
- package/web/theme.css +17 -2
- package/dist/web/assets/index-DBd77u4a.css +0 -1
- package/vendor/rho-workspace-plugin-agent-0.4.27.tgz +0 -0
- package/vendor/rho-workspace-plugin-documents-0.4.10.tgz +0 -0
- package/vendor/rho-workspace-plugin-kernel-0.5.2.tgz +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{n as t,t as n}from"./react-Dss-ouuy.js";import{r,t as i}from"./markdown-0ngRuTpW.js";import{N as a,a as o}from"./canvas-BXhC8RDZ.js";import{Bt as s,Ft as c,It as l,Nt as u,Pt as d,Ut as f,_t as p,bt as m,ft as h,g,gt as _,ht as v,m as y,mt as b,pt as x,ut as S,wt as C,xt as ee,zt as te}from"./index-BYuKpyoi.js";import{t as w}from"./work-turns-BeCt303c.js";import{t as T}from"./snapshot-CAxBYPvV.js";import{r as ne,t as E}from"./timeline-events-CDZ7wiJX.js";import{n as D,r as re,t as O}from"./choices-B-y2OYvE.js";var k=e(n(),1),A=t(),j=e=>e.kind===`question`?`Question`:e.kind===`run`?`Run`:e.kind===`finding`?`Finding`:e.kind===`choice`?`Choice`:{data:`Data`,code:`Script`,results:`Result`,figures:`Figure`,notes:`Note`}[e.category??``]??`File`,M=e=>e.kind===`question`?`question`:e.kind===`run`?`run`:e.kind===`finding`?`check`:e.kind===`choice`?`updown`:e.category===`figures`?`image`:e.category===`code`?`code`:e.category===`notes`?`document`:e.category?`table`:`file`,N=e=>e.kind===`file`?e.category??`other`:e.kind,P=e=>e.kind===`file`&&!!e.resource&&(/\.(png|jpe?g|svg)$/i.test(e.path)||/\.csv$/i.test(e.path)),ie=(e,t)=>t?{width:228,height:58}:e.meaning?{width:e.kind===`file`?256:300,height:e.kind===`question`?138:e.kind===`finding`||e.kind===`choice`?124:P(e)?/\.csv$/i.test(e.path)?226:212:128}:{width:e.kind===`question`?300:e.kind===`run`?236:256,height:e.kind===`question`?e.answer?160:116:e.kind===`run`?88:P(e)?/\.csv$/i.test(e.path)?198:184:96},F=(e,t)=>e?.written?(t(e.written.conversationId)??`The Agent`)+` · `+h(e.written.at):`Not in the Agent's record`,ae={both:`Meaning + process`,meaning:`Meaning`,process:`Process`},oe=e=>e?e.replace(/```[\s\S]*?```/g,` `).replace(/[#>*_`|]+/g,` `).replace(/\[([^\]]+)\]\([^)]*\)/g,`$1`).replace(/\s+/g,` `).trim().slice(0,220):``,se={read:`Read`,edit:`Edited`,write:`Wrote`,changed:`Changed`,capture:`Kept`,run:`Ran`,ask:`Asked`,answer:`Answered`};function I(e){let t=new Map;for(let n of e.events)n.action!==`ask`&&n.action!==`answer`&&!(n.action===`capture`&&e.versions)&&t.set(n.action,(t.get(n.action)??0)+1);return[...t].map(([e,t])=>(se[e]??e)+(t>1?` `+t+`×`:``)).join(` · `)}var ce={completed:`Answered`,failed:`Failed`,stopped:`Stopped`,running:`Working`,unknown:`Outcome unknown`},le=e=>{e&&(e.scrollTop=e.scrollHeight)},L={returned:`Returned`,requested:`Running`,failed:`Failed`,rejected:`Refused`,unknown:`Outcome unknown`};function R({client:e,snapshot:t,node:n,shown:r}){let i=n.resource?.id+`@`+n.resource?.version,[a,o]=(0,k.useState)(null),s=a?.preview??null;return(0,k.useEffect)(()=>{if(!r||!n.resource||a?.version===i)return;let s=!0;return g(e,t,{path:n.path,bytes:n.bytes,modifiedAt:n.modifiedAt,resource:n.resource?{...n.resource,kind:t.resources.find(e=>e.id===n.resource.id)?.kind??`file`}:void 0}).then(e=>{s&&o({version:i,preview:e})}),()=>{s=!1}},[r,i]),s?s.kind===`image`?(0,A.jsx)(`span`,{className:`graph-preview image`,children:(0,A.jsx)(`img`,{src:s.url,alt:``})}):s.kind===`table`?(0,A.jsxs)(`span`,{className:`graph-preview table`,children:[(0,A.jsxs)(`span`,{className:`graph-table`,style:{gridTemplateColumns:`repeat(${s.columns.length}, minmax(0, 1fr))`},children:[s.columns.map(e=>(0,A.jsx)(`span`,{className:`graph-cell head`,children:e},`h`+e)),s.rows.map((e,t)=>s.columns.map(n=>(0,A.jsx)(`span`,{className:`graph-cell`,children:e[n]===null||e[n]===void 0?``:String(e[n])},t+n)))]}),(0,A.jsxs)(`small`,{children:[s.total.toLocaleString(),` `,s.total===1?`row`:`rows`,` × `,s.width,` `,s.width===1?`column`:`columns`]})]}):(0,A.jsx)(`span`,{className:`graph-preview none`,children:s.note}):(0,A.jsx)(`span`,{className:`graph-preview loading`,"aria-hidden":`true`})}var z={min:.2,max:2},ue=.78;function B({initialResource:e,client:t,snapshot:n,files:i,agentNow:o,following:s,principalId:f,notesText:p=``,onFollow:m,onStopFollowing:g,onStudio:_,workspace:v,onAbout:y,onAgent:b}){let{turns:x,problem:S,loading:C,omitted:ee}=w(t,n),{marks:te}=E(t,n),[T,ne]=(0,k.useState)(()=>Date.now());(0,k.useEffect)(()=>{if(!o?.running)return;let e=setInterval(()=>ne(Date.now()),1e3);return()=>clearInterval(e)},[o?.running]);let O=(0,k.useMemo)(()=>i.files.map(e=>({path:e.path,bytes:e.bytes,modifiedAt:e.modifiedAt,category:e.category})),[i.files]),j=(0,k.useMemo)(()=>d(u({turns:x,files:O,project:n.project,kindOf:a,now:o?.running?T:Date.now()})),[x,O,n.project,o?.running?T:0]),M=D(t,n,j,O,p,x),N=M.layer.nodes.length>0,[F,oe]=(0,k.useState)(()=>{try{let e=localStorage.getItem(`rho.graph.layer.v1`);return e===`meaning`||e===`process`?e:`both`}catch{return`both`}});function se(e){Le.current=!1,oe(e);try{localStorage.setItem(`rho.graph.layer.v1`,e)}catch{}}let I=(0,k.useMemo)(()=>re(j,N?M.layer:null,F),[j,M.layer,N,F]),ce=new Set(N&&F!==`process`?M.layer.turns.map(e=>e.id):[]),le=e=>j.turns.find(t=>t.conversationId===e)?.agent,L=I.nodes.map(e=>e.id+(P(e)?`+`:``)+(e.answer?`a`:``)+(e.meaning?.description?`d`:``)).join(`|`)+`#`+I.edges.map(e=>e.id+`@`+e.turn).join(`|`),R=(0,k.useMemo)(()=>c(I,ie,{x:108,y:26,lane:64}),[L]),B=(0,k.useMemo)(()=>new Map(I.nodes.map(e=>[e.id,e])),[I]),ye=(0,k.useMemo)(()=>new Map(R.items.map(e=>[e.id,e])),[R]),be=I.turns.find(e=>e.running)?.id,xe=be?R.rows.find(e=>e.turn===be)?.lane:void 0,V=e=>e?R.items.find(t=>t.node===e&&t.lane===xe)?.id??e:null,[H,U]=(0,k.useState)(null);(0,k.useEffect)(()=>{if(e){let t=I.nodes.find(t=>(t.versions??(t.resource?[{resource:t.resource}]:[])).some(t=>t.resource.id===e.id&&t.resource.version===e.version));t&&U(t.id)}},[e?.id,e?.version,L]);let W=(0,k.useMemo)(()=>H&&B.has(H)?l(I,H):null,[H,I]),[Ce,we]=(0,k.useState)(``),G=(0,k.useMemo)(()=>{let e=Ce.trim().toLowerCase();return e?new Set(I.nodes.filter(t=>(t.title+` `+(t.path??``)+` `+(t.text??``)+` `+(t.command??``)).toLowerCase().includes(e)).map(e=>e.id)):null},[Ce,I]),[K,Te]=(0,k.useState)(null),[Ee,De]=(0,k.useState)(!1),[Oe,ke]=(0,k.useState)(1),Ae=I.events.map(e=>e.at);(0,k.useEffect)(()=>{if(!Ee)return;let e=I.events,t=K===null?0:e.findIndex(e=>e.at>K);if(t<0||t>=e.length){De(!1),Te(null);return}let n=Math.min(600,Math.max(140,9e3/Math.max(1,e.length)))/Oe,r=setTimeout(()=>Te(e[t].at),K===null?0:n);return()=>clearTimeout(r)},[Ee,K,I.events,Oe]);let je=K===null?null:[...I.events].reverse().find(e=>e.at<=K)??null,Me=(0,k.useRef)(null),[Ne,Pe]=(0,k.useState)(new Set);(0,k.useEffect)(()=>{let e=new Set(I.nodes.map(e=>e.id));if(Me.current){let t=[...e].filter(e=>!Me.current.has(e));if(t.length){Pe(new Set(t));let n=setTimeout(()=>Pe(new Set),1600);return Me.current=e,()=>clearTimeout(n)}}Me.current=e},[I.nodes]);let q=(0,k.useRef)(null),[J,Y]=(0,k.useState)({x:40,y:40,k:1}),[Fe,Ie]=(0,k.useState)(!1),X=(0,k.useRef)(J);X.current=J;let Le=(0,k.useRef)(!1),Re=(0,k.useRef)(!1),ze=e=>{Ie(!0),Y(e),setTimeout(()=>Ie(!1),380)},Be=(0,k.useCallback)((e=!0)=>{let t=q.current?.getBoundingClientRect();if(!t||!R.width)return;let n=Math.max(z.min,Math.min(1,(t.width-96)/R.width,(t.height-120)/R.height)),r={k:n,x:(t.width-R.width*n)/2,y:Math.max(56,(t.height-R.height*n)/2)};e?ze(r):Y(r)},[R]),Ve=R.rows.map(e=>e.turn).join(`,`),He=(0,k.useRef)(Ve);(0,k.useLayoutEffect)(()=>{let e=Ve!==He.current||R.rows.some(e=>e.turn.startsWith(`m:`));He.current=Ve,!Re.current&&!s&&e&&(Le.current=!1)},[R]),(0,k.useEffect)(()=>{H&&(Re.current=!0)},[H]),(0,k.useLayoutEffect)(()=>{if(Le.current||!I.nodes.length)return;let e=q.current?.getBoundingClientRect();if(!e)return;Le.current=!0;let t=Math.min(1,(e.width-96)/R.width,(e.height-120)/R.height),n=R.rows.filter(e=>e.turn.startsWith(`m:`)).at(-1),r=n??R.rows.at(-1);if(t>=ue||!r){Be(!1);return}let i=ue,a=R.height*i<=e.height-120,o=n&&R.placed.get(`q:`+n.turn);Y(o?{k:i,x:32-o.x*i,y:e.height*.35-(o.y+o.height/2)*i}:{k:i,x:32,y:a?(e.height-R.height*i)/2:Math.min(48,e.height-40-(r.y+r.height)*i)})},[I.nodes.length,Be,R]);let Ue=(e,t=!0,n)=>{let r=R.placed.get(e),i=q.current?.getBoundingClientRect();if(!r||!i)return;let a=n??Math.max(X.current.k,ue),o={k:a,x:i.width/2-(r.x+r.width/2)*a,y:i.height/2-(r.y+r.height/2)*a};t?ze(o):Y(o)};(0,k.useEffect)(()=>{if(!s||!I.live||K!==null)return;let e=V(I.live.node),t=R.placed.get(e),n=q.current?.getBoundingClientRect(),r=X.current;if(!t||!n)return;let i=t.x*r.k+r.x,a=t.y*r.k+r.y;(i<24||a<64||i+t.width*r.k>n.width-24||a+t.height*r.k>n.height-24)&&Ue(e)},[s,I.live?.node,R]),(0,k.useEffect)(()=>{let e=q.current;if(!e)return;function t(t){t.preventDefault(),Re.current=!0;let n=X.current;if(t.ctrlKey||t.metaKey){let r=e.getBoundingClientRect(),i=t.clientX-r.left,a=t.clientY-r.top,o=Math.min(z.max,Math.max(z.min,n.k*Math.exp(-t.deltaY*.01)));Y({k:o,x:i-(i-n.x)*o/n.k,y:a-(a-n.y)*o/n.k})}else Y({...n,x:n.x-t.deltaX,y:n.y-t.deltaY});s&&g()}return e.addEventListener(`wheel`,t,{passive:!1}),()=>e.removeEventListener(`wheel`,t)},[s]);let We=(0,k.useRef)(!1);function Ge(e){if(e.button!==0||e.target.closest(`.graph-node, .graph-zoom, .graph-overlay, .graph-legend`))return;let t={x:e.clientX,y:e.clientY,view:X.current},n=e.currentTarget;Re.current=!0,n.setPointerCapture(e.pointerId),We.current=!1;let r=e=>{Math.abs(e.clientX-t.x)+Math.abs(e.clientY-t.y)>3&&(We.current=!0,n.dataset.panning=``),Y({...t.view,x:t.view.x+e.clientX-t.x,y:t.view.y+e.clientY-t.y})},i=()=>{n.removeEventListener(`pointermove`,r),n.removeEventListener(`pointerup`,i),n.removeEventListener(`pointercancel`,i),delete n.dataset.panning,We.current?s&&g():U(null)};n.addEventListener(`pointermove`,r),n.addEventListener(`pointerup`,i),n.addEventListener(`pointercancel`,i)}let Ke=e=>{Re.current=!0;let t=q.current?.getBoundingClientRect(),n=X.current;if(!t)return;let r=Math.min(z.max,Math.max(z.min,n.k*e)),i=t.width/2,a=t.height/2;ze({k:r,x:i-(i-n.x)*r/n.k,y:a-(a-n.y)*r/n.k})};function Z(e,t=!1){U(e),e&&t&&Ue(e)}let[qe,Je]=(0,k.useState)(null);function Ye(e){F===`meaning`&&se(`both`),U(e),Je(e)}(0,k.useEffect)(()=>{qe&&R.placed.has(qe)&&(Ue(qe),Je(null))},[qe,R]);function Xe(e){let t=document.activeElement?.dataset.node;if(e.key===`Escape`){H&&(e.preventDefault(),U(null));return}if(e.key===`+`||e.key===`=`){e.preventDefault(),Ke(1.2);return}if(e.key===`-`){e.preventDefault(),Ke(1/1.2);return}if(e.key===`0`){e.preventDefault(),Be();return}if(!t||![`ArrowLeft`,`ArrowRight`,`ArrowUp`,`ArrowDown`].includes(e.key))return;let n=R.placed.get(t),r;if(e.key===`ArrowRight`)r=R.links.filter(e=>e.from===t).map(e=>e.to).sort((e,t)=>R.placed.get(e).y-R.placed.get(t).y)[0];else if(e.key===`ArrowLeft`)r=R.links.filter(e=>e.to===t).map(e=>e.from).sort((e,t)=>R.placed.get(e).y-R.placed.get(t).y)[0];else{let i=[...R.placed].filter(([,e])=>Math.abs(e.x+e.width/2-n.x-n.width/2)<4).sort((e,t)=>e[1].y-t[1].y).map(([e])=>e);r=i[i.indexOf(t)+(e.key===`ArrowDown`?1:-1)]}if(!r)return;e.preventDefault(),q.current?.querySelector(`[data-node="${CSS.escape(r)}"]`)?.focus();let i=R.placed.get(r),a=q.current.getBoundingClientRect(),o=X.current;(i.x*o.k+o.x<0||i.y*o.k+o.y<48||(i.x+i.width)*o.k+o.x>a.width||(i.y+i.height)*o.k+o.y>a.height)&&Ue(r)}let Ze=J.k>=.62,Qe=e=>K===null||(B.get(e)?.at??0)<=K,$e=e=>K===null||e.at<=K,et=e=>K===null||R.links.some(t=>(t.from===e.id||t.to===e.id)&&t.edge.at<=K),tt=e=>W&&!W.nodes.has(e)||G&&!G.has(e),Q=H?B.get(H):void 0,$=K===null&&o?.running?I.live:null,nt={questions:j.nodes.filter(e=>e.kind===`question`).length,files:j.nodes.filter(e=>e.kind===`file`).length,runs:j.nodes.filter(e=>e.kind===`run`).reduce((e,t)=>e+(t.commands?.length??1),0),findings:M.layer.nodes.filter(e=>e.kind===`finding`).length,choices:M.layer.nodes.filter(e=>e.kind===`choice`).length};return n.conversations?.length?(0,A.jsxs)(`section`,{className:`graph-page`,"aria-labelledby":`graph-title`,children:[(0,A.jsxs)(fe,{counts:nt,omitted:ee+I.omittedTurns,children:[N&&(0,A.jsx)(`div`,{className:`graph-layers`,role:`group`,"aria-label":`Layers`,children:[`both`,`meaning`,`process`].map(e=>(0,A.jsx)(`button`,{"aria-pressed":F===e,onClick:()=>se(e),children:ae[e]},e))}),(0,A.jsxs)(`label`,{className:`graph-search`,children:[(0,A.jsx)(r,{name:`search`,size:15}),(0,A.jsx)(`input`,{type:`search`,placeholder:`Find in this graph`,"aria-label":`Find in this graph`,value:Ce,onChange:e=>we(e.target.value),onKeyDown:e=>{if(e.key===`Enter`&&G?.size){let e=I.nodes.find(e=>G.has(e.id));e&&Z(e.id,!0)}}}),G&&(0,A.jsx)(`small`,{children:G.size})]}),$?.waiting&&(0,A.jsxs)(`button`,{className:`graph-waiting`,onClick:()=>Z($.node,!0),children:[(0,A.jsx)(`span`,{className:`pulse-dot`,"aria-hidden":`true`}),`Needs your choice`]}),o?.running&&(0,A.jsx)(`button`,{className:`follow-toggle`+(s?` on`:``),"aria-pressed":s,title:s?`The graph keeps the Agent in view as it works.`:`Keep the Agent in view as it works.`,onClick:s?g:m,children:s?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`span`,{className:`pulse-dot`,"aria-hidden":`true`}),`Following `,o.agent]}):(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(r,{name:`follow`,size:15}),`Follow `,o.agent]})})]}),e&&!C&&!I.nodes.some(t=>t.resource?.id===e.id&&t.resource.version===e.version)&&(0,A.jsx)(`p`,{className:`canvas-note`,children:`The selected result version is outside this retained Graph window. Its review still holds the exact reference.`}),!!I.omittedNodes&&(0,A.jsxs)(`p`,{className:`canvas-note`,children:[I.omittedNodes,` nodes are outside the drawing budget. This is a partial view of the retained work.`]}),S&&(0,A.jsx)(`p`,{className:`inline-error graph-problem`,role:`alert`,children:S}),(0,A.jsxs)(`div`,{className:`graph-body`,children:[(0,A.jsx)(`div`,{ref:q,className:`graph-canvas`+(W?` focusing`:``)+(K===null?``:` replaying`),tabIndex:-1,onPointerDown:Ge,onKeyDown:Xe,children:C?(0,A.jsxs)(`div`,{className:`loading-state`,role:`status`,children:[(0,A.jsx)(`span`,{className:`loading-dot`}),(0,A.jsx)(`span`,{children:`Reading what the Agent did…`})]}):(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(`div`,{className:`graph-world`+(Fe?` gliding`:``),"data-zoom":Ze?`near`:`far`,style:{transform:`translate(${J.x}px, ${J.y}px) scale(${J.k})`,width:R.width,height:R.height,"--k":J.k},children:[(0,A.jsx)(ge,{layout:R,focus:W,shown:$e,labels:Ze||!!W,dim:tt,live:V($?.node)}),[...R.items].sort((e,t)=>e.lane-t.lane||R.placed.get(e.id).column-R.placed.get(t.id).column||R.placed.get(e.id).y-R.placed.get(t.id).y).map(e=>{let r=R.placed.get(e.id),i=B.get(e.node),a=V($?.node)===e.id?(o?.agent??`Agent`)+` · `+$.label:null,s=R.rows.find(t=>t.lane===ye.get(e.node).lane);return e.proxy?(0,A.jsx)(_e,{item:e,node:i,place:r,home:!s||ce.has(s.turn)?`the notes`:`message `+(R.rows.filter(e=>!ce.has(e.turn)).indexOf(s)+1),dimmed:!!tt(e.node),later:!et(e),selected:H===e.node,live:a,onSelect:()=>Z(e.node,!0)},e.id):i.meaning?(0,A.jsx)(he,{node:i,place:r,client:t,snapshot:n,near:Ze,agentOf:le,selected:H===i.id,dimmed:!!tt(i.id),later:!Qe(i.id),arrived:Ne.has(i.id),onSelect:()=>Z(H===i.id?null:i.id),onOpen:()=>Z(i.id,!0)},e.id):(0,A.jsx)(me,{node:i,place:r,client:t,snapshot:n,near:Ze,selected:H===i.id,dimmed:!!tt(i.id),later:!Qe(i.id)||K!==null&&(i.capturedAt??0)>K,current:je?.node===i.id,arrived:Ne.has(i.id),live:a,onSelect:()=>Z(H===i.id?null:i.id),onOpen:()=>Z(i.id,!0)},e.id)})]}),W&&Q&&(0,A.jsxs)(`div`,{className:`graph-overlay`,children:[(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`strong`,{children:W.nodes.size}),` of `,I.nodes.length,` · the path to and from `,(0,A.jsx)(`strong`,{children:Q.title})]}),(0,A.jsx)(`button`,{className:`small-button`,onClick:()=>U(null),children:`Show everything`})]}),je&&(0,A.jsxs)(`div`,{className:`graph-caption`,role:`status`,"aria-live":`polite`,children:[(0,A.jsx)(`time`,{children:h(je.at,!0)}),(0,A.jsx)(`span`,{children:pe(je,B)})]}),(0,A.jsx)(de,{byId:B,layout:R,view:J,canvas:q,dim:tt,live:V($?.node),onMove:Y}),(0,A.jsxs)(`div`,{className:`graph-zoom`,role:`group`,"aria-label":`Zoom`,children:[(0,A.jsx)(`button`,{className:`icon-button`,"aria-label":`Fit the graph`,title:`Fit (0)`,onClick:()=>Be(),children:(0,A.jsx)(r,{name:`fit`,size:16})}),(0,A.jsx)(`button`,{className:`icon-button`,"aria-label":`Zoom out`,title:`Zoom out (−)`,onClick:()=>Ke(1/1.2),children:(0,A.jsx)(r,{name:`minus`,size:16})}),(0,A.jsxs)(`span`,{className:`graph-zoom-value`,"aria-live":`polite`,children:[Math.round(J.k*100),`%`]}),(0,A.jsx)(`button`,{className:`icon-button`,"aria-label":`Zoom in`,title:`Zoom in (+)`,onClick:()=>Ke(1.2),children:(0,A.jsx)(r,{name:`plus`,size:16})})]}),(0,A.jsxs)(`div`,{className:`graph-legend`,"aria-label":`What the lines mean`,children:[(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`i`,{className:`line reported`}),`The Agent reported it`]}),(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`i`,{className:`line named`}),`Named in a command`]}),(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`i`,{className:`line observed`}),`Seen changing on disk`]}),N&&F!==`process`&&(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`i`,{className:`line declared`}),`Written in the notes`]})]})]})}),Q&&(0,A.jsx)(ve,{node:K!==null&&(Q.capturedAt??0)>K?{...Q,resource:void 0,gap:`This snapshot was captured after the selected replay time.`}:Q,graph:I,byId:B,client:t,snapshot:n,principalId:f,workspace:v,onStudio:_,onAbout:y,onAgent:b,onSelect:e=>Z(e,!0),onTrace:Ye,agentOf:le,process:j,traces:M.layer.traces,onClose:()=>U(null)},Q.id)]}),(I.events.length>0||te.length>0)&&(0,A.jsx)(Se,{graph:I,marks:te,cursor:K,playing:Ee,running:!!o?.running,speed:Oe,onSpeed:ke,onCursor:e=>{De(!1),Te(e)},onPlay:()=>{Ee?De(!1):(K!==null&&K>=Ae.at(-1)&&Te(null),De(!0))}})]}):(0,A.jsxs)(`section`,{className:`graph-page`,children:[(0,A.jsx)(fe,{counts:null}),(0,A.jsxs)(`div`,{className:`studio-empty`,children:[(0,A.jsx)(`span`,{className:`empty-symbol`,children:(0,A.jsx)(r,{name:`graph`,size:26,stroke:1.5})}),(0,A.jsx)(`h2`,{children:`Nothing to draw yet`}),(0,A.jsx)(`p`,{children:`When you ask the Agent something here, the files it reads, the scripts it changes and runs, and what they produce are drawn as one graph.`}),(0,A.jsx)(`div`,{className:`empty-actions`,children:(0,A.jsxs)(`button`,{className:`primary`,onClick:()=>b(),children:[(0,A.jsx)(r,{name:`prompt`,size:17,stroke:1.6}),(0,A.jsx)(`span`,{children:`Ask Agent`})]})})]})]})}function de({byId:e,layout:t,view:n,canvas:r,dim:i,live:a,onMove:o}){let s=r.current?.getBoundingClientRect();if(!s||!t.width||t.width*n.k<=s.width&&t.height*n.k<=s.height&&n.x>=0&&n.y>=0&&n.x+t.width*n.k<=s.width&&n.y+t.height*n.k<=s.height)return null;let c=Math.max(64,Math.min(120,188*t.height/t.width)),l=Math.min(176/t.width,(c-12)/t.height),u=(188-t.width*l)/2,d=(c-t.height*l)/2,f={x:u+-n.x/n.k*l,y:d+-n.y/n.k*l,w:s.width/n.k*l,h:s.height/n.k*l};function p(e){let t=e.currentTarget,r=t.getBoundingClientRect();t.setPointerCapture(e.pointerId);let i=(e,t)=>{let i=(e-r.left-u)/l,a=(t-r.top-d)/l;o({...n,x:s.width/2-i*n.k,y:s.height/2-a*n.k})};i(e.clientX,e.clientY);let a=e=>i(e.clientX,e.clientY),c=()=>{t.removeEventListener(`pointermove`,a),t.removeEventListener(`pointerup`,c)};t.addEventListener(`pointermove`,a),t.addEventListener(`pointerup`,c)}return(0,A.jsx)(`div`,{className:`graph-map`,"aria-hidden":`true`,children:(0,A.jsxs)(`svg`,{width:188,height:c,onPointerDown:p,children:[t.items.map(n=>{let r=t.placed.get(n.id),o=e.get(n.node);return(0,A.jsx)(`rect`,{className:`tone-`+N(o)+(i(o.id)||n.proxy?` off`:``)+(a===n.id?` live`:``),x:u+r.x*l,y:d+r.y*l,width:Math.max(2,r.width*l),height:Math.max(2,r.height*l),rx:1.5},n.id)}),(0,A.jsx)(`rect`,{className:`graph-map-frame`,x:f.x,y:f.y,width:f.w,height:f.h,rx:3})]})})}function fe({counts:e,omitted:t=0,children:n}){let r=e?[e.questions+(e.questions===1?` question`:` questions`),e.files+(e.files===1?` file`:` files`),e.runs+(e.runs===1?` run`:` runs`)].join(` · `):``,i=e&&(e.findings||e.choices)?[e.findings?e.findings+(e.findings===1?` finding`:` findings`):``,e.choices?e.choices+(e.choices===1?` choice`:` choices`):``].filter(Boolean).join(` and `):``;return(0,A.jsxs)(`header`,{className:`graph-head`,children:[(0,A.jsxs)(`div`,{className:`graph-heading`,children:[(0,A.jsx)(`h1`,{id:`graph-title`,children:`Graph`}),(0,A.jsxs)(`p`,{children:[e?`What the Agent did: ${r}.`:`What the Agent did, drawn as one graph.`,i&&` The notes record ${i}.`,t>0&&` ${t} earlier ${t===1?`message is`:`messages are`} not drawn.`]})]}),n&&(0,A.jsx)(`div`,{className:`graph-tools`,children:n})]})}function pe(e,t){let n=t.get(e.node);return n?e.action===`ask`?`Asked: `+n.title:e.action===`answer`?e.label:e.action===`changed`?n.title+` · `+e.label.charAt(0).toLowerCase()+e.label.slice(1):e.label+` `+(n.kind===`run`?n.title:n.path??n.title):e.label}function me({node:e,place:t,client:n,snapshot:i,near:a,selected:o,dimmed:s,later:c,current:l,arrived:u,live:d,onSelect:p,onOpen:m}){let g=e.events.at(-1),_=e.kind===`question`?[e.agent,ce[e.state??``]??e.state,h(e.at)].filter(Boolean).join(` · `):e.kind===`run`?[e.end??L[e.outcome??``]??e.outcome,e.durationMs?f(e.durationMs):null,h(e.at)].filter(Boolean).join(` · `):[e.versions?e.versions.length+` versions`:``,I(e),g?h(g.at):``].filter(Boolean).join(` · `),v=e.path?.includes(`/`)?e.path.split(`/`).slice(0,-1).join(`/`):``,y=`${j(e)}: ${e.kind===`file`?e.path:e.title}. ${_}`;return(0,A.jsxs)(`button`,{className:`graph-node kind-`+e.kind+` tone-`+N(e),"data-node":e.id,style:{left:t.x,top:t.y,width:t.width,height:t.height},"aria-pressed":o,"aria-label":y,"data-dimmed":s||void 0,"data-later":c||void 0,"data-current":l||void 0,"data-arrived":u||void 0,"data-live":d?``:void 0,"data-missing":e.kind===`file`&&!e.exists||void 0,onClick:p,onDoubleClick:m,children:[d&&(0,A.jsxs)(`span`,{className:`graph-flag`+(e.waiting?` waiting`:``),children:[(0,A.jsx)(`span`,{className:`pulse-dot`,"aria-hidden":`true`}),d]}),(0,A.jsxs)(`span`,{className:`graph-node-head`,children:[(0,A.jsx)(`span`,{className:`graph-node-icon`,children:(0,A.jsx)(r,{name:M(e),size:15,stroke:1.8})}),(0,A.jsxs)(`span`,{className:`graph-node-kind`,children:[j(e),v&&(0,A.jsxs)(`span`,{className:`graph-node-folder`,children:[` · `,v]})]})]}),(0,A.jsx)(`strong`,{className:`graph-node-title`,title:e.kind===`question`?e.text:e.path??e.command,children:e.title}),e.kind===`question`&&e.answer&&(0,A.jsx)(`span`,{className:`graph-node-answer`,children:oe(e.answer)}),P(e)&&(e.capturedAt===void 0||!c)&&(0,A.jsx)(R,{client:n,snapshot:i,node:e,shown:a&&!c}),e.kind===`file`&&!e.resource&&(0,A.jsx)(`span`,{className:`graph-node-meta`,children:`Historical version not captured`}),(0,A.jsx)(`span`,{className:`graph-node-meta`,children:e.kind===`file`&&!e.exists?`Not in the folder now`:_})]})}function he({node:e,place:t,client:n,snapshot:i,near:a,agentOf:o,selected:s,dimmed:c,later:l,arrived:u,onSelect:d,onOpen:f}){let p=e.meaning,m=e.kind===`file`,g=m?p.description?.trace:p.trace,_=g?.files.some(e=>e.later===`kept`)?`newer version since`:g?.files.some(e=>e.later===`written`)?`written again since`:``,v=e.path?.includes(`/`)?e.path.split(`/`).slice(0,-1).join(`/`):``,y=m?p.description:void 0,b=m&&!y?`Nothing says what it holds yet`:y?.source===`model`?`Described by ${C(y.model)}${y.strategy===`context`?` from code`:``} · ${h(y.at??0)}${y.earlier?` · earlier version`:``}`:y?.source===`facts`?`Read from the file · ${h(y.at??0)}${y.writing?` · describing…`:``}`:p.message?`Asked ${h(p.message.at)} · no notes yet`:F(g,o),x=e.kind===`question`&&!p.statement&&!p.message?`Section`:j(e);return(0,A.jsxs)(`button`,{className:`graph-node meaning kind-`+e.kind+` tone-`+N(e),"data-node":e.id,style:{left:t.x,top:t.y,width:t.width,height:t.height},"aria-pressed":s,"aria-label":`${x}: ${m?(p.description?.text?p.description.text+`, `:``)+e.path:e.text}. ${b}`,"data-dimmed":c||void 0,"data-later":l||void 0,"data-arrived":u||void 0,"data-missing":m&&!e.exists||void 0,onClick:d,onDoubleClick:f,children:[(0,A.jsxs)(`span`,{className:`graph-node-head`,children:[(0,A.jsx)(`span`,{className:`graph-node-icon`,children:(0,A.jsx)(r,{name:M(e),size:15,stroke:1.8})}),(0,A.jsxs)(`span`,{className:`graph-node-kind`,children:[x,m&&v&&(0,A.jsxs)(`span`,{className:`graph-node-folder`,children:[` · `,v]}),e.kind===`question`&&!p.message&&(0,A.jsxs)(`span`,{className:`graph-node-folder`,children:[` · `,p.session]})]})]}),(0,A.jsx)(`strong`,{className:`graph-node-title meaning-text`+(y?` holds-`+y.source:``),title:m?e.path:e.text,children:m&&y?.text||e.title}),m&&y?.text&&(0,A.jsx)(`span`,{className:`graph-node-path`,children:e.title}),m&&P(e)&&(0,A.jsx)(R,{client:n,snapshot:i,node:e,shown:a&&!l}),(0,A.jsxs)(`span`,{className:`graph-node-meta`,children:[e.kind===`question`&&p.todos?`${p.todos.done} of ${p.todos.total} to-dos done · `:``,b,_&&(0,A.jsxs)(`span`,{className:`meaning-changed`,children:[` · `,_]}),m&&!e.exists&&` · not in the folder now`]})]})}function ge({layout:e,focus:t,shown:n,labels:r,dim:i,live:a}){return(0,A.jsxs)(`svg`,{className:`graph-edges`,width:e.width,height:e.height,"aria-hidden":`true`,style:{overflow:`visible`},children:[(0,A.jsxs)(`defs`,{children:[(0,A.jsx)(`marker`,{id:`graph-arrow`,viewBox:`0 0 10 10`,refX:`9`,refY:`5`,markerWidth:`7`,markerHeight:`7`,orient:`auto-start-reverse`,children:(0,A.jsx)(`path`,{d:`M0 1 9 5 0 9z`,className:`arrow`})}),(0,A.jsx)(`marker`,{id:`graph-arrow-on`,viewBox:`0 0 10 10`,refX:`9`,refY:`5`,markerWidth:`7`,markerHeight:`7`,orient:`auto-start-reverse`,children:(0,A.jsx)(`path`,{d:`M0 1 9 5 0 9z`,className:`arrow on`})})]}),e.rows.slice(1).map(t=>(0,A.jsx)(`line`,{className:`graph-row-rule`,x1:-40,x2:e.width+40,y1:t.y-32,y2:t.y-32},t.turn)),e.links.filter(t=>n(t.edge)&&!(t.edge.label===`ran`&&e.links.some(n=>n.from===t.from&&e.links.some(e=>e.from===n.to&&e.to===t.to)))).map(n=>{let o=n.edge,s=e.placed.get(n.from),c=e.placed.get(n.to),l=s.x+s.width<=c.x,u=l?s.x+s.width:s.x+s.width/2,d=l?s.y+s.height/2:s.y+s.height,f=l?c.x:c.x+c.width/2,p=l?c.y+c.height/2:c.y,m=Math.max(36,(f-u)/2),h=l?`M${u} ${d} C${u+m} ${d} ${f-m} ${p} ${f-2} ${p}`:`M${u} ${d} C${u} ${d+80} ${f} ${p-80} ${f} ${p-2}`,g=!!t?.edges.has(o.id),_=t&&!g||i(o.from)||i(o.to),v=(u+f)/2,y=l?(d+p)/2:(d+p)/2+40;return(0,A.jsxs)(`g`,{"data-label":o.label,className:`graph-edge `+o.basis+(g?` on`:``)+(_?` off`:``)+(a&&n.to===a?` live`:``),children:[(0,A.jsx)(`path`,{d:h,markerEnd:g?`url(#graph-arrow-on)`:`url(#graph-arrow)`}),r&&!_&&(0,A.jsx)(`text`,{x:v,y:y-(o.label.length>12?18:6),textAnchor:`middle`,children:o.label.length>12?o.label.split(/ (?=while|meanwhile)/).map((e,t,n)=>(0,A.jsx)(`tspan`,{x:v,dy:t?13:0,children:e+(t<n.length-1?` `:``)},t)):o.label})]},n.id+n.from)})]})}function _e({item:e,node:t,place:n,home:i,dimmed:a,later:o,selected:s,live:c,onSelect:l}){return(0,A.jsxs)(`button`,{className:`graph-node graph-ref tone-`+N(t),"data-node":e.id,style:{left:n.x,top:n.y,width:n.width,height:n.height},"aria-label":`${t.kind===`file`?t.path:t.title}, from ${i}. Go there`,"aria-pressed":s,"data-dimmed":a||void 0,"data-later":o||void 0,"data-live":c?``:void 0,onClick:l,children:[c&&(0,A.jsxs)(`span`,{className:`graph-flag`+(t.waiting?` waiting`:``),children:[(0,A.jsx)(`span`,{className:`pulse-dot`,"aria-hidden":`true`}),c]}),(0,A.jsxs)(`span`,{className:`graph-node-head`,children:[(0,A.jsx)(`span`,{className:`graph-node-icon`,children:(0,A.jsx)(r,{name:M(t),size:13,stroke:1.8})}),(0,A.jsxs)(`span`,{className:`graph-node-kind`,children:[j(t),` · from `,i]}),(0,A.jsx)(r,{name:`back`,size:12})]}),(0,A.jsx)(`strong`,{className:`graph-node-title`,children:t.title})]})}function ve({node:e,graph:t,process:n,traces:a,byId:s,client:c,snapshot:l,principalId:u,workspace:d,onStudio:p,onAbout:m,onAgent:g,onSelect:_,onTrace:b,agentOf:x,onClose:C}){let ee=(0,k.useContext)(y),te=l.annotations.filter(t=>e.resource&&(t.anchor?.resource?.id===e.resource.id&&t.anchor?.resource?.version===e.resource.version||t.messages?.some(t=>t.resources?.some(t=>t.id===e.resource.id&&t.version===e.resource.version)))),[w,ne]=(0,k.useState)(!1),[E,D]=(0,k.useState)(``);async function re(){ne(!0),D(``);try{let t=await o(c,l,d(),e.path);t?p(t.compositionId,t.viewId):D(`Rho has no viewer for this kind of file yet.`)}catch(e){D(e instanceof Error?e.message:`It could not be opened in the workspace.`)}finally{ne(!1)}}let O=t.edges.filter(t=>t.to===e.id),P=t.edges.filter(t=>t.from===e.id),ie=e=>s.get(`q:`+e)?.title??`A message`,F=(e,t)=>e.map(e=>{let n=s.get(t===`from`?e.from:e.to);return(0,A.jsxs)(`li`,{children:[(0,A.jsxs)(`button`,{className:`graph-link`,onClick:()=>_(n.id),children:[(0,A.jsx)(r,{name:M(n),size:14}),(0,A.jsx)(`span`,{children:n.title})]}),(0,A.jsx)(`small`,{className:`graph-basis `+e.basis,children:e.label})]},e.id)}),ae=e.kind===`question`&&e.events.at(-1)?.action===`answer`?v(e.events.at(-1).at-e.at):``;return(0,A.jsxs)(`aside`,{className:`graph-inspector`,"aria-label":j(e)+` `+e.title,children:[(0,A.jsxs)(`header`,{className:`graph-inspector-head`,children:[(0,A.jsx)(`span`,{className:`graph-node-icon tone-`+N(e),children:(0,A.jsx)(r,{name:M(e),size:16,stroke:1.8})}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`small`,{children:e.meaning&&e.kind!==`file`?j(e)+` · in the notes`:j(e)}),(0,A.jsx)(`h2`,{title:e.path??e.text,children:e.kind===`file`?e.title:e.kind===`run`?e.commands?e.title:`Ran a command`:e.meaning?e.meaning.session:`You asked`}),e.kind===`file`&&(0,A.jsxs)(`p`,{children:[e.path,e.bytes!==void 0&&e.exists?` · `+S(e.bytes):``]})]}),(0,A.jsx)(`button`,{className:`icon-button`,"aria-label":`Close`,onClick:C,children:(0,A.jsx)(r,{name:`close`,size:17})})]}),(0,A.jsxs)(`div`,{className:`graph-inspector-body`,children:[e.meaning&&(0,A.jsx)(ye,{node:e,graph:t,process:n,traces:a,client:c,snapshot:l,agentOf:x,onAgent:g,onTrace:b,onSelect:_}),e.kind===`question`&&!e.meaning&&(0,A.jsxs)(`section`,{className:`graph-said`,children:[(0,A.jsx)(`p`,{className:`graph-question`,children:e.text}),(0,A.jsx)(`p`,{className:`graph-facts`,children:[e.agent,ce[e.state??``]??e.state,ae&&`took `+ae,e.model].filter(Boolean).join(` · `)}),e.answer&&(0,A.jsx)(`div`,{className:`graph-answer`,children:(0,A.jsx)(i,{text:e.answer,streaming:e.state===`running`})}),(0,A.jsxs)(`button`,{onClick:()=>g(e.conversationId),children:[(0,A.jsx)(r,{name:`prompt`,size:15}),`Show the conversation`]})]}),e.waiting&&(0,A.jsx)(be,{waiting:e.waiting,client:c,projectId:l.project.id},e.waiting.permission),e.commands&&(0,A.jsxs)(`section`,{className:`graph-said`,children:[(0,A.jsxs)(`p`,{className:`graph-facts`,children:[`Commands that read, ran or changed no project file, for “`,ie(e.turn),`”`]}),(0,A.jsx)(`ol`,{className:`graph-commands`,children:e.commands.map(e=>(0,A.jsx)(`li`,{children:(0,A.jsxs)(`details`,{children:[(0,A.jsxs)(`summary`,{children:[(0,A.jsx)(`code`,{title:e.ran,children:e.command}),(0,A.jsx)(`small`,{children:[e.end??L[e.outcome??``]??e.outcome,e.durationMs?f(e.durationMs):null,h(e.at)].filter(Boolean).join(` · `)})]}),e.output?.text?(0,A.jsx)(`pre`,{className:`graph-output`,children:e.output.text}):(0,A.jsx)(`p`,{className:`muted`,children:`Printed nothing.`})]})},e.id))})]}),e.kind===`run`&&!e.commands&&(0,A.jsxs)(`section`,{className:`graph-said`,children:[(0,A.jsx)(`pre`,{className:`graph-command`,title:e.ran,children:e.command}),(0,A.jsxs)(`p`,{className:`graph-facts`,children:[[e.end??L[e.outcome??``]??e.outcome,e.durationMs?`took `+f(e.durationMs):null,h(e.at,!0)].filter(Boolean).join(` · `),` · for “`,ie(e.turn),`”`]}),e.output&&(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`h3`,{className:`caption`,children:e.output.text?e.output.cut?`Printed · last ${e.output.text.split(`
|
|
1
|
+
import{r as e}from"./rolldown-runtime-XKyaHtl9.js";import{n as t,t as n}from"./react-Dss-ouuy.js";import{r,t as i}from"./markdown-0ngRuTpW.js";import{N as a,a as o}from"./canvas-BXhC8RDZ.js";import{Bt as s,Ft as c,It as l,Nt as u,Pt as d,Ut as f,_t as p,bt as m,ft as h,g,gt as _,ht as v,m as y,mt as b,pt as x,ut as S,wt as C,xt as ee,zt as te}from"./index-BHQIaDsx.js";import{t as w}from"./work-turns-Co0C71rJ.js";import{t as T}from"./snapshot-CAxBYPvV.js";import{r as ne,t as E}from"./timeline-events-DmX1BCh3.js";import{n as D,r as re,t as O}from"./choices-DU9kHlyQ.js";var k=e(n(),1),A=t(),j=e=>e.kind===`question`?`Question`:e.kind===`run`?`Run`:e.kind===`finding`?`Finding`:e.kind===`choice`?`Choice`:{data:`Data`,code:`Script`,results:`Result`,figures:`Figure`,notes:`Note`}[e.category??``]??`File`,M=e=>e.kind===`question`?`question`:e.kind===`run`?`run`:e.kind===`finding`?`check`:e.kind===`choice`?`updown`:e.category===`figures`?`image`:e.category===`code`?`code`:e.category===`notes`?`document`:e.category?`table`:`file`,N=e=>e.kind===`file`?e.category??`other`:e.kind,P=e=>e.kind===`file`&&!!e.resource&&(/\.(png|jpe?g|svg)$/i.test(e.path)||/\.csv$/i.test(e.path)),ie=(e,t)=>t?{width:228,height:58}:e.meaning?{width:e.kind===`file`?256:300,height:e.kind===`question`?138:e.kind===`finding`||e.kind===`choice`?124:P(e)?/\.csv$/i.test(e.path)?226:212:128}:{width:e.kind===`question`?300:e.kind===`run`?236:256,height:e.kind===`question`?e.answer?160:116:e.kind===`run`?88:P(e)?/\.csv$/i.test(e.path)?198:184:96},F=(e,t)=>e?.written?(t(e.written.conversationId)??`The Agent`)+` · `+h(e.written.at):`Not in the Agent's record`,ae={both:`Meaning + process`,meaning:`Meaning`,process:`Process`},oe=e=>e?e.replace(/```[\s\S]*?```/g,` `).replace(/[#>*_`|]+/g,` `).replace(/\[([^\]]+)\]\([^)]*\)/g,`$1`).replace(/\s+/g,` `).trim().slice(0,220):``,se={read:`Read`,edit:`Edited`,write:`Wrote`,changed:`Changed`,capture:`Kept`,run:`Ran`,ask:`Asked`,answer:`Answered`};function I(e){let t=new Map;for(let n of e.events)n.action!==`ask`&&n.action!==`answer`&&!(n.action===`capture`&&e.versions)&&t.set(n.action,(t.get(n.action)??0)+1);return[...t].map(([e,t])=>(se[e]??e)+(t>1?` `+t+`×`:``)).join(` · `)}var ce={completed:`Answered`,failed:`Failed`,stopped:`Stopped`,running:`Working`,unknown:`Outcome unknown`},le=e=>{e&&(e.scrollTop=e.scrollHeight)},L={returned:`Returned`,requested:`Running`,failed:`Failed`,rejected:`Refused`,unknown:`Outcome unknown`};function R({client:e,snapshot:t,node:n,shown:r}){let i=n.resource?.id+`@`+n.resource?.version,[a,o]=(0,k.useState)(null),s=a?.preview??null;return(0,k.useEffect)(()=>{if(!r||!n.resource||a?.version===i)return;let s=!0;return g(e,t,{path:n.path,bytes:n.bytes,modifiedAt:n.modifiedAt,resource:n.resource?{...n.resource,kind:t.resources.find(e=>e.id===n.resource.id)?.kind??`file`}:void 0}).then(e=>{s&&o({version:i,preview:e})}),()=>{s=!1}},[r,i]),s?s.kind===`image`?(0,A.jsx)(`span`,{className:`graph-preview image`,children:(0,A.jsx)(`img`,{src:s.url,alt:``})}):s.kind===`table`?(0,A.jsxs)(`span`,{className:`graph-preview table`,children:[(0,A.jsxs)(`span`,{className:`graph-table`,style:{gridTemplateColumns:`repeat(${s.columns.length}, minmax(0, 1fr))`},children:[s.columns.map(e=>(0,A.jsx)(`span`,{className:`graph-cell head`,children:e},`h`+e)),s.rows.map((e,t)=>s.columns.map(n=>(0,A.jsx)(`span`,{className:`graph-cell`,children:e[n]===null||e[n]===void 0?``:String(e[n])},t+n)))]}),(0,A.jsxs)(`small`,{children:[s.total.toLocaleString(),` `,s.total===1?`row`:`rows`,` × `,s.width,` `,s.width===1?`column`:`columns`]})]}):(0,A.jsx)(`span`,{className:`graph-preview none`,children:s.note}):(0,A.jsx)(`span`,{className:`graph-preview loading`,"aria-hidden":`true`})}var z={min:.2,max:2},ue=.78;function B({initialResource:e,client:t,snapshot:n,files:i,agentNow:o,following:s,principalId:f,notesText:p=``,onFollow:m,onStopFollowing:g,onStudio:_,workspace:v,onAbout:y,onAgent:b}){let{turns:x,problem:S,loading:C,omitted:ee}=w(t,n),{marks:te}=E(t,n),[T,ne]=(0,k.useState)(()=>Date.now());(0,k.useEffect)(()=>{if(!o?.running)return;let e=setInterval(()=>ne(Date.now()),1e3);return()=>clearInterval(e)},[o?.running]);let O=(0,k.useMemo)(()=>i.files.map(e=>({path:e.path,bytes:e.bytes,modifiedAt:e.modifiedAt,category:e.category})),[i.files]),j=(0,k.useMemo)(()=>d(u({turns:x,files:O,project:n.project,kindOf:a,now:o?.running?T:Date.now()})),[x,O,n.project,o?.running?T:0]),M=D(t,n,j,O,p,x),N=M.layer.nodes.length>0,[F,oe]=(0,k.useState)(()=>{try{let e=localStorage.getItem(`rho.graph.layer.v1`);return e===`meaning`||e===`process`?e:`both`}catch{return`both`}});function se(e){Le.current=!1,oe(e);try{localStorage.setItem(`rho.graph.layer.v1`,e)}catch{}}let I=(0,k.useMemo)(()=>re(j,N?M.layer:null,F),[j,M.layer,N,F]),ce=new Set(N&&F!==`process`?M.layer.turns.map(e=>e.id):[]),le=e=>j.turns.find(t=>t.conversationId===e)?.agent,L=I.nodes.map(e=>e.id+(P(e)?`+`:``)+(e.answer?`a`:``)+(e.meaning?.description?`d`:``)).join(`|`)+`#`+I.edges.map(e=>e.id+`@`+e.turn).join(`|`),R=(0,k.useMemo)(()=>c(I,ie,{x:108,y:26,lane:64}),[L]),B=(0,k.useMemo)(()=>new Map(I.nodes.map(e=>[e.id,e])),[I]),ye=(0,k.useMemo)(()=>new Map(R.items.map(e=>[e.id,e])),[R]),be=I.turns.find(e=>e.running)?.id,xe=be?R.rows.find(e=>e.turn===be)?.lane:void 0,V=e=>e?R.items.find(t=>t.node===e&&t.lane===xe)?.id??e:null,[H,U]=(0,k.useState)(null);(0,k.useEffect)(()=>{if(e){let t=I.nodes.find(t=>(t.versions??(t.resource?[{resource:t.resource}]:[])).some(t=>t.resource.id===e.id&&t.resource.version===e.version));t&&U(t.id)}},[e?.id,e?.version,L]);let W=(0,k.useMemo)(()=>H&&B.has(H)?l(I,H):null,[H,I]),[Ce,we]=(0,k.useState)(``),G=(0,k.useMemo)(()=>{let e=Ce.trim().toLowerCase();return e?new Set(I.nodes.filter(t=>(t.title+` `+(t.path??``)+` `+(t.text??``)+` `+(t.command??``)).toLowerCase().includes(e)).map(e=>e.id)):null},[Ce,I]),[K,Te]=(0,k.useState)(null),[Ee,De]=(0,k.useState)(!1),[Oe,ke]=(0,k.useState)(1),Ae=I.events.map(e=>e.at);(0,k.useEffect)(()=>{if(!Ee)return;let e=I.events,t=K===null?0:e.findIndex(e=>e.at>K);if(t<0||t>=e.length){De(!1),Te(null);return}let n=Math.min(600,Math.max(140,9e3/Math.max(1,e.length)))/Oe,r=setTimeout(()=>Te(e[t].at),K===null?0:n);return()=>clearTimeout(r)},[Ee,K,I.events,Oe]);let je=K===null?null:[...I.events].reverse().find(e=>e.at<=K)??null,Me=(0,k.useRef)(null),[Ne,Pe]=(0,k.useState)(new Set);(0,k.useEffect)(()=>{let e=new Set(I.nodes.map(e=>e.id));if(Me.current){let t=[...e].filter(e=>!Me.current.has(e));if(t.length){Pe(new Set(t));let n=setTimeout(()=>Pe(new Set),1600);return Me.current=e,()=>clearTimeout(n)}}Me.current=e},[I.nodes]);let q=(0,k.useRef)(null),[J,Y]=(0,k.useState)({x:40,y:40,k:1}),[Fe,Ie]=(0,k.useState)(!1),X=(0,k.useRef)(J);X.current=J;let Le=(0,k.useRef)(!1),Re=(0,k.useRef)(!1),ze=e=>{Ie(!0),Y(e),setTimeout(()=>Ie(!1),380)},Be=(0,k.useCallback)((e=!0)=>{let t=q.current?.getBoundingClientRect();if(!t||!R.width)return;let n=Math.max(z.min,Math.min(1,(t.width-96)/R.width,(t.height-120)/R.height)),r={k:n,x:(t.width-R.width*n)/2,y:Math.max(56,(t.height-R.height*n)/2)};e?ze(r):Y(r)},[R]),Ve=R.rows.map(e=>e.turn).join(`,`),He=(0,k.useRef)(Ve);(0,k.useLayoutEffect)(()=>{let e=Ve!==He.current||R.rows.some(e=>e.turn.startsWith(`m:`));He.current=Ve,!Re.current&&!s&&e&&(Le.current=!1)},[R]),(0,k.useEffect)(()=>{H&&(Re.current=!0)},[H]),(0,k.useLayoutEffect)(()=>{if(Le.current||!I.nodes.length)return;let e=q.current?.getBoundingClientRect();if(!e)return;Le.current=!0;let t=Math.min(1,(e.width-96)/R.width,(e.height-120)/R.height),n=R.rows.filter(e=>e.turn.startsWith(`m:`)).at(-1),r=n??R.rows.at(-1);if(t>=ue||!r){Be(!1);return}let i=ue,a=R.height*i<=e.height-120,o=n&&R.placed.get(`q:`+n.turn);Y(o?{k:i,x:32-o.x*i,y:e.height*.35-(o.y+o.height/2)*i}:{k:i,x:32,y:a?(e.height-R.height*i)/2:Math.min(48,e.height-40-(r.y+r.height)*i)})},[I.nodes.length,Be,R]);let Ue=(e,t=!0,n)=>{let r=R.placed.get(e),i=q.current?.getBoundingClientRect();if(!r||!i)return;let a=n??Math.max(X.current.k,ue),o={k:a,x:i.width/2-(r.x+r.width/2)*a,y:i.height/2-(r.y+r.height/2)*a};t?ze(o):Y(o)};(0,k.useEffect)(()=>{if(!s||!I.live||K!==null)return;let e=V(I.live.node),t=R.placed.get(e),n=q.current?.getBoundingClientRect(),r=X.current;if(!t||!n)return;let i=t.x*r.k+r.x,a=t.y*r.k+r.y;(i<24||a<64||i+t.width*r.k>n.width-24||a+t.height*r.k>n.height-24)&&Ue(e)},[s,I.live?.node,R]),(0,k.useEffect)(()=>{let e=q.current;if(!e)return;function t(t){t.preventDefault(),Re.current=!0;let n=X.current;if(t.ctrlKey||t.metaKey){let r=e.getBoundingClientRect(),i=t.clientX-r.left,a=t.clientY-r.top,o=Math.min(z.max,Math.max(z.min,n.k*Math.exp(-t.deltaY*.01)));Y({k:o,x:i-(i-n.x)*o/n.k,y:a-(a-n.y)*o/n.k})}else Y({...n,x:n.x-t.deltaX,y:n.y-t.deltaY});s&&g()}return e.addEventListener(`wheel`,t,{passive:!1}),()=>e.removeEventListener(`wheel`,t)},[s]);let We=(0,k.useRef)(!1);function Ge(e){if(e.button!==0||e.target.closest(`.graph-node, .graph-zoom, .graph-overlay, .graph-legend`))return;let t={x:e.clientX,y:e.clientY,view:X.current},n=e.currentTarget;Re.current=!0,n.setPointerCapture(e.pointerId),We.current=!1;let r=e=>{Math.abs(e.clientX-t.x)+Math.abs(e.clientY-t.y)>3&&(We.current=!0,n.dataset.panning=``),Y({...t.view,x:t.view.x+e.clientX-t.x,y:t.view.y+e.clientY-t.y})},i=()=>{n.removeEventListener(`pointermove`,r),n.removeEventListener(`pointerup`,i),n.removeEventListener(`pointercancel`,i),delete n.dataset.panning,We.current?s&&g():U(null)};n.addEventListener(`pointermove`,r),n.addEventListener(`pointerup`,i),n.addEventListener(`pointercancel`,i)}let Ke=e=>{Re.current=!0;let t=q.current?.getBoundingClientRect(),n=X.current;if(!t)return;let r=Math.min(z.max,Math.max(z.min,n.k*e)),i=t.width/2,a=t.height/2;ze({k:r,x:i-(i-n.x)*r/n.k,y:a-(a-n.y)*r/n.k})};function Z(e,t=!1){U(e),e&&t&&Ue(e)}let[qe,Je]=(0,k.useState)(null);function Ye(e){F===`meaning`&&se(`both`),U(e),Je(e)}(0,k.useEffect)(()=>{qe&&R.placed.has(qe)&&(Ue(qe),Je(null))},[qe,R]);function Xe(e){let t=document.activeElement?.dataset.node;if(e.key===`Escape`){H&&(e.preventDefault(),U(null));return}if(e.key===`+`||e.key===`=`){e.preventDefault(),Ke(1.2);return}if(e.key===`-`){e.preventDefault(),Ke(1/1.2);return}if(e.key===`0`){e.preventDefault(),Be();return}if(!t||![`ArrowLeft`,`ArrowRight`,`ArrowUp`,`ArrowDown`].includes(e.key))return;let n=R.placed.get(t),r;if(e.key===`ArrowRight`)r=R.links.filter(e=>e.from===t).map(e=>e.to).sort((e,t)=>R.placed.get(e).y-R.placed.get(t).y)[0];else if(e.key===`ArrowLeft`)r=R.links.filter(e=>e.to===t).map(e=>e.from).sort((e,t)=>R.placed.get(e).y-R.placed.get(t).y)[0];else{let i=[...R.placed].filter(([,e])=>Math.abs(e.x+e.width/2-n.x-n.width/2)<4).sort((e,t)=>e[1].y-t[1].y).map(([e])=>e);r=i[i.indexOf(t)+(e.key===`ArrowDown`?1:-1)]}if(!r)return;e.preventDefault(),q.current?.querySelector(`[data-node="${CSS.escape(r)}"]`)?.focus();let i=R.placed.get(r),a=q.current.getBoundingClientRect(),o=X.current;(i.x*o.k+o.x<0||i.y*o.k+o.y<48||(i.x+i.width)*o.k+o.x>a.width||(i.y+i.height)*o.k+o.y>a.height)&&Ue(r)}let Ze=J.k>=.62,Qe=e=>K===null||(B.get(e)?.at??0)<=K,$e=e=>K===null||e.at<=K,et=e=>K===null||R.links.some(t=>(t.from===e.id||t.to===e.id)&&t.edge.at<=K),tt=e=>W&&!W.nodes.has(e)||G&&!G.has(e),Q=H?B.get(H):void 0,$=K===null&&o?.running?I.live:null,nt={questions:j.nodes.filter(e=>e.kind===`question`).length,files:j.nodes.filter(e=>e.kind===`file`).length,runs:j.nodes.filter(e=>e.kind===`run`).reduce((e,t)=>e+(t.commands?.length??1),0),findings:M.layer.nodes.filter(e=>e.kind===`finding`).length,choices:M.layer.nodes.filter(e=>e.kind===`choice`).length};return n.conversations?.length?(0,A.jsxs)(`section`,{className:`graph-page`,"aria-labelledby":`graph-title`,children:[(0,A.jsxs)(fe,{counts:nt,omitted:ee+I.omittedTurns,children:[N&&(0,A.jsx)(`div`,{className:`graph-layers`,role:`group`,"aria-label":`Layers`,children:[`both`,`meaning`,`process`].map(e=>(0,A.jsx)(`button`,{"aria-pressed":F===e,onClick:()=>se(e),children:ae[e]},e))}),(0,A.jsxs)(`label`,{className:`graph-search`,children:[(0,A.jsx)(r,{name:`search`,size:15}),(0,A.jsx)(`input`,{type:`search`,placeholder:`Find in this graph`,"aria-label":`Find in this graph`,value:Ce,onChange:e=>we(e.target.value),onKeyDown:e=>{if(e.key===`Enter`&&G?.size){let e=I.nodes.find(e=>G.has(e.id));e&&Z(e.id,!0)}}}),G&&(0,A.jsx)(`small`,{children:G.size})]}),$?.waiting&&(0,A.jsxs)(`button`,{className:`graph-waiting`,onClick:()=>Z($.node,!0),children:[(0,A.jsx)(`span`,{className:`pulse-dot`,"aria-hidden":`true`}),`Needs your choice`]}),o?.running&&(0,A.jsx)(`button`,{className:`follow-toggle`+(s?` on`:``),"aria-pressed":s,title:s?`The graph keeps the Agent in view as it works.`:`Keep the Agent in view as it works.`,onClick:s?g:m,children:s?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`span`,{className:`pulse-dot`,"aria-hidden":`true`}),`Following `,o.agent]}):(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(r,{name:`follow`,size:15}),`Follow `,o.agent]})})]}),e&&!C&&!I.nodes.some(t=>t.resource?.id===e.id&&t.resource.version===e.version)&&(0,A.jsx)(`p`,{className:`canvas-note`,children:`The selected result version is outside this retained Graph window. Its review still holds the exact reference.`}),!!I.omittedNodes&&(0,A.jsxs)(`p`,{className:`canvas-note`,children:[I.omittedNodes,` nodes are outside the drawing budget. This is a partial view of the retained work.`]}),S&&(0,A.jsx)(`p`,{className:`inline-error graph-problem`,role:`alert`,children:S}),(0,A.jsxs)(`div`,{className:`graph-body`,children:[(0,A.jsx)(`div`,{ref:q,className:`graph-canvas`+(W?` focusing`:``)+(K===null?``:` replaying`),tabIndex:-1,onPointerDown:Ge,onKeyDown:Xe,children:C?(0,A.jsxs)(`div`,{className:`loading-state`,role:`status`,children:[(0,A.jsx)(`span`,{className:`loading-dot`}),(0,A.jsx)(`span`,{children:`Reading what the Agent did…`})]}):(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(`div`,{className:`graph-world`+(Fe?` gliding`:``),"data-zoom":Ze?`near`:`far`,style:{transform:`translate(${J.x}px, ${J.y}px) scale(${J.k})`,width:R.width,height:R.height,"--k":J.k},children:[(0,A.jsx)(ge,{layout:R,focus:W,shown:$e,labels:Ze||!!W,dim:tt,live:V($?.node)}),[...R.items].sort((e,t)=>e.lane-t.lane||R.placed.get(e.id).column-R.placed.get(t.id).column||R.placed.get(e.id).y-R.placed.get(t.id).y).map(e=>{let r=R.placed.get(e.id),i=B.get(e.node),a=V($?.node)===e.id?(o?.agent??`Agent`)+` · `+$.label:null,s=R.rows.find(t=>t.lane===ye.get(e.node).lane);return e.proxy?(0,A.jsx)(_e,{item:e,node:i,place:r,home:!s||ce.has(s.turn)?`the notes`:`message `+(R.rows.filter(e=>!ce.has(e.turn)).indexOf(s)+1),dimmed:!!tt(e.node),later:!et(e),selected:H===e.node,live:a,onSelect:()=>Z(e.node,!0)},e.id):i.meaning?(0,A.jsx)(he,{node:i,place:r,client:t,snapshot:n,near:Ze,agentOf:le,selected:H===i.id,dimmed:!!tt(i.id),later:!Qe(i.id),arrived:Ne.has(i.id),onSelect:()=>Z(H===i.id?null:i.id),onOpen:()=>Z(i.id,!0)},e.id):(0,A.jsx)(me,{node:i,place:r,client:t,snapshot:n,near:Ze,selected:H===i.id,dimmed:!!tt(i.id),later:!Qe(i.id)||K!==null&&(i.capturedAt??0)>K,current:je?.node===i.id,arrived:Ne.has(i.id),live:a,onSelect:()=>Z(H===i.id?null:i.id),onOpen:()=>Z(i.id,!0)},e.id)})]}),W&&Q&&(0,A.jsxs)(`div`,{className:`graph-overlay`,children:[(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`strong`,{children:W.nodes.size}),` of `,I.nodes.length,` · the path to and from `,(0,A.jsx)(`strong`,{children:Q.title})]}),(0,A.jsx)(`button`,{className:`small-button`,onClick:()=>U(null),children:`Show everything`})]}),je&&(0,A.jsxs)(`div`,{className:`graph-caption`,role:`status`,"aria-live":`polite`,children:[(0,A.jsx)(`time`,{children:h(je.at,!0)}),(0,A.jsx)(`span`,{children:pe(je,B)})]}),(0,A.jsx)(de,{byId:B,layout:R,view:J,canvas:q,dim:tt,live:V($?.node),onMove:Y}),(0,A.jsxs)(`div`,{className:`graph-zoom`,role:`group`,"aria-label":`Zoom`,children:[(0,A.jsx)(`button`,{className:`icon-button`,"aria-label":`Fit the graph`,title:`Fit (0)`,onClick:()=>Be(),children:(0,A.jsx)(r,{name:`fit`,size:16})}),(0,A.jsx)(`button`,{className:`icon-button`,"aria-label":`Zoom out`,title:`Zoom out (−)`,onClick:()=>Ke(1/1.2),children:(0,A.jsx)(r,{name:`minus`,size:16})}),(0,A.jsxs)(`span`,{className:`graph-zoom-value`,"aria-live":`polite`,children:[Math.round(J.k*100),`%`]}),(0,A.jsx)(`button`,{className:`icon-button`,"aria-label":`Zoom in`,title:`Zoom in (+)`,onClick:()=>Ke(1.2),children:(0,A.jsx)(r,{name:`plus`,size:16})})]}),(0,A.jsxs)(`div`,{className:`graph-legend`,"aria-label":`What the lines mean`,children:[(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`i`,{className:`line reported`}),`The Agent reported it`]}),(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`i`,{className:`line named`}),`Named in a command`]}),(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`i`,{className:`line observed`}),`Seen changing on disk`]}),N&&F!==`process`&&(0,A.jsxs)(`span`,{children:[(0,A.jsx)(`i`,{className:`line declared`}),`Written in the notes`]})]})]})}),Q&&(0,A.jsx)(ve,{node:K!==null&&(Q.capturedAt??0)>K?{...Q,resource:void 0,gap:`This snapshot was captured after the selected replay time.`}:Q,graph:I,byId:B,client:t,snapshot:n,principalId:f,workspace:v,onStudio:_,onAbout:y,onAgent:b,onSelect:e=>Z(e,!0),onTrace:Ye,agentOf:le,process:j,traces:M.layer.traces,onClose:()=>U(null)},Q.id)]}),(I.events.length>0||te.length>0)&&(0,A.jsx)(Se,{graph:I,marks:te,cursor:K,playing:Ee,running:!!o?.running,speed:Oe,onSpeed:ke,onCursor:e=>{De(!1),Te(e)},onPlay:()=>{Ee?De(!1):(K!==null&&K>=Ae.at(-1)&&Te(null),De(!0))}})]}):(0,A.jsxs)(`section`,{className:`graph-page`,children:[(0,A.jsx)(fe,{counts:null}),(0,A.jsxs)(`div`,{className:`studio-empty`,children:[(0,A.jsx)(`span`,{className:`empty-symbol`,children:(0,A.jsx)(r,{name:`graph`,size:26,stroke:1.5})}),(0,A.jsx)(`h2`,{children:`Nothing to draw yet`}),(0,A.jsx)(`p`,{children:`When you ask the Agent something here, the files it reads, the scripts it changes and runs, and what they produce are drawn as one graph.`}),(0,A.jsx)(`div`,{className:`empty-actions`,children:(0,A.jsxs)(`button`,{className:`primary`,onClick:()=>b(),children:[(0,A.jsx)(r,{name:`prompt`,size:17,stroke:1.6}),(0,A.jsx)(`span`,{children:`Ask Agent`})]})})]})]})}function de({byId:e,layout:t,view:n,canvas:r,dim:i,live:a,onMove:o}){let s=r.current?.getBoundingClientRect();if(!s||!t.width||t.width*n.k<=s.width&&t.height*n.k<=s.height&&n.x>=0&&n.y>=0&&n.x+t.width*n.k<=s.width&&n.y+t.height*n.k<=s.height)return null;let c=Math.max(64,Math.min(120,188*t.height/t.width)),l=Math.min(176/t.width,(c-12)/t.height),u=(188-t.width*l)/2,d=(c-t.height*l)/2,f={x:u+-n.x/n.k*l,y:d+-n.y/n.k*l,w:s.width/n.k*l,h:s.height/n.k*l};function p(e){let t=e.currentTarget,r=t.getBoundingClientRect();t.setPointerCapture(e.pointerId);let i=(e,t)=>{let i=(e-r.left-u)/l,a=(t-r.top-d)/l;o({...n,x:s.width/2-i*n.k,y:s.height/2-a*n.k})};i(e.clientX,e.clientY);let a=e=>i(e.clientX,e.clientY),c=()=>{t.removeEventListener(`pointermove`,a),t.removeEventListener(`pointerup`,c)};t.addEventListener(`pointermove`,a),t.addEventListener(`pointerup`,c)}return(0,A.jsx)(`div`,{className:`graph-map`,"aria-hidden":`true`,children:(0,A.jsxs)(`svg`,{width:188,height:c,onPointerDown:p,children:[t.items.map(n=>{let r=t.placed.get(n.id),o=e.get(n.node);return(0,A.jsx)(`rect`,{className:`tone-`+N(o)+(i(o.id)||n.proxy?` off`:``)+(a===n.id?` live`:``),x:u+r.x*l,y:d+r.y*l,width:Math.max(2,r.width*l),height:Math.max(2,r.height*l),rx:1.5},n.id)}),(0,A.jsx)(`rect`,{className:`graph-map-frame`,x:f.x,y:f.y,width:f.w,height:f.h,rx:3})]})})}function fe({counts:e,omitted:t=0,children:n}){let r=e?[e.questions+(e.questions===1?` question`:` questions`),e.files+(e.files===1?` file`:` files`),e.runs+(e.runs===1?` run`:` runs`)].join(` · `):``,i=e&&(e.findings||e.choices)?[e.findings?e.findings+(e.findings===1?` finding`:` findings`):``,e.choices?e.choices+(e.choices===1?` choice`:` choices`):``].filter(Boolean).join(` and `):``;return(0,A.jsxs)(`header`,{className:`graph-head`,children:[(0,A.jsxs)(`div`,{className:`graph-heading`,children:[(0,A.jsx)(`h1`,{id:`graph-title`,children:`Graph`}),(0,A.jsxs)(`p`,{children:[e?`What the Agent did: ${r}.`:`What the Agent did, drawn as one graph.`,i&&` The notes record ${i}.`,t>0&&` ${t} earlier ${t===1?`message is`:`messages are`} not drawn.`]})]}),n&&(0,A.jsx)(`div`,{className:`graph-tools`,children:n})]})}function pe(e,t){let n=t.get(e.node);return n?e.action===`ask`?`Asked: `+n.title:e.action===`answer`?e.label:e.action===`changed`?n.title+` · `+e.label.charAt(0).toLowerCase()+e.label.slice(1):e.label+` `+(n.kind===`run`?n.title:n.path??n.title):e.label}function me({node:e,place:t,client:n,snapshot:i,near:a,selected:o,dimmed:s,later:c,current:l,arrived:u,live:d,onSelect:p,onOpen:m}){let g=e.events.at(-1),_=e.kind===`question`?[e.agent,ce[e.state??``]??e.state,h(e.at)].filter(Boolean).join(` · `):e.kind===`run`?[e.end??L[e.outcome??``]??e.outcome,e.durationMs?f(e.durationMs):null,h(e.at)].filter(Boolean).join(` · `):[e.versions?e.versions.length+` versions`:``,I(e),g?h(g.at):``].filter(Boolean).join(` · `),v=e.path?.includes(`/`)?e.path.split(`/`).slice(0,-1).join(`/`):``,y=`${j(e)}: ${e.kind===`file`?e.path:e.title}. ${_}`;return(0,A.jsxs)(`button`,{className:`graph-node kind-`+e.kind+` tone-`+N(e),"data-node":e.id,style:{left:t.x,top:t.y,width:t.width,height:t.height},"aria-pressed":o,"aria-label":y,"data-dimmed":s||void 0,"data-later":c||void 0,"data-current":l||void 0,"data-arrived":u||void 0,"data-live":d?``:void 0,"data-missing":e.kind===`file`&&!e.exists||void 0,onClick:p,onDoubleClick:m,children:[d&&(0,A.jsxs)(`span`,{className:`graph-flag`+(e.waiting?` waiting`:``),children:[(0,A.jsx)(`span`,{className:`pulse-dot`,"aria-hidden":`true`}),d]}),(0,A.jsxs)(`span`,{className:`graph-node-head`,children:[(0,A.jsx)(`span`,{className:`graph-node-icon`,children:(0,A.jsx)(r,{name:M(e),size:15,stroke:1.8})}),(0,A.jsxs)(`span`,{className:`graph-node-kind`,children:[j(e),v&&(0,A.jsxs)(`span`,{className:`graph-node-folder`,children:[` · `,v]})]})]}),(0,A.jsx)(`strong`,{className:`graph-node-title`,title:e.kind===`question`?e.text:e.path??e.command,children:e.title}),e.kind===`question`&&e.answer&&(0,A.jsx)(`span`,{className:`graph-node-answer`,children:oe(e.answer)}),P(e)&&(e.capturedAt===void 0||!c)&&(0,A.jsx)(R,{client:n,snapshot:i,node:e,shown:a&&!c}),e.kind===`file`&&!e.resource&&(0,A.jsx)(`span`,{className:`graph-node-meta`,children:`Historical version not captured`}),(0,A.jsx)(`span`,{className:`graph-node-meta`,children:e.kind===`file`&&!e.exists?`Not in the folder now`:_})]})}function he({node:e,place:t,client:n,snapshot:i,near:a,agentOf:o,selected:s,dimmed:c,later:l,arrived:u,onSelect:d,onOpen:f}){let p=e.meaning,m=e.kind===`file`,g=m?p.description?.trace:p.trace,_=g?.files.some(e=>e.later===`kept`)?`newer version since`:g?.files.some(e=>e.later===`written`)?`written again since`:``,v=e.path?.includes(`/`)?e.path.split(`/`).slice(0,-1).join(`/`):``,y=m?p.description:void 0,b=m&&!y?`Nothing says what it holds yet`:y?.source===`model`?`Described by ${C(y.model)}${y.strategy===`context`?` from code`:``} · ${h(y.at??0)}${y.earlier?` · earlier version`:``}`:y?.source===`facts`?`Read from the file · ${h(y.at??0)}${y.writing?` · describing…`:``}`:p.message?`Asked ${h(p.message.at)} · no notes yet`:F(g,o),x=e.kind===`question`&&!p.statement&&!p.message?`Section`:j(e);return(0,A.jsxs)(`button`,{className:`graph-node meaning kind-`+e.kind+` tone-`+N(e),"data-node":e.id,style:{left:t.x,top:t.y,width:t.width,height:t.height},"aria-pressed":s,"aria-label":`${x}: ${m?(p.description?.text?p.description.text+`, `:``)+e.path:e.text}. ${b}`,"data-dimmed":c||void 0,"data-later":l||void 0,"data-arrived":u||void 0,"data-missing":m&&!e.exists||void 0,onClick:d,onDoubleClick:f,children:[(0,A.jsxs)(`span`,{className:`graph-node-head`,children:[(0,A.jsx)(`span`,{className:`graph-node-icon`,children:(0,A.jsx)(r,{name:M(e),size:15,stroke:1.8})}),(0,A.jsxs)(`span`,{className:`graph-node-kind`,children:[x,m&&v&&(0,A.jsxs)(`span`,{className:`graph-node-folder`,children:[` · `,v]}),e.kind===`question`&&!p.message&&(0,A.jsxs)(`span`,{className:`graph-node-folder`,children:[` · `,p.session]})]})]}),(0,A.jsx)(`strong`,{className:`graph-node-title meaning-text`+(y?` holds-`+y.source:``),title:m?e.path:e.text,children:m&&y?.text||e.title}),m&&y?.text&&(0,A.jsx)(`span`,{className:`graph-node-path`,children:e.title}),m&&P(e)&&(0,A.jsx)(R,{client:n,snapshot:i,node:e,shown:a&&!l}),(0,A.jsxs)(`span`,{className:`graph-node-meta`,children:[e.kind===`question`&&p.todos?`${p.todos.done} of ${p.todos.total} to-dos done · `:``,b,_&&(0,A.jsxs)(`span`,{className:`meaning-changed`,children:[` · `,_]}),m&&!e.exists&&` · not in the folder now`]})]})}function ge({layout:e,focus:t,shown:n,labels:r,dim:i,live:a}){return(0,A.jsxs)(`svg`,{className:`graph-edges`,width:e.width,height:e.height,"aria-hidden":`true`,style:{overflow:`visible`},children:[(0,A.jsxs)(`defs`,{children:[(0,A.jsx)(`marker`,{id:`graph-arrow`,viewBox:`0 0 10 10`,refX:`9`,refY:`5`,markerWidth:`7`,markerHeight:`7`,orient:`auto-start-reverse`,children:(0,A.jsx)(`path`,{d:`M0 1 9 5 0 9z`,className:`arrow`})}),(0,A.jsx)(`marker`,{id:`graph-arrow-on`,viewBox:`0 0 10 10`,refX:`9`,refY:`5`,markerWidth:`7`,markerHeight:`7`,orient:`auto-start-reverse`,children:(0,A.jsx)(`path`,{d:`M0 1 9 5 0 9z`,className:`arrow on`})})]}),e.rows.slice(1).map(t=>(0,A.jsx)(`line`,{className:`graph-row-rule`,x1:-40,x2:e.width+40,y1:t.y-32,y2:t.y-32},t.turn)),e.links.filter(t=>n(t.edge)&&!(t.edge.label===`ran`&&e.links.some(n=>n.from===t.from&&e.links.some(e=>e.from===n.to&&e.to===t.to)))).map(n=>{let o=n.edge,s=e.placed.get(n.from),c=e.placed.get(n.to),l=s.x+s.width<=c.x,u=l?s.x+s.width:s.x+s.width/2,d=l?s.y+s.height/2:s.y+s.height,f=l?c.x:c.x+c.width/2,p=l?c.y+c.height/2:c.y,m=Math.max(36,(f-u)/2),h=l?`M${u} ${d} C${u+m} ${d} ${f-m} ${p} ${f-2} ${p}`:`M${u} ${d} C${u} ${d+80} ${f} ${p-80} ${f} ${p-2}`,g=!!t?.edges.has(o.id),_=t&&!g||i(o.from)||i(o.to),v=(u+f)/2,y=l?(d+p)/2:(d+p)/2+40;return(0,A.jsxs)(`g`,{"data-label":o.label,className:`graph-edge `+o.basis+(g?` on`:``)+(_?` off`:``)+(a&&n.to===a?` live`:``),children:[(0,A.jsx)(`path`,{d:h,markerEnd:g?`url(#graph-arrow-on)`:`url(#graph-arrow)`}),r&&!_&&(0,A.jsx)(`text`,{x:v,y:y-(o.label.length>12?18:6),textAnchor:`middle`,children:o.label.length>12?o.label.split(/ (?=while|meanwhile)/).map((e,t,n)=>(0,A.jsx)(`tspan`,{x:v,dy:t?13:0,children:e+(t<n.length-1?` `:``)},t)):o.label})]},n.id+n.from)})]})}function _e({item:e,node:t,place:n,home:i,dimmed:a,later:o,selected:s,live:c,onSelect:l}){return(0,A.jsxs)(`button`,{className:`graph-node graph-ref tone-`+N(t),"data-node":e.id,style:{left:n.x,top:n.y,width:n.width,height:n.height},"aria-label":`${t.kind===`file`?t.path:t.title}, from ${i}. Go there`,"aria-pressed":s,"data-dimmed":a||void 0,"data-later":o||void 0,"data-live":c?``:void 0,onClick:l,children:[c&&(0,A.jsxs)(`span`,{className:`graph-flag`+(t.waiting?` waiting`:``),children:[(0,A.jsx)(`span`,{className:`pulse-dot`,"aria-hidden":`true`}),c]}),(0,A.jsxs)(`span`,{className:`graph-node-head`,children:[(0,A.jsx)(`span`,{className:`graph-node-icon`,children:(0,A.jsx)(r,{name:M(t),size:13,stroke:1.8})}),(0,A.jsxs)(`span`,{className:`graph-node-kind`,children:[j(t),` · from `,i]}),(0,A.jsx)(r,{name:`back`,size:12})]}),(0,A.jsx)(`strong`,{className:`graph-node-title`,children:t.title})]})}function ve({node:e,graph:t,process:n,traces:a,byId:s,client:c,snapshot:l,principalId:u,workspace:d,onStudio:p,onAbout:m,onAgent:g,onSelect:_,onTrace:b,agentOf:x,onClose:C}){let ee=(0,k.useContext)(y),te=l.annotations.filter(t=>e.resource&&(t.anchor?.resource?.id===e.resource.id&&t.anchor?.resource?.version===e.resource.version||t.messages?.some(t=>t.resources?.some(t=>t.id===e.resource.id&&t.version===e.resource.version)))),[w,ne]=(0,k.useState)(!1),[E,D]=(0,k.useState)(``);async function re(){ne(!0),D(``);try{let t=await o(c,l,d(),e.path);t?p(t.compositionId,t.viewId):D(`Rho has no viewer for this kind of file yet.`)}catch(e){D(e instanceof Error?e.message:`It could not be opened in the workspace.`)}finally{ne(!1)}}let O=t.edges.filter(t=>t.to===e.id),P=t.edges.filter(t=>t.from===e.id),ie=e=>s.get(`q:`+e)?.title??`A message`,F=(e,t)=>e.map(e=>{let n=s.get(t===`from`?e.from:e.to);return(0,A.jsxs)(`li`,{children:[(0,A.jsxs)(`button`,{className:`graph-link`,onClick:()=>_(n.id),children:[(0,A.jsx)(r,{name:M(n),size:14}),(0,A.jsx)(`span`,{children:n.title})]}),(0,A.jsx)(`small`,{className:`graph-basis `+e.basis,children:e.label})]},e.id)}),ae=e.kind===`question`&&e.events.at(-1)?.action===`answer`?v(e.events.at(-1).at-e.at):``;return(0,A.jsxs)(`aside`,{className:`graph-inspector`,"aria-label":j(e)+` `+e.title,children:[(0,A.jsxs)(`header`,{className:`graph-inspector-head`,children:[(0,A.jsx)(`span`,{className:`graph-node-icon tone-`+N(e),children:(0,A.jsx)(r,{name:M(e),size:16,stroke:1.8})}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`small`,{children:e.meaning&&e.kind!==`file`?j(e)+` · in the notes`:j(e)}),(0,A.jsx)(`h2`,{title:e.path??e.text,children:e.kind===`file`?e.title:e.kind===`run`?e.commands?e.title:`Ran a command`:e.meaning?e.meaning.session:`You asked`}),e.kind===`file`&&(0,A.jsxs)(`p`,{children:[e.path,e.bytes!==void 0&&e.exists?` · `+S(e.bytes):``]})]}),(0,A.jsx)(`button`,{className:`icon-button`,"aria-label":`Close`,onClick:C,children:(0,A.jsx)(r,{name:`close`,size:17})})]}),(0,A.jsxs)(`div`,{className:`graph-inspector-body`,children:[e.meaning&&(0,A.jsx)(ye,{node:e,graph:t,process:n,traces:a,client:c,snapshot:l,agentOf:x,onAgent:g,onTrace:b,onSelect:_}),e.kind===`question`&&!e.meaning&&(0,A.jsxs)(`section`,{className:`graph-said`,children:[(0,A.jsx)(`p`,{className:`graph-question`,children:e.text}),(0,A.jsx)(`p`,{className:`graph-facts`,children:[e.agent,ce[e.state??``]??e.state,ae&&`took `+ae,e.model].filter(Boolean).join(` · `)}),e.answer&&(0,A.jsx)(`div`,{className:`graph-answer`,children:(0,A.jsx)(i,{text:e.answer,streaming:e.state===`running`})}),(0,A.jsxs)(`button`,{onClick:()=>g(e.conversationId),children:[(0,A.jsx)(r,{name:`prompt`,size:15}),`Show the conversation`]})]}),e.waiting&&(0,A.jsx)(be,{waiting:e.waiting,client:c,projectId:l.project.id},e.waiting.permission),e.commands&&(0,A.jsxs)(`section`,{className:`graph-said`,children:[(0,A.jsxs)(`p`,{className:`graph-facts`,children:[`Commands that read, ran or changed no project file, for “`,ie(e.turn),`”`]}),(0,A.jsx)(`ol`,{className:`graph-commands`,children:e.commands.map(e=>(0,A.jsx)(`li`,{children:(0,A.jsxs)(`details`,{children:[(0,A.jsxs)(`summary`,{children:[(0,A.jsx)(`code`,{title:e.ran,children:e.command}),(0,A.jsx)(`small`,{children:[e.end??L[e.outcome??``]??e.outcome,e.durationMs?f(e.durationMs):null,h(e.at)].filter(Boolean).join(` · `)})]}),e.output?.text?(0,A.jsx)(`pre`,{className:`graph-output`,children:e.output.text}):(0,A.jsx)(`p`,{className:`muted`,children:`Printed nothing.`})]})},e.id))})]}),e.kind===`run`&&!e.commands&&(0,A.jsxs)(`section`,{className:`graph-said`,children:[(0,A.jsx)(`pre`,{className:`graph-command`,title:e.ran,children:e.command}),(0,A.jsxs)(`p`,{className:`graph-facts`,children:[[e.end??L[e.outcome??``]??e.outcome,e.durationMs?`took `+f(e.durationMs):null,h(e.at,!0)].filter(Boolean).join(` · `),` · for “`,ie(e.turn),`”`]}),e.output&&(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`h3`,{className:`caption`,children:e.output.text?e.output.cut?`Printed · last ${e.output.text.split(`
|
|
2
2
|
`).length} of ${e.output.lines} lines`:`Printed`:`Printed nothing`}),e.output.text&&(0,A.jsx)(`pre`,{className:`graph-output`,ref:le,children:e.output.text})]}),e.ran&&e.ran!==e.command&&(0,A.jsxs)(`p`,{className:`graph-facts`,children:[`As run: `,(0,A.jsx)(`code`,{children:e.ran})]})]}),e.kind===`file`&&(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`p`,{className:`graph-facts`,children:e.resource?(e.versions?`Newest of ${e.versions.length} versions kept during this message, `:`Version kept `)+new Date(e.capturedAt).toLocaleString()+(e.captureSource===`buffer`?` from the open editor`:e.captureSource===`disk`?` from disk`:``)+` · which step made it is not confirmed`:e.gap}),e.resource&&(0,A.jsx)(T,{client:c,projectId:l.project.id,resource:e.resource,path:e.path}),(0,A.jsx)(`div`,{className:`graph-actions`,children:e.exists&&(0,A.jsxs)(`button`,{className:`primary`,disabled:w,onClick:()=>void re(),children:[(0,A.jsx)(r,{name:`layout`,size:15}),w?`Opening…`:`Open current file in workspace`]})})]}),te.map(e=>(0,A.jsxs)(`button`,{onClick:()=>ee?.openReview?.(e.annotationId),children:[`Review: `,e.messages[0].draft.text.slice(0,70)]},e.annotationId)),E&&(0,A.jsx)(`p`,{className:`canvas-note`,role:`alert`,children:E}),e.kind===`file`&&!e.exists&&(0,A.jsx)(`p`,{className:`muted`,children:`This file was not in the project folders when they were last read. It may have been moved or removed.`}),O.length>0&&(0,A.jsxs)(`section`,{children:[(0,A.jsx)(`h3`,{className:`caption`,children:`Comes from`}),(0,A.jsx)(`ul`,{className:`graph-relations`,children:F(O,`from`)})]}),P.length>0&&(0,A.jsxs)(`section`,{children:[(0,A.jsx)(`h3`,{className:`caption`,children:`Leads to`}),(0,A.jsx)(`ul`,{className:`graph-relations`,children:F(P,`to`)})]}),e.kind===`file`&&!e.meaning&&(0,A.jsxs)(`section`,{children:[(0,A.jsx)(`h3`,{className:`caption`,children:`What happened`}),(0,A.jsx)(`ol`,{className:`graph-history`,children:e.events.map(e=>(0,A.jsxs)(`li`,{children:[(0,A.jsx)(`time`,{children:h(e.at)}),(0,A.jsxs)(`span`,{children:[e.label,e.outcome&&e.outcome!==`returned`?` · `+(L[e.outcome]??e.outcome).toLowerCase():``]}),(0,A.jsx)(`button`,{className:`graph-link`,onClick:()=>_(`q:`+e.turn),children:ie(e.turn)})]},e.key))})]})]})]})}function ye({node:e,graph:t,process:n,traces:i,client:a,snapshot:o,agentOf:s,onAgent:c,onTrace:l,onSelect:u}){let d=e.meaning,f=e.kind===`file`,p=f?d.description?.trace:d.trace,g=(0,k.useContext)(y),_=i.find(t=>t.from===e.id&&t.label===`kept as`)?.to,v=p?.written?`q:`+p.written.turn:null,b=v?n.nodes.find(e=>e.id===v):void 0;return(0,A.jsxs)(`section`,{className:`graph-said meaning-said`,children:[f?d.description?(0,A.jsx)(`p`,{className:`meaning-statement`,children:d.description.text}):(0,A.jsx)(`p`,{className:`muted`,children:`The notes do not say what this file holds.`}):e.kind===`choice`&&d.statement?(0,A.jsx)(O,{statement:d.statement,trace:d.trace,conversationId:d.conversationId,client:a,projectId:o.project.id,onPath:e=>g?.openPath?.(e),onSent:e=>c(e)}):(0,A.jsx)(`p`,{className:`meaning-statement`,children:e.text}),e.kind===`question`&&d.todos&&(0,A.jsxs)(`p`,{className:`graph-facts`,children:[d.todos.done,` of `,d.todos.total,` to-dos done`]}),f&&d.description&&d.description.source!==`notes`&&(0,A.jsxs)(`div`,{className:`meaning-trace`,children:[(0,A.jsx)(`h3`,{className:`caption`,children:`Where this comes from`}),(0,A.jsx)(`p`,{className:`graph-facts`,children:d.description.source===`model`?(0,A.jsxs)(A.Fragment,{children:[`Described by `,C(d.description.model),` at `,h(d.description.at??0,!0),` `,ee(d.description),d.description.earlier?`, from an earlier version than the facts below`:``,`. A model's sentence; it is not checked. The notes do not say what this file holds yet.`]}):(0,A.jsxs)(A.Fragment,{children:[`Read from the file at `,h(d.description.at??0,!0),d.description.writing?`; a model is writing a sentence about it`:``,`. The notes do not say what this file holds yet.`]})}),d.description.source===`model`&&d.description.why&&(0,A.jsx)(`p`,{className:`graph-facts`,children:d.description.why}),d.description.source===`model`&&d.description.cost&&(0,A.jsx)(`p`,{className:`graph-facts`,children:m(d.description.cost)}),d.description.source===`model`&&d.description.facts&&(0,A.jsxs)(`p`,{className:`graph-facts`,children:[`Facts read from the file: `,d.description.facts]})]}),d.message&&(0,A.jsxs)(`div`,{className:`meaning-trace`,children:[(0,A.jsx)(`h3`,{className:`caption`,children:`Where this comes from`}),(0,A.jsxs)(`p`,{className:`graph-facts`,children:[`Asked at `,h(d.message.at,!0),`. The notes have no section for this conversation yet, so its results are shown by what was read from them.`]}),(0,A.jsx)(`div`,{className:`graph-actions`,children:(0,A.jsxs)(`button`,{onClick:()=>l(d.message.id),children:[(0,A.jsx)(r,{name:`graph`,size:15}),`Show the message`]})})]}),!d.message&&(!f||d.description?.source===`notes`)&&(0,A.jsxs)(`div`,{className:`meaning-trace`,children:[(0,A.jsx)(`h3`,{className:`caption`,children:`Where this comes from`}),(0,A.jsx)(`p`,{className:`graph-facts`,children:p?.written?(0,A.jsxs)(A.Fragment,{children:[`Written by `,s(p.written.conversationId)??`the Agent`,` at `,h(p.written.at,!0),`, first in version `,p.written.version,` of `,p.written.of,` of the notes that the Agent's record kept.`]}):(0,A.jsx)(A.Fragment,{children:`No version of the notes that the Agent's record kept holds this. You or another program wrote it, or the record kept no version since.`})}),p?.files.length?(0,A.jsx)(`ul`,{className:`meaning-files`,children:p.files.map(e=>{let n=t.nodes.find(t=>t.id===`m:f:`+e.path);return(0,A.jsxs)(`li`,{children:[(0,A.jsxs)(`button`,{className:`graph-link`,onClick:()=>n&&u(n.id),children:[(0,A.jsx)(r,{name:`file`,size:13}),(0,A.jsx)(`span`,{children:e.path})]}),(0,A.jsxs)(`small`,{children:[e.kept?`version kept `+h(e.kept.at):`no version kept`,e.later===`kept`?` · a newer version was kept since`:e.later===`written`?` · written again since`:``]})]},e.path)})}):null,(0,A.jsxs)(`div`,{className:`graph-actions`,children:[b&&(0,A.jsxs)(`button`,{onClick:()=>l(b.id),children:[(0,A.jsx)(r,{name:`graph`,size:15}),`Show the message it was written in`]}),_&&(0,A.jsxs)(`button`,{onClick:()=>l(_),children:[(0,A.jsx)(r,{name:`graph`,size:15}),`Show this version in the process`]}),!b&&!_&&d.conversationId&&(0,A.jsxs)(`button`,{onClick:()=>c(d.conversationId),children:[(0,A.jsx)(r,{name:`prompt`,size:15}),`Show the conversation`]})]})]})]})}function be({waiting:e,client:t,projectId:n}){let[r,i]=(0,k.useState)(``),[a,o]=(0,k.useState)(``);function s(r){i(r),o(``),t.call(`conversation.permission`,{projectId:n,conversationId:e.conversationId,turnId:e.turn,permissionId:e.permission,optionId:r}).catch(e=>{i(``),o(e instanceof Error?e.message:`The choice could not be sent.`)})}return(0,A.jsxs)(`section`,{className:`turn-permission graph-choice`,role:`group`,"aria-label":`Agent permission`,children:[(0,A.jsxs)(`p`,{className:`permission-caption`,children:[(0,A.jsx)(`span`,{"aria-hidden":`true`}),`Needs your choice`]}),(0,A.jsx)(`p`,{className:`permission-title`,children:e.title}),(0,A.jsx)(`div`,{children:e.options.map(e=>(0,A.jsx)(`button`,{className:`small-button`,disabled:!!r,onClick:()=>s(e.id),children:e.name},e.id))}),a&&(0,A.jsx)(`p`,{className:`inline-error`,role:`alert`,children:a})]})}var xe=[1e4,3e4,6e4,12e4,3e5,6e5,9e5,18e5,36e5,72e5,216e5],V={failed:`Failed`,stopped:`Stopped`,unknown:`Outcome unknown`};function Se({graph:e,marks:t=[],cursor:n,playing:i,running:a,speed:o,onSpeed:c,onCursor:l,onPlay:u,compact:d=!1}){let f=(0,k.useRef)(null),[m,g]=(0,k.useState)(600),[y,S]=(0,k.useState)(null),[C,ee]=(0,k.useState)(null);(0,k.useLayoutEffect)(()=>{let e=f.current;if(!e)return;let t=new ResizeObserver(()=>g(e.clientWidth));return t.observe(e),g(e.clientWidth),()=>t.disconnect()},[]);let w=(0,k.useMemo)(()=>{let n=[...e.turns.map(e=>({start:e.start,end:e.end})),...t.map(e=>({start:e.at,end:e.end}))].sort((e,t)=>e.start-t.start),r=[];for(let e of n){let t=r.at(-1);t&&e.start<=t.end+3e4?t.end=Math.max(t.end,e.end):r.push({start:e.start,end:Math.max(e.end,e.start+1e3)})}return r},[e.turns,t]),T=(0,k.useMemo)(()=>{let n=[];for(let t of[...e.turns].sort((e,t)=>e.start-t.start)){let e=n.find(e=>e.id===t.conversationId);e?e.turns.push(t):n.push({id:t.conversationId,title:t.title,agent:t.agent,who:`conversation`,start:t.start,turns:[t]})}for(let e of t)n.some(t=>t.id===e.lane)||n.push({id:e.lane,title:e.laneTitle,agent:e.agent??``,who:e.who,start:e.at,turns:[]});let r=e=>e===`person`?0:e===`conversation`?1:2;return n.sort((e,t)=>r(e.who)-r(t.who)||e.start-t.start)},[e.turns,t]),E=(0,k.useMemo)(()=>new Map(T.map((e,t)=>[e.id,t])),[T]),D=(0,k.useMemo)(()=>{let n=new Map(e.turns.map(e=>[e.id,E.get(e.conversationId)??0]));return[...e.events.map(e=>({key:e.key,at:e.at,lane:n.get(e.turn)??0,kind:b(e.action),failed:x(e),event:e})),...t.map(e=>({key:e.key,at:e.at,lane:E.get(e.lane)??0,kind:b(e.action),failed:e.failed,mark:e}))].sort((e,t)=>e.at-t.at)},[e.events,e.turns,t,E]),re=Math.max(100,m-44*Math.max(0,w.length-1)),O=_(w,D,re),j=[],M=0;w.forEach((e,t)=>{j.push(M),M+=O[t]+44});let N=e=>O[e],P=e=>{let t=w.findIndex(t=>e<=t.end),n=t<0?w.length-1:t,r=w[n],i=N(n);return j[n]+Math.min(i,Math.max(0,(e-r.start)/(r.end-r.start)*i))},ie=e=>{for(let t=w.length-1;t>=0;t--)if(e>=j[t]){let n=w[t],r=N(t);return n.start+Math.min(1,Math.max(0,(e-j[t])/r))*(n.end-n.start)}return w[0]?.start??0},F=D.at(-1)?.at??0,ae=n===null?D.length:D.filter(e=>e.at<=n).length;function oe(e){let t=e.currentTarget,n=t.getBoundingClientRect();t.setPointerCapture(e.pointerId),S(null);let r=e=>{let t=ie(e-n.left),r=D.reduce((e,n)=>Math.abs(n.at-t)<Math.abs(e.at-t)?n:e,D[0]);l(Math.abs(P(r.at)-(e-n.left))<8?r.at:t)};r(e.clientX);let i=e=>r(e.clientX),a=()=>{t.removeEventListener(`pointermove`,i),t.removeEventListener(`pointerup`,a),t.removeEventListener(`pointercancel`,a)};t.addEventListener(`pointermove`,i),t.addEventListener(`pointerup`,a),t.addEventListener(`pointercancel`,a)}function se(e){if(e.buttons)return;let t=e.currentTarget.getBoundingClientRect(),n=e.clientX-t.left,r=Math.floor((e.clientY-t.top-0)/24),i=null,a=7;for(let e of D){if(e.lane!==r)continue;let t=Math.abs(P(e.at)-n);t<a&&(i=e,a=t)}S(i?{block:i,x:P(i.at),lane:r}:null)}function I(e){let t=n??F,r=e.key===`ArrowRight`?D.find(e=>e.at>t)?.at??null:e.key===`ArrowLeft`?[...D].reverse().find(e=>e.at<t)?.at??D[0].at:e.key===`Home`?D[0].at:e.key===`End`?null:void 0;r!==void 0&&(e.preventDefault(),l(r))}let ce=n===null?m:P(n),le=e.turns.reduce((e,t)=>e+(t.end-t.start),0),R=p.map(e=>({...e,count:D.filter(t=>t.kind===e.key).length})).filter(e=>e.count>0),z=D.filter(e=>e.failed).length,ue=T.filter(e=>e.who===`conversation`).length,B=t.filter(e=>e.who===`person`).length,de=w.flatMap((e,t)=>{let n=N(t),r=e.end-e.start,i=xe.find(e=>n*e/r>=72)??xe.at(-1),a=[{at:e.start,x:j[t],first:!0}];for(let r=Math.ceil(e.start/i)*i;r<e.end;r+=i){let e=P(r);e-a.at(-1).x>=60&&j[t]+n-e>=24&&a.push({at:r,x:e,first:!1})}return a.map(e=>({...e,label:h(e.at,i<6e4)}))}),fe=w.slice(1).map((e,t)=>({x:j[t+1]-44,length:e.start-w[t].end})),me=(0,k.useMemo)(()=>new Map(e.nodes.map(e=>[e.id,e])),[e.nodes]),he=d?`div`:`footer`,ge=[e.turns.length?`${e.turns.length} ${e.turns.length===1?`message`:`messages`} · ${v(le)}`:``,ue>1?`${ue} conversations`:``,B?`${B} by you`:``].filter(Boolean).join(` · `);return(0,A.jsxs)(he,{className:`graph-timeline`+(d?` compact`:``)+(C?` only-`+C:``),"aria-label":`Timeline`,children:[(0,A.jsxs)(`div`,{className:`tl-head`,children:[!d&&(0,A.jsx)(`button`,{className:`graph-play`,"aria-label":i?`Pause`:`Play the work from the start`,onClick:u,children:(0,A.jsx)(r,{name:i?`pause`:`run`,size:16})}),(0,A.jsxs)(`div`,{className:`graph-timeline-text`,children:[(0,A.jsxs)(`strong`,{children:[D.filter(e=>e.kind!==`ask`&&e.kind!==`answer`).length,` actions`]}),(0,A.jsx)(`span`,{children:ge})]}),(0,A.jsxs)(`div`,{className:`tl-legend`,role:`group`,"aria-label":`Show one kind of action`,children:[R.map(e=>(0,A.jsxs)(`button`,{className:`tl-kind `+e.key,"aria-pressed":C===e.key,onClick:()=>ee(C===e.key?null:e.key),children:[(0,A.jsx)(`i`,{"aria-hidden":`true`}),(0,A.jsx)(`span`,{children:e.label}),(0,A.jsx)(`small`,{children:e.count})]},e.key)),z>0&&(0,A.jsxs)(`span`,{className:`tl-kind failed`,children:[(0,A.jsx)(`i`,{"aria-hidden":`true`}),(0,A.jsx)(`span`,{children:`Failed, refused or unknown`}),(0,A.jsx)(`small`,{children:z})]})]}),!d&&(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`div`,{className:`tl-speed`,role:`group`,"aria-label":`Replay speed`,children:[1,2,4].map(e=>(0,A.jsxs)(`button`,{"aria-pressed":o===e,onClick:()=>c(e),children:[e,`×`]},e))}),(0,A.jsx)(`button`,{className:`graph-now`+(n===null?` on`:``),"aria-pressed":n===null,onClick:()=>l(null),children:a?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`span`,{className:`pulse-dot`,"aria-hidden":`true`}),`Live`]}):`Now`})]})]}),(0,A.jsxs)(`div`,{className:`tl-body`,children:[(0,A.jsx)(`ol`,{className:`tl-names`,"aria-label":`Who did it`,children:T.map(e=>{let t=e.who===`conversation`?s(e.agent):null,n=e.who===`conversation`&&T.some(t=>t!==e&&t.title===e.title)&&e.turns[0]?h(e.turns[0].start)+` · `+e.title:e.title;return(0,A.jsxs)(`li`,{title:n,"data-who":e.who,children:[t?(0,A.jsx)(te,{brand:t,size:13}):(0,A.jsx)(r,{name:e.who===`person`?`person`:e.who===`other`?`monitor`:`chat`,size:13}),(0,A.jsx)(`span`,{children:n})]},e.id)})}),(0,A.jsxs)(`div`,{className:`tl-plot`,children:[(0,A.jsxs)(`div`,{ref:f,className:`graph-track`,...d?{role:`img`,"aria-label":`${D.length} steps over ${T.length} ${T.length===1?`lane`:`lanes`}`}:{role:`slider`,tabIndex:0,"aria-label":`When`,"aria-valuemin":0,"aria-valuemax":D.length,"aria-valuenow":ae,"aria-valuetext":n===null?`Now · everything`:`${h(n,!0)} · ${ae} of ${D.length}`,onPointerDown:oe,onKeyDown:I},onPointerMove:se,onPointerLeave:()=>S(null),style:{height:T.length*24},children:[T.map((e,n)=>(0,A.jsxs)(`div`,{className:`tl-lane`,style:{top:n*24,height:24},children:[e.turns.map(e=>(0,A.jsx)(`span`,{className:`tl-band`+(e.running?` running`:``),style:{left:P(e.start),width:Math.max(4,P(e.end)-P(e.start))}},e.id)),e.who!==`conversation`&&t.filter(t=>t.lane===e.id).map(e=>(0,A.jsx)(`span`,{className:`tl-band`+(e.outcome===`running`?` running`:``),style:{left:P(e.at),width:Math.max(4,P(e.end)-P(e.at))}},e.key))]},e.id)),fe.map((e,t)=>(0,A.jsx)(`span`,{className:`tl-fold`,style:{left:e.x,width:44,height:T.length*24},"aria-hidden":`true`},t)),D.map(e=>(0,A.jsx)(`i`,{className:`graph-tick tl-block `+e.kind+(e.failed?` failed`:``)+(n!==null&&e.at>n?` later`:``)+(y?.block.key===e.key?` hot`:``),style:{left:P(e.at),top:e.lane*24+5}},e.key)),(0,A.jsx)(`span`,{className:`graph-head-line`,style:{left:ce,height:T.length*24+22},children:n!==null&&(0,A.jsx)(`time`,{children:h(n,!0)})}),y&&(0,A.jsxs)(`div`,{className:`tl-tip`,style:{left:Math.min(Math.max(y.x,110),m-110),top:y.lane*24},role:`tooltip`,children:[(0,A.jsx)(`time`,{children:h(y.block.at,!0)}),y.block.event?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`span`,{children:pe(y.block.event,me)}),y.block.failed&&(0,A.jsx)(`small`,{children:L[y.block.event.outcome]})]}):y.block.mark&&(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`span`,{children:ne(y.block.mark)}),V[y.block.mark.outcome]&&(0,A.jsx)(`small`,{children:V[y.block.mark.outcome]})]})]})]}),(0,A.jsxs)(`div`,{className:`tl-axis`,"aria-hidden":`true`,children:[de.map(e=>(0,A.jsx)(`span`,{className:e.first?`first`:``,style:{left:e.x},children:e.label},e.at+`:`+e.x)),fe.map((e,t)=>(0,A.jsx)(`small`,{style:{left:e.x+22},title:`A pause of `+v(e.length),children:v(e.length)},t))]})]})]})]})}function H({client:e,snapshot:t,files:n,onOpen:i,onConversations:o}){let{turns:s,loading:c}=w(e,t),{marks:l}=E(e,t),d=(0,k.useMemo)(()=>u({turns:s,files:n.files.map(e=>({path:e.path,bytes:e.bytes,modifiedAt:e.modifiedAt,category:e.category})),project:t.project,kindOf:a,now:Date.now()}),[s,n.files,t.project]);if(c||!d.events.length&&!l.length)return null;let f=d.nodes.filter(e=>e.kind===`file`&&e.events.some(e=>e.action===`edit`||e.action===`write`||e.action===`changed`)).length,p=Math.max(d.events.at(-1)?.at??0,l.at(-1)?.at??0),m=Math.round((new Date().setHours(0,0,0,0)-new Date(p).setHours(0,0,0,0))/864e5),g=(m===0?`today`:m===1?`yesterday`:new Date(p).toLocaleDateString())+` at `+h(p),_=t.conversations?.length??0,v=l.some(e=>e.who===`person`),y=d.events.length?v?`What you and the Agent did`:`What the Agent did`:`What you did`;return(0,A.jsxs)(`section`,{className:`project-section work-strip`,"aria-labelledby":`work-strip-title`,children:[(0,A.jsxs)(`div`,{className:`section-heading`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h2`,{id:`work-strip-title`,children:y}),(0,A.jsxs)(`p`,{className:`work-strip-line`,children:[_>0&&(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(`button`,{className:`text-button`,onClick:o,children:[_,` `,_===1?`conversation`:`conversations`]}),` · `,f,` `,f===1?`file`:`files`,` changed · `]}),`last `,g]})]}),d.events.length>0&&(0,A.jsxs)(`button`,{className:`text-button`,onClick:i,children:[`Open the Graph `,(0,A.jsx)(r,{name:`chevron`,size:12})]})]}),(0,A.jsx)(Se,{graph:d,marks:l,cursor:null,playing:!1,running:!1,speed:1,onSpeed:()=>void 0,onCursor:()=>void 0,onPlay:()=>void 0,compact:!0})]})}export{B as WorkGraph,H as WorkStrip};
|