@shawnstack/quickforge 1.4.0 → 1.4.1

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.
Files changed (37) hide show
  1. package/README.md +12 -12
  2. package/dist/assets/{AgentProfilesPage-C79teCgh.js → AgentProfilesPage-CNK5PxA3.js} +1 -1
  3. package/dist/assets/ChatPanelHost-FqPQwwMO.js +217 -0
  4. package/dist/assets/PluginsPage-BCu1Ept0.js +1 -0
  5. package/dist/assets/{ScheduledTasksPage-C047y3p3.js → ScheduledTasksPage-Bx04rjui.js} +2 -2
  6. package/dist/assets/SharedConversationPage-55vX9sqe.js +1 -0
  7. package/dist/assets/TerminalDock-DLN_pLkJ.js +2 -0
  8. package/dist/assets/WorkspaceInspector-DoemHHnY.js +3 -0
  9. package/dist/assets/{WorkspaceReaderDialog-bTeERaGd.js → WorkspaceReaderDialog-C6xUHBCw.js} +2 -2
  10. package/dist/assets/{icons-Dsc5yL3l.js → icons-BWtivFsx.js} +1 -1
  11. package/dist/assets/index-CxOHP41X.css +3 -0
  12. package/dist/assets/index-Dcf73EL8.js +895 -0
  13. package/dist/assets/{monaco-DG4TcBMc.js → monaco-evITXh-m.js} +1 -1
  14. package/dist/assets/{react-vendor-CiCXOLb5.js → react-vendor-Mthyt1p4.js} +1 -1
  15. package/dist/index.html +4 -4
  16. package/package.json +1 -1
  17. package/server/agent-manager.mjs +85 -13
  18. package/server/approval-store.mjs +13 -1
  19. package/server/auto-compaction.mjs +29 -73
  20. package/server/context-usage.mjs +108 -0
  21. package/server/custom-commands.mjs +145 -28
  22. package/server/mcp/registry.mjs +40 -0
  23. package/server/routes/agent.mjs +1 -1
  24. package/server/routes/mcp.mjs +7 -1
  25. package/server/routes/project.mjs +32 -2
  26. package/server/routes/shared-conversation.mjs +1 -1
  27. package/server/storage.mjs +1 -0
  28. package/server/subagents.mjs +8 -6
  29. package/server/system-prompt.mjs +2 -2
  30. package/server/tools/definitions.mjs +1 -1
  31. package/dist/assets/ChatPanelHost-BjdIshtX.js +0 -195
  32. package/dist/assets/PluginsPage-Dt7Iiddo.js +0 -1
  33. package/dist/assets/SharedConversationPage-8X8kfztQ.js +0 -1
  34. package/dist/assets/TerminalDock-CEuJNf0m.js +0 -2
  35. package/dist/assets/WorkspaceInspector-BIa5gLVs.js +0 -3
  36. package/dist/assets/index-CPAWYhzz.css +0 -3
  37. package/dist/assets/index-YTL26wyJ.js +0 -814
@@ -1,195 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{N as t,it as n}from"./icons-Dsc5yL3l.js";import{n as r,t as i}from"./react-vendor-CiCXOLb5.js";import{d as a,p as o,t as s}from"./lit-vendor-Dr3cpBGF.js";import{c,l,s as u}from"./pi-web-ui-CBet4bMl.js";import{t as d}from"./logger-B65Akg8A.js";import{O as f,d as p,f as m,l as h,m as g,n as _,u as v}from"./index-YTL26wyJ.js";import{t as y}from"./plugin-api-YfYj_Bd7.js";var b=e(n(),1),x={maxHeight:`28rem`,overflow:`auto`,border:`1px solid color-mix(in oklab, var(--border) 75%, transparent)`,borderRadius:`0.75rem`,background:`color-mix(in oklab, var(--muted) 28%, transparent)`,fontFamily:`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace`,fontSize:`0.78rem`,lineHeight:`1.45`},S={minHeight:`1.35em`,padding:`0 0.75rem`,whiteSpace:`pre`},C={display:`inline-flex`,alignItems:`center`,borderRadius:`999px`,padding:`0.05rem 0.45rem`,fontFamily:`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace`,fontSize:`0.72rem`,fontWeight:`650`};function w(e){if(e==null)return``;if(typeof e==`string`)try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}try{return JSON.stringify(e,null,2)}catch{return String(e)}}function T(e){return e?.content?.filter(e=>e.type===`text`).map(e=>e.text??``).join(`
2
- `)??``}function E(e){return!!(e&&typeof e==`object`&&!Array.isArray(e))}function D(e,t){if(e.running===!0||t)return`Status: running`;let n=[e.timedOut?`timed out`:null,e.aborted?`aborted`:null].filter(Boolean),r=n.length?` (${n.join(`, `)})`:``;return`Exit code: ${e.code??`unknown`}${typeof e.signal==`string`&&e.signal?`, signal: ${e.signal}`:``}${r}`}function O(e,t,n){let r=E(t)?t:void 0,i=typeof r?.command==`string`?r.command:typeof e?.command==`string`?e.command:``;if(!i||!r)return``;let a=typeof r?.stdout_preview==`string`?r.stdout_preview:typeof r?.stdout==`string`?r.stdout:``,o=typeof r?.stderr_preview==`string`?r.stderr_preview:typeof r?.stderr==`string`?r.stderr:``,s=!!(a||o),c=r.running===!0||r.code!==void 0||r.signal!==void 0||r.timedOut===!0||r.aborted===!0;return!s&&!c&&!n?``:[`Command: ${i}`,D(r,n),``,`STDOUT:`,a||`(empty)`,``,`STDERR:`,o||`(empty)`].join(`
3
- `)}function k(e,t,n,r){return T(n)||(e===`run_command`?O(t,n?.details,r):``)}function A(e,t){return E(e)&&typeof e[t]==`string`?e[t]:``}function j(e,t,n){if(!t&&!n?.details)return``;if(e===`run_command`&&typeof t?.command==`string`)return t.command;if(e===`grep_files`){let e=typeof t?.query==`string`&&t.query?t.query:A(n?.details,`query`),r=typeof t?.path==`string`&&t.path?t.path:A(n?.details,`path`)||`.`,i=t?.regex||E(n?.details)&&E(n.details.searchOptions)&&n.details.searchOptions.regex?`regex`:`text`,a=r&&r!==`.`?` in ${r}`:` in current workspace`;return e?`${i}: ${e}${a}`:`searching${a}`}return e===`activate_skill`&&typeof t?.name==`string`?t.name:e===`read_skill_resource`&&typeof t?.path==`string`||t&&`path`in t&&typeof t.path==`string`?t.path:t&&`query`in t&&typeof t.query==`string`?t.query:``}function M(e){if(!e||typeof e!=`object`)return;let t=e.diff;if(!t||typeof t!=`object`)return;let n=t;return typeof n.text==`string`?n:void 0}function ee(e){if(!e||typeof e!=`object`)return e;let t=e,n=t.diff;if(!n||typeof n!=`object`)return e;let{text:r,...i}=n;return{...t,diff:i}}function N(e){if(!e||typeof e!=`object`)return{};let t=e;return{sessionId:typeof t.sessionId==`string`?t.sessionId:void 0,toolCallId:typeof t.toolCallId==`string`?t.toolCallId:void 0}}async function P(e,t,n){let r=n.getAttribute(`aria-label`)||f(`terminateCommand`);n.disabled=!0,n.setAttribute(`aria-label`,f(`commandTerminateRequested`)),n.setAttribute(`title`,f(`commandTerminateRequested`));try{let n=await fetch(`/api/agents/${encodeURIComponent(e)}/abort-tool`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({toolCallId:t})});if(!n.ok)throw Error(`HTTP ${n.status}`)}catch{n.disabled=!1,n.setAttribute(`aria-label`,r),n.setAttribute(`title`,f(`terminateCommandTitle`))}}function F(e){return e.startsWith(`+++`)||e.startsWith(`---`)?`quickforge-diff-file`:e.startsWith(`@@`)?`quickforge-diff-hunk`:e.startsWith(`+`)?`quickforge-diff-add`:e.startsWith(`-`)?`quickforge-diff-del`:`quickforge-diff-context`}function I(e){return e.startsWith(`+++`)||e.startsWith(`---`)?{...S,background:`color-mix(in oklab, var(--muted) 48%, transparent)`,color:`color-mix(in oklab, var(--muted-foreground) 88%, transparent)`}:e.startsWith(`@@`)?{...S,background:`color-mix(in oklab, rgb(37 99 235) 10%, transparent)`,color:`rgb(37 99 235)`}:e.startsWith(`+`)?{...S,background:`color-mix(in oklab, rgb(34 197 94) 16%, transparent)`,color:`rgb(22 101 52)`}:e.startsWith(`-`)?{...S,background:`color-mix(in oklab, rgb(239 68 68) 14%, transparent)`,color:`rgb(153 27 27)`}:{...S,color:`var(--foreground)`}}function L(e){let t=e.text?.split(`
4
- `)??[],n=Number(e.addedLines??0),r=Number(e.removedLines??0);return o`
5
- <div>
6
- <div class="mb-1 flex items-center gap-2 text-xs font-medium text-muted-foreground">
7
- <span>Diff</span>
8
- <span
9
- class="quickforge-diff-badge quickforge-diff-badge-add"
10
- style=${s({...C,background:`color-mix(in oklab, rgb(34 197 94) 16%, transparent)`,color:`rgb(22 101 52)`})}
11
- >+${n}</span>
12
- <span
13
- class="quickforge-diff-badge quickforge-diff-badge-del"
14
- style=${s({...C,background:`color-mix(in oklab, rgb(239 68 68) 14%, transparent)`,color:`rgb(153 27 27)`})}
15
- >-${r}</span>
16
- ${e.truncated?o`<span class="text-muted-foreground/80">truncated</span>`:a}
17
- </div>
18
- <div class="quickforge-diff-block" style=${s(x)}>${t.map(e=>o`
19
- <div class=${F(e)} style=${s(I(e))}>${e||` `}</div>
20
- `)}</div>
21
- </div>
22
- `}function R(e){if(!Number.isFinite(e)||e<0)return``;if(e<1e3)return`${Math.max(0,Math.round(e))}ms`;let t=e/1e3;return t<10?`${t.toFixed(1)}s`:t<60?`${Math.round(t)}s`:`${Math.floor(t/60)}m ${Math.floor(t%60).toString().padStart(2,`0`)}s`}function te(e){if(e){if(typeof e.durationMs==`number`)return e.durationMs;if(typeof e.startedAt==`number`)return Date.now()-e.startedAt}}var z=class extends HTMLElement{timer;static get observedAttributes(){return[`duration-ms`,`running`,`started-at`]}connectedCallback(){this.render(),this.syncTimer()}disconnectedCallback(){this.stopTimer()}attributeChangedCallback(){this.render(),this.syncTimer()}readNumberAttribute(e){let t=this.getAttribute(e);if(t===null||t.trim()===``)return;let n=Number(t);return Number.isFinite(n)&&n>=0?n:void 0}syncTimer(){this.getAttribute(`running`)===`true`&&this.readNumberAttribute(`duration-ms`)===void 0?this.timer||=setInterval(()=>this.render(),500):this.stopTimer()}stopTimer(){this.timer&&=(clearInterval(this.timer),void 0)}render(){let e=this.readNumberAttribute(`duration-ms`),t=this.readNumberAttribute(`started-at`),n=e===void 0?t!==void 0&&t>0?Date.now()-t:0:e;this.textContent=R(n)}};customElements.get(`quickforge-elapsed-time`)||customElements.define(`quickforge-elapsed-time`,z);function B(e,t){return te(e)===void 0?a:o`
23
- <quickforge-elapsed-time
24
- class="text-xs text-muted-foreground/70"
25
- started-at=${String(e?.startedAt??``)}
26
- duration-ms=${typeof e?.durationMs==`number`?String(e.durationMs):``}
27
- running=${String(t===`running`)}
28
- ></quickforge-elapsed-time>
29
- `}function ne(){return`text-emerald-600 dark:text-emerald-500`}function re(e){let t=`quickforge-tool-type-icon shrink-0 ${ne()}`;return e===`edit_file`?o`<svg class=${t} xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/><path d="M18.4 2.6a2.1 2.1 0 0 1 3 3L12 15l-4 1 1-4Z"/></svg>`:e===`write_file`?o`<svg class=${t} xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8Z"/><path d="M14 2v6h6"/><path d="M12 18v-6"/><path d="M9 15h6"/></svg>`:e===`read_file`?o`<svg class=${t} xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8Z"/><path d="M14 2v6h6"/><path d="M16 13H8"/><path d="M16 17H8"/><path d="M10 9H8"/></svg>`:e===`grep_files`?o`<svg class=${t} xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/></svg>`:e===`read_skill_resource`?o`<svg class=${t} xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 7v14"/><path d="M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3Z"/></svg>`:e===`run_command`?o`<svg class=${t} xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="4 17 10 11 4 5"/><line x1="12" x2="20" y1="19" y2="19"/></svg>`:e===`run_subagent`?o`<svg class=${t} xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3 4 7l8 4 8-4-8-4Z"/><path d="m4 12 8 4 8-4"/><path d="m4 17 8 4 8-4"/></svg>`:e===`activate_skill`?o`<svg class=${t} xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9.9 2.1 8.5 8.5 2.1 9.9l6.4 1.4 1.4 6.4 1.4-6.4 6.4-1.4-6.4-1.4Z"/><path d="M19 15v4"/><path d="M21 17h-4"/></svg>`:o`<svg class=${t} xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.8-3.8a6 6 0 0 1-7.9 7.9l-6.9 6.9a2.1 2.1 0 0 1-3-3l6.9-6.9a6 6 0 0 1 7.9-7.9Z"/></svg>`}function ie(e){return e===`error`?`text-destructive`:e===`running`?`text-primary animate-spin`:e===`done`?`text-emerald-600 dark:text-emerald-500`:`text-muted-foreground/70`}function ae(e){let t=`quickforge-tool-status-icon shrink-0 ${ie(e)}`,n=f(e);return e===`running`?o`<svg class=${t} xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" role="img" aria-label=${n}><path d="M21 12a9 9 0 1 1-6.2-8.6"/></svg>`:e===`done`?o`<svg class=${t} xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" role="img" aria-label=${n}><path d="M22 11.1V12a10 10 0 1 1-5.9-9.1"/><path d="m9 11 3 3L22 4"/></svg>`:e===`error`?o`<svg class=${t} xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" role="img" aria-label=${n}><circle cx="12" cy="12" r="10"/><path d="m15 9-6 6"/><path d="m9 9 6 6"/></svg>`:o`<svg class=${t} xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" role="img" aria-label=${n}><circle cx="12" cy="12" r="10"/><circle cx="12" cy="12" r="2" fill="currentColor" stroke="none"/></svg>`}function oe(e,t){return o`
30
- <span class="shrink-0 inline-flex items-center gap-1.5" title=${f(e)}>
31
- ${ae(e)}${B(t,e)}
32
- </span>
33
- `}function se(e,t,n){if(e!==`run_command`||t!==`running`)return a;let{sessionId:r,toolCallId:i}=N(n);return!r||!i?a:o`
34
- <button
35
- type="button"
36
- class="shrink-0 inline-flex size-5 items-center justify-center text-foreground transition-opacity hover:opacity-70 disabled:cursor-not-allowed disabled:opacity-40"
37
- title=${f(`terminateCommandTitle`)}
38
- aria-label=${f(`terminateCommandTitle`)}
39
- @click=${e=>{e.preventDefault(),e.stopPropagation(),P(r,i,e.currentTarget)}}
40
- ><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="7" y="7" width="10" height="10" rx="2.4"/></svg></button>
41
- `}function ce(e,t){return E(t)&&typeof t.label==`string`&&t.label?t.label:e===`general`?f(`subagentGeneral`):e===`explore`?f(`subagentExplore`):e||f(`runSubagent`)}function le(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function ue(e){return Array.isArray(e)?e:[]}function de(e){let t=new Set,n=[];for(let r of e){if(!E(r)||r.role!==`assistant`||!Array.isArray(r.content))continue;let e=r.content.filter(e=>E(e)&&e.type===`toolCall`);if(e.length!==0){for(let n of e)E(n)&&typeof n.id==`string`&&t.add(n.id);n.push({...r,content:e,usage:void 0})}}let r=e.filter(e=>E(e)&&e.role===`toolResult`&&typeof e.toolCallId==`string`&&t.has(e.toolCallId));return[...n,...r]}var V=new Map,fe=100;function pe(e,t){if(e){if(!V.has(e)&&V.size>=fe){let e=V.keys().next().value;e&&V.delete(e)}V.set(e,t)}}var me=class{render(e,t,n){let r=t?.isError?`error`:n?`running`:t?`done`:`called`,i=g(t?.details),s=E(t?.details)?t.details:void 0,c=typeof e?.subagent==`string`?e.subagent:typeof s?.subagent==`string`?s.subagent:``,l=ce(c,s),u=typeof e?.task==`string`?e.task:``,d=typeof e?.context==`string`?e.context:``,p=typeof e?.expectedOutput==`string`?e.expectedOutput:``,m=typeof s?.toolCalls==`number`?s.toolCalls:void 0,_=le(s?.allowedTools),v=ue(s?.messages),y=ue(s?.tools),b=new Set(le(s?.pendingToolCalls)),x=h(),S=x.showToolDetails?v:de(v),C=x.showToolDetails?w(e):``,D=x.showToolDetails?w(t?.details):``,O=T(t),k=typeof s?.sessionId==`string`?s.sessionId:`${c}:${u}`,A=V.get(k)??x.expandToolsByDefault,j=r===`running`?f(`subagentRunning`,{name:l}):r===`done`?f(`subagentCompleted`,{name:l}):r===`error`?f(`subagentFailed`,{name:l}):f(`runSubagent`);return{isCustom:!1,content:o`
42
- <details class="group/tool quickforge-subagent-tool" ?open=${A} @toggle=${e=>pe(k,e.currentTarget.open)}>
43
- <summary class="flex cursor-pointer list-none items-center gap-2 text-sm text-muted-foreground select-none">
44
- <svg class="shrink-0 transition-transform group-open/tool:rotate-90" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"/></svg>
45
- ${re(`run_subagent`)}
46
- <span class="min-w-0 flex-1 truncate">${j}${u?o`<span class="text-muted-foreground/70"> · ${u}</span>`:``}</span>
47
- ${oe(r,i)}
48
- </summary>
49
- <div class="mt-3 space-y-3">
50
- ${x.showToolDetails?o`<div class="quickforge-subagent-summary rounded-lg border border-border/75 bg-muted/20 px-3 py-2.5 text-sm">
51
- <div class="flex flex-wrap items-center gap-x-3 gap-y-1 text-muted-foreground">
52
- <span class="font-medium text-foreground/85">${l}</span>
53
- ${m===void 0?a:o`<span>${f(`subagentToolCalls`)}: ${m}</span>`}
54
- ${i?o`<span>${B(i,r)}</span>`:a}
55
- </div>
56
- ${u?o`<div class="mt-2 text-muted-foreground/85"><span class="font-medium text-foreground/75">${f(`subagentTask`)}:</span> ${u}</div>`:a}
57
- ${d?o`<div class="mt-1 text-xs text-muted-foreground/70"><span class="font-medium">${f(`subagentContext`)}:</span> ${d}</div>`:a}
58
- ${p?o`<div class="mt-1 text-xs text-muted-foreground/70"><span class="font-medium">${f(`subagentExpectedOutput`)}:</span> ${p}</div>`:a}
59
- ${_.length>0?o`<div class="mt-2 flex flex-wrap gap-1.5">${_.map(e=>o`<span class="rounded-full bg-background/80 px-2 py-0.5 text-[11px] text-muted-foreground/80">${e}</span>`)}</div>`:a}
60
- </div>`:a}
61
- ${S.length>0?o`<div class="quickforge-subagent-trace rounded-lg border border-border/70 bg-background/60 p-2.5"><message-list .messages=${S} .tools=${y} .pendingToolCalls=${b} .isStreaming=${r===`running`}></message-list></div>`:a}
62
- ${O?o`<div><div class="mb-1 text-xs font-medium text-muted-foreground">${f(`subagentResult`)}</div><code-block .code=${O} language="text"></code-block></div>`:a}
63
- ${C?o`<div><div class="mb-1 text-xs font-medium text-muted-foreground">${f(`input`)}</div><code-block .code=${C} language="json"></code-block></div>`:a}
64
- ${D?o`<div><div class="mb-1 text-xs font-medium text-muted-foreground">${f(`details`)}</div><code-block .code=${D} language="json"></code-block></div>`:a}
65
- </div>
66
- </details>
67
- `}}},H=class{toolName;labelKey;constructor(e,t){this.toolName=e,this.labelKey=t}render(e,t,n){let r=t?.isError?`error`:n?`running`:t?`done`:`called`,i=g(t?.details),a=j(this.toolName,e,t),s=h(),c=s.showToolDetails,l=s.expandToolsByDefault,u=c?w(e):``,d=k(this.toolName,e,t,n),p=M(t?.details),m=c?w(p?ee(t?.details):t?.details):``,_=t?.isError?`error`:`default`;return{isCustom:!1,content:o`
68
- <details class="group/tool" ?open=${l}>
69
- <summary class="flex cursor-pointer list-none items-center gap-2 text-sm text-muted-foreground select-none">
70
- <svg class="shrink-0 transition-transform group-open/tool:rotate-90" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"/></svg>
71
- ${re(this.toolName)}
72
- <span class="min-w-0 flex-1 truncate">${f(this.labelKey)}${a?o`<span class="text-muted-foreground/70"> · ${a}</span>`:``}</span>
73
- ${se(this.toolName,r,t?.details)}
74
- ${oe(r,i)}
75
- </summary>
76
- <div class="mt-3 space-y-3">
77
- ${u?o`<div><div class="mb-1 text-xs font-medium text-muted-foreground">${f(`input`)}</div><code-block .code=${u} language="json"></code-block></div>`:``}
78
- ${d?o`<div><div class="mb-1 text-xs font-medium text-muted-foreground">${f(`output`)}</div>${this.toolName===`run_command`?o`<console-block .content=${d} .variant=${_}></console-block>`:o`<code-block .code=${d} language="text"></code-block>`}</div>`:``}
79
- ${p?L(p):``}
80
- ${m?o`<div><div class="mb-1 text-xs font-medium text-muted-foreground">${f(`details`)}</div><code-block .code=${m} language="json"></code-block></div>`:``}
81
- </div>
82
- </details>
83
- `}}};for(let[e,t]of[[`read_file`,`readFile`],[`grep_files`,`searchFiles`],[`write_file`,`writeFile`],[`edit_file`,`editFile`],[`run_command`,`runCommand`],[`activate_skill`,`activateSkill`],[`read_skill_resource`,`readSkillResource`]])l(e,new H(e,t));l(`run_subagent`,new me);function he(e=[]){return e}function U(e,t){let n=document.createElement(`template`);n.innerHTML=t;let r=n.content.firstElementChild;if(!r)return;let i=e.querySelector(`svg`);i?i.replaceWith(r):e.appendChild(r)}function W(e,t){let n=document.createElement(`template`);n.innerHTML=t;let r=Array.from(n.content.children);for(let t of Array.from(e.children))t.remove();for(let t of r)e.appendChild(t)}var ge=()=>({text:``,attachments:[]}),G=e=>e.text.length>0||(e.attachments?.length??0)>0;function K(e){try{return JSON.stringify(e)}catch{return``}}function q(e){let t=String(e||``);if(!t)return 0;let n=t.match(/[\u3400-\u9fff\uf900-\ufaff]/g)?.length??0,r=Math.max(0,t.length-n);return Math.ceil(n+r/3.5)}function J(e){return e?typeof e==`string`?e:Array.isArray(e)?e.map(e=>{if(!e||typeof e!=`object`)return J(e);let t=e;return t.type===`text`?typeof t.text==`string`?t.text:``:t.type===`thinking`?typeof t.thinking==`string`?t.thinking:``:t.type===`image`?`[image:${typeof t.mimeType==`string`?t.mimeType:`unknown`}]`:t.type===`toolCall`?`[toolCall:${typeof t.name==`string`?t.name:`unknown`}] ${K(t.arguments)}`:K(t)}).filter(Boolean).join(`
84
- `):typeof e==`object`?K(e):String(e):``}function Y(e){let t=[e.role??``,J(e.content)];return e.toolName&&t.push(e.toolName),e.toolCallId&&t.push(e.toolCallId),e.attachments!==void 0&&t.push(K(e.attachments)),q(t.filter(Boolean).join(`
85
- `))}function _e(e,t,n=[]){return q(e)+t.reduce((e,t)=>e+Y(t),0)+q(K(n))}function ve(e){if(typeof e.timestamp==`number`)return e.timestamp;if(typeof e.timestamp==`string`){let t=Date.parse(e.timestamp);return Number.isNaN(t)?0:t}return 0}function ye(e){return e.role===`user`&&J(e.content).includes(`<compact_summary>`)}function be(e){let t=0;for(let n of e)ye(n)&&(t=Math.max(t,ve(n)));return t}function xe(e,t,n,r=[],i){let a=be(t),o=t.reduce((e,t)=>{let n=t.usage;return t.role!==`assistant`||!n||a>0&&ve(t)<=a?e:n},void 0),s=o?.input??o?.totalTokens??0,c=_e(e,t,r),l=Number.isFinite(Number(s))&&Number(s)>0,u=l?Number(s):c,d=u,f=l?`provider`:`estimated`,p=Math.max(0,Number(i)||4096),m=d+p,h=n>0?Math.round(m/n*1e3)/10:0;return{contextWindow:n,usedTokens:d,totalTokens:m,inputTokens:u,estimatedInputTokens:c,inputTokenSource:f,reservedOutputTokens:p,percent:h,color:`hsl(${Math.round(142-142*Math.min(100,Math.max(0,h))/100)} 72% 45%)`}}function X(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${Math.round(e/1e3)}K`:String(e)}function Se({panel:e}){let t=!0,n,r=0,i,a=-1/0,o=-1/0,s,c=()=>e.querySelector(`agent-interface .overflow-y-auto`),l=e=>e.scrollHeight-e.scrollTop-e.clientHeight<=80,u=t=>{e.querySelector(`agent-interface`)?.setAutoScroll?.(t)},d=()=>{let e=Math.max(a,o);return window.performance.now()-e<=500},f=()=>{n!==void 0&&(window.cancelAnimationFrame(n),n=void 0),t=!1,u(!1)},p=()=>{a=window.performance.now(),f()},m=()=>{o=window.performance.now()},h=()=>{let e=c();!e||!t||(e.scrollTop=e.scrollHeight,r=e.scrollTop)},g=()=>{n===void 0&&(n=window.requestAnimationFrame(()=>{n=void 0,h(),window.requestAnimationFrame(h)}))},_=()=>{t=!0,u(!0),g()},v=()=>{let e=c();if(!e)return;let n=e.scrollTop,i=n<r-1,a=i&&d();if(i&&t&&!a&&!l(e)){r=n,g();return}a?f():l(e)&&(t=!0,u(!0)),r=n},y=e=>{e.deltaY<0&&p()},b=e=>{e.target===e.currentTarget&&m()},x=e=>{(e.key===`ArrowUp`||e.key===`PageUp`||e.key===`Home`)&&p()},S=e=>{i=e.touches[0]?.clientY},C=e=>{let t=e.touches[0]?.clientY;t===void 0||i===void 0||(t>i+1&&p(),i=t)};return{get isEnabled(){return t},enable:_,disable:f,scheduleScrollToBottom:g,setup:()=>{let n=c();if(!n||s)return;r=n.scrollTop,n.addEventListener(`scroll`,v,{passive:!0}),n.addEventListener(`wheel`,y,{passive:!0}),n.addEventListener(`pointerdown`,b,{passive:!0}),n.addEventListener(`keydown`,x),n.addEventListener(`touchstart`,S,{passive:!0}),n.addEventListener(`touchmove`,C,{passive:!0}),s=new ResizeObserver(()=>{t&&g()}),s.observe(n);let i=n.querySelector(`.max-w-3xl`);i&&s.observe(i);let a=e.querySelector(`.quickforge-composer-dock`);a&&s.observe(a),_()},cleanup:()=>{let e=c();e?.removeEventListener(`scroll`,v),e?.removeEventListener(`wheel`,y),e?.removeEventListener(`pointerdown`,b),e?.removeEventListener(`keydown`,x),e?.removeEventListener(`touchstart`,S),e?.removeEventListener(`touchmove`,C),s?.disconnect(),s=void 0,n!==void 0&&(window.cancelAnimationFrame(n),n=void 0)}}}function Ce({panel:e,getCustomCommands:t,restoreDraftIntoComposer:n}){let r=e=>`/${e.name}${e.argumentHint?` ${e.argumentHint}`:``}`,i=()=>[{name:`plan`,description:f(`planCommandDescription`),argumentHint:`[task]`},{name:`review`,description:f(`reviewCommandDescription`),argumentHint:`[scope]`},{name:`compact`,description:f(`compactCommandDescription`),argumentHint:``},{name:`clear`,description:f(`clearCommandDescription`),argumentHint:``}],a=()=>{let n=(e.querySelector(`.quickforge-command-suggestions`)?.querySelector(`.quickforge-command-suggestion-item`))?.dataset.quickforgeCommandName;if(n)return[...i(),...t()].find(e=>e.name===n)},o=()=>{let t=e.querySelector(`.quickforge-command-suggestions`);t?.__quickforgeDismissHandler&&(document.removeEventListener(`pointerdown`,t.__quickforgeDismissHandler,!0),t.__quickforgeDismissHandler=void 0),t?.remove()},s=t=>{let r=e.querySelector(`message-editor`),i=`/${t.name}${t.argumentHint?` `:``}`;n({text:i,attachments:[]});let a=r?.querySelector(`textarea`);a?.focus(),a&&(a.selectionStart=i.length,a.selectionEnd=i.length),o()};return{update:n=>{let a=e.querySelector(`message-editor`),c=n??a?.value??a?.querySelector(`textarea`)?.value??``,l=a?.querySelector(`textarea`),u=e.querySelector(`.quickforge-command-suggestions`);if(!a||!l||!c.startsWith(`/`)){u?.remove();return}let d=c.slice(1).trim().toLowerCase(),p=t(),m=[...i(),...p].filter(e=>e.name.includes(d)||e.description?.toLowerCase().includes(d));if(m.length===0){u?.remove();return}let h=u??document.createElement(`div`);h.className=`quickforge-command-suggestions`,h.setAttribute(`role`,`listbox`),h.innerHTML=``;let g=document.createElement(`div`);g.className=`quickforge-command-suggestions-header`,g.textContent=f(p.length?`customCommandsHint`:`customCommandsEmptyHint`),h.append(g);for(let e of m){let t=document.createElement(`button`);t.type=`button`,t.className=`quickforge-command-suggestion-item`,t.dataset.quickforgeCommandName=e.name,t.setAttribute(`role`,`option`),t.innerHTML=`
86
- <span class="quickforge-command-suggestion-name"></span>
87
- <span class="quickforge-command-suggestion-description"></span>
88
- `,t.querySelector(`.quickforge-command-suggestion-name`).textContent=r(e),t.querySelector(`.quickforge-command-suggestion-description`).textContent=e.description??``,t.onpointerdown=t=>{t.preventDefault(),t.stopPropagation(),s(e)},h.append(t)}u||a.parentElement?.insertBefore(h,a),h.__quickforgeDismissHandler||(h.__quickforgeDismissHandler=e=>{h.contains(e.target)||a.contains(e.target)||o()},document.addEventListener(`pointerdown`,h.__quickforgeDismissHandler,!0))},remove:o,setupTextareaHandler:e=>{let t=e?.querySelector(`textarea`);if(!t)return;let n=t;n.__quickforgeCommandCompleteHandler&&n.removeEventListener(`keydown`,n.__quickforgeCommandCompleteHandler,!0),n.__quickforgeCommandCompleteHandler=t=>{if(t.isComposing||t.key===`Process`)return;if(t.key===`Enter`&&t.shiftKey){t.stopImmediatePropagation();return}if(t.key!==`Tab`||!(e?.value??n.value??``).startsWith(`/`)||t.shiftKey)return;let r=a();r&&(t.preventDefault(),t.stopPropagation(),s(r))},n.addEventListener(`keydown`,n.__quickforgeCommandCompleteHandler,!0)},cleanupTextareaHandler:()=>{let t=e.querySelector(`message-editor textarea`);t?.__quickforgeCommandCompleteHandler&&t.removeEventListener(`keydown`,t.__quickforgeCommandCompleteHandler,!0)}}}var we={plugin:`
89
- <svg viewBox="0 0 20 20" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round">
90
- <path d="M7.4 3.2h5.2a1.2 1.2 0 0 1 1.2 1.2v2.1h.9a2.1 2.1 0 1 1 0 4.2h-.9v2.1a1.2 1.2 0 0 1-1.2 1.2h-2.1v.7a2.1 2.1 0 1 1-4.2 0V14H4.4a1.2 1.2 0 0 1-1.2-1.2V9.9h.8a1.8 1.8 0 1 0 0-3.6h-.8V4.4a1.2 1.2 0 0 1 1.2-1.2h2.1v-.8a1.8 1.8 0 1 1 3.6 0v.8Z" />
91
- </svg>`,document:`
92
- <svg viewBox="0 0 20 20" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.65" stroke-linecap="round" stroke-linejoin="round">
93
- <path d="M5.4 2.8h6.1L15.8 7v10.2H5.4z" />
94
- <path d="M11.4 2.9V7h4.1" />
95
- <path d="M7.6 10.2h5" />
96
- <path d="M7.6 13h4.3" />
97
- </svg>`,spreadsheet:`
98
- <svg viewBox="0 0 20 20" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.65" stroke-linecap="round" stroke-linejoin="round">
99
- <rect x="3.4" y="4" width="13.2" height="12.2" rx="1.5" />
100
- <path d="M3.4 8h13.2" />
101
- <path d="M7.8 4v12.2" />
102
- <path d="M12.2 4v12.2" />
103
- <path d="M3.4 12h13.2" />
104
- </svg>`,presentation:`
105
- <svg viewBox="0 0 20 20" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.65" stroke-linecap="round" stroke-linejoin="round">
106
- <path d="M3 4.2h14" />
107
- <rect x="4.2" y="4.2" width="11.6" height="8.4" rx="1.2" />
108
- <path d="M10 12.6v3.2" />
109
- <path d="m7.2 17 2.8-1.2 2.8 1.2" />
110
- <path d="M7.1 9.5 9 7.7l1.5 1.3 2.4-2.5" />
111
- </svg>`,skill:`
112
- <svg viewBox="0 0 20 20" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round">
113
- <path d="M4.2 3.2h4.4A2.4 2.4 0 0 1 11 5.6v11a2.4 2.4 0 0 0-2.4-2.4H4.2V3.2Z" />
114
- <path d="M11 5.6a2.4 2.4 0 0 1 2.4-2.4h2.4v11.1h-2.4A2.4 2.4 0 0 0 11 16.7" />
115
- </svg>`,tool:`
116
- <svg viewBox="0 0 20 20" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
117
- <path d="M12.8 3.5a4.2 4.2 0 0 0 4 5.5l-7.6 7.6a2.2 2.2 0 0 1-3.1-3.1l7.6-7.6a4.2 4.2 0 0 0-5.5-4" />
118
- </svg>`,command:`
119
- <svg viewBox="0 0 20 20" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
120
- <path d="m5 6 4 4-4 4" />
121
- <path d="M10.5 14h4.5" />
122
- </svg>`};function Te(e){return e.split(/[-_/\\]+/).filter(Boolean).map(e=>e&&`${e[0].toUpperCase()}${e.slice(1)}`).join(` `)}function Ee(e){switch(e.name){case`openai-documents`:return{label:f(`pluginOpenaiDocumentsName`),description:f(`pluginOpenaiDocumentsDescription`),mention:`Documents`,iconKind:`document`};case`openai-spreadsheets`:return{label:f(`pluginOpenaiSpreadsheetsName`),description:f(`pluginOpenaiSpreadsheetsDescription`),mention:`Spreadsheets`,iconKind:`spreadsheet`};case`openai-presentations`:return{label:f(`pluginOpenaiPresentationsName`),description:f(`pluginOpenaiPresentationsDescription`),mention:`Presentations`,iconKind:`presentation`};default:return null}}function De(e){let t=Ee(e);return t?t.label:(e.displayName||Te(e.name.replace(/^openai-/,``))).replace(/^OpenAI\s+/i,``)}function Oe(e){let t=Ee(e),n=t?.label??De(e),r=t?.mention??n.replace(/\s+/g,``);return[{type:`plugin`,iconKind:t?.iconKind??`plugin`,pluginName:e.name,name:e.name,label:n,mention:r,insertText:r,description:t?.description??e.description}]}function ke(e,t){let n=e.slice(0,t),r=/(^|\s)@([^\s@]*)$/.exec(n);if(!r)return null;let i=r[1]?.length??0;return{start:n.length-r[0].length+i,end:t,query:r[2]??``}}function Ae(e){let t=new Set,n=/(^|\s)@([\p{L}\p{N}_-]+)/gu,r;for(;r=n.exec(e);)t.add((r[2]||``).toLowerCase());return t}function je({panel:e,restoreDraftIntoComposer:t,onSelectionChange:n}){let r=[],i=null,a=new Map,o=()=>n?.([...a.values()]),s=()=>i||(i=y().then(e=>{r=(e.plugins??[]).filter(e=>e.enabled&&e.status===`loaded`)}).catch(()=>{r=[]}).finally(()=>{i=null}),i);s();let c=()=>r.flatMap(Oe),l=()=>{let t=(e.querySelector(`.quickforge-capability-suggestions`)?.querySelector(`.quickforge-capability-suggestion-item`))?.dataset.quickforgeCapabilityKey;if(t)return c().find(e=>Me(e)===t)},u=()=>{let t=e.querySelector(`.quickforge-capability-suggestions`);t?.__quickforgeDismissHandler&&(document.removeEventListener(`pointerdown`,t.__quickforgeDismissHandler,!0),t.__quickforgeDismissHandler=void 0),t?.remove()},d=(n,r)=>{let i=e.querySelector(`message-editor`),s=i?.querySelector(`textarea`),c=i?.value??s?.value??``,l=s?.selectionStart??c.length,d=r??ke(c,l),f=`@${n.insertText}`,p=d?`${c.slice(0,d.start)}${f} ${c.slice(d.end)}`:`${c}${c.endsWith(` `)||c.length===0?``:` `}${f} `,m=d?d.start+f.length+1:p.length;a.set(Me(n),n),o(),t({text:p,attachments:i?.attachments?[...i.attachments]:[]});let h=i?.querySelector(`textarea`);h?.focus(),h&&(h.selectionStart=m,h.selectionEnd=m),u()},p=e=>{let t=()=>{let t=c().find(t=>t.insertText===e);t&&d(t)};if(r.length===0){s().then(t);return}t()},m=t=>{let n=e.querySelector(`message-editor`),i=n?.querySelector(`textarea`),a=t??n?.value??i?.value??``,o=ke(a,i?.selectionStart??a.length),l=e.querySelector(`.quickforge-capability-suggestions`);if(!n||!i||!o){l?.remove();return}r.length===0&&s().then(()=>m(t));let p=o.query.toLowerCase(),h=c().filter(e=>[e.label,e.name,e.pluginName,e.description].filter(Boolean).join(` `).toLowerCase().includes(p)).slice(0,8);if(h.length===0){l?.remove();return}let g=l??document.createElement(`div`);g.className=`quickforge-capability-suggestions`,g.setAttribute(`role`,`listbox`),g.innerHTML=``;let _=document.createElement(`div`);_.className=`quickforge-capability-suggestions-header`,_.textContent=f(`pluginMentionHeader`),g.append(_);for(let e of h){let t=document.createElement(`button`);t.type=`button`,t.className=`quickforge-capability-suggestion-item`,t.dataset.quickforgeCapabilityKey=Me(e),t.dataset.quickforgePluginName=e.pluginName,t.setAttribute(`role`,`option`),t.innerHTML=`
123
- <span class="quickforge-capability-suggestion-icon quickforge-capability-suggestion-icon-${e.iconKind}">${we[e.iconKind]}</span>
124
- <span class="quickforge-capability-suggestion-main">
125
- <span class="quickforge-capability-suggestion-line">
126
- <span class="quickforge-capability-suggestion-name"></span>
127
- </span>
128
- <span class="quickforge-capability-suggestion-description"></span>
129
- </span>
130
- `,t.querySelector(`.quickforge-capability-suggestion-name`).textContent=e.label,t.querySelector(`.quickforge-capability-suggestion-description`).textContent=e.description??e.pluginName,t.onpointerdown=t=>{t.preventDefault(),t.stopPropagation(),d(e,o)},g.append(t)}l||n.parentElement?.insertBefore(g,n),g.__quickforgeDismissHandler||(g.__quickforgeDismissHandler=e=>{g.contains(e.target)||n.contains(e.target)||u()},document.addEventListener(`pointerdown`,g.__quickforgeDismissHandler,!0))};return{update:m,remove:u,setupTextareaHandler:e=>{let t=e?.querySelector(`textarea`);if(!t)return;let n=t;n.__quickforgeCapabilityCompleteHandler&&n.removeEventListener(`keydown`,n.__quickforgeCapabilityCompleteHandler,!0),n.__quickforgeCapabilityCompleteHandler=t=>{if(t.isComposing||t.key===`Process`)return;if(t.key===`Escape`){u();return}if(t.key!==`Tab`&&t.key!==`Enter`)return;let r=e?.value??n.value??``,i=ke(r,n.selectionStart??r.length);if(!i||t.shiftKey)return;let a=l();a&&(t.preventDefault(),t.stopPropagation(),t.stopImmediatePropagation(),d(a,i))},n.addEventListener(`keydown`,n.__quickforgeCapabilityCompleteHandler,!0)},cleanupTextareaHandler:()=>{let t=e.querySelector(`message-editor textarea`);t?.__quickforgeCapabilityCompleteHandler&&t.removeEventListener(`keydown`,t.__quickforgeCapabilityCompleteHandler,!0)},consumeSelectedCapabilities:e=>{let t=Ae(e),n=[...a.values()].filter(e=>t.has(e.mention.toLowerCase())),r=c().filter(e=>t.has(e.insertText.toLowerCase())||t.has(e.label.replace(/\s+/g,``).toLowerCase())),i=new Map;for(let e of[...n,...r])i.set(Me(e),e);return a=new Map,o(),[...i.values()].slice(0,4)},insertBuiltinPluginMention:p}}function Me(e){return`${e.type}:${e.pluginName}:${e.name}`}var Ne=i();function Pe(e){return`hsl(${Math.round(142-142*Math.min(100,Math.max(0,e))/100)} 72% 45%)`}function Fe(e,t){let n=Number(e.inputTokens)||0,r=Math.max(0,Number(e.knownInputTokens)||0),i=Math.max(0,Number(e.estimatedInputTokens)||0),a=Math.max(0,Number(e.reservedOutputTokens)||0),o=Math.max(0,Number(e.totalTokens)||n+a),s=Number.isFinite(Number(e.percent))?Number(e.percent):0,c=e.inputTokenSource??(r>0?`provider`:`estimated`);return{contextWindow:Math.max(0,Number(e.contextWindow)||t),usedTokens:Math.max(0,Number(e.usedTokens)||n),totalTokens:o,inputTokens:n,estimatedInputTokens:i,inputTokenSource:c,reservedOutputTokens:a,percent:s,color:e.color||Pe(s)}}function Ie(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`)}function Le(e,t){if(!t){e.removeAttribute(`role`),e.removeAttribute(`tabindex`),e.style.cursor=``;return}e.setAttribute(`role`,`button`),e.tabIndex=0,e.style.cursor=`pointer`,!e.dataset.quickforgeGitBranchBound&&(e.dataset.quickforgeGitBranchBound=`true`,e.addEventListener(`click`,e=>{e.preventDefault(),e.stopPropagation(),t()}),e.addEventListener(`keydown`,e=>{e.key!==`Enter`&&e.key!==` `||(e.preventDefault(),e.stopPropagation(),t())}))}var Re=(0,Ne.renderToStaticMarkup)((0,b.createElement)(t,{size:13,strokeWidth:2,"aria-hidden":!0,style:{flex:`0 0 auto`}}));function ze({panel:e,getSystemPrompt:t,getMessages:n,getContextWindow:r,getTools:i,getMaxTokens:a,getEffectiveMessages:o,getServerContextUsage:s,getGitBranch:c,onGitBranchClick:l,renderInline:u=!0,onDisplayChange:d}){return{update:()=>{let f=r(),p=n(),m=o?.()??p,h=e.querySelector(`.quickforge-context-usage`),g=e.querySelector(`.quickforge-context-usage-label`),_=e.querySelector(`.quickforge-git-branch-inline`),v=u?e.querySelector(`message-editor`)?.parentElement?.querySelector(`.ml-auto.items-center`):null,y=c?.()?.trim()||void 0,b={gitBranch:y};if(!u)_?.remove(),h?.remove(),g?.remove();else if(y&&v){let e=`${Re}<span style="max-width: 8rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">${Ie(y)}</span>`,t=`Git branch: ${y}`;if(_)_.dataset.quickforgeGitBranch!==y&&(_.innerHTML=e,_.dataset.quickforgeGitBranch=y),_.title=t,_.setAttribute(`aria-label`,t),Le(_,l);else{let n=document.createElement(`span`);n.className=`quickforge-git-branch-inline`,n.dataset.quickforgeGitBranch=y,n.title=t,n.setAttribute(`aria-label`,t),n.innerHTML=e,n.style.cssText=[`display: inline-flex`,`align-items: center`,`gap: 0.25rem`,`max-width: 10rem`,`color: hsl(var(--muted-foreground))`,`font-size: 12px`,`line-height: 1`,`font-weight: 500`].join(`;`),Le(n,l),v.prepend(n)}}else _?.remove();if(!f)return u&&(h?.remove(),g?.remove()),d?.(b),b;let x=s?.(),S=m.length>0,C=x?Fe(x,f):S?xe(t(),m,f,i?.()??[],a?.()):{contextWindow:f,usedTokens:0,totalTokens:0,inputTokens:0,estimatedInputTokens:0,inputTokenSource:`estimated`,reservedOutputTokens:0,percent:0,color:`hsl(142 72% 45%)`},w=C.contextWindow||f,T=m!==p,E=C.inputTokenSource===`provider`?`provider input`:`estimated input`,D=`Context used: ${C.percent}% (${X(C.totalTokens)} / ${X(w)} tokens, ${E} ${X(C.inputTokens)}, estimated input ${X(C.estimatedInputTokens)}, reserved output ${X(C.reservedOutputTokens)}${x?`, server calculated`:``}${T?`, compacted model context`:``})`;if(b.context={percent:C.percent,color:C.color,label:`${C.percent}% · ${X(C.totalTokens)} / ${X(w)} tokens`,title:D},d?.(b),!u||!v)return h?.remove(),g?.remove(),b;let O=Math.min(100,Math.max(0,C.percent)),k=`conic-gradient(${C.color} ${O*3.6}deg, rgb(229 231 235) 0deg)`,A=h??document.createElement(`span`);A.className=`quickforge-context-usage`,A.title=D,A.setAttribute(`aria-label`,D),A.style.cssText=[`position: relative`,`display: inline-flex`,`width: 14px`,`height: 14px`,`flex: 0 0 auto`,`border-radius: 9999px`,`background: ${k}`,`vertical-align: middle`,`box-shadow: 0 0 0 1px rgb(0 0 0 / 0.06)`].join(`;`);let j=A.firstElementChild;j||(j=document.createElement(`span`),A.append(j)),j.style.cssText=[`position: absolute`,`inset: 3px`,`border-radius: 9999px`,`background: hsl(var(--background))`].join(`;`);let M=A.nextElementSibling;return M?.classList.contains(`quickforge-context-usage-label`)||(M=document.createElement(`span`),M.className=`quickforge-context-usage-label`,M.style.cssText=`color: hsl(var(--muted-foreground)); font-size: 12px; line-height: 1;`),M.textContent=`${C.percent}%`,M.title=D,M.setAttribute(`aria-label`,D),h?A.nextElementSibling!==M&&A.after(M):(v.prepend(M),v.prepend(A)),b}}}var Be=`<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg>`,Ve=`<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg>`,He=`<svg xmlns="http://www.w3.org/2000/svg" width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 14 4 9l5-5"/><path d="M4 9h10.5a5.5 5.5 0 0 1 0 11H11"/></svg>`,Ue=`<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="18" r="3"/><circle cx="6" cy="6" r="3"/><circle cx="18" cy="6" r="3"/><path d="M18 9v1a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2V9"/><path d="M12 12v3"/></svg>`,We=`<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polygon points="6 3 20 12 6 21 6 3"/></svg>`,Ge=`<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 2v6h-6"/><path d="M3 12a9 9 0 0 1 15.36-5.64L21 9"/><path d="M3 22v-6h6"/><path d="M21 12a9 9 0 0 1-15.36 5.64L3 15"/></svg>`,Ke=`<svg class="quickforge-plan-mode-icon" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 6h1"/><path d="M4 12h1"/><path d="M4 18h1"/><path d="M9 6h11"/><path d="M9 12h11"/><path d="M9 18h11"/></svg>`,qe=`<svg class="quickforge-plan-remove-icon" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>`,Je=`<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 5v14"/><path d="M5 12h14"/></svg>`,Ye=`<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"/></svg>`,Xe=`<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7.5 4.5h5a1.5 1.5 0 0 1 1.5 1.5v2h1a2.5 2.5 0 0 1 0 5h-1v2a1.5 1.5 0 0 1-1.5 1.5h-2v1a2.5 2.5 0 0 1-5 0v-1h-2A1.5 1.5 0 0 1 2 15.5v-3h1a2 2 0 1 0 0-4H2v-2A1.5 1.5 0 0 1 3.5 5h2v-1a2.5 2.5 0 0 1 5 0v.5Z"/></svg>`,Ze=`<svg viewBox="0 0 20 20" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.65" stroke-linecap="round" stroke-linejoin="round"><path d="M5.4 2.8h6.1L15.8 7v10.2H5.4z"/><path d="M11.4 2.9V7h4.1"/><path d="M7.6 10.2h5"/><path d="M7.6 13h4.3"/></svg>`,Qe=`<svg viewBox="0 0 20 20" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.65" stroke-linecap="round" stroke-linejoin="round"><rect x="3.4" y="4" width="13.2" height="12.2" rx="1.5"/><path d="M3.4 8h13.2"/><path d="M7.8 4v12.2"/><path d="M12.2 4v12.2"/><path d="M3.4 12h13.2"/></svg>`,$e=`<svg viewBox="0 0 20 20" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.65" stroke-linecap="round" stroke-linejoin="round"><path d="M3 4.2h14"/><rect x="4.2" y="4.2" width="11.6" height="8.4" rx="1.2"/><path d="M10 12.6v3.2"/><path d="m7.2 17 2.8-1.2 2.8 1.2"/><path d="M7.1 9.5 9 7.7l1.5 1.3 2.4-2.5"/></svg>`;function et(e,t,n){let r=f(`copied`),i=Number(e.dataset.quickforgeCopyFeedbackTimer);i&&window.clearTimeout(i),U(e,Ve),e.title=r,e.setAttribute(`aria-label`,r),e.style.color=`rgb(5 150 105)`;let a=window.setTimeout(()=>{U(e,n),e.title=t,e.setAttribute(`aria-label`,t),e.style.color=``,delete e.dataset.quickforgeCopyFeedbackTimer},1200);e.dataset.quickforgeCopyFeedbackTimer=String(a)}function tt(e,t,n,r){let i=document.createElement(`button`);return i.type=`button`,i.dataset.quickforgeAction=e,i.title=t,i.setAttribute(`aria-label`,t),U(i,n),i.className=`pointer-events-auto inline-flex size-7 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-transparent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40`,i.onclick=e=>{e.stopPropagation(),r(i)},i}function nt(e){e.querySelectorAll(`.quickforge-rollback-popover`).forEach(e=>{e.quickforgeCleanup?.(),(e.closest(`.quickforge-rollback-action`)?.querySelector(`button[data-quickforge-action="rollback"]`))?.setAttribute(`aria-expanded`,`false`),e.remove()})}function rt(e){let{panel:t,button:n,messageIndex:r,title:i,description:a,onConfirm:o}=e,s=n.closest(`.quickforge-rollback-action`);if(!s||n.disabled)return;if(s.querySelector(`.quickforge-rollback-popover`)){nt(t);return}nt(t);let c=document.createElement(`div`);c.className=`quickforge-rollback-popover`,c.setAttribute(`role`,`dialog`),c.setAttribute(`aria-label`,i),c.tabIndex=-1;let l=document.createElement(`div`);l.className=`quickforge-rollback-popover-arrow`;let u=document.createElement(`div`);u.className=`quickforge-rollback-popover-title`,u.textContent=i;let d=document.createElement(`div`);d.className=`quickforge-rollback-popover-description`,d.textContent=a;let p=document.createElement(`div`);p.className=`quickforge-rollback-popover-footer`;let m=document.createElement(`button`);m.type=`button`,m.className=`quickforge-rollback-popover-cancel`,m.textContent=f(`cancel`);let h=document.createElement(`button`);h.type=`button`,h.className=`quickforge-rollback-popover-confirm`,h.textContent=f(`confirmRollback`),p.append(m,h),c.append(l,u,d,p);let g=()=>nt(t),_=e=>{let t=e.target;!t||c.contains(t)||n.contains(t)||g()},v=e=>{e.key===`Escape`&&(e.preventDefault(),g())};c.quickforgeCleanup=()=>{document.removeEventListener(`pointerdown`,_,!0),document.removeEventListener(`keydown`,v)},c.addEventListener(`pointerdown`,e=>e.stopPropagation()),c.addEventListener(`click`,e=>e.stopPropagation()),m.addEventListener(`click`,g),h.addEventListener(`click`,async()=>{h.disabled=!0,m.disabled=!0,h.textContent=f(`rollingBack`);try{await o(r)}finally{g()}}),s.append(c),n.setAttribute(`aria-expanded`,`true`),document.addEventListener(`pointerdown`,_,!0),document.addEventListener(`keydown`,v),window.requestAnimationFrame(()=>h.focus())}function it(e){let t=document.createElement(`span`);t.className=`quickforge-rollback-action`;let n=tt(`rollback`,f(`rollback`),He,t=>{rt({panel:e.panel,button:t,messageIndex:e.messageIndex,title:e.title,description:e.description,onConfirm:e.onConfirm})});return n.disabled=e.isDisabled,n.setAttribute(`aria-haspopup`,`dialog`),n.setAttribute(`aria-expanded`,`false`),t.append(n),t}var at=new Set([`bash`,`sh`,`shell`,`zsh`,`fish`,`cmd`,`bat`,`batch`,`powershell`,`ps1`,`terminal`,`console`]),ot=/\b(rm\s+-rf|sudo|chmod\b|chown\b|npm\s+publish|pnpm\s+publish|yarn\s+publish|git\s+push|curl\b[^\n|;]*\|\s*(sh|bash)|wget\b[^\n|;]*\|\s*(sh|bash))\b/i;function st(e){return e.role===`user`||e.role===`user-with-attachments`||e.role===`assistant`}function ct(e){return e.role===`user`||e.role===`user-with-attachments`}function lt(e){return e.role===`assistant`?v(e).trim().length>0:!1}function ut(e){return e.querySelector(`message-list`)}function dt(e){let t=ut(e);return t?Array.from(t.querySelectorAll(`user-message, assistant-message`)).filter(e=>e.closest(`message-list`)===t):[]}function ft(e){if(typeof e.getDecodedCode==`function`)try{return e.getDecodedCode()}catch{}let t=typeof e.code==`string`?e.code:e.getAttribute(`code`)??``;if(!t)return``;try{return decodeURIComponent(escape(window.atob(t)))}catch{return t}}function pt(e){return e.replace(/\r\n/g,`
131
- `).split(`
132
- `).map(e=>e.replace(/^\s*\$\s+/,``).replace(/^\s*>\s+/,``).replace(/^\s*PS\s+[^>\n]+>\s+/i,``)).join(`
133
- `).trim()}function mt(e){return e.split(`
134
- `).map(e=>e.trim()).filter(Boolean).length}function ht(e){let t=String(e.language??e.getAttribute(`language`)??``).trim().toLowerCase();return at.has(t)}function gt(e,t){e.querySelectorAll(`assistant-message markdown-block code-block`).forEach(e=>{let n=e.querySelector(`[data-quickforge-action="execute-markdown-command"]`);if(!ht(e)){n?.remove(),delete e.dataset.quickforgeCommand;return}let r;if(n&&e.dataset.quickforgeCommand!==void 0){if(n.disabled===t)return;r=e.dataset.quickforgeCommand}else r=pt(ft(e));if(!r){n?.remove(),delete e.dataset.quickforgeCommand;return}e.dataset.quickforgeCommand=r;let i=f(`executeInTerminal`),a=n??tt(`execute-markdown-command`,i,We,()=>{let t=pt(ft(e));t&&window.dispatchEvent(new CustomEvent(`quickforge:execute-markdown-command`,{detail:{command:t,confirm:mt(t)>1,dangerous:ot.test(t)}}))});if(a.title=i,a.setAttribute(`aria-label`,i),a.disabled=t,a.className=`pointer-events-auto inline-flex size-8 items-center justify-center rounded-md text-emerald-600 transition-colors hover:bg-emerald-500/10 hover:text-emerald-700 disabled:cursor-not-allowed disabled:opacity-40 dark:text-emerald-400 dark:hover:text-emerald-300`,!n){let t=e.querySelector(`:scope > div > div:first-child`),n=t?.querySelector(`copy-button`);if(t&&n){let e=document.createElement(`div`);e.className=`flex items-center gap-1`,n.before(e),e.appendChild(n),e.appendChild(a)}}})}function _t(e,t,n,r){let i=dt(e),a=0;for(let e=0;e<t.length;e++)if(st(t[e])){if(e===n){let e=i[a];if(e){r.nextElementSibling!==e&&e.before(r);return}break}a+=1}let o=e.querySelector(`message-list`);o&&o.firstElementChild!==r&&o.prepend(r)}function vt(e){let t=e,n=t?.role===`assistant`?v(t):m(t);return(n.match(/<compact_summary>\s*([\s\S]*?)\s*<\/compact_summary>/i)?.[1]??n).trim()}function yt(e,t,n=!1){let r=e.querySelector(`.quickforge-context-compaction-details`),i=e.querySelector(`.quickforge-context-compaction-summary`),a=e.querySelector(`.quickforge-context-compaction-toggle-label`),o=e.querySelector(`[data-quickforge-action="copy-compact-summary"]`);r&&(r.open=n);let s=()=>{a&&r&&(a.textContent=r.open?f(`contextCompactedHideSummary`):f(`contextCompactedViewSummary`))};i&&!i.dataset.quickforgeCompactionBound&&(i.dataset.quickforgeCompactionBound=`true`,i.addEventListener(`click`,e=>{e.preventDefault(),e.stopPropagation(),r&&(r.open=!r.open,s())})),r&&!r.dataset.quickforgeCompactionBound&&(r.dataset.quickforgeCompactionBound=`true`,r.addEventListener(`toggle`,s)),s(),o&&(o.onclick=async e=>{e.preventDefault(),e.stopPropagation(),await p(t),et(o,f(`contextCompactedCopySummary`),Be)})}function bt(e){let{panel:t,getMessages:n,getContextCompaction:r}=e,i=r(),a=n(),o=t.querySelector(`.quickforge-context-compaction-notice`);if(!i||a.length===0){o?.remove();return}let s=Math.min(a.length,Math.max(0,Number(i.compactedUpToIndex)||0));if(s<=0){o?.remove();return}let c=i.summaryMessage?vt(i.summaryMessage):``,l=o?.querySelector(`.quickforge-context-compaction-details`)?.open??!1,u=o??document.createElement(`div`),d=u.dataset.summaryText??``,p=u.dataset.hasSummary===`true`,m=!o||d!==c||p!==!!c;u.className=`quickforge-context-compaction-notice`,u.dataset.tailStart=String(s),u.dataset.summaryText=c,u.dataset.hasSummary=String(!!c),u.title=f(`contextCompactedTooltip`),u.setAttribute(`aria-label`,f(`contextCompactedTooltip`)),m&&(u.innerHTML=c?`
135
- <details class="quickforge-context-compaction-details">
136
- <summary class="quickforge-context-compaction-summary">
137
- <div class="quickforge-context-compaction-line"></div>
138
- <div class="quickforge-context-compaction-pill">
139
- <span class="quickforge-context-compaction-dot" aria-hidden="true"></span>
140
- <span><strong>${$(f(`contextCompactedLabel`))}</strong> · ${$(f(`contextCompactedTimelineLabel`))} · <span class="quickforge-context-compaction-toggle-label"></span></span>
141
- </div>
142
- <div class="quickforge-context-compaction-line"></div>
143
- </summary>
144
- <div class="quickforge-context-compaction-card">
145
- <div class="quickforge-context-compaction-card-header">
146
- <span>${$(f(`contextCompactedSummaryTitle`))}</span>
147
- <button type="button" class="quickforge-context-compaction-copy" data-quickforge-action="copy-compact-summary">${Be}<span>${$(f(`contextCompactedCopySummary`))}</span></button>
148
- </div>
149
- <pre class="quickforge-context-compaction-text">${$(c)}</pre>
150
- </div>
151
- </details>
152
- `:`
153
- <div class="quickforge-context-compaction-summary" role="separator">
154
- <div class="quickforge-context-compaction-line"></div>
155
- <div class="quickforge-context-compaction-pill">
156
- <span class="quickforge-context-compaction-dot" aria-hidden="true"></span>
157
- <span><strong>${$(f(`contextCompactedLabel`))}</strong> · ${$(f(`contextCompactedTimelineLabel`))}</span>
158
- </div>
159
- <div class="quickforge-context-compaction-line"></div>
160
- </div>
161
- `),c&&yt(u,c,l),_t(t,a,s,u)}var xt=`.quickforge-assistant-waiting`;function St(e){e.querySelectorAll(xt).forEach(e=>e.remove())}function Ct(e){let t=e.querySelectorAll(`thinking-block, tool-message`);for(let e of t)if(!e.closest(`.quickforge-process-body`))return!0;let n=e.querySelectorAll(`markdown-block, code-block`);for(let e of n)if(!e.closest(`.quickforge-process-body`)&&(e.textContent??``).trim().length>0)return!0;let r=e.cloneNode(!0);return r.querySelectorAll(`.quickforge-message-actions`).forEach(e=>e.remove()),r.querySelectorAll(`.quickforge-process-body`).forEach(e=>e.remove()),(r.textContent??``).trim().length>0}function wt(e){let{panel:t,getMessages:n,isStreaming:r,isActive:i}=e,a=t.querySelector(xt);if(!r()||!i)return St(t),!1;let o=ut(t),s=n(),c=s.map((e,t)=>({message:e,index:t})).filter(({message:e})=>st(e)),l=(()=>{for(let e=c.length-1;e>=0;e--)if(ct(c[e].message))return e;return-1})();if(!o||l<0)return a?.remove(),!1;let u=c[l],d=s.slice(u.index+1).some(lt),p=dt(t),m=p[l],h=p.slice(l+1).some(e=>e.matches(`assistant-message`)&&Ct(e));if(!m||d||h)return a?.remove(),!1;let g=a??document.createElement(`div`);return g.className=`quickforge-assistant-waiting`,g.setAttribute(`role`,`status`),g.setAttribute(`aria-live`,`polite`),g.setAttribute(`aria-label`,f(`assistantWaitingAriaLabel`)),a||(g.innerHTML=`
162
- <div class="quickforge-assistant-waiting-dots" aria-hidden="true">
163
- <span></span>
164
- <span></span>
165
- <span></span>
166
- </div>
167
- `),g.previousElementSibling!==m&&m.after(g),!0}function Tt(e){let{panel:t,getMessages:n,isStreaming:r,onCopyAnswer:i,onRollbackFromMessage:a,onRetryFromMessage:o,onForkFromMessage:s,onOpenLocalFilePath:c,disableFork:l,readOnly:u=!1,enableTerminalCommandActions:d=!0,rollbackConfirmTitle:p=f(`rollbackConfirmTitle`),rollbackConfirmDescription:h=f(`rollbackConfirm`)}=e,g=n().map((e,t)=>({message:e,index:t})).filter(({message:e})=>e.role===`user`||e.role===`user-with-attachments`||e.role===`assistant`),_=(()=>{for(let e=g.length-1;e>=0;e--)if(g[e].message.role!==`assistant`)return g[e]})(),y=dt(t),b=e=>{let t=f(`copy`);return tt(`copy`,t,Be,async n=>{let r=e();if(r)try{await i(r),et(n,t,Be)}catch{}})};y.forEach((e,i)=>{let d=g[i];if(!d)return;e.classList.add(`group`,`relative`),e.classList.toggle(`quickforge-assistant-message`,d.message.role===`assistant`),e.classList.toggle(`quickforge-user-message`,d.message.role!==`assistant`),d.message.role===`assistant`&&c&&Nt(e,d.message,c);let y=`quickforge-message-actions pointer-events-none mt-1 flex gap-1 opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100 ${d.message.role===`assistant`?`px-4 justify-start`:`mx-4 justify-end`}`,x=e.querySelector(`.quickforge-message-actions`);if(x?.dataset.quickforgeLayout===`message-bottom`){x.className=y,x.parentElement===e&&x!==e.lastElementChild&&e.append(x),u&&nt(t),x.querySelectorAll(`button[data-quickforge-action="rollback"], button[data-quickforge-action="retry"], button[data-quickforge-action="fork"]`).forEach(e=>{if(u){e.closest(`.quickforge-rollback-action`)?.remove(),e.remove();return}e.disabled=r()}),r()&&nt(t);let n=x.querySelector(`button[data-quickforge-action="retry"]`),i=!u&&_&&d.index===_.index&&d.message.role!==`assistant`;if(n&&!i)n.remove();else if(!n&&i){let e=tt(`retry`,f(`retry`),Ge,()=>{o(d.index)});e.disabled=r(),x.append(e)}return}x?.remove();let S=document.createElement(`div`);if(S.dataset.quickforgeLayout=`message-bottom`,S.className=y,d.message.role===`assistant`){let e=v(d.message);if(!e)return;let t=b(()=>{let t=n()[d.index];return t?v(t):e});if(S.append(t),!u&&!l){let e=tt(`fork`,f(`forkConversation`),Ue,()=>{s(d.index)});e.disabled=r(),S.append(e)}}else{let e=m(d.message);if(e){let t=b(()=>{let t=n()[d.index];return t?m(t):e});S.append(t)}if(!u){let e=it({panel:t,messageIndex:d.index,isDisabled:r(),title:p,description:h,onConfirm:a});S.append(e)}if(!u&&_&&d.index===_.index){let e=tt(`retry`,f(`retry`),Ge,()=>{o(d.index)});e.disabled=r(),S.append(e)}}e.append(S)}),_n(t,r()),d?gt(t,r()):t.querySelectorAll(`[data-quickforge-action="execute-markdown-command"]`).forEach(e=>e.remove())}var Et=/[A-Za-z]:[\\/][^\s"'<>`]+|(?:\/Users|\/home|\/workspace|\/mnt|\/Volumes)\/[^\s"'<>`]+/g,Dt=new Set([`.`,`,`,`;`,`:`,`!`,`?`,`)`,`]`,`}`,`>`,`。`,`,`,`;`,`:`,`!`,`?`,`)`,`】`,`》`]),Ot=[`pre`,`code`,`a`,`button`,`textarea`,`input`,`select`,`thinking-block`,`tool-message`,`.quickforge-file-path-link`,`.quickforge-message-actions`,`.quickforge-process-group`,`.quickforge-approval-card`].join(`,`);function kt(e){let t=e.length;for(;t>0&&Dt.has(e[t-1]);)--t;return{path:e.slice(0,t),suffix:e.slice(t)}}function At(e,t){let n=document.createElement(`button`);return n.type=`button`,n.className=`quickforge-file-path-link`,n.dataset.quickforgeFilePath=e,n.textContent=e,n.title=`Open file`,n.setAttribute(`aria-label`,`Open file ${e}`),n.onclick=n=>{n.preventDefault(),n.stopPropagation(),t(e)},n}function jt(e){let t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode(e){let t=e.textContent??``;if(!Et.test(t))return NodeFilter.FILTER_REJECT;Et.lastIndex=0;let n=e.parentElement;return!n||n.closest(Ot)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}}),r=n.nextNode();for(;r;)t.push(r),r=n.nextNode();return t}function Mt(e,t){let n=e.textContent??``;Et.lastIndex=0;let r,i=0,a=document.createDocumentFragment(),o=!1;for(;r=Et.exec(n);){let e=r[0],{path:s,suffix:c}=kt(e);if(!s)continue;let l=r.index,u=l+e.length;l>i&&a.append(document.createTextNode(n.slice(i,l))),a.append(At(s,t)),c&&a.append(document.createTextNode(c)),i=u,o=!0}o&&(i<n.length&&a.append(document.createTextNode(n.slice(i))),e.replaceWith(a))}function Nt(e,t,n){let r=Array.from(e.querySelectorAll(`markdown-block`)),i=r.reduce((e,t)=>e+(t.textContent?.length??0),0),a=v(t).length,o=`${String(t.timestamp??``)}:${a}:${r.length}:${i}`;e.dataset.quickforgeLocalPathSignature!==o&&(r.forEach(e=>{jt(e).forEach(e=>Mt(e,n))}),e.dataset.quickforgeLocalPathSignature=o)}var Pt=`.quickforge-process-group`,Z=`.quickforge-process-body`,Ft=`thinking-block, tool-message, streaming-message-container`,It=`thinking-block, tool-message, markdown-block, streaming-message-container`,Lt=`data-quickforge-process-final-summary`,Rt=`data-quickforge-process-folded`,zt=500,Bt=new WeakMap;function Vt(e){let t=Bt.get(e);return t||(t=new Map,Bt.set(e,t)),t}function Ht(e,t,n){let r=Vt(e);if(r.set(t,n),r.size<=zt)return;let i=r.keys().next().value;i&&r.delete(i)}function Ut(e,t){return`turn:${t}:started:${qt(e[0]?.message?.timestamp)??`unknown`}`}function Wt(e,t,n){let r=t.dataset.quickforgeProcessKey;t.dataset.quickforgeProcessKey=n;let i=Vt(e).get(n);if(i!==void 0){t.dataset.expanded=String(i);return}t.dataset.expanded=r===n&&t.dataset.expanded===`true`?`true`:`false`}function Gt(e){return!!(e&&typeof e==`object`&&!Array.isArray(e))}function Kt(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function qt(e){if(typeof e==`number`&&Number.isFinite(e))return e;if(typeof e==`string`){let t=e.trim();if(!t)return;let n=Number(t);if(Number.isFinite(n))return n;let r=Date.parse(t);return Number.isNaN(r)?void 0:r}}function Jt(e){if(!Gt(e))return;let t=e.details;if(!Gt(t))return;let n=t.quickforgeTiming;if(Gt(n))return{startedAt:Kt(n.startedAt),finishedAt:Kt(n.finishedAt),durationMs:Kt(n.durationMs)}}function Yt(e){let t=Jt(e.result);if(t?.finishedAt!==void 0)return t.finishedAt;if(t?.startedAt!==void 0&&t.durationMs!==void 0)return t.startedAt+t.durationMs}function Xt(e){return Jt(e.result)?.startedAt}function Zt(e){if(e===void 0||e<1e3)return``;let t=Math.max(1,Math.round(e/1e3)),n=Math.floor(t/60),r=t%60;return n>0?`${n}m ${r}s`:`${r}s`}function Qt(e,t,n,r){let i=r,a=[...e].reverse().find(e=>e.message?.stopReason)?.message?.stopReason,o=Array.from(t.querySelectorAll(`tool-message`)),s=[...e.map(e=>qt(e.message?.timestamp)),...o.map(Xt)].filter(e=>e!==void 0),c=o.map(Yt).filter(e=>e!==void 0),l=s.length>0?Math.min(...s):void 0,u=c.length>0?Math.max(...c):void 0;if(i)u=Date.now();else{let e=qt(n.dataset.quickforgeFinishedAt);e!==void 0&&e>0?u=e:(u??=Date.now(),n.dataset.quickforgeFinishedAt=String(u))}let d=l!==void 0&&u!==void 0?Zt(Math.max(0,u-l)):``,p=f(a===`error`?`processFailed`:a===`aborted`?`processAborted`:i?`processing`:`processed`);return d?`${p} ${d}`:p}function $t(e){let t=e.querySelector(`${It}, ${Pt}`);return t?.closest(`.px-4.flex.flex-col`)??t?.parentElement??null}function en(){let e=document.createElement(`div`);e.className=`quickforge-process-group`,e.dataset.expanded=`false`;let t=document.createElement(`button`);t.type=`button`,t.className=`quickforge-process-summary`,t.innerHTML=`
168
- <span class="quickforge-process-label"></span>
169
- <span class="quickforge-process-chevron" aria-hidden="true">
170
- <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m9 18 6-6-6-6"/></svg>
171
- </span>
172
- `;let n=document.createElement(`div`);return n.className=`quickforge-process-body`,e.append(t,n),e}function tn(e){let t=e.querySelector(Pt);if(t)return t;let n=$t(e);if(!n)return null;let r=en();return n.insertBefore(r,n.firstElementChild),r}function nn(e,t,n,r,i){Wt(e,r,t);let a=r.querySelector(Z),o=r.querySelector(`.quickforge-process-summary`),s=r.querySelector(`.quickforge-process-label`);if(!a||!o||!s)return;let c=Qt(n,a,r,i);s.textContent!==c&&(s.textContent=c);let l=r.dataset.expanded===`true`;o.setAttribute(`aria-expanded`,String(l)),o.setAttribute(`aria-label`,f(l?`collapseProcess`:`expandProcess`)),o.onclick=n=>{n.preventDefault(),n.stopPropagation();let i=r.dataset.expanded!==`true`;r.dataset.expanded=String(i),Ht(e,t,i),o.setAttribute(`aria-expanded`,String(i)),o.setAttribute(`aria-label`,f(i?`collapseProcess`:`expandProcess`))}}function rn(e){return Array.from(e.querySelectorAll(`markdown-block`)).filter(e=>!e.closest(Ft))}function an(e){let t=e.filter(e=>(e.textContent??``).trim().length>0);return t[t.length-1]??e[e.length-1]??null}function Q(e,t,n){if(n){e.hasAttribute(t)||e.setAttribute(t,`true`);return}e.hasAttribute(t)&&e.removeAttribute(t)}function on(e,t){if(t)return null;let n=rn(e);return an(n.filter(e=>e.hasAttribute(Lt)))||an(n.filter(e=>!e.closest(Z)))||an(n)}function sn(e,t){rn(e).forEach(e=>{e===t?(Q(e,Lt,!0),Q(e,Rt,!1)):Q(e,Lt,!1)})}function cn(e){return e.length>1||e.some(e=>!!e.querySelector(Ft))}function ln(e,t,n){return e===t?!1:e.tagName.toLowerCase()===`markdown-block`?n:!0}function un(e,t,n){return e.some(e=>Array.from(e.querySelectorAll(It)).some(e=>ln(e,t,n)))}function dn(e,t){return t?.closest(Z)?(e.after(t),Q(t,Rt,!1),Q(t,Lt,!0),!0):!1}function fn(e){return(e.querySelector(Z)?.childElementCount??0)>0}function pn(e){for(let t of e)t.classList.remove(`quickforge-process-source-empty`),t.querySelectorAll(Pt).forEach(e=>{let t=e.querySelector(Z);t&&Array.from(t.children).forEach(t=>{t instanceof HTMLElement&&(Q(t,Rt,!1),Q(t,Lt,!1)),e.parentElement?.insertBefore(t,e)}),e.remove()}),rn(t).forEach(e=>{Q(e,Rt,!1),Q(e,Lt,!1)})}function mn(e,t,n,r){let i=t.querySelector(Z);if(!i)return!1;let a=!1;for(let o of e)o.querySelectorAll(Pt).forEach(e=>{let n=e.querySelector(Z);n&&n!==i&&Array.from(n.children).forEach(e=>{i.append(e),a=!0}),e!==t&&e.remove()}),o.querySelectorAll(It).forEach(e=>{ln(e,n,r)&&(e.closest(Z)||(Q(e,Rt,!0),i.append(e),a=!0))});return dn(t,n),a||fn(t)}function hn(e,t){for(let n of e){if(n===t){n.classList.remove(`quickforge-process-source-empty`);continue}let e=!!n.querySelector(`markdown-block, thinking-block, tool-message, .quickforge-process-group, .quickforge-approval-card`);n.classList.toggle(`quickforge-process-source-empty`,!e)}}function gn(e,t,n,r){if(t.length===0)return;let i=t[t.length-1],a=Ut(t,r),o=i.querySelector(Pt);if(n){o&&pn(t);return}let s=cn(t),c=s?on(i,n):null;if(s&&sn(i,c),!un(t,c,s)){o&&(dn(o,c),pn(t));return}let l=tn(i);if(l){if(!mn(t,l,c,s)||!fn(l)){l.remove();return}nn(e,a,t,l,n),hn(t,i)}}function _n(e,t){let n=dt(e),r=n[n.length-1]?.tagName.toLowerCase()===`assistant-message`,i=[],a=[];for(let e of n){if(e.tagName.toLowerCase()===`user-message`){a.length>0&&i.push(a),a=[];continue}a.push(e)}a.length>0&&i.push(a),i.forEach((n,a)=>{gn(e,n,t&&r&&a===i.length-1,a)})}function vn(e){switch(e){case`low`:return f(`thinkingLow`);case`medium`:return f(`thinkingMedium`);case`high`:return f(`thinkingHigh`);case`xhigh`:return f(`thinkingXHigh`);default:return f(`thinkingOff`)}}function yn(e,t){let n=e,r=n?.currentModel;t.querySelector(`[data-quickforge-thinking-badge]`)?.remove();let i=Array.from(t.querySelectorAll(`button:not(.quickforge-yolo-inline):not(.quickforge-plan-inline)`)).find(e=>!!(r?.id&&e.textContent?.includes(r.id)));i&&(i.classList.add(`quickforge-model-trigger`),r?.reasoning?i.dataset.quickforgeThinkingLevel=`· ${vn(n?.thinkingLevel)}`:delete i.dataset.quickforgeThinkingLevel)}function bn(e,t,n){let r=e?.querySelector(`textarea`);if(!r)return;let i=r;i.__quickforgePlanModeHandler&&i.removeEventListener(`keydown`,i.__quickforgePlanModeHandler,!0),i.__quickforgePlanModeHandler=e=>{e.isComposing||e.key===`Process`||e.key!==`Tab`||!e.shiftKey||(e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),n())},i.addEventListener(`keydown`,i.__quickforgePlanModeHandler,!0),e&&(e.dataset.quickforgePlanMode=String(t))}var xn=[{mention:`Documents`,nameKey:`pluginOpenaiDocumentsName`,descriptionKey:`pluginOpenaiDocumentsDescription`,pluginName:`openai-documents`,icon:Ze},{mention:`Spreadsheets`,nameKey:`pluginOpenaiSpreadsheetsName`,descriptionKey:`pluginOpenaiSpreadsheetsDescription`,pluginName:`openai-spreadsheets`,icon:Qe},{mention:`Presentations`,nameKey:`pluginOpenaiPresentationsName`,descriptionKey:`pluginOpenaiPresentationsDescription`,pluginName:`openai-presentations`,icon:$e}];function Sn(e){let t=e.querySelector(`.quickforge-plus-popover`);t?.__quickforgeDismissHandler&&(document.removeEventListener(`pointerdown`,t.__quickforgeDismissHandler,!0),t.__quickforgeDismissHandler=void 0),t?.remove(),e.querySelector(`.quickforge-plus-inline`)?.setAttribute(`aria-expanded`,`false`)}function Cn(e,t){e.querySelectorAll(`.quickforge-native-attachment-hidden`).forEach(e=>{t.contains(e)||e.classList.remove(`quickforge-native-attachment-hidden`)})}function wn(e){return e.querySelector(`.quickforge-native-attachment-hidden`)||Array.from(e.querySelectorAll(`button`)).find(e=>!e.classList.contains(`quickforge-plus-inline`)&&!e.classList.contains(`quickforge-yolo-inline`)&&!e.classList.contains(`quickforge-plan-inline`))}function Tn(e,t){let n=e.querySelector(`input[type="file"]`);if(n){n.click();return}wn(t)?.click()}function En({className:e,icon:t,label:n,description:r,pluginName:i,onSelect:a}){let o=document.createElement(`button`);o.type=`button`,o.className=`quickforge-plus-popover-item${e?` ${e}`:``}`,i&&(o.dataset.quickforgePluginName=i),o.innerHTML=`
173
- <span class="quickforge-plus-popover-item-icon">${t}</span>
174
- <span class="quickforge-plus-popover-item-main">
175
- <span class="quickforge-plus-popover-item-label"></span>
176
- ${r?`<span class="quickforge-plus-popover-item-description"></span>`:``}
177
- </span>
178
- `,o.querySelector(`.quickforge-plus-popover-item-label`).textContent=n;let s=o.querySelector(`.quickforge-plus-popover-item-description`);return s&&r&&(s.textContent=r),o.onpointerdown=e=>{e.preventDefault(),e.stopPropagation(),a()},o}function Dn(e,t){let{panel:n,editor:r,leftControls:i,insertBuiltinPluginMention:a,removeCommandSuggestions:o,removeCapabilitySuggestions:s}=e;o(),s();let c=n.querySelector(`.quickforge-plus-popover`)??document.createElement(`div`);c.className=`quickforge-plus-popover`,c.setAttribute(`role`,`menu`),c.innerHTML=``;let l=document.createElement(`div`);if(l.className=`quickforge-plus-popover-header`,l.textContent=f(t===`plugins`?`composerAddPlugins`:`composerAddMenu`),c.append(l),t===`main`)c.append(En({icon:Ye,label:f(`composerAddAttachment`),onSelect:()=>{Sn(n),Tn(r,i)}}),En({icon:Xe,label:f(`composerAddPlugins`),onSelect:()=>Dn(e,`plugins`)}));else{let t=En({className:`quickforge-plus-popover-back`,icon:`<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m15 18-6-6 6-6"/></svg>`,label:f(`composerAddBack`),onSelect:()=>Dn(e,`main`)});c.append(t);for(let e of xn)c.append(En({icon:e.icon,label:f(e.nameKey),description:f(e.descriptionKey),pluginName:e.pluginName,onSelect:()=>{a(e.mention),Sn(n)}}))}c.isConnected||r.parentElement?.insertBefore(c,r),c.__quickforgeDismissHandler&&document.removeEventListener(`pointerdown`,c.__quickforgeDismissHandler,!0),c.__quickforgeDismissHandler=e=>{let t=e.target;c.contains(t)||n.querySelector(`.quickforge-plus-inline`)?.contains(t)||Sn(n)},document.addEventListener(`pointerdown`,c.__quickforgeDismissHandler,!0),n.querySelector(`.quickforge-plus-inline`)?.setAttribute(`aria-expanded`,`true`)}function On(e){let{panel:t,editor:n,leftControls:r}=e;Cn(n,r),wn(r)?.classList.add(`quickforge-native-attachment-hidden`);let i=r.querySelector(`.quickforge-plus-inline`),a=n=>{n.type=`button`,W(n,Je),n.title=f(`composerAddMenu`),n.setAttribute(`aria-label`,f(`composerAddMenu`)),n.setAttribute(`aria-haspopup`,`menu`),n.setAttribute(`aria-expanded`,t.querySelector(`.quickforge-plus-popover`)?`true`:`false`),n.className=`quickforge-plus-inline inline-flex h-8 w-8 items-center justify-center rounded-md border border-transparent text-muted-foreground`,n.onpointerdown=n=>{n.preventDefault(),n.stopPropagation(),t.querySelector(`.quickforge-plus-popover`)?Sn(t):Dn(e,`main`)},n.onclick=e=>{e.preventDefault(),e.stopPropagation()}};if(i){a(i);return}let o=document.createElement(`button`);a(o),r.prepend(o)}function kn(e){let{panel:t,isStreaming:n,abort:r,yoloMode:i,planMode:a,workspaceToolsEnabled:o,readOnly:s,allowModelControls:c,onToggleYoloMode:l,onTogglePlanMode:u,onPlanModeSent:d,onInput:p,onFilesChange:m,removeCommandSuggestions:h,updateCommandSuggestions:g,setupCommandTextareaHandler:_,removeCapabilitySuggestions:v,updateCapabilitySuggestions:y,setupCapabilityTextareaHandler:b,insertBuiltinPluginMention:x,onBeforeSend:S}=e,C=t.querySelector(`message-editor`);C?.classList.add(`quickforge-composer`),C?.parentElement?.classList.add(`quickforge-composer-shell`),C?.parentElement?.parentElement?.classList.add(`quickforge-composer-dock`);let w=C?.querySelector(`textarea`);if(w&&(w.placeholder=f(`composerPlaceholder`)),s){t.querySelector(`.quickforge-composer-dock`)?.remove();return}if(C){C.onInput=e=>{p(e),g(e),y(e)},C.onFilesChange=e=>{m(e?[...e]:[])};let e=C.onSend;e&&e!==C.__quickforgePlanWrappedOnSend&&(C.__quickforgePlanBaseOnSend=e);let t=C.__quickforgePlanBaseOnSend;if(t){let e=(e,n)=>{let r=String(e??``),i=r.trim(),o=a&&i.length>0&&!i.toLowerCase().startsWith(`/plan`);i.length>0&&S?.(r),h(),v(),o&&d(),t(o?`/plan ${r}`:r,n)};C.__quickforgePlanWrappedOnSend=e,C.onSend=e}g(),y()}_(C),b(C),bn(C,a,u);let T=t.querySelector(`agent-interface`);if(T){let e=T.enableModelSelector!==c;T.enableModelSelector=c,T.enableThinkingSelector=!1,e&&T.requestUpdate?.()}let E=C?.querySelectorAll(`.flex.gap-2.items-center`),D=E?.[0],O=E?.[E.length-1];if(!O)return;yn(C,O);let k=O.querySelector(`button:last-child`);if(k){let e=()=>{k.__quickforgeStopHandler&&=(k.removeEventListener(`pointerdown`,k.__quickforgeStopHandler,!0),k.removeEventListener(`click`,k.__quickforgeStopHandler,!0),void 0)};if(n())k.disabled=!1,k.classList.remove(`quickforge-send-button`),k.classList.add(`quickforge-stop-button`),k.title=`Stop`,k.setAttribute(`aria-label`,`Stop`),delete k.dataset.quickforgeSendIcon,U(k,`<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><rect x="6" y="6" width="12" height="12" rx="2"/></svg>`),k.__quickforgeStopHandler||(k.__quickforgeStopHandler=e=>{e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),h(),r()},k.addEventListener(`pointerdown`,k.__quickforgeStopHandler,!0),k.addEventListener(`click`,k.__quickforgeStopHandler,!0));else if(e(),k.classList.remove(`quickforge-stop-button`),k.classList.add(`quickforge-send-button`),k.dataset.quickforgeSendIcon!==`arrow-up`){k.dataset.quickforgeSendIcon=`arrow-up`,U(k,`<svg xmlns="http://www.w3.org/2000/svg" width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 19V5"/><path d="m5 12 7-7 7 7"/></svg>`);let e=k.querySelector(`svg`)?.parentElement;e&&e!==k&&e.style.transform&&(e.style.transform=``)}}if(!D){t.querySelector(`.quickforge-plus-inline`)?.remove(),Sn(t),t.querySelector(`.quickforge-yolo-inline`)?.remove(),t.querySelector(`.quickforge-plan-inline`)?.remove();return}C&&On({panel:t,editor:C,leftControls:D,insertBuiltinPluginMention:x,removeCommandSuggestions:h,removeCapabilitySuggestions:v});let A=f(`planModeEnabledTitle`),j=`${Ke}${qe}<span>${f(`planModeLabel`)}</span>`,M=e=>{e.preventDefault(),e.stopPropagation(),u()},ee=e=>{e.key!==`Enter`&&e.key!==` `||M(e)},N=t.querySelector(`.quickforge-plan-inline`),P=e=>{W(e,j),e.title=A,e.setAttribute(`aria-label`,A),e.setAttribute(`aria-pressed`,String(a)),e.className=`quickforge-plan-inline inline-flex h-8 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 text-xs font-medium text-muted-foreground`,e.onpointerdown=M,e.onclick=e=>{e.preventDefault(),e.stopPropagation()},e.onkeydown=ee};if(!a)N?.remove();else if(N)P(N);else{let e=document.createElement(`button`);e.type=`button`,P(e);let t=D.querySelector(`.quickforge-yolo-inline`);t?D.insertBefore(e,t.nextSibling):D.append(e)}if(!o){t.querySelector(`.quickforge-yolo-inline`)?.remove();return}let F=i?`<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3 19 6v5c0 4.5-2.8 8.4-7 10-4.2-1.6-7-5.5-7-10V6l7-3Z"/><path d="m9 12 2 2 4-4"/></svg>`:`<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3 19 6v5c0 4.5-2.8 8.4-7 10-4.2-1.6-7-5.5-7-10V6l7-3Z"/><path d="M9 12h6"/></svg>`,I=`quickforge-yolo-inline inline-flex h-8 items-center justify-center rounded-md border border-transparent px-2 text-xs font-medium ${i?`bg-emerald-500/10 text-emerald-700 dark:text-emerald-400`:`text-muted-foreground`}`,L=f(i?`yoloEnabledTitle`:`yoloDisabledTitle`),R=e=>{e.preventDefault(),e.stopPropagation(),l()},te=e=>{e.key!==`Enter`&&e.key!==` `||R(e)},z=t.querySelector(`.quickforge-yolo-inline`);if(z){let e=z.getAttribute(`aria-pressed`),t=String(i);e!==t&&(W(z,F),z.setAttribute(`aria-pressed`,t),z.className=I),z.title!==L&&(z.title=L,z.setAttribute(`aria-label`,L)),z.onpointerdown=R,z.onclick=e=>{e.preventDefault(),e.stopPropagation()},z.onkeydown=te;let n=D.querySelector(`.quickforge-plan-inline`);n&&z.nextSibling!==n&&D.insertBefore(n,z.nextSibling);return}let B=document.createElement(`button`);B.type=`button`,W(B,F),B.title=L,B.setAttribute(`aria-label`,L),B.setAttribute(`aria-pressed`,String(i)),B.className=I,B.onpointerdown=R,B.onclick=e=>{e.preventDefault(),e.stopPropagation()},B.onkeydown=te,D.append(B);let ne=D.querySelector(`.quickforge-plan-inline`);ne&&D.insertBefore(ne,B.nextSibling)}function An(e){let t=e.querySelector(`message-editor`),n=t?.querySelector(`textarea`);return{text:t?.value??n?.value??``,attachments:t?.attachments?[...t.attachments]:[]}}function jn(e,t,n){let r=An(e);G(r)?t.set(n,r):t.delete(n)}function Mn(e,t,n,r){if(!G(t))return;let i={text:t.text,attachments:t.attachments?[...t.attachments]:[]},a=()=>{let t=e.querySelector(`message-editor`),n=t?.querySelector(`textarea`);t&&(t.value=i.text,t.attachments=i.attachments,t.requestUpdate?.(),t.onInput?.(i.text),t.onFilesChange?.(i.attachments)),n&&(n.value=i.text,n.dispatchEvent(new Event(`input`,{bubbles:!0})),n.focus())};e.querySelector(`agent-interface`)?.setInput?.(i.text,i.attachments),a(),requestAnimationFrame(a),window.setTimeout(a,0),n.set(r,i)}var Nn=`.quickforge-approval-card`;function Pn(e,t){return typeof t.summary==`string`?t.summary:e===`run_command`&&typeof t.command==`string`?t.command:e===`activate_skill`&&typeof t.name==`string`?t.name:e===`read_skill_resource`&&typeof t.path==`string`||typeof t.path==`string`?t.path:typeof t.query==`string`?t.query:typeof t.name==`string`?t.name:``}function Fn(e,t){let n=Pn(e,t);return`
179
- ${n?`<div class="text-xs text-muted-foreground mb-1">${$(f(`toolArgsSummary`))}: ${$(n)}</div>`:``}
180
- <div class="text-xs bg-background border rounded p-2 text-muted-foreground">${$(f(`toolDetailsHidden`))}</div>
181
- `}function In(e,t,n,r,i){let{panel:a,onApprove:o,onReject:s}=e;if(a.querySelector(`.quickforge-approval-card[data-tool-call-id="${CSS.escape(n)}"]`))return;Ln(a);let c=document.createElement(`div`);c.className=`quickforge-approval-card pointer-events-auto mb-4 mx-4 rounded-lg border border-amber-300 dark:border-amber-700 bg-amber-50 dark:bg-amber-950/30 p-4`,c.dataset.toolCallId=n;let l=i?.type===`subagent`?i.label||i.subagent||`Subagent`:``,u=document.createElement(`div`);if(u.className=`flex items-center gap-2 mb-3 text-sm font-medium text-amber-800 dark:text-amber-300`,u.innerHTML=`<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>`,u.append(` ${l?f(`subagentToolApprovalWaiting`,{source:l,toolName:t}):f(`toolApprovalWaiting`,{toolName:t})}`),c.append(u),l){let e=document.createElement(`div`);e.className=`mb-3 rounded-md border border-amber-200/80 bg-background/65 px-2.5 py-1.5 text-xs text-amber-800/85 dark:border-amber-800/70 dark:text-amber-200/85`,e.textContent=f(`toolApprovalSourceSubagent`,{source:l}),c.append(e)}let d=document.createElement(`div`);d.className=`quickforge-approval-preview mb-3`;let p=h().showToolDetails;if(t===`write_file`){let e=String(r.path??``),t=String(r.content??``),n=t.length>800;d.innerHTML=`
182
- <div class="text-xs text-muted-foreground mb-1">📁 ${$(e)}</div>
183
- <pre class="text-xs bg-background border rounded p-2 max-h-40 overflow-auto font-mono whitespace-pre-wrap">${Rn(t.slice(0,800))}${n?`\n${$(f(`toolApprovalTruncated`))}`:``}</pre>
184
- `}else if(t===`edit_file`){let e=String(r.path??``),t=zn(String(r.oldText??``),String(r.newText??``));d.innerHTML=`
185
- <div class="text-xs text-muted-foreground mb-1">📁 ${$(e)}</div>
186
- <pre class="text-xs bg-background border rounded p-2 max-h-40 overflow-auto font-mono whitespace-pre-wrap">${t}</pre>
187
- `}else if(t===`run_command`){let e=String(r.command??``);d.innerHTML=`
188
- <div class="text-xs text-muted-foreground mb-1">⏱️ ${f(`toolApprovalTimeout`)}: ${$(`30m`)}</div>
189
- <pre class="text-xs bg-background border rounded p-2 max-h-40 overflow-auto font-mono whitespace-pre-wrap">$ ${$(e)}</pre>
190
- `}else typeof r.description==`string`?d.innerHTML=`<div class="text-xs bg-background border rounded p-2 text-muted-foreground">${$(r.description)}</div>`:d.innerHTML=p?`<pre class="text-xs bg-background border rounded p-2 max-h-40 overflow-auto font-mono whitespace-pre-wrap">${$(JSON.stringify(r,null,2))}</pre>`:Fn(t,r);c.append(d);let m=document.createElement(`div`);m.className=`mb-2 hidden text-xs text-red-700 dark:text-red-400`,c.append(m);let g=document.createElement(`div`);g.className=`flex items-center gap-2`;let _=e=>{y.disabled=e,b.disabled=e,y.classList.toggle(`opacity-60`,e),b.classList.toggle(`opacity-60`,e),y.textContent=f(e?`toolApprovalSubmitting`:`toolApprovalAccept`)},v=async e=>{m.classList.add(`hidden`),m.textContent=``,_(!0);try{await e()}catch(e){m.textContent=e instanceof Error?e.message:f(`toolApprovalFailed`),m.classList.remove(`hidden`),_(!1)}},y=document.createElement(`button`);y.type=`button`,y.className=`inline-flex items-center gap-1.5 rounded-md bg-emerald-600 px-3 py-1.5 text-xs font-medium text-white hover:bg-emerald-700 transition-colors cursor-pointer disabled:cursor-not-allowed`,y.textContent=f(`toolApprovalAccept`),y.addEventListener(`click`,e=>{e.stopPropagation(),e.preventDefault(),v(o)});let b=document.createElement(`button`);b.type=`button`,b.className=`inline-flex items-center gap-1.5 rounded-md border border-red-300 dark:border-red-700 px-3 py-1.5 text-xs font-medium text-red-700 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-950/30 transition-colors cursor-pointer disabled:cursor-not-allowed`,b.textContent=f(`toolApprovalReject`),b.addEventListener(`click`,e=>{e.stopPropagation(),e.preventDefault(),v(s)}),g.append(y,b),c.append(g);let x=a.querySelector(`message-list`);x?x.append(c):a.querySelector(`agent-interface`)?.append(c),c.scrollIntoView({behavior:`smooth`,block:`end`})}function Ln(e){e.querySelectorAll(Nn).forEach(e=>e.remove())}function $(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`)}function Rn(e){return e.split(`
191
- `).map(e=>{let t=$(e);return e.startsWith(`+`)?`<span style="color:rgb(22 101 52);background:rgba(34,197,94,.14);display:block;">${t}</span>`:e.startsWith(`-`)?`<span style="color:rgb(153 27 27);background:rgba(239,68,68,.12);display:block;">${t}</span>`:e.startsWith(`@@`)?`<span style="color:rgb(37 99 235);background:rgba(37,99,235,.10);display:block;">${t}</span>`:`<span style="display:block;">${t||` `}</span>`}).join(`
192
- `)}function zn(e,t){let n=e.split(`
193
- `),r=t.split(`
194
- `),i=[];for(let e of n)i.push(`<span style="color:rgb(153 27 27);background:rgba(239,68,68,.12);display:block;">- ${$(e)}</span>`);for(let e of r)i.push(`<span style="color:rgb(22 101 52);background:rgba(34,197,94,.14);display:block;">+ ${$(e)}</span>`);return i.join(`
195
- `)}var Bn=`composer-drafts:v1`;function Vn(e){return!!(e&&!e.startsWith(`pending-`))}function Hn(e){return Vn(e.sessionId)?`session:${e.sessionId}`:e.scope===`project`&&e.projectId?`new:project:${e.projectId}`:`new:global`}function Un(e){if(!e||typeof e!=`object`||Array.isArray(e))return{};let t={};for(let[n,r]of Object.entries(e)){if(!r||typeof r!=`object`||Array.isArray(r))continue;let e=r;typeof e.text==`string`&&(t[n]={text:e.text,updatedAt:typeof e.updatedAt==`string`?e.updatedAt:new Date().toISOString(),scope:e.scope===`project`?`project`:e.scope===`global`?`global`:void 0,projectId:typeof e.projectId==`string`?e.projectId:void 0,sessionId:typeof e.sessionId==`string`?e.sessionId:void 0})}return t}async function Wn(e){return Un(await e.settings.get(Bn))}async function Gn(e,t){let n=(await Wn(e))[t];if(!(!n||n.text.length===0))return{text:n.text,attachments:[]}}async function Kn(e,t,n,r){let i=n.text??``;if(i.length===0){await qn(e,t);return}let a=await Wn(e);a[t]={text:i,updatedAt:new Date().toISOString(),scope:r.scope,projectId:r.scope===`project`?r.projectId:void 0,sessionId:Vn(r.sessionId)?r.sessionId:void 0},await e.settings.set(Bn,a)}async function qn(e,t){let n=await Wn(e);Object.prototype.hasOwnProperty.call(n,t)&&(delete n[t],await e.settings.set(Bn,n))}var Jn=r();function Yn(e){let t=e.state.contextCompaction;if(!t?.summaryMessage)return e.state.messages;let n=e.state.messages,r=Math.min(n.length,Math.max(0,Number(t.compactedUpToIndex)||0));return[t.summaryMessage,...n.slice(r)]}function Xn({agent:e,onModelSelect:t,revision:n,yoloMode:r,workspaceToolsEnabled:i,project:a,projectId:o,chatScope:s=`global`,storage:l=null,onToggleYoloMode:p,onRollbackFromMessage:m,onRetryFromMessage:h,onCopyAnswer:g,onForkFromMessage:v,onApproveToolCall:y,onRejectToolCall:x,onApproveAutoCompact:S,onRejectAutoCompact:C,onOpenWorkspaceGitChanges:w,onOpenLocalFilePath:T,onContextUsageDisplayChange:E,restoredDraft:D,disableFork:O=!1,readOnly:k=!1,bypassClientApiKeyCheck:A=!1,allowModelControls:j=!0,rollbackConfirmTitle:M,rollbackConfirmDescription:ee}){let N=(0,b.useRef)(null),P=(0,b.useRef)(void 0),F=(0,b.useRef)(void 0),I=(0,b.useRef)(new Map),L=(0,b.useRef)(l),R=(0,b.useRef)([]),te=(0,b.useRef)(void 0),z=(0,b.useRef)(new Set),B=(0,b.useRef)(void 0),[ne,re]=(0,b.useState)(),[ie,ae]=(0,b.useState)(!1),oe=(0,b.useCallback)(()=>ae(e=>!e),[]),se=(0,b.useCallback)(()=>ae(!1),[]),ce=(0,b.useCallback)(()=>{B.current&&=(window.clearTimeout(B.current),void 0)},[]);(0,b.useEffect)(()=>{L.current=l},[l]);let le=(0,b.useMemo)(()=>({sessionId:e?.sessionId,scope:s,projectId:o}),[e?.sessionId,s,o]),ue=Hn(le),de=(0,b.useRef)(le),V=(0,b.useRef)(ue);(0,b.useEffect)(()=>{de.current=le,V.current=ue},[le,ue]),(0,b.useEffect)(()=>()=>{ce()},[ce]);let fe=(0,b.useCallback)((e,t,n)=>{let r=L.current;if(r){if(t.text.length===0){qn(r,e).catch(e=>d.error(`Failed to clear composer draft:`,e));return}Kn(r,e,t,n).catch(e=>d.error(`Failed to save composer draft:`,e))}},[]),pe=(0,b.useCallback)((e,t,n)=>{B.current&&window.clearTimeout(B.current),B.current=window.setTimeout(()=>{B.current=void 0,fe(e,t,n)},400)},[fe]),me=(0,b.useCallback)((e,t=V.current,n=de.current)=>{let r=An(e);G(r)?I.current.set(t,r):I.current.delete(t),fe(t,r,n)},[fe]),H=(0,b.useRef)({onCopyAnswer:g,onRollbackFromMessage:m,onRetryFromMessage:h,onForkFromMessage:v,onToggleYoloMode:p,onTogglePlanMode:oe,onPlanModeSent:se,onApproveToolCall:y,onRejectToolCall:x,onApproveAutoCompact:S,onRejectAutoCompact:C,onOpenWorkspaceGitChanges:w,onOpenLocalFilePath:T,onContextUsageDisplayChange:E,onModelSelect:t,yoloMode:r,planMode:ie,workspaceToolsEnabled:i,disableFork:O,readOnly:k,allowModelControls:j,bypassClientApiKeyCheck:A,rollbackConfirmTitle:M,rollbackConfirmDescription:ee,gitBranch:ne});(0,b.useEffect)(()=>{H.current={onCopyAnswer:g,onRollbackFromMessage:m,onRetryFromMessage:h,onForkFromMessage:v,onToggleYoloMode:p,onTogglePlanMode:oe,onPlanModeSent:se,onApproveToolCall:y,onRejectToolCall:x,onApproveAutoCompact:S,onRejectAutoCompact:C,onOpenWorkspaceGitChanges:w,onOpenLocalFilePath:T,onContextUsageDisplayChange:E,onModelSelect:t,yoloMode:r,planMode:ie,workspaceToolsEnabled:i,disableFork:O,readOnly:k,allowModelControls:j,bypassClientApiKeyCheck:A,rollbackConfirmTitle:M,rollbackConfirmDescription:ee,gitBranch:ne},F.current=D});let U=a?.id??o;(0,b.useEffect)(()=>{let e=!1;return queueMicrotask(()=>{if(!e){if(!U){re(void 0);return}_(U).then(t=>{e||re(t.isGitRepository?t.branch:void 0)}).catch(t=>{e||(d.warn(`Failed to load git branch:`,t),re(void 0))})}}),()=>{e=!0}},[U,n]);let W=(0,b.useRef)(null),K=(0,b.useRef)(null),q=(0,b.useRef)(null),J=(0,b.useRef)(null),Y=(0,b.useRef)(null);(0,b.useEffect)(()=>{let e=!1;return a?.id?(fetch(`/api/project/commands?projectId=${encodeURIComponent(a.id)}`,{cache:`no-store`}).then(e=>e.ok?e.json():{commands:[]}).then(t=>{e||(R.current=Array.isArray(t.commands)?t.commands:[],q.current?.())}).catch(()=>{e||(R.current=[],q.current?.())}),()=>{e=!0}):(R.current=[],()=>{e=!0})},[a?.id,n]);let _e=(e,t,n,r,i=!1)=>{if(t.sessionId&&t.sessionId!==n||!G(t)||!i&&z.current.has(t.id))return;let a=()=>{if(!i&&z.current.has(t.id))return;let n=e.querySelector(`message-editor`),a=n?{text:n.value??n.querySelector(`textarea`)?.value??``,attachments:n.attachments?[...n.attachments]:[]}:I.current.get(r),o=te.current;(o?.id!==t.id||!G(a??ge())||a?.text===o.text)&&(Mn(e,t,I.current,r),te.current={id:t.id,text:t.text})};a(),window.requestAnimationFrame(a);for(let e of[0,50,150,300,600])window.setTimeout(a,e);e.querySelector(`agent-interface`)?.updateComplete?.then(a)};return(0,b.useEffect)(()=>{if(!N.current||!e)return;let t=new c;ae(!1);let n=e.sessionId,r=V.current,i=de.current,a=!1,o,s=!1,l=e.state.isStreaming,p=!1,m=Se({panel:t});K.current=m;let h=Ce({panel:t,getCustomCommands:()=>R.current,getComposerDrafts:()=>I.current,sessionId:r,setComposerDrafts:e=>{I.current=e},restoreDraftIntoComposer:e=>{Mn(t,e,I.current,r),pe(r,e,i)}}),g=je({panel:t,restoreDraftIntoComposer:e=>{Mn(t,e,I.current,r),pe(r,e,i)}}),_=ze({panel:t,getSystemPrompt:()=>e.state.systemPrompt,getMessages:()=>e.state.messages,getEffectiveMessages:()=>Yn(e),getContextWindow:()=>e.state.model?.contextWindow??0,getTools:()=>e.state.tools,getMaxTokens:()=>e.state.model?.maxTokens,getServerContextUsage:()=>e.state.contextUsage??null,getGitBranch:()=>H.current.gitBranch,onGitBranchClick:()=>H.current.onOpenWorkspaceGitChanges?.(),renderInline:!1,onDisplayChange:t=>H.current.onContextUsageDisplayChange?.(e.sessionId,t)}),v=e=>{s=!1;let n=t.querySelector(`message-editor`),a={text:e,attachments:n?.attachments?[...n.attachments]:[]};G(a)?I.current.set(r,a):I.current.delete(r),pe(r,a,i)},y=e=>{s=!1;let n=t.querySelector(`message-editor`),a=n?.querySelector(`textarea`),o={text:n?.value??a?.value??``,attachments:e?[...e]:[]};G(o)?I.current.set(r,o):I.current.delete(r),pe(r,o,i);let c=t.querySelector(`agent-interface`);c?.requestUpdate?.(),window.requestAnimationFrame(()=>q.current?.()),c?.updateComplete?.then(()=>q.current?.())},b=()=>{e.state.isStreaming?t.dataset.quickforgeAgentStreaming=`true`:delete t.dataset.quickforgeAgentStreaming},x=()=>{if(a||!t.isConnected)return;b();let n=H.current;try{Tt({panel:t,getMessages:()=>e.state.messages,isStreaming:()=>e.state.isStreaming,onCopyAnswer:n.onCopyAnswer,onRollbackFromMessage:n.onRollbackFromMessage,onRetryFromMessage:n.onRetryFromMessage,onForkFromMessage:n.onForkFromMessage,onOpenLocalFilePath:n.onOpenLocalFilePath,disableFork:n.disableFork,readOnly:n.readOnly,enableTerminalCommandActions:!n.readOnly,rollbackConfirmTitle:n.rollbackConfirmTitle,rollbackConfirmDescription:n.rollbackConfirmDescription}),bt({panel:t,getMessages:()=>e.state.messages,getContextCompaction:()=>e.state.contextCompaction??null}),wt({panel:t,getMessages:()=>e.state.messages,isStreaming:()=>e.state.isStreaming,isActive:l})}catch{}try{kn({panel:t,isStreaming:()=>e.state.isStreaming,abort:()=>e.abort(),yoloMode:n.yoloMode,planMode:n.planMode,workspaceToolsEnabled:n.workspaceToolsEnabled,readOnly:n.readOnly,allowModelControls:n.allowModelControls,onToggleYoloMode:n.onToggleYoloMode,onTogglePlanMode:n.onTogglePlanMode,onPlanModeSent:n.onPlanModeSent,onInput:v,onFilesChange:y,removeCommandSuggestions:h.remove,updateCommandSuggestions:h.update,setupCommandTextareaHandler:h.setupTextareaHandler,removeCapabilitySuggestions:g.remove,updateCapabilitySuggestions:g.update,setupCapabilityTextareaHandler:g.setupTextareaHandler,insertBuiltinPluginMention:g.insertBuiltinPluginMention,onBeforeSend:t=>{let n=g.consumeSelectedCapabilities(t);e.setNextPromptCapabilities?.(n)}})}catch{}let r=J.current;if(r&&r.sessionId===e.sessionId){let e=r.toolCallId;In({panel:t,onApprove:async()=>{await H.current.onApproveToolCall(e),J.current=null,Ln(t)},onReject:async()=>{await H.current.onRejectToolCall(e),J.current=null,Ln(t)}},r.toolName,e,r.args,r.source)}else{let n=Y.current;if(n&&n.sessionId===e.sessionId){let e=n.approvalId;In({panel:t,onApprove:async()=>{await H.current.onApproveAutoCompact?.(e),Y.current=null,Ln(t)},onReject:async()=>{await H.current.onRejectAutoCompact?.(e),Y.current=null,Ln(t)}},f(`contextManagement`),e,{percent:n.usage?.percent??0,threshold:n.thresholdPercent??0,keepRecentTurns:n.keepRecentTurns??2,summary:f(`autoCompactApprovalWaiting`,{percent:n.usage?.percent??0,threshold:n.thresholdPercent??0}),description:f(`autoCompactApprovalPreview`,{keepRecentTurns:n.keepRecentTurns??2})})}else Ln(t)}_.update(),m.setup(),m.isEnabled&&m.scheduleScrollToBottom()},S=!1,C,w=!1,T,E=()=>{T===void 0&&(T=window.requestAnimationFrame(()=>{T=void 0,w=!1}))},D=()=>{if(!a){w=!0;try{x()}finally{E()}}},O=()=>{S||(S=!0,C=window.requestAnimationFrame(()=>{C=void 0,S=!1,D()}))};W.current=D;let k=()=>{p||(p=!0,window.requestAnimationFrame(()=>{if(p=!1,a)return;b();let e=t.querySelector(`agent-interface`);e?.requestUpdate?.(),q.current?.(),e?.updateComplete?.then(()=>q.current?.()),m.isEnabled&&m.scheduleScrollToBottom()}))};q.current=O,t.setAgent(e,{onApiKeyRequired:H.current.bypassClientApiKeyCheck?async()=>!0:e=>u.prompt(e),onBeforeSend:()=>{let e=F.current;e&&z.current.add(e.id),ce(),s=!0,h.remove(),I.current.delete(r);let t=L.current;t&&qn(t,r).catch(e=>d.error(`Failed to clear composer draft:`,e)),m.enable()},onModelSelect:H.current.onModelSelect,toolsFactory:()=>he(e.state.tools)}).then(()=>{if(a)return;let e=F.current,i=i=>{a||(e&&P.current!==e.id?(P.current=e.id,_e(t,e,n,r)):Mn(t,i??I.current.get(r)??ge(),I.current,r))};if(e&&P.current!==e.id)i();else{let e=I.current.get(r);e?i(e):L.current?Gn(L.current,r).then(e=>i(e)).catch(e=>d.error(`Failed to load composer draft:`,e)):i()}o=new MutationObserver(()=>{w||O()}),o.observe(t,{childList:!0,subtree:!0}),window.requestAnimationFrame(()=>{a||D()})}),N.current.replaceChildren(t);let A=e.subscribe(i=>{if(i.type===`agent_start`&&(l=!0,b(),q.current?.(),m.enable(),J.current?.sessionId===e.sessionId&&(J.current=null),Y.current?.sessionId===e.sessionId&&(Y.current=null)),i.type===`message_start`||i.type===`message_update`||i.type===`message_end`||i.type===`turn_end`||i.type===`agent_end`){b();let e=i.message;(i.type===`message_update`||e?.role===`assistant`)&&(l=!1),q.current?.(),m.isEnabled&&m.scheduleScrollToBottom()}if(i.type===`messages_replaced`){let e=F.current;e&&P.current===e.id&&_e(t,e,n,r)}let a=i.type;if(a===`tool_execution_start`||a===`tool_execution_end`){b();let e=t.querySelector(`agent-interface`);e?.requestUpdate?.(),q.current?.(),window.requestAnimationFrame(()=>q.current?.()),e?.updateComplete?.then(()=>q.current?.()),m.isEnabled&&m.scheduleScrollToBottom()}if(a===`tool_execution_update`&&k(),i.type===`agent_end`&&(l=!1,b(),q.current?.(),J.current?.sessionId===e.sessionId&&(J.current=null,q.current?.()),Y.current?.sessionId===e.sessionId&&(Y.current=null,q.current?.())),a===`auto_compact_completed`||a===`messages_replaced`){let e=t.querySelector(`agent-interface`);e?.requestUpdate?.(),q.current?.(),window.requestAnimationFrame(()=>q.current?.()),e?.updateComplete?.then(()=>q.current?.())}if(a===`auto_compact_failed`&&d.warn(f(`autoCompactFailed`)),i.type===`tool_approval_required`){let e=i;J.current={toolCallId:e.toolCallId,toolName:e.toolName,args:e.args,sessionId:e.sessionId,source:e.source},q.current?.()}if(i.type===`auto_compact_approval_required`){let e=i;Y.current={approvalId:e.approvalId,usage:e.usage,thresholdPercent:e.thresholdPercent,keepRecentTurns:e.keepRecentTurns,sessionId:e.sessionId},q.current?.()}});return()=>{if(s){ce(),I.current.delete(r);let e=L.current;e&&qn(e,r).catch(e=>d.error(`Failed to clear composer draft:`,e))}else jn(t,I.current,r),me(t,r,i);h.remove(),h.cleanupTextareaHandler(),g.remove(),g.cleanupTextareaHandler(),a=!0,m.cleanup(),K.current=null,A(),o?.disconnect(),C!==void 0&&window.cancelAnimationFrame(C),T!==void 0&&window.cancelAnimationFrame(T),W.current=null,t.remove()}},[e,ce,me,pe]),(0,b.useEffect)(()=>{W.current?.(),(N.current?.querySelector(`agent-interface`))?.requestUpdate?.()},[r,ie,i,ne,O,k,j,n]),(0,b.useEffect)(()=>{let t=F.current;if(!t||!N.current)return;let n=e?.sessionId??``;if(t.sessionId&&t.sessionId!==n)return;let r=N.current.querySelector(`pi-chat-panel`);r&&(P.current=t.id,_e(r,t,n,V.current,!0))},[D,e]),(0,Jn.jsx)(`div`,{ref:N,className:`min-h-0 flex-1 overflow-hidden`})}export{Xn as ChatPanelHost};
@@ -1 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{M as t,c as n,h as r,i,it as a,m as o,r as s}from"./icons-Dsc5yL3l.js";import{n as c}from"./react-vendor-CiCXOLb5.js";import{D as l,E as u,O as d}from"./index-YTL26wyJ.js";import{n as f,r as p,t as m}from"./plugin-api-YfYj_Bd7.js";var h=e(a(),1),g=c();function _(e){return e===`loaded`?`bg-emerald-500/10 text-emerald-700 dark:text-emerald-300`:e===`error`?`bg-destructive/10 text-destructive`:`bg-muted text-muted-foreground`}function v(e){return e===`loaded`?d(`pluginStatusLoaded`):e===`disabled`?d(`pluginStatusDisabled`):e===`error`?d(`pluginStatusError`):e}function y(e){switch(e){case`openai-documents`:return{label:d(`pluginOpenaiDocumentsName`),description:d(`pluginOpenaiDocumentsDescription`)};case`openai-spreadsheets`:return{label:d(`pluginOpenaiSpreadsheetsName`),description:d(`pluginOpenaiSpreadsheetsDescription`)};case`openai-presentations`:return{label:d(`pluginOpenaiPresentationsName`),description:d(`pluginOpenaiPresentationsDescription`)};default:return null}}function b(e){return y(e.name)?.label||(e.displayName||e.name).replace(/^OpenAI\s+/i,``)}function x(e){return y(e.name)?.description||e.description||d(`noDescription`)}function S(e){return(e.label||e.name||e.quickForgeName).replace(/^OpenAI\s+/i,``)}function C({onChanged:e}){let[a,c]=(0,h.useState)(null),[y,C]=(0,h.useState)(!0),[w,T]=(0,h.useState)(null),[E,D]=(0,h.useState)(null),[O,k]=(0,h.useState)(null),A=(0,h.useCallback)(async(t=`load`)=>{k(null),C(!0);try{c(t===`reload`?await f():await m()),t===`reload`&&e?.()}catch(e){k(e instanceof Error?e.message:d(`pluginsLoadFailed`))}finally{C(!1)}},[e]);(0,h.useEffect)(()=>{let e=!1;return m().then(t=>{e||c(t)}).catch(t=>{e||k(t instanceof Error?t.message:d(`pluginsLoadFailed`))}).finally(()=>{e||C(!1)}),()=>{e=!0}},[]);let j=(0,h.useMemo)(()=>{let e=a?.plugins||[];return{total:e.length,enabled:e.filter(e=>e.enabled).length,tools:e.reduce((e,t)=>e+t.tools.length,0)}},[a]),M=(0,h.useMemo)(()=>E&&(a?.plugins||[]).find(e=>e.name===E)||null,[a,E]),N=async(t,n)=>{T(t),k(null);try{c(await p(t,n)),e?.()}catch(e){k(e instanceof Error?e.message:d(`pluginsSaveFailed`))}finally{T(null)}};return(0,g.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col overflow-hidden bg-background`,children:[(0,g.jsxs)(`div`,{className:`border-b border-border px-6 py-5`,children:[(0,g.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,g.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,g.jsx)(`div`,{className:`flex size-10 items-center justify-center rounded-2xl bg-primary/10 text-primary`,children:(0,g.jsx)(r,{className:`size-5`})}),(0,g.jsxs)(`div`,{children:[(0,g.jsx)(`h1`,{className:`text-lg font-semibold text-foreground`,children:d(`plugins`)}),(0,g.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:d(`pluginsDescription`)})]})]}),(0,g.jsxs)(u,{variant:`outline`,size:`sm`,onClick:()=>void A(`reload`),disabled:y,children:[y?(0,g.jsx)(t,{className:`mr-2 size-4 animate-spin`}):(0,g.jsx)(o,{className:`mr-2 size-4`}),d(`pluginsReload`)]})]}),(0,g.jsxs)(`div`,{className:`mt-4 flex flex-wrap gap-2 text-xs text-muted-foreground`,children:[(0,g.jsx)(`span`,{className:`rounded-full bg-muted px-2 py-0.5`,children:d(`pluginsCount`,j)}),(0,g.jsx)(`span`,{className:`rounded-full bg-muted px-2 py-0.5`,children:d(`pluginToolsCount`,{count:j.tools})})]})]}),(0,g.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto p-6`,children:(0,g.jsxs)(`div`,{className:`mx-auto max-w-5xl space-y-5`,children:[O?(0,g.jsx)(`div`,{className:`rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive`,children:O}):null,a?.errors?.length?(0,g.jsxs)(`div`,{className:`space-y-2 rounded-lg border border-amber-500/30 bg-amber-500/8 p-3 text-sm`,children:[(0,g.jsxs)(`div`,{className:`flex items-center gap-2 font-medium text-amber-700 dark:text-amber-300`,children:[(0,g.jsx)(i,{className:`size-4`}),d(`pluginDiscoveryErrors`)]}),a.errors.map((e,t)=>(0,g.jsxs)(`div`,{className:`text-muted-foreground`,children:[(0,g.jsx)(`span`,{className:`font-mono text-xs`,children:e.dir}),`: `,e.error]},`${e.dir}-${t}`))]}):null,y&&!a?(0,g.jsxs)(`div`,{className:`flex h-40 items-center justify-center text-sm text-muted-foreground`,children:[(0,g.jsx)(t,{className:`mr-2 size-4 animate-spin`}),d(`loadingPlugins`)]}):null,!y&&a&&a.plugins.length===0?(0,g.jsxs)(`div`,{className:`rounded-2xl border border-dashed border-border bg-card p-6 text-sm text-muted-foreground`,children:[(0,g.jsx)(`div`,{className:`text-base font-medium text-foreground`,children:d(`noPlugins`)}),(0,g.jsx)(`p`,{className:`mt-2`,children:d(`noPluginsDescription`)}),(0,g.jsx)(`div`,{className:`mt-4 space-y-1`,children:(a.searchPaths||[]).map(e=>(0,g.jsx)(`div`,{className:`font-mono text-xs`,children:e},e))})]}):null,(0,g.jsx)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:(a?.plugins||[]).map(e=>(0,g.jsxs)(`article`,{className:`rounded-2xl border border-border bg-card p-4 shadow-sm`,children:[(0,g.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,g.jsxs)(`div`,{className:`min-w-0`,children:[(0,g.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,g.jsx)(`h2`,{className:`truncate text-base font-semibold text-foreground`,children:b(e)}),(0,g.jsxs)(`span`,{className:`rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground`,children:[`v`,e.version]}),(0,g.jsx)(`span`,{className:l(`rounded-full px-2 py-0.5 text-xs`,_(e.status)),children:v(e.status)})]}),(0,g.jsx)(`p`,{className:`mt-2 line-clamp-2 text-sm text-muted-foreground`,children:x(e)})]}),(0,g.jsxs)(`div`,{className:`flex shrink-0 flex-col gap-1.5`,children:[(0,g.jsxs)(u,{variant:e.enabled?`outline`:`default`,size:`sm`,disabled:w===e.name,onClick:()=>void N(e.name,!e.enabled),children:[w===e.name?(0,g.jsx)(t,{className:`mr-2 size-4 animate-spin`}):null,e.enabled?d(`disablePlugin`):d(`enablePlugin`)]}),(0,g.jsx)(u,{variant:`ghost`,size:`sm`,onClick:()=>D(e.name),children:d(`viewDetails`)})]})]}),e.error?(0,g.jsx)(`div`,{className:`mt-3 rounded-lg border border-destructive/30 bg-destructive/8 px-3 py-2 text-sm text-destructive`,children:e.error}):null,(0,g.jsxs)(`div`,{className:`mt-3 flex flex-wrap gap-x-4 gap-y-1 border-t border-border pt-3 text-xs text-muted-foreground`,children:[(0,g.jsxs)(`span`,{className:`inline-flex items-center gap-1`,children:[(0,g.jsx)(s,{className:`size-3`}),d(`pluginToolsCount`,{count:e.tools.length})]}),(0,g.jsxs)(`span`,{className:`inline-flex items-center gap-1`,children:[(0,g.jsx)(n,{className:`size-3`}),d(`pluginPermissionsCount`,{count:e.permissions.length})]}),(0,g.jsx)(`span`,{children:e.enabled?d(`enabled`):d(`disabled`)})]})]},e.name))})]})}),M?(0,g.jsx)(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4`,onMouseDown:e=>{e.target===e.currentTarget&&D(null)},children:(0,g.jsxs)(`div`,{className:`flex max-h-[90vh] w-full max-w-3xl flex-col overflow-hidden rounded-2xl border border-border bg-background shadow-2xl`,onMouseDown:e=>e.stopPropagation(),children:[(0,g.jsxs)(`div`,{className:`flex shrink-0 items-start justify-between gap-3 border-b border-border px-5 py-4`,children:[(0,g.jsxs)(`div`,{className:`min-w-0`,children:[(0,g.jsx)(`h2`,{className:`text-base font-semibold text-foreground`,children:d(`pluginDetails`)}),(0,g.jsx)(`p`,{className:`mt-1 truncate text-sm text-muted-foreground`,children:b(M)})]}),(0,g.jsx)(u,{variant:`ghost`,size:`sm`,onClick:()=>D(null),children:d(`close`)})]}),(0,g.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-5 py-4`,children:(0,g.jsxs)(`div`,{className:`space-y-4`,children:[M.error?(0,g.jsx)(`div`,{className:`rounded-lg border border-destructive/30 bg-destructive/8 px-3 py-2 text-sm text-destructive`,children:M.error}):null,(0,g.jsxs)(`div`,{className:`rounded-2xl border border-border bg-card p-4 shadow-sm`,children:[(0,g.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:x(M)}),(0,g.jsxs)(`div`,{className:`mt-3 grid gap-2 border-t border-border pt-3 text-xs text-muted-foreground sm:grid-cols-2`,children:[(0,g.jsxs)(`span`,{children:[d(`pluginVersion`),`:`,M.version]}),(0,g.jsxs)(`span`,{children:[d(`status`),`:`,v(M.status)]}),(0,g.jsx)(`span`,{children:d(`pluginToolsCount`,{count:M.tools.length})}),(0,g.jsx)(`span`,{children:M.enabled?d(`enabled`):d(`disabled`)})]})]}),(0,g.jsxs)(`div`,{className:`rounded-2xl border border-border bg-card p-4 shadow-sm`,children:[(0,g.jsxs)(`div`,{className:`mb-3 flex items-center gap-2 text-sm font-semibold text-foreground`,children:[(0,g.jsx)(s,{className:`size-4 text-muted-foreground`}),d(`pluginTools`)]}),M.tools.length?(0,g.jsx)(`div`,{className:`space-y-2`,children:M.tools.map(e=>(0,g.jsxs)(`div`,{className:`rounded-xl bg-muted/30 px-3 py-2`,children:[(0,g.jsx)(`div`,{className:`text-sm font-medium text-foreground`,children:S(e)}),e.description?(0,g.jsx)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:e.description}):null]},e.quickForgeName))}):(0,g.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:d(`pluginNoTools`)})]}),(0,g.jsxs)(`div`,{className:`rounded-2xl border border-border bg-card p-4 shadow-sm`,children:[(0,g.jsxs)(`div`,{className:`mb-3 flex items-center gap-2 text-sm font-semibold text-foreground`,children:[(0,g.jsx)(n,{className:`size-4 text-muted-foreground`}),d(`pluginPermissions`)]}),M.permissions.length?(0,g.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:M.permissions.map(e=>(0,g.jsx)(`span`,{className:`rounded-full bg-muted px-2 py-0.5 font-mono text-xs text-muted-foreground`,children:e},e))}):(0,g.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:d(`pluginNoPermissions`)}),(0,g.jsx)(`p`,{className:`mt-3 text-xs text-muted-foreground/80`,children:d(`pluginTrustedNotice`)})]})]})})]})}):null]})}export{C as PluginsPage};
@@ -1 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{H as t,i as n,it as r}from"./icons-Dsc5yL3l.js";import{n as i}from"./react-vendor-CiCXOLb5.js";import{f as a,i as o,n as s,r as c,t as l,u}from"./pi-web-ui-CBet4bMl.js";import{p as d}from"./pi-ai-Cx633yhb.js";import{t as f}from"./logger-B65Akg8A.js";import{C as p,D as m,E as h,O as g,_,a as v,c as y,d as b,f as x,g as S,h as C,o as w,p as T,s as E,v as D,w as O}from"./index-YTL26wyJ.js";import{ChatPanelHost as k}from"./ChatPanelHost-BjdIshtX.js";var A=e(r(),1),j=`quickforgeClientMessageId`;function M(e){let t=e?.metadata;return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}function N(e){let t=M(e)?.[j];return typeof t==`string`&&t?t:void 0}function P(){return`qfcm_${typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}`}function F(e){let t=N(e);if(t)return{message:e,clientMessageId:t};let n=P();return{message:{...e,metadata:{...M(e),[j]:n}},clientMessageId:n}}function I(e){return typeof e==`string`?e:Array.isArray(e)?e.filter(e=>e&&typeof e==`object`&&e.type===`text`).map(e=>e.text).filter(e=>typeof e==`string`).join(``):``}function L(e,t){if(!e||!t||e.role!==t.role)return!1;let n=N(e),r=N(t);return n&&r?n===r:I(e.content)===I(t.content)}async function R(e,t){let n=await fetch(e,{...t,cache:`no-store`,headers:{...t?.body?{"content-type":`application/json`}:void 0,...t?.headers}}),r=await n.json().catch(()=>null);if(!n.ok)throw Error(r?.error||`Request failed: ${n.status}`);return r}var z=class e{state;streamFn=d;getApiKey;sessionId;shareId;permission;listeners=new Set;eventSource=null;disposed=!1;reconnectTimer=null;reconnectDelay=1e3;baseUrl=``;syncingThinkingLevel=!1;constructor(e,t){this.shareId=e,this.sessionId=t.sessionId||t.id||e,this.permission=t.permission??`read`;let n={systemPrompt:t.systemPrompt??``,model:t.model??{provider:`shared`,id:`shared`},thinkingLevel:t.thinkingLevel??`off`,messages:t.messages?.slice()??[],tools:t.tools??[],isStreaming:!!t.isStreaming,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:t.errorMessage,contextCompaction:t.contextCompaction??null,contextUsage:t.contextUsage??null};this.state=new Proxy(n,{set:(e,t,n)=>{let r=e[t];return e[t]=n,t===`thinkingLevel`&&!this.syncingThinkingLevel&&n!==r&&this.updateThinkingLevel(n).catch(e=>{f.error(`Failed to update shared thinking level:`,e)}),!0}}),this.connectEvents()}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}async prompt(e){if(this.disposed||this.permission!==`operate`)return;let{message:t,clientMessageId:n}=F(this.normalizeInput(e));this.state.messages=[...this.state.messages,t],this.emit({type:`message_start`,message:t}),this.state.isStreaming||(this.state.isStreaming=!0,this.state.errorMessage=void 0,this.emit({type:`agent_start`}));try{await R(`/api/shared/${encodeURIComponent(this.shareId)}/message`,{method:`POST`,body:JSON.stringify({message:t,clientMessageId:n})})}catch(e){let t=e instanceof Error?e.message:String(e);throw this.state.errorMessage=t,this.state.isStreaming=!1,this.emit({type:`error`,error:t}),this.emit({type:`agent_end`,messages:this.state.messages}),e}}async updateModel(e){if(!(this.disposed||this.permission!==`operate`)){this.state.model=e;try{let t=await R(`/api/shared/${encodeURIComponent(this.shareId)}/model`,{method:`POST`,body:JSON.stringify({model:e})});t.model&&(this.state.model=t.model)}catch(e){let t=e instanceof Error?e.message:String(e);throw this.state.errorMessage=t,this.emit({type:`error`,error:t}),e}}}async updateThinkingLevel(e){if(!(this.disposed||this.permission!==`operate`)){!this.syncingThinkingLevel&&this.state.thinkingLevel!==e&&(this.state.thinkingLevel=e);try{let t=await R(`/api/shared/${encodeURIComponent(this.shareId)}/thinking-level`,{method:`POST`,body:JSON.stringify({thinkingLevel:e})});t.thinkingLevel&&(this.state.thinkingLevel=t.thinkingLevel)}catch(e){let t=e instanceof Error?e.message:String(e);throw this.state.errorMessage=t,this.emit({type:`error`,error:t}),e}}}abort(){this.permission===`operate`&&fetch(`/api/shared/${encodeURIComponent(this.shareId)}/abort`,{method:`POST`}).catch(e=>{f.error(`Failed to abort shared conversation:`,e)})}steer(){}followUp(){}reset(){this.state.messages=[],this.state.errorMessage=void 0,this.state.isStreaming=!1,this.state.streamingMessage=void 0,this.state.pendingToolCalls=new Set}async rollback(e){if(this.permission!==`operate`)return;let t=await R(`/api/shared/${encodeURIComponent(this.shareId)}/rollback`,{method:`POST`,body:JSON.stringify({messageIndex:e})});return this.applyState(t.session),this.emit({type:`messages_replaced`,messages:this.state.messages}),t}dispose(){this.disposed=!0,this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.eventSource?.close(),this.eventSource=null,this.listeners.clear()}static async loadState(e){return R(`/api/shared/${encodeURIComponent(e)}/session`)}static async create(t){return new e(t,await e.loadState(t))}normalizeInput(e){return typeof e==`string`?{role:`user`,content:e,timestamp:Date.now()}:Array.isArray(e)?[...e].reverse().find(e=>e.role===`user`||e.role===`user-with-attachments`)??e[e.length-1]:e}connectEvents(){this.disposed||(this.eventSource?.close(),this.baseUrl=``,this.openEventSource())}openEventSource(){if(this.disposed)return;let e=`${this.baseUrl}/api/shared/${encodeURIComponent(this.shareId)}/events`;this.eventSource=new EventSource(e,{withCredentials:!0}),this.eventSource.onopen=()=>{this.reconnectDelay=1e3};let t=[`state`,`agent_start`,`agent_end`,`message_start`,`message_end`,`turn_start`,`turn_end`,`message_update`,`tool_execution_start`,`tool_execution_update`,`tool_execution_end`,`error`,`title_updated`,`messages_replaced`,`auto_compact_completed`],n=e=>t=>{try{let n=JSON.parse(t.data);this.handleEvent(e?{type:e,...n}:n)}catch{}};this.eventSource.onmessage=n();for(let e of t)this.eventSource.addEventListener(e,n(e));this.eventSource.onerror=()=>{this.eventSource?.close(),this.eventSource=null,this.scheduleReconnect()}}scheduleReconnect(){this.disposed||this.reconnectTimer||(this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.reconnectDelay=Math.min(this.reconnectDelay*2,3e4),this.openEventSource()},this.reconnectDelay))}handleEvent(e){if(e.type){switch(e.type){case`state`:this.applyState(e);break;case`agent_start`:this.state.isStreaming=!0,this.state.errorMessage=void 0;break;case`agent_end`:this.state.isStreaming=!1,this.state.streamingMessage=void 0;break;case`message_start`:if(e.message){let t=this.state.messages.findIndex(t=>L(t,e.message));if(t>=0){let n=this.state.messages.slice();n[t]=e.message,this.state.messages=n}else this.state.messages=[...this.state.messages,e.message];this.state.contextUsage=null}break;case`message_update`:e.message&&(this.state.streamingMessage=e.message);break;case`message_end`:e.message&&(this.state.messages=S(this.state.messages,e.message)),this.state.contextUsage=`contextUsage`in e?e.contextUsage:null,this.state.streamingMessage=void 0;break;case`messages_replaced`:e.messages&&(this.state.messages=e.messages,this.state.streamingMessage=void 0),`contextCompaction`in e&&(this.state.contextCompaction=e.contextCompaction),`contextUsage`in e&&(this.state.contextUsage=e.contextUsage);break;case`auto_compact_completed`:`contextCompaction`in e&&(this.state.contextCompaction=e.contextCompaction),`contextUsage`in e&&(this.state.contextUsage=e.contextUsage);break;case`tool_execution_start`:{let t=e;t.toolCallId&&(this.state.messages=_(this.state.messages,C(t),!0),this.state.pendingToolCalls=new Set([...this.state.pendingToolCalls,t.toolCallId]));break}case`tool_execution_update`:{let t=e;this.state.messages=_(this.state.messages,t,!0),t.toolCallId&&(this.state.pendingToolCalls=new Set([...this.state.pendingToolCalls,t.toolCallId]));break}case`tool_execution_end`:{let t=e;if(this.state.messages=_(this.state.messages,t,!1),t.toolCallId){let e=new Set(this.state.pendingToolCalls);e.delete(t.toolCallId),this.state.pendingToolCalls=e}break}case`error`:this.state.errorMessage=typeof e.error==`string`?e.error:`Unknown error`,this.state.isStreaming=!1;break}this.emit(e)}}applyState(e){this.sessionId=e.sessionId||e.id||this.sessionId,e.messages&&(this.state.messages=e.messages,this.state.contextUsage=e.contextUsage===void 0?null:e.contextUsage),e.systemPrompt!==void 0&&(this.state.systemPrompt=e.systemPrompt),e.model&&(this.state.model=e.model),e.thinkingLevel&&(this.syncingThinkingLevel=!0,this.state.thinkingLevel=e.thinkingLevel,this.syncingThinkingLevel=!1),e.tools&&(this.state.tools=e.tools),e.isStreaming!==void 0&&(this.state.isStreaming=!!e.isStreaming),e.errorMessage!==void 0&&(this.state.errorMessage=e.errorMessage),e.contextCompaction!==void 0&&(this.state.contextCompaction=e.contextCompaction),e.contextUsage!==void 0&&(this.state.contextUsage=e.contextUsage)}emit(e){for(let t of this.listeners)try{t(e)}catch{}}},B=i();function V(e){return{id:`shared-${e.provider}`,name:e.provider,type:e.api,baseUrl:e.baseUrl??``,models:[e]}}async function H(e,t){try{let t=await w(e);if(t.providers?.length)return t.providers}catch{}return t?[V(t)]:[]}function U(e,t){let n=t.model??{provider:`shared`,id:`shared`};return new z(e,{...t,model:n,thinkingLevel:t.thinkingLevel??D(n)})}function W(e,t){let n={settings:new l,providerKeys:new c,sessions:new s,customProviders:new o},r=new p(``,{blockedStores:[`sessions`,`provider-keys`],fakeProviderKeys:t?[t.provider]:void 0,storeOverrides:t?{"custom-providers":{keys:async()=>(await H(e,t)).map(e=>e.name),get:async n=>(await H(e,t)).find(e=>e.name===n)??null,has:async n=>(await H(e,t)).some(e=>e.name===n)}}:void 0});n.settings.setBackend(r),n.providerKeys.setBackend(r),n.sessions.setBackend(r),n.customProviders.setBackend(r),a(new u(n.settings,n.providerKeys,n.sessions,n.customProviders,r))}function G({shareId:e}){let[r,i]=(0,A.useState)(``),[a,o]=(0,A.useState)(null),[s,c]=(0,A.useState)(`read`),[l,u]=(0,A.useState)(`QuickForge 分享对话`),[d,p]=(0,A.useState)(),[_,S]=(0,A.useState)(!1),[C,w]=(0,A.useState)(),D=(0,A.useRef)(!1),j=s===`operate`,M=!!a,N=!!a?.state.tools?.length;(0,A.useEffect)(()=>{W(e,a?.state.model)},[a?.state.model,e]),(0,A.useEffect)(()=>()=>a?.dispose(),[a]);let P=(0,A.useCallback)(async(t=r.trim())=>{p(void 0),S(!0);try{let n=await E(e,t);c(n.permission),u(n.title||n.share.titleSnapshot||`QuickForge 分享对话`);let r=await z.loadState(e);W(e,r.model),o(U(e,r))}catch(e){p(e instanceof Error?e.message:`Failed to unlock shared conversation`)}finally{S(!1)}},[r,e]);(0,A.useEffect)(()=>{if(M||_||D.current)return;D.current=!0;let t=window.setTimeout(()=>{(async()=>{try{(await v(e)).share.hasPassword||await P(``)}catch(e){p(e instanceof Error?e.message:`Failed to load shared conversation`)}})()},0);return()=>window.clearTimeout(t)},[_,e,P,M]);let F=(0,A.useCallback)(async e=>{await b(e)},[]),I=(0,A.useCallback)(async()=>{if(!(!a||a.permission!==`operate`))try{let t=(await H(e,a.state.model)).flatMap(e=>e.models??[]);if(!t.length)return;y(a.state.model,t,t=>{!t.reasoning&&a.state.thinkingLevel!==`off`&&a.updateThinkingLevel(`off`).catch(e=>{f.error(`Failed to update shared thinking level:`,e)}),W(e,t),a.updateModel(t).catch(e=>{p(e instanceof Error?e.message:`Failed to update model`)})},void 0,{thinkingLevel:a.state.thinkingLevel,onThinkingLevelSelect:e=>{a.updateThinkingLevel(e).catch(e=>{f.error(`Failed to update shared thinking level:`,e),p(e instanceof Error?e.message:`Failed to update thinking level`)})}})}catch(e){p(e instanceof Error?e.message:`Failed to load models`)}},[a,e]),L=(0,A.useCallback)(async e=>{if(!a||a.permission!==`operate`)return;if(p(void 0),a.state.isStreaming){O(g(`generationStillRunning`));return}let t=T(a.state.messages,e),n=t>=0?a.state.messages[t]:void 0;if(!n){O(g(`noConversationTurnToRollback`));return}try{await a.rollback(e),w({id:Date.now(),sessionId:a.sessionId,text:x(n),attachments:n.role===`user-with-attachments`?n.attachments:void 0})}catch(e){p(e instanceof Error?e.message:`Failed to roll back`)}},[a]);return M?(0,B.jsxs)(`div`,{className:`flex h-screen min-h-0 flex-col bg-background text-foreground`,children:[(0,B.jsx)(`header`,{className:m(`shrink-0 border-b px-4 py-3`,j?`border-red-300 bg-red-50 text-red-950`:`border-border bg-card`),children:(0,B.jsxs)(`div`,{className:`mx-auto flex max-w-4xl items-start gap-3`,children:[(0,B.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,B.jsx)(`div`,{className:`truncate text-sm font-semibold`,children:l}),(0,B.jsxs)(`div`,{className:`mt-1 flex flex-wrap items-center gap-x-2 gap-y-1 text-xs`,children:[(0,B.jsxs)(`span`,{className:m(`inline-flex items-center gap-1 rounded-full px-2 py-0.5 font-medium`,j?`bg-red-100 text-red-700`:`bg-muted text-muted-foreground`),children:[j?(0,B.jsx)(n,{className:`size-3.5`}):null,j?`高危可操作`:`只读分享`]}),(0,B.jsx)(`span`,{className:m(j?`text-red-800`:`text-muted-foreground`),children:j?`正在操作分享者的原始对话`:`只能查看,不能发送或修改`})]}),j?null:(0,B.jsx)(`div`,{className:`mt-1 text-xs leading-5 text-muted-foreground`,children:`界面与正常对话保持一致`})]}),(0,B.jsxs)(h,{variant:`ghost`,size:`sm`,className:m(`shrink-0`,j?`text-red-700 hover:bg-red-100 hover:text-red-800`:void 0),onClick:()=>void b(window.location.href),"aria-label":j?`复制高危分享链接`:`复制分享链接`,title:j?`复制高危分享链接`:`复制分享链接`,children:[(0,B.jsx)(t,{className:`size-4`}),(0,B.jsx)(`span`,{className:`hidden sm:inline`,children:j?`复制高危链接`:`复制链接`})]})]})}),d?(0,B.jsx)(`div`,{className:`mx-auto w-full max-w-4xl px-4 py-2 text-sm text-destructive`,children:d}):null,(0,B.jsx)(k,{agent:a,revision:0,yoloMode:N,workspaceToolsEnabled:N,onModelSelect:I,onToggleYoloMode:()=>void 0,onRollbackFromMessage:L,onRetryFromMessage:()=>void 0,onCopyAnswer:F,onForkFromMessage:()=>void 0,onApproveToolCall:()=>void 0,onRejectToolCall:()=>void 0,disableFork:!0,rollbackConfirmTitle:g(`sharedRollbackConfirmTitle`),rollbackConfirmDescription:g(`sharedRollbackConfirm`),readOnly:!j,restoredDraft:C,bypassClientApiKeyCheck:!0})]}):(0,B.jsx)(`div`,{className:`flex min-h-screen items-center justify-center bg-background p-6 text-foreground`,children:(0,B.jsxs)(`div`,{className:`w-full max-w-md rounded-2xl border border-border bg-card p-6 shadow-xl`,children:[(0,B.jsxs)(`div`,{className:`flex items-center gap-2 text-base font-semibold`,children:[(0,B.jsx)(n,{className:`size-5 text-amber-500`}),`QuickForge 局域网对话分享`]}),(0,B.jsx)(`p`,{className:`mt-2 text-sm text-muted-foreground`,children:`如果分享者设置了密码,请输入密码。未设置密码的链接会自动打开。`}),(0,B.jsx)(`input`,{type:`password`,value:r,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Enter`&&P()},className:`mt-5 h-10 w-full rounded-md border border-input bg-background px-3 text-sm outline-none focus:border-primary`,placeholder:`密码`,autoFocus:!0}),d?(0,B.jsx)(`div`,{className:`mt-3 rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive`,children:d}):null,(0,B.jsx)(h,{className:`mt-5 w-full`,onClick:()=>void P(),disabled:_||!r.trim(),children:_?g(`loading`):`用密码打开分享对话`})]})})}export{G as SharedConversationPage};
@@ -1,2 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{E as t,M as n,Q as r,g as i,it as a,j as o,n as s,o as c}from"./icons-Dsc5yL3l.js";import{n as l}from"./react-vendor-CiCXOLb5.js";import{D as u,E as d,O as f}from"./index-YTL26wyJ.js";import{n as p,t as m}from"./xterm-5XDrJ343.js";var h=e(a(),1);async function g(e,t){let n=await fetch(e,{cache:`no-store`,...t}),r=await n.json().catch(()=>null);if(!n.ok)throw Error(r?.error||`Request failed: ${n.status}`);return r}function _(){return g(`/api/terminal/capabilities`)}function v(e){return g(`/api/terminal/sessions${e?`?projectId=${encodeURIComponent(e)}`:``}`)}function y(e){return g(`/api/terminal/sessions`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e)})}function b(e){return g(`/api/terminal/sessions/${encodeURIComponent(e)}`,{method:`DELETE`})}function x(e,t){return g(`/api/terminal/sessions/${encodeURIComponent(e)}/input`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({data:t})})}function S(){return``}function C(){let e=S();if(e){let t=new URL(e);return t.protocol=t.protocol===`https:`?`wss:`:`ws:`,t.toString().replace(/\/$/,``)}return`${location.protocol===`https:`?`wss:`:`ws:`}//${location.host}`}var w=l();function ee({session:e,active:t,height:n,onExited:r,onConnectionError:i}){let a=(0,h.useRef)(null),o=(0,h.useRef)(null),s=(0,h.useRef)(null),c=(0,h.useRef)(null),l=(0,h.useRef)(null),u=(0,h.useRef)(null);return(0,h.useEffect)(()=>{let t=a.current;if(!t)return;let n=!1,d=!1,h=!1,g=!1,_=t=>{n||h||g||(g=!0,i(e.id,t))},v=new p({cursorBlink:!0,convertEol:!1,fontFamily:`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace`,fontSize:12,lineHeight:1.2,scrollback:5e3,theme:{background:`#ffffff`,foreground:`#1f2937`,cursor:`#1f2937`,selectionBackground:`#dbeafe`}}),y=new m;v.loadAddon(y),v.open(t),v.writeln(`\x1b[2mConnected to ${e.cwd}\x1b[0m`),o.current=v,s.current=y;let b=()=>{if(t.isConnected)try{y.fit();let{cols:e,rows:t}=v,n=c.current;n?.readyState===WebSocket.OPEN&&n.send(JSON.stringify({type:`resize`,cols:e,rows:t}))}catch{}},x=new WebSocket(`${C()}/api/terminal/sessions/${encodeURIComponent(e.id)}/ws`);c.current=x,x.addEventListener(`open`,()=>{d=!0,g=!1,i(e.id,void 0),l.current=v.onData(e=>{x.readyState===WebSocket.OPEN&&x.send(JSON.stringify({type:`input`,data:e}))}),window.setTimeout(b,0)}),x.addEventListener(`message`,t=>{try{let n=JSON.parse(String(t.data));n.type===`output`?v.write(n.data):n.type===`exit`?(h=!0,v.writeln(``),v.writeln(`\x1b[33m[process exited with code ${n.exitCode??`unknown`}]\x1b[0m`),r(e.id)):n.type===`error`&&v.writeln(`\x1b[31m${n.message}\x1b[0m`)}catch{}}),x.addEventListener(`error`,()=>{_(f(d?`terminalConnectionClosedUnexpectedly`:`terminalConnectionFailed`))}),x.addEventListener(`close`,e=>{l.current?.dispose(),l.current=null,!(n||h)&&(!e.wasClean||e.code!==1e3)&&_(f(d?`terminalConnectionClosedUnexpectedly`:`terminalConnectionFailed`))});let S=new ResizeObserver(()=>b());return S.observe(t),u.current=S,window.setTimeout(b,50),()=>{n=!0,S.disconnect(),u.current=null,l.current?.dispose(),l.current=null,x.close(),c.current=null,v.dispose(),o.current=null,s.current=null}},[i,r,e.cwd,e.id]),(0,h.useEffect)(()=>{if(!t)return;let e=s.current,n=o.current;window.setTimeout(()=>{try{e?.fit(),n?.focus()}catch{}},0)},[t,n]),(0,w.jsx)(`div`,{ref:a,className:t?`h-full min-h-0 w-full`:`hidden`,"aria-hidden":!t})}var T=180,te=.7,ne=320;function E(e,t){let n=t?t.name:`Terminal`,r=new Set(e.map(e=>e.name));if(n!==`Terminal`&&!r.has(n))return n;let i=1;for(;r.has(`${n} ${i}`);)i+=1;return`${n} ${i}`}function D(e,t){let n=e?.terminalShellProfiles||[],r=t||e?.defaultTerminalShellProfileId||``;return n.find(e=>e.id===r)||n[0]}function O({project:e,onCollapse:a,pendingCommand:l,onPendingCommandHandled:p}){let[m,g]=(0,h.useState)(null),[S,C]=(0,h.useState)([]),[O,k]=(0,h.useState)(),[A,re]=(0,h.useState)(ne),[j,M]=(0,h.useState)(!0),[N,P]=(0,h.useState)(!1),[ie,F]=(0,h.useState)(),[ae,I]=(0,h.useState)({}),[L,R]=(0,h.useState)(!1),[z,B]=(0,h.useState)(!1),V=(0,h.useRef)(!1),H=(0,h.useRef)(new Set),U=(0,h.useRef)(null),W=(0,h.useRef)(null),G=e?.id,K=(0,h.useMemo)(()=>S.find(e=>e.id===O)??S[0],[O,S]),oe=(0,h.useCallback)(async()=>{let e=await v(G);return C(e.sessions),k(t=>t&&e.sessions.some(e=>e.id===t)?t:e.sessions[0]?.id),e.sessions},[G]),q=(0,h.useCallback)(async(e,t)=>{if(V.current)return;let n=D(m,t);V.current=!0,P(!0),F(void 0),I({});try{let t=await y({projectId:G,name:E(e,n),cols:120,rows:30,shellProfileId:n?.id,shellProfileName:n?.name});C(e=>[...e,t]),k(t.id)}catch(e){F(e instanceof Error?e.message:f(`terminalCreateFailed`))}finally{V.current=!1,P(!1)}},[m,G]);(0,h.useEffect)(()=>{let e=!1;return(async()=>{M(!0),F(void 0);try{let[t,n]=await Promise.all([_(),v(G)]);if(e)return;if(g(t),C(n.sessions),k(n.sessions[0]?.id),t.enabled&&n.sessions.length===0){let n=D(t);y({projectId:G,name:E([],n),cols:120,rows:30,shellProfileId:n?.id,shellProfileName:n?.name}).then(t=>{if(e){b(t.id).catch(()=>{});return}C([t]),k(t.id)}).catch(t=>{e||F(t instanceof Error?t.message:f(`terminalCreateFailed`))})}}catch(t){e||F(t instanceof Error?t.message:f(`terminalUnavailable`))}finally{e||M(!1)}})(),()=>{e=!0}},[G]),(0,h.useEffect)(()=>{if(!L)return;let e=e=>{W.current?.contains(e.target)||R(!1)},t=e=>{e.key===`Escape`&&R(!1)};return document.addEventListener(`pointerdown`,e),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`pointerdown`,e),document.removeEventListener(`keydown`,t)}},[L]),(0,h.useEffect)(()=>{if(!z)return;let e=e=>{e.key===`Escape`&&B(!1)};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[z]),(0,h.useEffect)(()=>{if(!l||H.current.has(l.id)||j||N||!m)return;if(!m.enabled){H.current.add(l.id),window.setTimeout(()=>{F(m.reason||f(`terminalUnavailable`)),p?.(l.id)},0);return}let e=!1;return(async()=>{H.current.add(l.id),F(void 0);try{let t=K&&!K.exited?K:S.find(e=>!e.exited);if(!t){let n=D(m);if(t=await y({projectId:G,name:E(S,n),cols:120,rows:30,shellProfileId:n?.id,shellProfileName:n?.name}),e)return;C(e=>[...e,t])}if(k(t.id),l.execute){let e=l.command.split(`
2
- `),n=e.flatMap((t,n)=>n<e.length-1?[t,`\r`]:[t]);n.push(`\r`),await x(t.id,n.join(``))}else await x(t.id,l.command)}catch(t){e||F(t instanceof Error?t.message:f(`terminalCommandExecuteFailed`))}finally{e||p?.(l.id)}})(),()=>{e=!0}},[K,m,N,j,p,l,G,S]);let J=async e=>{F(void 0),I(t=>{if(!t[e])return t;let n={...t};return delete n[e],n});let t=S.filter(t=>t.id!==e);C(t),O===e&&k(t[0]?.id);try{await b(e)}catch(e){F(e instanceof Error?e.message:f(`terminalCloseFailed`)),oe().catch(()=>{})}},se=(0,h.useCallback)(e=>{C(t=>t.map(t=>t.id===e?{...t,exited:!0}:t))},[]),ce=(0,h.useCallback)((e,t)=>{I(n=>{if(!t){if(!n[e])return n;let t={...n};return delete t[e],t}return n[e]===t?n:{...n,[e]:t}})},[]),le=e=>{U.current={startY:e.clientY,startHeight:A},e.currentTarget.setPointerCapture(e.pointerId)},ue=e=>{let t=U.current;if(!t)return;let n=Math.max(T,Math.floor(window.innerHeight*te));re(Math.min(n,Math.max(T,t.startHeight+t.startY-e.clientY)))},Y=e=>{U.current=null;try{e.currentTarget.releasePointerCapture(e.pointerId)}catch{}},X=m?.terminalShellProfiles||[],de=m?.defaultTerminalShellProfileId||``,Z=X.find(e=>e.id===de)||X[0],fe=!!(m&&S.length>=m.maxSessions),Q=N||fe,pe=K?ae[K.id]:void 0,$=ie??pe,me=z?$?`calc(100% - 4.25rem)`:`calc(100% - 2.25rem)`:$?A-72:A-45;return(0,w.jsxs)(`div`,{className:u(`shrink-0 border-t border-border bg-background`,z&&`absolute inset-0 z-30 flex flex-col border-t-0`),style:z?void 0:{height:A},children:[z?null:(0,w.jsx)(`div`,{className:`h-1 cursor-row-resize bg-transparent hover:bg-border`,onPointerDown:le,onPointerMove:ue,onPointerUp:Y,onPointerCancel:Y}),(0,w.jsxs)(`div`,{className:`flex h-9 items-center gap-1 border-b border-border px-2`,children:[(0,w.jsx)(c,{className:`size-4 shrink-0 text-muted-foreground/60`}),(0,w.jsx)(`div`,{className:`flex min-w-0 flex-1 items-center gap-1 overflow-x-auto`,children:S.map(e=>(0,w.jsxs)(`button`,{type:`button`,className:u(`group flex max-w-44 shrink-0 items-center gap-1 rounded-md px-2 py-1 text-xs text-muted-foreground/72 hover:bg-muted/20 hover:text-foreground/85`,K?.id===e.id&&`bg-muted/28 text-foreground/90`),onClick:()=>k(e.id),title:`${e.name} — ${e.cwd}`,children:[(0,w.jsx)(`span`,{className:u(`size-1.5 rounded-full`,e.exited?`bg-muted-foreground/40`:`bg-emerald-500/80`)}),(0,w.jsx)(`span`,{className:`truncate`,children:e.name}),(0,w.jsx)(`span`,{role:`button`,tabIndex:0,className:`ml-1 rounded-sm p-0.5 opacity-60 hover:bg-background hover:opacity-100`,onClick:t=>{t.stopPropagation(),J(e.id)},onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),t.stopPropagation(),J(e.id))},"aria-label":f(`terminalCloseSession`,{name:e.name}),children:(0,w.jsx)(s,{className:`size-3`})})]},e.id))}),(0,w.jsxs)(`div`,{className:`relative shrink-0`,ref:W,children:[(0,w.jsxs)(`div`,{className:`flex items-center overflow-hidden rounded-md border border-border bg-background`,children:[(0,w.jsx)(`button`,{type:`button`,className:`inline-flex h-7 w-7 items-center justify-center text-foreground/85 transition-colors hover:bg-muted/20 disabled:pointer-events-none disabled:opacity-50`,onClick:()=>void q(S),disabled:Q,title:Z?f(`terminalNewWithProfile`,{name:Z.name}):f(`terminalNew`),"aria-label":f(`terminalNew`),children:N?(0,w.jsx)(n,{className:`size-3.5 animate-spin`}):(0,w.jsx)(i,{className:`size-3.5`})}),X.length>0?(0,w.jsx)(`button`,{type:`button`,className:`inline-flex h-7 w-7 items-center justify-center border-l border-border text-muted-foreground/72 transition-colors hover:bg-muted/20 hover:text-foreground/85 disabled:pointer-events-none disabled:opacity-50`,onClick:()=>R(e=>!e),disabled:Q,title:f(`terminalSelectShell`),"aria-label":f(`terminalSelectShell`),"aria-expanded":L,children:(0,w.jsx)(r,{className:`size-3.5`})}):null]}),L?(0,w.jsxs)(`div`,{className:`absolute bottom-9 right-0 z-30 w-64 overflow-hidden rounded-lg border border-border bg-background p-1.5 shadow-[0_16px_38px_-22px_rgb(15_23_42_/_0.65)]`,children:[(0,w.jsx)(`div`,{className:`px-2 pb-1.5 pt-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground/60`,children:f(`terminalNewWith`)}),X.map(e=>(0,w.jsxs)(`button`,{type:`button`,className:`flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-xs text-muted-foreground/80 hover:bg-muted/20 hover:text-foreground/90`,onClick:()=>{R(!1),q(S,e.id)},children:[(0,w.jsx)(`span`,{className:`inline-flex size-5 shrink-0 items-center justify-center rounded bg-muted/20 text-[10px] text-muted-foreground/70`,children:e.name.slice(0,1).toUpperCase()}),(0,w.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,w.jsx)(`span`,{className:`block truncate font-medium`,children:e.name}),(0,w.jsx)(`span`,{className:`block truncate font-mono text-[11px] text-muted-foreground/55`,children:e.command})]})]},e.id))]}):null]}),(0,w.jsx)(d,{variant:`ghost`,size:`icon`,className:`size-7`,onClick:()=>B(e=>!e),title:f(z?`terminalExitFullscreen`:`terminalFullscreen`),"aria-label":f(z?`terminalExitFullscreen`:`terminalFullscreen`),children:z?(0,w.jsx)(t,{className:`size-3.5`}):(0,w.jsx)(o,{className:`size-3.5`})}),(0,w.jsx)(d,{variant:`ghost`,size:`icon`,className:`size-7`,onClick:a,title:f(`terminalCollapse`),"aria-label":f(`terminalCollapse`),children:(0,w.jsx)(r,{className:`size-3.5`})})]}),$?(0,w.jsx)(`div`,{className:`border-b border-border px-3 py-1.5 text-xs text-destructive`,children:$}):null,(0,w.jsx)(`div`,{className:`min-h-0 bg-background`,style:{height:me},children:j?(0,w.jsxs)(`div`,{className:`flex h-full items-center justify-center gap-2 text-xs text-muted-foreground/60`,children:[(0,w.jsx)(n,{className:`size-4 animate-spin`}),` `,f(`terminalStarting`)]}):m&&!m.enabled?(0,w.jsx)(`div`,{className:`flex h-full items-center justify-center px-4 text-center text-xs text-muted-foreground/60`,children:m.reason||f(`terminalUnavailable`)}):S.length===0?(0,w.jsx)(`div`,{className:`flex h-full items-center justify-center text-xs text-muted-foreground/60`,children:f(`terminalNoSessions`)}):S.map(e=>(0,w.jsx)(ee,{session:e,active:e.id===K?.id,height:z?window.innerHeight-36:A,onExited:se,onConnectionError:ce},e.id))})]})}export{O as TerminalDock};
@@ -1,3 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-DWdDZTNf.js";import{C as t,D as n,F as r,R as i,U as a,X as o,it as s,m as c,p as l}from"./icons-Dsc5yL3l.js";import{n as u}from"./react-vendor-CiCXOLb5.js";import{D as d,E as f,O as p,i as ee,n as te,r as m,t as h}from"./index-YTL26wyJ.js";import{WorkspaceReaderDialog as g}from"./WorkspaceReaderDialog-bTeERaGd.js";var _=e(s(),1),v=u();function y(e){return e===`added`?{label:`A`,text:p(`workspaceStatusAdded`),className:`text-emerald-600 dark:text-emerald-500`}:e===`deleted`?{label:`D`,text:p(`workspaceStatusDeleted`),className:`text-red-600 dark:text-red-500`}:e===`renamed`?{label:`R`,text:p(`workspaceStatusRenamed`),className:`text-blue-600 dark:text-blue-500`}:e===`untracked`?{label:`U`,text:p(`workspaceStatusUntracked`),className:`text-amber-600 dark:text-amber-500`}:e===`conflicted`?{label:`!`,text:p(`workspaceStatusConflict`),className:`text-red-600 dark:text-red-500`}:{label:`M`,text:p(`workspaceStatusModified`),className:`text-emerald-600 dark:text-emerald-500`}}function b({files:e,selectedPath:t,onSelectFile:n,emptyMessage:r=p(`workspaceNoWorkingTreeChanges`)}){return e.length===0?(0,v.jsx)(`div`,{className:`px-2 py-3 text-xs text-muted-foreground/70`,children:r}):(0,v.jsx)(`div`,{className:`space-y-0.5`,children:e.map(e=>{let r=y(e.status);return(0,v.jsxs)(`button`,{type:`button`,className:`flex h-7 w-full items-center gap-2 rounded-md px-2 text-left text-xs transition-colors ${t===e.path?`bg-muted/28 text-foreground/90`:`text-muted-foreground/72 hover:bg-muted/20 hover:text-foreground/85`}`,onClick:()=>n(e.path),title:e.oldPath?`${e.oldPath} → ${e.path}`:e.path,children:[(0,v.jsx)(`span`,{className:`w-4 shrink-0 font-mono text-[0.68rem] font-semibold ${r.className}`,children:r.label}),(0,v.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:e.path}),(0,v.jsx)(`span`,{className:`shrink-0 text-[0.68rem] text-muted-foreground/55`,children:r.text})]},`${e.status}:${e.oldPath??``}:${e.path}`)})})}function x(e){return e?e.status===`added`?`A`:e.status===`deleted`?`D`:e.status===`renamed`?`R`:e.status===`untracked`?`U`:`M`:``}function S({node:e,depth:t,selectedPath:n,gitStatuses:a,onSelectFile:s}){let[c,l]=(0,_.useState)(t<1),u=e.type===`directory`,d=n===e.path,f=x(a[e.path]);return(0,v.jsxs)(`div`,{children:[(0,v.jsxs)(`button`,{type:`button`,className:`flex h-7 w-full items-center gap-1.5 rounded-md px-2 text-left text-xs transition-colors ${d?`bg-muted/28 text-foreground/90`:`text-muted-foreground/72 hover:bg-muted/20 hover:text-foreground/85`}`,style:{paddingLeft:`${.5+t*.75}rem`},onClick:()=>{u?l(e=>!e):s(e.path)},title:e.path,children:[u?(0,v.jsx)(o,{className:`size-3 shrink-0 transition-transform ${c?`rotate-90`:``}`}):(0,v.jsx)(`span`,{className:`w-3 shrink-0`}),u?(0,v.jsx)(r,{className:`size-3.5 shrink-0`}):(0,v.jsx)(i,{className:`size-3.5 shrink-0`}),(0,v.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:e.name}),f?(0,v.jsx)(`span`,{className:`shrink-0 font-mono text-[0.68rem] text-emerald-600 dark:text-emerald-500`,children:f}):null]}),u&&c?(0,v.jsx)(`div`,{children:(e.children??[]).map(e=>(0,v.jsx)(S,{node:e,depth:t+1,selectedPath:n,gitStatuses:a,onSelectFile:s},e.path))}):null]})}function ne({tree:e,selectedPath:t,gitStatuses:n={},onSelectFile:r}){return e.length===0?(0,v.jsx)(`div`,{className:`px-2 py-3 text-xs text-muted-foreground/70`,children:p(`workspaceNoFilesToDisplay`)}):(0,v.jsx)(`div`,{className:`space-y-0.5`,children:e.map(e=>(0,v.jsx)(S,{node:e,depth:0,selectedPath:t,gitStatuses:n,onSelectFile:r},e.path))})}function C(e,t){let n=t.trim().toLowerCase();return n?e.flatMap(e=>{let t=e.children?C(e.children,n):void 0;return!(e.name.toLowerCase().includes(n)||e.path.toLowerCase().includes(n))&&(!t||t.length===0)?[]:[{...e,...t?{children:t}:{}}]}):e}function re(e){return`Please review the current workspace changes and generate a concise summary, risk assessment, verification plan, and a suggested commit message.\n\nChanged files:\n${e.map(e=>`- ${e.status}: ${e.oldPath?`${e.oldPath} -> `:``}${e.path}`).join(`
2
- `)}`}function ie(e){return`Please generate a concise Conventional Commit message for the current Git changes. Include a one-line subject and an optional short body if useful.\n\nChanged files:\n${e.map(e=>`- ${e.status}: ${e.oldPath?`${e.oldPath} -> `:``}${e.path}`).join(`
3
- `)}`}function ae(e,t){let n=[`Current branch: ${e||`Unknown branch`}`];return t?.total&&n.push(`${t.total} change${t.total===1?``:`s`}`),n.join(` · `)}function w({title:e,files:t,selectedPath:n,onSelectFile:r}){return t.length===0?null:(0,v.jsxs)(`div`,{className:`space-y-1`,children:[(0,v.jsxs)(`div`,{className:`px-2 text-[11px] font-medium uppercase tracking-wide text-muted-foreground/60`,children:[e,` `,t.length]}),(0,v.jsx)(b,{files:t,selectedPath:n,onSelectFile:r})]})}function T({project:e,open:r,onOpenChange:i,onDraftRequest:o,focusTarget:s}){let[u,p]=(0,_.useState)(`files`),[y,b]=(0,_.useState)([]),[x,S]=(0,_.useState)([]),[T,E]=(0,_.useState)(),[D,oe]=(0,_.useState)(),[se,ce]=(0,_.useState)(!1),[O,k]=(0,_.useState)(!1),[A,j]=(0,_.useState)(),[M,le]=(0,_.useState)(``),[ue,de]=(0,_.useState)(0),[fe,N]=(0,_.useState)(),[P,F]=(0,_.useState)(),[I,L]=(0,_.useState)(!1),[R,z]=(0,_.useState)(),[B,V]=(0,_.useState)(),[pe,H]=(0,_.useState)(),[me,U]=(0,_.useState)(!1),[he,W]=(0,_.useState)(),[ge,G]=(0,_.useState)(!1),[K,q]=(0,_.useState)(`file`),[_e,J]=(0,_.useState)(r),[ve,Y]=(0,_.useState)(!1),X=e?.id,Z=(0,_.useMemo)(()=>{let e={};for(let t of x)e[t.path]=t;return e},[x]),ye=(0,_.useMemo)(()=>C(y,M),[M,y]),Q=(0,_.useMemo)(()=>({conflicts:x.filter(e=>e.conflict||e.status===`conflicted`),staged:x.filter(e=>!e.conflict&&e.status!==`untracked`&&e.staged),unstaged:x.filter(e=>!e.conflict&&e.status!==`untracked`&&e.unstaged),untracked:x.filter(e=>!e.conflict&&e.status===`untracked`)}),[x]);(0,_.useEffect)(()=>{if(r){let e=!1;return queueMicrotask(()=>{e||(J(!0),window.requestAnimationFrame(()=>{e||Y(!0)}))}),()=>{e=!0}}let e=!1;queueMicrotask(()=>{e||Y(!1)});let t=window.setTimeout(()=>J(!1),180);return()=>{e=!0,window.clearTimeout(t)}},[r]),(0,_.useEffect)(()=>{let e=!1;return!r||!s||queueMicrotask(()=>{e||p(s.tab)}),()=>{e=!0}},[s,r]),(0,_.useEffect)(()=>{let e=!1;if(!(!X||!r))return queueMicrotask(()=>{e||(k(!0),j(void 0),Promise.all([ee(X),te(X)]).then(([t,n])=>{e||(b(t.tree),S(n.files),E(n.branch),oe(n.counts),ce(n.isGitRepository))}).catch(t=>{e||j(t instanceof Error?t.message:`Failed to load workspace.`)}).finally(()=>{e||k(!1)}))}),()=>{e=!0}},[r,X,ue]),(0,_.useEffect)(()=>{queueMicrotask(()=>{N(void 0),F(void 0),z(void 0),V(void 0),H(void 0),W(void 0),G(!1)})},[X]);async function be(e){if(X){p(`files`),q(`file`),G(!0),N(e),F(void 0),L(!0),z(void 0);try{F(await m(X,e))}catch(e){F(void 0),z(e instanceof Error?e.message:`Failed to open file.`)}finally{L(!1)}}}async function $(e){if(X){p(`git`),q(`diff`),G(!0),V(e),H(void 0),U(!0),W(void 0);try{H(await h(X,e))}catch(e){H(void 0),W(e instanceof Error?e.message:`Failed to open diff.`)}finally{U(!1)}}}function xe(){de(e=>e+1)}return _e?(0,v.jsxs)(v.Fragment,{children:[(0,v.jsxs)(`aside`,{className:d(`hidden shrink-0 overflow-hidden flex-col border-l border-border bg-background transition-[width,min-width,max-width,opacity,transform] duration-200 ease-out will-change-[width,opacity,transform] lg:flex`,ve?`w-[340px] min-w-[280px] max-w-[380px] translate-x-0 opacity-100`:`w-0 min-w-0 max-w-0 translate-x-4 opacity-0`),children:[(0,v.jsxs)(`div`,{className:`flex h-14 shrink-0 items-center gap-2 border-b border-border px-3`,children:[(0,v.jsx)(a,{className:`size-4 text-emerald-600 dark:text-emerald-500`}),(0,v.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,v.jsx)(`div`,{className:`truncate text-sm font-semibold text-foreground/90`,children:`Workspace`}),(0,v.jsx)(`div`,{className:`truncate text-xs text-muted-foreground/65`,children:e?.name??`No project selected`})]}),(0,v.jsx)(f,{variant:`ghost`,size:`icon`,onClick:xe,disabled:!e?.id||O,"aria-label":`Refresh workspace`,title:`Refresh workspace`,children:(0,v.jsx)(c,{className:`size-4 ${O?`animate-spin`:``}`})}),(0,v.jsx)(f,{variant:`ghost`,size:`icon`,onClick:()=>i(!1),"aria-label":`Close workspace`,title:`Close workspace`,children:(0,v.jsx)(t,{className:`size-4`})})]}),(0,v.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col`,children:[(0,v.jsx)(`div`,{className:`flex shrink-0 gap-1 border-b border-border px-3 py-2`,children:[`files`,`git`].map(e=>(0,v.jsx)(`button`,{type:`button`,className:`rounded-md px-3 py-1.5 text-xs font-medium transition-colors ${u===e?`bg-muted/28 text-foreground/90`:`text-muted-foreground/72 hover:bg-muted/20 hover:text-foreground/85`}`,onClick:()=>p(e),children:e===`files`?`Files`:`Git${x.length?` ${x.length}`:``}`},e))}),e?.id?A?(0,v.jsx)(`div`,{className:`p-4 text-sm text-destructive`,children:A}):(0,v.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-auto p-2`,children:[O?(0,v.jsx)(`div`,{className:`px-2 py-3 text-xs text-muted-foreground/70`,children:`Loading workspace...`}):null,!O&&u===`files`?(0,v.jsxs)(v.Fragment,{children:[(0,v.jsxs)(`label`,{className:`mb-2 flex items-center gap-2 rounded-md border border-border bg-background px-2 py-1.5 text-xs text-muted-foreground/65 focus-within:text-foreground/85`,children:[(0,v.jsx)(l,{className:`size-3.5 shrink-0`}),(0,v.jsx)(`input`,{value:M,onChange:e=>le(e.target.value),placeholder:`Filter files by name or path`,className:`min-w-0 flex-1 bg-transparent text-xs text-foreground/85 outline-none placeholder:text-muted-foreground/50`})]}),(0,v.jsx)(`div`,{className:`mb-2 px-2 text-xs text-muted-foreground/60`,children:`Click a file to open the Monaco reader.`}),(0,v.jsx)(ne,{tree:ye,selectedPath:fe,gitStatuses:Z,onSelectFile:be})]}):null,!O&&u===`git`?se?(0,v.jsxs)(`div`,{className:`space-y-3`,children:[(0,v.jsxs)(`div`,{className:`rounded-lg border border-border bg-muted/10 px-3 py-2`,children:[(0,v.jsx)(`div`,{className:`truncate text-xs font-medium text-foreground/85`,children:ae(T,D)}),(0,v.jsxs)(`div`,{className:`mt-1 flex flex-wrap gap-x-3 gap-y-1 text-[11px] text-muted-foreground/60`,children:[(0,v.jsxs)(`span`,{children:[`Staged `,D?.staged??0]}),(0,v.jsxs)(`span`,{children:[`Changes `,D?.unstaged??0]}),(0,v.jsxs)(`span`,{children:[`Untracked `,D?.untracked??0]}),D?.conflicts?(0,v.jsxs)(`span`,{className:`text-red-600 dark:text-red-500`,children:[`Conflicts `,D.conflicts]}):null]}),x.length>0&&o?(0,v.jsxs)(`div`,{className:`mt-2 flex gap-1.5`,children:[(0,v.jsxs)(`button`,{type:`button`,className:`inline-flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] font-medium text-muted-foreground/72 transition-colors hover:bg-muted/20 hover:text-foreground/85`,onClick:()=>o(re(x)),children:[(0,v.jsx)(n,{className:`size-3`}),`Review`]}),(0,v.jsxs)(`button`,{type:`button`,className:`inline-flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] font-medium text-muted-foreground/72 transition-colors hover:bg-muted/20 hover:text-foreground/85`,onClick:()=>o(ie(x)),children:[(0,v.jsx)(n,{className:`size-3`}),`Commit msg`]})]}):null]}),x.length===0?(0,v.jsx)(`div`,{className:`px-2 py-3 text-xs text-muted-foreground/70`,children:`No Git changes.`}):(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(w,{title:`Conflicts`,files:Q.conflicts,selectedPath:B,onSelectFile:$}),(0,v.jsx)(w,{title:`Staged Changes`,files:Q.staged,selectedPath:B,onSelectFile:$}),(0,v.jsx)(w,{title:`Changes`,files:Q.unstaged,selectedPath:B,onSelectFile:$}),(0,v.jsx)(w,{title:`Untracked`,files:Q.untracked,selectedPath:B,onSelectFile:$})]})]}):(0,v.jsx)(`div`,{className:`px-2 py-3 text-xs text-muted-foreground/70`,children:`This project is not a Git repository.`}):null]}):(0,v.jsx)(`div`,{className:`p-4 text-sm text-muted-foreground/70`,children:`Select a project to inspect its workspace.`})]})]}),(0,v.jsx)(g,{open:ge,mode:K,file:P,diff:pe,loading:K===`file`?I:me,error:K===`file`?R:he,onOpenChange:G,onDraftRequest:o})]}):null}export{T as WorkspaceInspector};