presubmit 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +51 -0
- package/THIRD_PARTY_NOTICES.md +24 -0
- package/apps/web/dist/assets/FileCode-CZZH52o7.js +5 -0
- package/apps/web/dist/assets/FileCode-DovDO7Jh.css +1 -0
- package/apps/web/dist/assets/SettingsPage-CRvOwdjt.js +4 -0
- package/apps/web/dist/assets/SettingsPage-UbYSCwJj.css +1 -0
- package/apps/web/dist/assets/TerminalPanel-0sw-J6YS.css +1 -0
- package/apps/web/dist/assets/TerminalPanel-BqUjPWav.js +16 -0
- package/apps/web/dist/assets/index-BhqNNFja.js +54 -0
- package/apps/web/dist/assets/index-DD8VXy8H.css +1 -0
- package/apps/web/dist/assets/presubmit-mark-BBQ19Fmr.svg +7 -0
- package/apps/web/dist/assets/presubmit-mark-busy-CwBC-7on.svg +8 -0
- package/apps/web/dist/assets/react-vendor-wiHys0m2.js +9 -0
- package/apps/web/dist/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/apps/web/dist/index.html +6 -0
- package/apps/web/dist/service-worker.js +11 -0
- package/dist/apps/server/src/agent-builder.js +204 -0
- package/dist/apps/server/src/attach.js +163 -0
- package/dist/apps/server/src/attachments.js +86 -0
- package/dist/apps/server/src/browser-access.js +131 -0
- package/dist/apps/server/src/check-provenance.js +95 -0
- package/dist/apps/server/src/check-supervisor.js +112 -0
- package/dist/apps/server/src/checks.js +402 -0
- package/dist/apps/server/src/child-collaboration-guidance.js +2 -0
- package/dist/apps/server/src/child-sessions.js +191 -0
- package/dist/apps/server/src/cli.js +162 -0
- package/dist/apps/server/src/conversation-search.js +12 -0
- package/dist/apps/server/src/coordinator-messages.js +72 -0
- package/dist/apps/server/src/dev-auth.js +54 -0
- package/dist/apps/server/src/dev-server.js +201 -0
- package/dist/apps/server/src/dev-worker.js +48 -0
- package/dist/apps/server/src/diagnostics.js +105 -0
- package/dist/apps/server/src/fast-mode.js +8 -0
- package/dist/apps/server/src/folder-picker.js +54 -0
- package/dist/apps/server/src/git-blobs.js +62 -0
- package/dist/apps/server/src/git-handoff.js +127 -0
- package/dist/apps/server/src/history-sources.js +59 -0
- package/dist/apps/server/src/hub.js +159 -0
- package/dist/apps/server/src/internal-transport.js +38 -0
- package/dist/apps/server/src/local-embeddings.js +70 -0
- package/dist/apps/server/src/ollama-setup.js +56 -0
- package/dist/apps/server/src/planning.js +30 -0
- package/dist/apps/server/src/project-agents.js +276 -0
- package/dist/apps/server/src/project-memory.js +94 -0
- package/dist/apps/server/src/projects.js +106 -0
- package/dist/apps/server/src/queued-launch.js +13 -0
- package/dist/apps/server/src/reply-search.js +172 -0
- package/dist/apps/server/src/review-context.js +60 -0
- package/dist/apps/server/src/review-refresh.js +14 -0
- package/dist/apps/server/src/reviewers.js +75 -0
- package/dist/apps/server/src/search-settings.js +22 -0
- package/dist/apps/server/src/semantic-history.js +186 -0
- package/dist/apps/server/src/server.js +4338 -0
- package/dist/apps/server/src/session-changes.js +181 -0
- package/dist/apps/server/src/session-router-settings.js +198 -0
- package/dist/apps/server/src/session-workspaces.js +135 -0
- package/dist/apps/server/src/sessions.js +579 -0
- package/dist/apps/server/src/shared-auth.js +70 -0
- package/dist/apps/server/src/shell-evaluator-settings.js +53 -0
- package/dist/apps/server/src/store.js +203 -0
- package/dist/apps/server/src/tailscale-process.js +115 -0
- package/dist/apps/server/src/tailscale-serve-worker.js +33 -0
- package/dist/apps/server/src/tailscale-serve.js +276 -0
- package/dist/apps/server/src/task-capacity.js +92 -0
- package/dist/apps/server/src/task-graph.js +190 -0
- package/dist/apps/server/src/task-logs.js +74 -0
- package/dist/apps/server/src/task-numbers.js +25 -0
- package/dist/apps/server/src/task-orchestrator.js +1088 -0
- package/dist/apps/server/src/terminal.js +182 -0
- package/dist/apps/server/src/terminals.js +80 -0
- package/dist/apps/server/src/tool-safety.js +2 -0
- package/dist/apps/server/src/workspace-lock.js +140 -0
- package/dist/apps/server/src/workspace-watcher.js +65 -0
- package/dist/apps/server/src/workspace.js +517 -0
- package/dist/packages/agent-pi/src/agent-builder-tool.js +32 -0
- package/dist/packages/agent-pi/src/agent-capabilities.js +44 -0
- package/dist/packages/agent-pi/src/ask-user.js +86 -0
- package/dist/packages/agent-pi/src/auth.js +510 -0
- package/dist/packages/agent-pi/src/check-tools.js +72 -0
- package/dist/packages/agent-pi/src/command-policy.js +246 -0
- package/dist/packages/agent-pi/src/coordinator-tools.js +122 -0
- package/dist/packages/agent-pi/src/fast-mode.js +67 -0
- package/dist/packages/agent-pi/src/file-tools.js +163 -0
- package/dist/packages/agent-pi/src/history-tool.js +40 -0
- package/dist/packages/agent-pi/src/history.js +34 -0
- package/dist/packages/agent-pi/src/index.js +177 -0
- package/dist/packages/agent-pi/src/ipc.js +314 -0
- package/dist/packages/agent-pi/src/jev-session-router.js +408 -0
- package/dist/packages/agent-pi/src/jev-tools.js +71 -0
- package/dist/packages/agent-pi/src/local-model.js +277 -0
- package/dist/packages/agent-pi/src/memory-tools.js +119 -0
- package/dist/packages/agent-pi/src/model.js +25 -0
- package/dist/packages/agent-pi/src/planning.js +206 -0
- package/dist/packages/agent-pi/src/resource-loader.js +23 -0
- package/dist/packages/agent-pi/src/review-tools.js +158 -0
- package/dist/packages/agent-pi/src/review-transition.js +73 -0
- package/dist/packages/agent-pi/src/review.js +40 -0
- package/dist/packages/agent-pi/src/routing.js +27 -0
- package/dist/packages/agent-pi/src/session-setup.js +118 -0
- package/dist/packages/agent-pi/src/shell-context.js +51 -0
- package/dist/packages/agent-pi/src/shell-policy.js +281 -0
- package/dist/packages/agent-pi/src/shell-safety.js +205 -0
- package/dist/packages/agent-pi/src/shell.js +121 -0
- package/dist/packages/agent-pi/src/snapshot-permissions.js +12 -0
- package/dist/packages/agent-pi/src/spike.js +41 -0
- package/dist/packages/agent-pi/src/task-tools.js +53 -0
- package/dist/packages/agent-pi/src/types.js +1 -0
- package/dist/packages/agent-pi/src/usage.js +30 -0
- package/dist/packages/agent-pi/src/worker.js +602 -0
- package/dist/packages/protocol/src/activity-summary.js +77 -0
- package/dist/packages/protocol/src/agents.js +301 -0
- package/dist/packages/protocol/src/browser-access.js +1 -0
- package/dist/packages/protocol/src/checks.js +40 -0
- package/dist/packages/protocol/src/child-sessions.js +28 -0
- package/dist/packages/protocol/src/command-policy.js +3 -0
- package/dist/packages/protocol/src/coordinator.js +135 -0
- package/dist/packages/protocol/src/delegation.js +40 -0
- package/dist/packages/protocol/src/git-diff.js +71 -0
- package/dist/packages/protocol/src/git-handoff.js +1 -0
- package/dist/packages/protocol/src/index.js +1 -0
- package/dist/packages/protocol/src/memory.js +46 -0
- package/dist/packages/protocol/src/metrics.js +70 -0
- package/dist/packages/protocol/src/planning.js +138 -0
- package/dist/packages/protocol/src/retrieval.js +36 -0
- package/dist/packages/protocol/src/reviewers.js +17 -0
- package/dist/packages/protocol/src/search.js +16 -0
- package/dist/packages/protocol/src/session-changes.js +29 -0
- package/dist/packages/protocol/src/session-router.js +123 -0
- package/dist/packages/protocol/src/shell-evaluator.js +43 -0
- package/dist/packages/protocol/src/task-graph.js +1 -0
- package/dist/packages/protocol/src/token-usage.js +17 -0
- package/dist/packages/protocol/src/user-questions.js +106 -0
- package/package.json +71 -0
- package/vendor/lancedb/NODEJS_THIRD_PARTY_LICENSES.md +668 -0
- package/vendor/lancedb/RUST_THIRD_PARTY_LICENSES.html +14607 -0
- package/vendor/lancedb/dist/arrow.d.ts +296 -0
- package/vendor/lancedb/dist/arrow.js +1145 -0
- package/vendor/lancedb/dist/arrow_type.d.ts +9 -0
- package/vendor/lancedb/dist/arrow_type.js +29 -0
- package/vendor/lancedb/dist/connection.d.ts +508 -0
- package/vendor/lancedb/dist/connection.js +298 -0
- package/vendor/lancedb/dist/embedding/embedding_function.d.ts +103 -0
- package/vendor/lancedb/dist/embedding/embedding_function.js +192 -0
- package/vendor/lancedb/dist/embedding/index.d.ts +37 -0
- package/vendor/lancedb/dist/embedding/index.js +108 -0
- package/vendor/lancedb/dist/embedding/openai.d.ts +16 -0
- package/vendor/lancedb/dist/embedding/openai.js +81 -0
- package/vendor/lancedb/dist/embedding/registry.d.ts +94 -0
- package/vendor/lancedb/dist/embedding/registry.js +221 -0
- package/vendor/lancedb/dist/embedding/transformers.d.ts +36 -0
- package/vendor/lancedb/dist/embedding/transformers.js +110 -0
- package/vendor/lancedb/dist/header.d.ts +162 -0
- package/vendor/lancedb/dist/header.js +217 -0
- package/vendor/lancedb/dist/index.d.ts +246 -0
- package/vendor/lancedb/dist/index.js +176 -0
- package/vendor/lancedb/dist/indices.d.ts +721 -0
- package/vendor/lancedb/dist/indices.js +166 -0
- package/vendor/lancedb/dist/materialized_view.d.ts +69 -0
- package/vendor/lancedb/dist/materialized_view.js +112 -0
- package/vendor/lancedb/dist/merge.d.ts +104 -0
- package/vendor/lancedb/dist/merge.js +120 -0
- package/vendor/lancedb/dist/native.d.ts +1193 -0
- package/vendor/lancedb/dist/native.js +688 -0
- package/vendor/lancedb/dist/oauth.d.ts +66 -0
- package/vendor/lancedb/dist/oauth.js +15 -0
- package/vendor/lancedb/dist/otel.d.ts +26 -0
- package/vendor/lancedb/dist/otel.js +114 -0
- package/vendor/lancedb/dist/permutation.d.ts +143 -0
- package/vendor/lancedb/dist/permutation.js +184 -0
- package/vendor/lancedb/dist/query.d.ts +663 -0
- package/vendor/lancedb/dist/query.js +966 -0
- package/vendor/lancedb/dist/rerankers/index.d.ts +5 -0
- package/vendor/lancedb/dist/rerankers/index.js +19 -0
- package/vendor/lancedb/dist/rerankers/rrf.d.ts +14 -0
- package/vendor/lancedb/dist/rerankers/rrf.js +28 -0
- package/vendor/lancedb/dist/sanitize.d.ts +32 -0
- package/vendor/lancedb/dist/sanitize.js +544 -0
- package/vendor/lancedb/dist/scannable.d.ts +92 -0
- package/vendor/lancedb/dist/scannable.js +200 -0
- package/vendor/lancedb/dist/schema.d.ts +16 -0
- package/vendor/lancedb/dist/schema.js +387 -0
- package/vendor/lancedb/dist/table.d.ts +1069 -0
- package/vendor/lancedb/dist/table.js +498 -0
- package/vendor/lancedb/dist/util.d.ts +14 -0
- package/vendor/lancedb/dist/util.js +77 -0
- package/vendor/lancedb/license_header.txt +2 -0
- package/vendor/lancedb/package.json +56 -0
- package/vendor/transformers/LICENSE +202 -0
- package/vendor/transformers/dist/transformers.cjs +30844 -0
- package/vendor/transformers/dist/transformers.mjs +31404 -0
- package/vendor/transformers/package.json +55 -0
- package/vendor/transformers/types/backends/onnx.d.ts +30 -0
- package/vendor/transformers/types/configs.d.ts +85 -0
- package/vendor/transformers/types/env.d.ts +110 -0
- package/vendor/transformers/types/generation/configuration_utils.d.ts +320 -0
- package/vendor/transformers/types/generation/logits_process.d.ts +354 -0
- package/vendor/transformers/types/generation/logits_sampler.d.ts +51 -0
- package/vendor/transformers/types/generation/parameters.d.ts +47 -0
- package/vendor/transformers/types/generation/stopping_criteria.d.ts +81 -0
- package/vendor/transformers/types/generation/streamers.d.ts +81 -0
- package/vendor/transformers/types/models/whisper/common_whisper.d.ts +8 -0
- package/vendor/transformers/types/models/whisper/generation_whisper.d.ts +76 -0
- package/vendor/transformers/types/models.d.ts +3684 -0
- package/vendor/transformers/types/ops/registry.d.ts +11 -0
- package/vendor/transformers/types/pipelines.d.ts +2402 -0
- package/vendor/transformers/types/processors.d.ts +924 -0
- package/vendor/transformers/types/tokenizers.d.ts +990 -0
- package/vendor/transformers/types/transformers.d.ts +13 -0
- package/vendor/transformers/types/utils/audio.d.ts +130 -0
- package/vendor/transformers/types/utils/constants.d.ts +2 -0
- package/vendor/transformers/types/utils/core.d.ts +98 -0
- package/vendor/transformers/types/utils/data-structures.d.ts +236 -0
- package/vendor/transformers/types/utils/devices.d.ts +18 -0
- package/vendor/transformers/types/utils/dtypes.d.ts +19 -0
- package/vendor/transformers/types/utils/generic.d.ts +11 -0
- package/vendor/transformers/types/utils/hub.d.ts +152 -0
- package/vendor/transformers/types/utils/image.d.ts +119 -0
- package/vendor/transformers/types/utils/maths.d.ts +280 -0
- package/vendor/transformers/types/utils/tensor.d.ts +418 -0
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,t as n}from"./react-vendor-wiHys0m2.js";import{_ as r,a as i,c as a,d as o,l as s,m as c,o as l,p as u,s as d,u as f,v as p,y as m}from"./index-BhqNNFja.js";var h=e(t(),1),g=n();function _(){let e=(0,h.useSyncExternalStore)(m,r);return(0,g.jsxs)(`section`,{className:`appearance-settings`,"aria-labelledby":`appearance-title`,children:[(0,g.jsx)(`h2`,{id:`appearance-title`,children:`Appearance`}),(0,g.jsxs)(`div`,{className:`appearance-setting`,children:[(0,g.jsxs)(`div`,{children:[(0,g.jsx)(`label`,{htmlFor:`theme-preference`,children:`Color theme`}),(0,g.jsx)(`p`,{id:`theme-description`,children:`Choose a theme for this browser. System follows your device’s appearance.`})]}),(0,g.jsxs)(`select`,{id:`theme-preference`,"aria-describedby":`theme-description`,value:e,onChange:e=>p(e.target.value),children:[(0,g.jsx)(`option`,{value:`system`,children:`System`}),(0,g.jsx)(`option`,{value:`light`,children:`Light`}),(0,g.jsx)(`option`,{value:`dark`,children:`Dark`}),(0,g.jsx)(`option`,{value:`pink`,children:`Pink`}),(0,g.jsx)(`option`,{value:`matrix`,children:`Matrix`}),(0,g.jsx)(`option`,{value:`dracula`,children:`Dracula`}),(0,g.jsx)(`option`,{value:`ocean`,children:`Ocean`}),(0,g.jsx)(`option`,{value:`sunset`,children:`Sunset`})]})]})]})}function v(e,t){return t.model===e.model&&t.endpoint===e.endpoint&&(!t.enabled||e.enabled)&&(!t.agentRetrieval||e.agentRetrieval)&&(e.enabled&&!t.enabled||e.agentRetrieval&&!t.agentRetrieval)}function y(e,t){return e.enabled&&t.enabled&&t.model===e.model&&t.endpoint===e.endpoint&&t.agentRetrieval!==e.agentRetrieval}var b=e=>`'${e.replaceAll(`'`,`'\\''`)}'`;function x(e,t){if(e=e.trim(),!e||e.length>200||e.startsWith(`-`)||/[\x00-\x1f\x7f]/.test(e))throw Error(`Enter a model name to generate the setup commands.`);let n;try{n=new URL(t.trim())}catch{throw Error(`Enter a local Ollama address to generate the setup commands.`)}if(n.protocol!==`http:`||![`127.0.0.1`,`[::1]`].includes(n.hostname)||n.username||n.password||n.pathname!==`/`||n.search||n.hash)throw Error(`Use an HTTP address on 127.0.0.1 or [::1] for the setup commands.`);let r=`OLLAMA_HOST=${b(`${n.hostname}:${n.port||`80`}`)}`;return{serve:`${r} OLLAMA_NO_CLOUD=1 ollama serve`,pull:`${r} ollama pull ${b(e)}`}}function S(e,t,n){e=e.trim(),t=t.trim();let r=JSON.stringify([e,t]),[i,a]=(0,h.useState)(),[o,s]=(0,h.useState)(!1),[c,l]=(0,h.useState)(0);(0,h.useEffect)(()=>{if(s(!1),!n)return;let i=new AbortController,o,c=!1;async function l(){if(!(c||document.hidden||i.signal.aborted)){clearTimeout(o),c=!0,s(!0);try{let n=await f(`/api/sessions/ollama-setup?${new URLSearchParams({model:e,endpoint:t})}`,void 0,AbortSignal.any([i.signal,AbortSignal.timeout(5e3)]));if(typeof n.installed!=`boolean`||typeof n.running!=`boolean`||n.modelAvailable!==null&&typeof n.modelAvailable!=`boolean`)throw Error(`Invalid setup status.`);i.signal.aborted||a({key:r,status:n})}catch{i.signal.aborted||a({key:r,error:`Could not check Ollama setup. Try Check again.`})}finally{c=!1,i.signal.aborted||(s(!1),o=setTimeout(()=>void l(),5e3))}}}let u=()=>void l();return o=setTimeout(u,300),window.addEventListener(`focus`,u),document.addEventListener(`visibilitychange`,u),()=>{i.abort(),clearTimeout(o),window.removeEventListener(`focus`,u),document.removeEventListener(`visibilitychange`,u)}},[e,t,r,n,c]);let u=n&&i?.key===r?i:void 0;return{status:u?.status,error:u?.error,checking:n&&o,checkAgain:()=>l(e=>e+1)}}function C({number:e,title:t,done:n,label:r,children:i}){let a=(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(`span`,{className:`ollama-setup-step-icon${n?` complete`:``}`,children:n?(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(s,{name:`check`}),(0,g.jsx)(`span`,{className:`visually-hidden`,children:`Completed: `})]}):e}),(0,g.jsxs)(`span`,{className:`ollama-setup-step-title`,children:[(0,g.jsx)(`strong`,{children:t}),!n&&(0,g.jsx)(`span`,{className:`ollama-setup-step-status`,children:r})]})]}),o=(0,g.jsx)(`div`,{className:`ollama-setup-step-content`,children:i});return(0,g.jsx)(`li`,{children:n?(0,g.jsxs)(`details`,{children:[(0,g.jsxs)(`summary`,{className:`ollama-setup-step`,children:[a,(0,g.jsx)(`span`,{className:`ollama-setup-disclosure`,children:(0,g.jsx)(s,{name:`chevron`,size:16})})]}),o]}):(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(`div`,{className:`ollama-setup-step`,children:a}),o]})})}function w({model:e,endpoint:t,platform:n,connected:r}){let[i,a]=(0,h.useState)(``),[o,s]=(0,h.useState)(``),c=n===`darwin`?`brew install ollama`:n===`linux`?`curl -fsSL https://ollama.com/install.sh | sh`:void 0,l,d=``;try{l=x(e,t)}catch(e){d=e instanceof Error?e.message:`Check the model and address.`}let{status:f,error:p,checking:m,checkAgain:_}=S(e,t,r&&!!l),v=m?`Checking…`:`Not checked`;async function y(e){s(``);try{await navigator.clipboard.writeText(e),a(e)}catch{s(`Clipboard unavailable. Select and copy the command text instead.`)}}function b(e,t){return(0,g.jsxs)(`div`,{className:`ollama-setup-command`,children:[(0,g.jsx)(`code`,{children:t}),(0,g.jsx)(`button`,{type:`button`,"aria-label":`Copy ${e} command`,onClick:()=>void y(t),children:i===t?`Copied`:`Copy`})]})}return(0,g.jsxs)(`section`,{className:`ollama-setup`,"aria-labelledby":`ollama-setup-title`,children:[(0,g.jsxs)(`div`,{className:`ollama-setup-heading`,children:[(0,g.jsx)(`h3`,{id:`ollama-setup-title`,children:`Set up Ollama`}),(0,g.jsx)(`a`,{href:u(`/s/main?view=terminal&sidebar=collapsed`),target:`_blank`,rel:`noopener noreferrer`,children:`Open terminal ↗`})]}),(0,g.jsx)(`p`,{children:`Expand a completed step to view or copy its command. Run any remaining commands on the Presubmit server. Open terminal keeps these settings in this tab.`}),(0,g.jsxs)(`div`,{className:`ollama-setup-check`,children:[(0,g.jsx)(`button`,{type:`button`,onClick:_,disabled:!r||!l||m,children:m?`Checking…`:`Check again`}),(0,g.jsx)(`span`,{role:`status`,children:r?p||`Checks refresh while this page is visible and when you return.`:`Reconnect to check setup.`})]}),(0,g.jsxs)(`ol`,{role:`list`,children:[(0,g.jsxs)(C,{number:1,title:`Install Ollama`,done:f?.installed,label:f?f.installed?`Installed`:`Not detected`:v,children:[n===`darwin`&&(0,g.jsxs)(`p`,{children:[`Using Homebrew. If you don’t have Homebrew, use the`,` `,(0,g.jsx)(`a`,{href:`https://ollama.com/download/mac`,target:`_blank`,rel:`noopener noreferrer`,children:`macOS download`}),`.`]}),n===`linux`&&(0,g.jsxs)(`p`,{children:[`Use the`,` `,(0,g.jsx)(`a`,{href:`https://docs.ollama.com/linux`,target:`_blank`,rel:`noopener noreferrer`,children:`official Linux installer`}),`.`]}),c?b(`install`,c):(0,g.jsxs)(`p`,{children:[`Follow the`,` `,(0,g.jsx)(`a`,{href:`https://ollama.com/download`,target:`_blank`,rel:`noopener noreferrer`,children:`Ollama installation instructions`}),` `,`for your server.`]})]}),(0,g.jsxs)(C,{number:2,title:`Start Ollama`,done:f?.running,label:f?f.running?`Running`:`Not detected at this address`:v,children:[(0,g.jsx)(`p`,{children:f?.running?`Ollama is running at the selected address.`:`Keep this terminal running after starting Ollama.`}),l&&b(`start`,l.serve)]}),(0,g.jsxs)(C,{number:3,title:`Download the embedding model`,done:f?.modelAvailable,label:f?f.modelAvailable===null?`Start Ollama to check`:f.modelAvailable?`Downloaded`:`Not downloaded`:v,children:[f?.modelAvailable?(0,g.jsxs)(`p`,{children:[e.trim(),` is available at the selected address.`]}):(0,g.jsxs)(`p`,{children:[`Use another terminal tab with `,(0,g.jsx)(`strong`,{children:`+`}),` while Ollama runs. Then return here and save your search settings.`]}),l&&b(`download`,l.pull)]})]}),d&&(0,g.jsx)(`p`,{role:`status`,children:d}),o&&(0,g.jsx)(`p`,{role:`alert`,children:o})]})}function T(e,t){return!t||!e?{title:`Indexing status unavailable`,detail:`Reconnect or reload settings to see the latest progress.`}:e.error?{title:`Indexing needs attention`,detail:e.error}:e.enabled?e.indexing?{title:e.progress&&e.progress.completed===e.progress.total?`Finishing indexing…`:`Indexing conversations…`,detail:e.progress?`Progress updates automatically.`:`${e.indexedChunks.toLocaleString()} passages indexed so far. Calculating the total…`}:e.indexedChunks?{title:`Indexing complete`,detail:`${e.progress?``:`${e.indexedChunks.toLocaleString()} passages ready to search. `}New conversations are added automatically after they finish.`,complete:!0}:{title:`No conversations to index yet`,detail:`Finish a conversation to add it to search automatically.`}:{title:`Semantic search is off`,detail:`Exact text search is available.`}}function E({connected:e}){let[t,n]=(0,h.useState)(),[r,i]=(0,h.useState)(),[a,o]=(0,h.useState)(0),[s,c]=(0,h.useState)(!1),[l,u]=(0,h.useState)(!1),[d,p]=(0,h.useState)(0),[m,_]=(0,h.useState)(``),[b,x]=(0,h.useState)(``),[S,C]=(0,h.useState)(!1);(0,h.useEffect)(()=>{if(!e||l)return;let t=new AbortController,r;async function a(){try{let e=await f(`/api/sessions/search-settings`,void 0,t.signal);if(!e.settings||typeof e.version!=`number`)throw Error(`Search settings are unavailable.`);if(t.signal.aborted)return;n(e),_(``),s||(i(e.settings),o(e.version))}catch(e){t.signal.aborted||_(e instanceof Error?e.message:`Could not load search settings.`)}finally{t.signal.aborted||(r=setTimeout(()=>void a(),2e3))}}return a(),()=>{t.abort(),clearTimeout(r)}},[e,s,l,d]);let E=s&&t?.version!==a,D=l||!e||!t||!!m,O=t&&r&&(t.canChange||t.canDisable&&v(t.settings,r)||t.canChangeAgentRetrieval&&y(t.settings,r));function k(e){i(n=>n&&{...n,...!t?.canChange&&t?{model:t.settings.model,endpoint:t.settings.endpoint}:{},...e}),c(!0),C(!1),x(``)}function A(){c(!1),x(``),C(!1),p(e=>e+1)}async function j(){if(r&&!D&&O&&!E){u(!0),x(``),C(!1);try{let e=await f(`/api/sessions/search-settings`,{version:a,settings:r});n(e),i(e.settings),o(e.version),c(!1),C(!0)}catch(e){x(e instanceof Error?e.message:`Could not save search settings.`)}finally{u(!1)}}}let M=T(t?.status,e&&!m),N=e&&!m&&t?.status.enabled&&t.status.progress?.total?t.status.progress:void 0,P=N?Math.min(N.completed<N.total?99:100,Math.round(N.completed/N.total*100)):void 0;return(0,g.jsxs)(`section`,{className:`search-settings`,"aria-labelledby":`search-settings-title`,children:[(0,g.jsx)(`h2`,{id:`search-settings-title`,children:`Search and agent memory`}),(0,g.jsxs)(`p`,{className:`search-settings-description`,children:[t?`Applies to ${t.projectName} and its saved sessions.`:`Configure local search for this project.`,` `,`Settings are saved on the server.`]}),!e&&(0,g.jsx)(`p`,{role:`status`,children:`Reconnect to Presubmit to configure search.`}),e&&!t&&!m&&(0,g.jsx)(`p`,{role:`status`,children:`Loading search settings…`}),m&&(0,g.jsx)(`p`,{role:`alert`,children:m}),r&&(0,g.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),j()},children:[(0,g.jsxs)(`fieldset`,{disabled:D,children:[(0,g.jsx)(`legend`,{className:`visually-hidden`,children:`Local search configuration`}),(0,g.jsxs)(`label`,{className:`search-settings-toggle`,children:[(0,g.jsx)(`input`,{type:`checkbox`,checked:r.enabled,disabled:!t?.canChange&&!(t?.canDisable&&t.settings.enabled),onChange:e=>k({enabled:e.target.checked,agentRetrieval:!1})}),(0,g.jsxs)(`span`,{children:[`Enable semantic search`,(0,g.jsx)(`small`,{children:`Find related ideas in saved prompts and replies using local embeddings.`})]})]}),(0,g.jsxs)(`label`,{className:`search-settings-toggle`,children:[(0,g.jsx)(`input`,{type:`checkbox`,checked:r.enabled&&r.agentRetrieval,disabled:!r.enabled||!t?.canChange&&!t?.canChangeAgentRetrieval&&!(t?.canDisable&&t.settings.agentRetrieval),onChange:e=>k({agentRetrieval:e.target.checked})}),(0,g.jsxs)(`span`,{children:[`Allow agents to search project history`,(0,g.jsx)(`small`,{children:`Coding agents can retrieve earlier conversations from this project. Agents that started without access get it on their next turn. Disabling takes effect immediately.`})]})]}),(0,g.jsxs)(`div`,{className:`search-settings-fields`,children:[(0,g.jsx)(`label`,{htmlFor:`search-embedding-model`,children:`Embedding model`}),(0,g.jsx)(`input`,{id:`search-embedding-model`,value:r.model,maxLength:200,required:!0,disabled:!r.enabled||!t?.canChange,onChange:e=>k({model:e.target.value}),spellCheck:!1}),(0,g.jsx)(`label`,{htmlFor:`search-embedding-endpoint`,children:`Ollama address`}),(0,g.jsx)(`input`,{id:`search-embedding-endpoint`,type:`url`,value:r.endpoint,maxLength:500,required:!0,disabled:!r.enabled||!t?.canChange,onChange:e=>k({endpoint:e.target.value}),spellCheck:!1,"aria-describedby":`search-embedding-help`}),(0,g.jsx)(`p`,{id:`search-embedding-help`,children:`Run Ollama on the Presubmit server and install the selected model first. Use an HTTP address on 127.0.0.1 or [::1].`})]})]}),(0,g.jsxs)(`div`,{className:`search-settings-status${M.complete?` complete`:``}`,role:`status`,children:[(0,g.jsxs)(`strong`,{children:[M.complete&&(0,g.jsx)(`span`,{"aria-hidden":`true`,children:`✓ `}),M.title]}),N&&(0,g.jsxs)(g.Fragment,{children:[(0,g.jsxs)(`p`,{children:[N.completed.toLocaleString(),` of `,N.total.toLocaleString(),` `,`passages indexed · `,P,`%`]}),(0,g.jsx)(`progress`,{"aria-label":`Conversation indexing progress`,value:N.completed,max:N.total})]}),(0,g.jsx)(`p`,{children:M.detail})]}),t&&!t.canChange&&(0,g.jsx)(`p`,{className:`search-settings-lock`,role:`status`,children:t.canDisable?(0,g.jsx)(g.Fragment,{children:`Project work is still running. You can change agent history access or turn off semantic search and save now. Enabling semantic search or changing the model or address must wait.`}):(0,g.jsx)(g.Fragment,{children:`Search settings are temporarily unavailable.`})}),E&&(0,g.jsx)(`p`,{role:`alert`,children:`Search settings changed in another tab. Reload settings before saving.`}),b&&(0,g.jsx)(`p`,{role:`alert`,children:b}),(0,g.jsxs)(`div`,{className:`search-settings-actions`,children:[(0,g.jsx)(`button`,{type:`submit`,disabled:D||!O||!s||E,children:l?`Saving…`:`Save search settings`}),(0,g.jsx)(`button`,{type:`button`,onClick:A,disabled:l||!e,children:`Reload settings`}),S&&(0,g.jsx)(`span`,{role:`status`,children:`Saved.`})]})]}),r&&(0,g.jsx)(w,{connected:e,model:r.model,endpoint:r.endpoint,platform:t?.hostPlatform})]})}var D=4096,O=32768;function k(e){return typeof e==`number`&&Number.isInteger(e)&&e>=256&&e<=32768}function A({connected:e}){let[t,n]=(0,h.useState)(),[r,i]=(0,h.useState)({}),[a,o]=(0,h.useState)(!1),[s,c]=(0,h.useState)(``),[l,u]=(0,h.useState)(!1),d=e=>{if(!e||!Array.isArray(e.models)||!e.settings||typeof e.defaultPrompt!=`string`||typeof e.version!=`string`)throw Error(`Evaluator settings are unavailable. Reload to retry.`);n(e),i(e.settings)},p=async()=>{o(!0),c(``);try{d(await f(`/api/shell-evaluator`)),u(!1)}catch(e){u(!0),c(e instanceof Error?e.message:`Unable to load evaluator settings.`)}finally{o(!1)}};(0,h.useEffect)(()=>{e&&!t&&p()},[e]);let m=!!t&&(r.model!==t.settings.model||r.reasoning!==t.settings.reasoning||r.maxTokens!==t.settings.maxTokens||(r.prompt??t.defaultPrompt)!==(t.settings.prompt??t.defaultPrompt)),_=r.maxTokens!==void 0&&!k(r.maxTokens),v=l||!!s&&/reload/i.test(s),y=a||!e||!t,b=()=>{(!m||window.confirm(`Discard unsaved evaluator changes and reload settings?`))&&p()},x=t?.models.find(e=>e.id===r.model)?.reasoningLevels??[`off`],S=async()=>{if(!(!t||y||!m||v||_)){o(!0),c(``);try{d(await f(`/api/shell-evaluator`,{version:t.version,provider:t.provider,settings:r}))}catch(e){c(e instanceof Error?e.message:`Unable to save evaluator settings.`)}finally{o(!1)}}};return(0,g.jsxs)(`section`,{className:`openai-settings shell-evaluator-settings`,"aria-labelledby":`shell-evaluator-title`,children:[(0,g.jsx)(`h2`,{id:`shell-evaluator-title`,children:`Automatic shell evaluator`}),(0,g.jsxs)(`p`,{className:`openai-settings-note`,children:[`Shared across this server, per provider (`,t?.provider??`loading`,`). Independent of the coding model; saved changes apply to the next evaluation, including in active sessions. In-flight checks and pending manual approvals are unchanged.`]}),(0,g.jsx)(`p`,{className:`openai-settings-warning`,children:`Warning: prompt changes affect automatic command approvals. The evaluator can authorize commands with server-user privileges; this is not a sandbox. Output validation, timeouts, cancellation, and manual approval safeguards remain enforced.`}),!e&&(0,g.jsx)(`p`,{role:`status`,children:`Reconnect to edit evaluator settings.`}),e&&!t&&!s&&(0,g.jsx)(`p`,{role:`status`,children:`Loading evaluator settings…`}),s&&(0,g.jsx)(`p`,{className:`openai-settings-warning`,role:`alert`,children:s}),v&&(0,g.jsx)(`button`,{type:`button`,disabled:a||!e,onClick:b,children:t?`Reload settings…`:`Retry load`}),t?.environmentModel&&(0,g.jsxs)(`p`,{className:`openai-settings-note`,role:`status`,children:[`PRESUBMIT_SAFETY_MODEL uses `,t.environmentModel,` with low reasoning. Saved model and reasoning apply after this override is removed.`]}),(0,g.jsxs)(`fieldset`,{disabled:y,className:`openai-settings-form`,children:[(0,g.jsx)(`label`,{htmlFor:`evaluator-model`,children:`Model`}),(0,g.jsxs)(`select`,{id:`evaluator-model`,value:r.model??``,onChange:e=>i({...r,model:e.target.value||void 0,reasoning:void 0}),children:[(0,g.jsx)(`option`,{value:``,children:`Default (Luna, or environment override)`}),r.model&&!t?.models.some(e=>e.id===r.model)&&(0,g.jsxs)(`option`,{value:r.model,children:[r.model,` (unavailable)`]}),t?.models.map(e=>(0,g.jsx)(`option`,{value:e.id,children:e.name},e.id))]}),(0,g.jsx)(`label`,{htmlFor:`evaluator-reasoning`,children:`Reasoning`}),(0,g.jsxs)(`select`,{id:`evaluator-reasoning`,disabled:!r.model,value:r.reasoning??``,onChange:e=>i({...r,reasoning:e.target.value||void 0}),children:[(0,g.jsx)(`option`,{value:``,children:`Default (low)`}),x.map(e=>(0,g.jsx)(`option`,{value:e,children:e},e))]}),(0,g.jsx)(`label`,{htmlFor:`evaluator-max-tokens`,children:`Maximum output tokens`}),(0,g.jsx)(`input`,{id:`evaluator-max-tokens`,type:`number`,min:256,max:O,step:1,placeholder:String(D),value:r.maxTokens??``,"aria-describedby":`evaluator-max-tokens-help`,"aria-invalid":_||void 0,onChange:e=>i({...r,maxTokens:e.target.value===``?void 0:Number(e.target.value)})}),(0,g.jsxs)(`p`,{id:`evaluator-max-tokens-help`,className:`openai-settings-note`,children:[`Default: `,D.toLocaleString(`en-US`),`. Enter`,` `,256 .toLocaleString(`en-US`),`–`,O.toLocaleString(`en-US`),` `,`tokens, or clear to use the default. Higher limits allow more model output but may increase latency and cost. The 15-second deadline still applies.`]}),(0,g.jsxs)(`div`,{className:`shell-evaluator-prompt-heading`,children:[(0,g.jsx)(`label`,{htmlFor:`evaluator-prompt`,children:`Policy prompt`}),t&&(r.prompt??t.defaultPrompt)!==t.defaultPrompt&&(0,g.jsx)(`button`,{type:`button`,onClick:()=>i({...r,prompt:void 0}),children:`Reset to default`})]}),(0,g.jsx)(`textarea`,{id:`evaluator-prompt`,"aria-describedby":`evaluator-prompt-help`,rows:16,maxLength:16e3,value:r.prompt??t?.defaultPrompt??``,onChange:e=>i({...r,prompt:e.target.value})}),(0,g.jsx)(`p`,{id:`evaluator-prompt-help`,className:`openai-settings-note`,children:`Save applies prompt edits and resets. Unavailable models fall back to the local read-only allowlist; uncertain or malformed decisions need manual approval.`}),(0,g.jsx)(`div`,{className:`openai-settings-actions`,children:(0,g.jsx)(`button`,{className:`primary`,type:`button`,disabled:!m||v||_,onClick:()=>void S(),children:`Save`})})]})]})}function j(){let e=d();return(0,g.jsxs)(`section`,{className:`openai-settings`,"aria-labelledby":`evaluator-traces-title`,children:[(0,g.jsx)(`h2`,{id:`evaluator-traces-title`,children:`Evaluator traces`}),(0,g.jsxs)(`div`,{className:`evaluator-trace-setting`,children:[(0,g.jsxs)(`div`,{children:[(0,g.jsx)(`label`,{htmlFor:`show-evaluator-traces`,children:`Show automatic evaluator and routing traces`}),(0,g.jsx)(`p`,{id:`evaluator-traces-description`,children:`View recorded safety checks and Jev routing decisions in conversations and task logs. Saved in this browser and applied immediately across tabs.`})]}),(0,g.jsx)(`input`,{id:`show-evaluator-traces`,type:`checkbox`,checked:e,"aria-describedby":`evaluator-traces-description`,onChange:e=>l(e.target.checked)})]})]})}function M({connected:e}){let[t,n]=(0,h.useState)(),[r,i]=(0,h.useState)(5),[a,o]=(0,h.useState)(!0),[s,c]=(0,h.useState)(!1),[l,u]=(0,h.useState)(``),d=e=>{if(!e||typeof e.version!=`string`||!Number.isInteger(e.limit))throw Error(`Execution settings are unavailable. Reload to retry.`);n({...e,parallelFileReads:e.parallelFileReads??!0}),i(e.limit),o(e.parallelFileReads??!0)},p=async()=>{c(!0),u(``);try{d(await f(`/api/execution-settings`))}catch(e){u(e instanceof Error?e.message:`Unable to load execution settings.`)}finally{c(!1)}};(0,h.useEffect)(()=>{e&&!t&&p()},[e,t]);let m=!!t&&(r!==t.limit||a!==t.parallelFileReads),_=!Number.isInteger(r)||r<1||r>10,v=async()=>{if(t&&!s&&e&&m&&!_){c(!0),u(``);try{d(await f(`/api/execution-settings`,{version:t.version,limit:r,parallelFileReads:a}))}catch(e){u(e instanceof Error?e.message:`Unable to save execution settings.`)}finally{c(!1)}}};return(0,g.jsxs)(`section`,{className:`delegated-execution-settings`,"aria-labelledby":`delegated-execution-title`,children:[(0,g.jsx)(`h2`,{id:`delegated-execution-title`,children:`Tool execution`}),!e&&(0,g.jsx)(`p`,{role:`status`,children:`Reconnect to edit execution settings.`}),e&&!t&&!l&&(0,g.jsx)(`p`,{role:`status`,children:`Loading execution settings…`}),l&&(0,g.jsx)(`p`,{role:`alert`,children:l}),l&&(0,g.jsx)(`button`,{type:`button`,disabled:s||!e,onClick:()=>void p(),children:`Reload`}),(0,g.jsxs)(`label`,{className:`tool-execution-toggle`,children:[`Parallel file reads`,(0,g.jsx)(`input`,{type:`checkbox`,checked:a,disabled:!t||s||!e,onChange:e=>o(e.target.checked)})]}),(0,g.jsxs)(`div`,{className:`delegated-execution-control`,children:[(0,g.jsx)(`label`,{htmlFor:`delegated-execution-limit`,children:`Maximum running child sessions per parent`}),(0,g.jsx)(`input`,{id:`delegated-execution-limit`,type:`number`,min:1,max:10,step:1,value:r,disabled:!t||s||!e,"aria-invalid":_||void 0,onChange:e=>i(Number(e.target.value))}),(0,g.jsx)(`button`,{type:`button`,disabled:!m||_||s||!e,onClick:()=>void v(),children:s&&t?`Saving…`:`Save`})]})]})}function N({provider:e,server:t,disabled:n,action:r}){let i=e===`mlx-lm`?`MLX`:`Ollama`,a=`http://127.0.0.1:${e===`mlx-lm`?8080:11434}/v1`,[o,s]=(0,h.useState)(t?.baseUrl??a),[c,l]=(0,h.useState)(!1);return(0,h.useEffect)(()=>{t&&s(t.baseUrl)},[t?.baseUrl]),(0,g.jsxs)(`section`,{className:`openai-settings`,"aria-labelledby":`${e}-settings-title`,children:[(0,g.jsxs)(`div`,{className:`model-connection-heading`,children:[(0,g.jsx)(`h2`,{id:`${e}-settings-title`,children:i}),t&&(0,g.jsxs)(`span`,{className:`model-connection-status`,children:[t.models.length,` `,t.models.length===1?`model`:`models`]})]}),(0,g.jsxs)(`form`,{className:`openai-settings-form local-model-form`,onSubmit:async t=>{t.preventDefault(),l(!0);try{await r({action:`connect_local`,localServer:{provider:e,baseUrl:o.trim()}})}finally{l(!1)}},children:[(0,g.jsxs)(`label`,{htmlFor:`${e}-server-url`,children:[i,` server address`]}),(0,g.jsx)(`input`,{id:`${e}-server-url`,type:`url`,value:o,disabled:n,onChange:e=>s(e.target.value),spellCheck:!1,autoComplete:`off`}),t&&(t.models.length?(0,g.jsx)(`ul`,{className:`local-model-catalog`,"aria-label":`${i} models`,children:t.models.map(e=>(0,g.jsx)(`li`,{children:e.split(`/`).at(-1)},e))}):(0,g.jsx)(`p`,{className:`openai-settings-note`,children:`No models available`})),(0,g.jsxs)(`div`,{className:`openai-settings-actions`,children:[(0,g.jsx)(`button`,{disabled:n||!o.trim(),children:c?`Loading models…`:t?o.trim()===t.baseUrl?`Refresh models`:`Save connection`:`Connect`}),t&&(0,g.jsx)(`button`,{type:`button`,className:`openai-disconnect`,disabled:n,onClick:()=>void r({action:`disconnect`,connection:e}),children:`Disconnect`})]})]})]})}function P({active:e,connected:t,running:n}){let[r,i]=(0,h.useState)(),[a,o]=(0,h.useState)(),[s,c]=(0,h.useState)(``),[l,u]=(0,h.useState)(!1),[d,p]=(0,h.useState)(!1),[m,_]=(0,h.useState)(``),v=e=>{if(!e||typeof e.version!=`string`||typeof e.connected!=`boolean`||!e.settings||!Array.isArray(e.models))throw Error(`Session routing settings are unavailable.`);i(e),o(e.settings)},y=async e=>{p(!0),_(``);try{return v(await f(`/api/session-router`,e)),!0}catch(e){return _(e instanceof Error?e.message:`Unable to update session routing.`),!1}finally{p(!1)}};(0,h.useEffect)(()=>{e&&t&&!r&&y()},[e,t]);let b=d||!t||n,x=!!r&&!!a&&(a.enabled!==r.settings.enabled||a.model!==r.settings.model||a.routeConfidence.code!==r.settings.routeConfidence.code||a.routeConfidence.plan!==r.settings.routeConfidence.plan||a.taskRoutingEnabled!==r.settings.taskRoutingEnabled||a.taskMinConfidence!==r.settings.taskMinConfidence||a.agentConsultEnabled!==r.settings.agentConsultEnabled||a.agentConsultMinConfidence!==r.settings.agentConsultMinConfidence||a.shellSafetyShadowEnabled!==r.settings.shellSafetyShadowEnabled),S=!!a&&[a.routeConfidence.code,a.routeConfidence.plan,a.taskMinConfidence,a.agentConsultMinConfidence].some(e=>e<.5||e>1),C=r?.models??[];return(0,g.jsxs)(`section`,{className:`openai-settings`,"aria-labelledby":`session-router-title`,children:[(0,g.jsxs)(`div`,{className:`model-connection-heading`,children:[(0,g.jsxs)(`div`,{children:[(0,g.jsx)(`h2`,{id:`session-router-title`,children:`TypeSafe Jev`}),(0,g.jsx)(`p`,{className:`openai-settings-note`,children:`Fast structured decisions for sessions, delegated tasks, and shell-safety observation. Jev is not used as the coding model.`})]}),r?.connected&&(0,g.jsx)(`span`,{className:`model-connection-status`,children:`Connected`})]}),!t&&(0,g.jsx)(`p`,{role:`status`,children:`Reconnect to configure session routing.`}),n&&(0,g.jsx)(`p`,{role:`status`,className:`openai-settings-warning`,children:`Wait for active agent runs to finish before changing session routing.`}),m&&(0,g.jsx)(`p`,{role:`alert`,className:`openai-settings-warning`,children:m}),r?.message&&(0,g.jsx)(`p`,{className:`openai-settings-note`,children:r.message}),t&&!r&&!m&&(0,g.jsx)(`p`,{role:`status`,children:`Loading session routing…`}),r?.connected?(0,g.jsxs)(g.Fragment,{children:[(0,g.jsxs)(`div`,{className:`openai-settings-connected`,children:[(0,g.jsx)(`strong`,{children:`TypeSafe connected`}),(0,g.jsxs)(`span`,{children:[r.source===`environment`?`Server environment`:`Saved API key`,a&&` · ${[a.enabled&&`session routing`,a.taskRoutingEnabled&&`subtask routing`,a.agentConsultEnabled&&`agent consultations`,a.shellSafetyShadowEnabled&&`shell shadowing`].filter(Boolean).join(`, `)||`Jev decisions disabled`}`]})]}),a&&(0,g.jsxs)(`fieldset`,{disabled:b,className:`openai-settings-form`,children:[(0,g.jsxs)(`label`,{className:`session-router-toggle`,children:[(0,g.jsx)(`input`,{type:`checkbox`,checked:a.agentConsultEnabled,onChange:e=>o({...a,agentConsultEnabled:e.target.checked})}),(0,g.jsxs)(`span`,{children:[`Allow main agents to consult Jev`,(0,g.jsx)(`small`,{children:`Adds an advisory tool for choosing among two to five explicit options. It cannot approve commands, change permissions, or authorize external effects.`})]})]}),(0,g.jsx)(`label`,{htmlFor:`session-router-agent-confidence`,children:`Agent consultation confidence`}),(0,g.jsx)(`input`,{id:`session-router-agent-confidence`,type:`number`,min:.5,max:1,step:.05,value:a.agentConsultMinConfidence,"aria-invalid":S||void 0,onChange:e=>o({...a,agentConsultMinConfidence:Number(e.target.value)})}),(0,g.jsxs)(`label`,{className:`session-router-toggle`,children:[(0,g.jsx)(`input`,{type:`checkbox`,checked:a.enabled,onChange:e=>o({...a,enabled:e.target.checked})}),(0,g.jsxs)(`span`,{children:[`Use Jev for session routing`,(0,g.jsx)(`small`,{children:`Confident code and planning routes are accepted. Images, reviews, clarification, errors, and uncertain results use the existing model router.`})]})]}),(0,g.jsx)(`label`,{htmlFor:`session-router-model`,children:`Jev model`}),(0,g.jsxs)(`select`,{id:`session-router-model`,value:a.model,onChange:e=>o({...a,model:e.target.value}),children:[!C.some(e=>e.id===a.model)&&(0,g.jsx)(`option`,{value:a.model,children:a.model}),C.map(e=>(0,g.jsx)(`option`,{value:e.id,children:e.id},e.id))]}),(0,g.jsx)(`label`,{htmlFor:`session-router-code-confidence`,children:`Code route confidence`}),(0,g.jsx)(`input`,{id:`session-router-code-confidence`,type:`number`,min:.5,max:1,step:.05,value:a.routeConfidence.code,"aria-invalid":S||void 0,onChange:e=>o({...a,routeConfidence:{...a.routeConfidence,code:Number(e.target.value)}})}),(0,g.jsx)(`label`,{htmlFor:`session-router-plan-confidence`,children:`Plan route confidence`}),(0,g.jsx)(`input`,{id:`session-router-plan-confidence`,type:`number`,min:.5,max:1,step:.05,value:a.routeConfidence.plan,"aria-invalid":S||void 0,onChange:e=>o({...a,routeConfidence:{...a.routeConfidence,plan:Number(e.target.value)}})}),(0,g.jsx)(`p`,{className:`openai-settings-note`,children:`Below the selected route’s threshold, Presubmit falls back to its existing routing model. Prompts and supported text attachments are sent to TypeSafe when routing is enabled.`}),(0,g.jsxs)(`label`,{className:`session-router-toggle`,children:[(0,g.jsx)(`input`,{type:`checkbox`,checked:a.taskRoutingEnabled,onChange:e=>o({...a,taskRoutingEnabled:e.target.checked})}),(0,g.jsxs)(`span`,{children:[`Route inherited subtask model and reasoning`,(0,g.jsx)(`small`,{children:`Jev chooses from the connected model catalog for untouched task cards. Explicit per-task settings always win.`})]})]}),(0,g.jsx)(`label`,{htmlFor:`session-router-task-confidence`,children:`Subtask confidence`}),(0,g.jsx)(`input`,{id:`session-router-task-confidence`,type:`number`,min:.5,max:1,step:.05,value:a.taskMinConfidence,"aria-invalid":S||void 0,onChange:e=>o({...a,taskMinConfidence:Number(e.target.value)})}),(0,g.jsxs)(`label`,{className:`session-router-toggle`,children:[(0,g.jsx)(`input`,{type:`checkbox`,checked:a.shellSafetyShadowEnabled,onChange:e=>o({...a,shellSafetyShadowEnabled:e.target.checked})}),(0,g.jsxs)(`span`,{children:[`Shadow shell safety with Jev`,(0,g.jsx)(`small`,{children:`Records Jev’s classification beside the existing evaluator. It never changes whether a command runs or needs approval.`})]})]}),(0,g.jsxs)(`div`,{className:`openai-settings-actions`,children:[(0,g.jsx)(`button`,{type:`button`,className:`primary`,disabled:!x||S,onClick:()=>void y({action:`save`,version:r.version,settings:a}),children:`Save routing settings`}),(0,g.jsx)(`button`,{type:`button`,onClick:()=>void y({action:`refresh`}),children:`Refresh models`}),(0,g.jsx)(`button`,{type:`button`,className:`openai-disconnect`,onClick:()=>void y({action:`disconnect`}),children:`Disconnect`})]})]})]}):r?(0,g.jsxs)(`div`,{className:`openai-settings-choice`,children:[(0,g.jsx)(`h3`,{children:`Connect an API key`}),(0,g.jsx)(`p`,{children:`The key stays on the Presubmit server. TypeSafe receives session prompts only after you enable Jev routing.`}),l?(0,g.jsxs)(`form`,{className:`openai-settings-form`,onSubmit:async e=>{e.preventDefault();let t=s.trim();c(``),await y({action:`connect`,apiKey:t})&&u(!1)},children:[(0,g.jsx)(`label`,{htmlFor:`typesafe-api-key`,children:`TypeSafe API key`}),(0,g.jsx)(`input`,{id:`typesafe-api-key`,type:`password`,value:s,autoComplete:`off`,spellCheck:!1,disabled:b,onChange:e=>c(e.target.value)}),(0,g.jsx)(`button`,{disabled:b||!s.trim(),children:`Connect TypeSafe`})]}):(0,g.jsx)(`button`,{disabled:b,onClick:()=>u(!0),children:`Enter API key`}),(0,g.jsx)(`p`,{className:`openai-settings-footer`,children:`You can also set TYPESAFE_API_KEY in the server environment and restart Presubmit.`})]}):null]})}function F(e){if(e)try{let t=new URL(e);return t.protocol===`https:`&&!t.username&&!t.password&&[`auth.openai.com`,`chatgpt.com`].includes(t.hostname)?t.href:void 0}catch{return}}function I({active:e,state:t,connected:n,running:r}){let[i,a]=(0,h.useState)(!1),[o,s]=(0,h.useState)(``),[c,l]=(0,h.useState)(``),[u,d]=(0,h.useState)(``),[p,m]=(0,h.useState)(!1),[_,v]=(0,h.useState)(!1),[y,b]=(0,h.useState)(!1),x=t?.phase===`connecting`,S=t?.phase===`connected`,C=t?.connections??(S&&t?.provider?[{provider:t.provider}]:[]),w=C.some(({provider:e})=>e===`openai`||e===`openai-codex`),T=C.filter(({provider:e})=>e===`openai`||e===`openai-codex`).map(({provider:e})=>e===`openai-codex`?`ChatGPT subscription`:`API key`),E=i||!n||r,D=E||x,O=F(t?.url);(0,h.useEffect)(()=>{d(``)},[t?.prompt?.id]),(0,h.useEffect)(()=>{b(!1)},[t?.userCode]),(0,h.useEffect)(()=>{v(!1),m(!1),l(``)},[t?.phase]);let k=async e=>{a(!0),s(``);try{return await f(`/api/openai-auth`,e),!0}catch(e){return s(e instanceof Error?e.message:`Unable to update the connection.`),!1}finally{a(!1)}};return(0,g.jsxs)(`div`,{className:`model-connections`,children:[!n&&(0,g.jsx)(`p`,{role:`status`,className:`openai-settings-warning`,children:`Reconnect to the server to change your connection.`}),r&&(0,g.jsx)(`p`,{role:`status`,className:`openai-settings-warning`,children:`Wait for the current agent run to finish, or stop it, before changing the connection.`}),o&&(0,g.jsx)(`p`,{className:`openai-settings-warning`,role:`alert`,children:o}),(0,g.jsx)(`div`,{"aria-live":`polite`,children:t?.message&&(0,g.jsx)(`p`,{className:t.phase===`error`?`openai-settings-warning`:`openai-settings-note`,children:t.message})}),(0,g.jsxs)(`section`,{className:`openai-settings`,"aria-labelledby":`openai-settings-title`,children:[(0,g.jsxs)(`div`,{className:`model-connection-heading`,children:[(0,g.jsxs)(`div`,{children:[(0,g.jsx)(`h2`,{id:`openai-settings-title`,children:`OpenAI`}),(0,g.jsx)(`p`,{className:`openai-settings-note`,children:`Cloud models through ChatGPT or an API key.`})]}),w&&(0,g.jsx)(`span`,{className:`model-connection-status`,children:`Connected`})]}),w&&(0,g.jsxs)(`div`,{className:`openai-settings-connected`,children:[(0,g.jsx)(`strong`,{children:`OpenAI connected`}),(0,g.jsxs)(`span`,{children:[T.join(` · `),t?.model?.startsWith(`openai`)?` · ${t.models?.find(e=>e.id===t.model)?.name||t.model.split(`/`).slice(1).join(`/`)}`:``]})]}),w&&(0,g.jsxs)(`div`,{className:`openai-settings-actions`,children:[(0,g.jsx)(`button`,{type:`button`,disabled:E,"aria-expanded":_,"aria-controls":`openai-connection-options`,onClick:()=>{v(!_),m(!1),l(``)},children:_?`Cancel`:`Manage sign-in`}),(0,g.jsx)(`button`,{type:`button`,className:`openai-disconnect`,disabled:E,onClick:()=>void k({action:`disconnect`,connection:`openai`}),children:`Disconnect`})]}),x&&t.method!==`local`?(0,g.jsxs)(`section`,{className:`openai-settings-flow`,"aria-label":`Sign-in progress`,children:[(0,g.jsx)(`h3`,{children:t.method===`device_code`?`Sign in with a device code`:`Finish signing in`}),t.userCode&&(0,g.jsxs)(`div`,{className:`openai-device-code`,children:[(0,g.jsx)(`code`,{"aria-label":`Device code`,children:t.userCode}),(0,g.jsx)(`button`,{type:`button`,onClick:async()=>{try{await navigator.clipboard.writeText(t.userCode),b(!0)}catch{s(`Copy the device code shown here to continue.`)}},children:y?`Copied`:`Copy code`})]}),O&&(0,g.jsx)(`a`,{className:`openai-login-link`,href:O,target:`_blank`,rel:`noopener noreferrer`,children:`Continue to OpenAI ↗`}),t.method===`device_code`&&(0,g.jsx)(`p`,{className:`openai-settings-note`,children:`Enter this code on OpenAI’s sign-in page. Device-code login may need to be enabled in your ChatGPT security settings.`}),t.prompt&&(0,g.jsxs)(`form`,{className:`openai-settings-form`,onSubmit:async e=>{e.preventDefault();let n=u;d(``),await k({action:`respond`,promptId:t.prompt.id,value:n})},children:[(0,g.jsx)(`label`,{htmlFor:`openai-auth-response`,children:t.prompt.message}),(0,g.jsx)(`input`,{id:`openai-auth-response`,type:`password`,value:u,placeholder:t.prompt.placeholder,autoComplete:`off`,spellCheck:!1,onChange:e=>d(e.target.value),disabled:E}),(0,g.jsx)(`button`,{disabled:E||!u.trim(),children:`Continue`})]}),(0,g.jsx)(`button`,{type:`button`,disabled:E,onClick:()=>void k({action:`cancel`}),children:`Cancel sign-in`}),(0,g.jsx)(`p`,{className:`openai-settings-note`,children:`You can leave Settings and return while sign-in is in progress.`})]}):!x&&(!w||_)?(0,g.jsxs)(`div`,{id:`openai-connection-options`,children:[(0,g.jsxs)(`section`,{className:`openai-settings-choice`,children:[(0,g.jsx)(`h3`,{children:`Sign in with ChatGPT`}),(0,g.jsx)(`p`,{children:`Use your eligible ChatGPT subscription through Pi’s Codex integration.`}),(0,g.jsxs)(`div`,{className:`openai-settings-actions`,children:[(0,g.jsx)(`button`,{className:`primary`,disabled:E,onClick:()=>void k({action:`start`,method:`browser`}),children:`Sign in with ChatGPT ↗`}),(0,g.jsx)(`button`,{disabled:E,onClick:()=>void k({action:`start`,method:`device_code`}),children:`Use a device code`})]}),(0,g.jsx)(`p`,{className:`openai-settings-note`,children:`Use a device code when Presubmit runs on a remote server.`})]}),(0,g.jsxs)(`section`,{className:`openai-settings-choice`,children:[(0,g.jsx)(`h3`,{children:`Use an API key`}),(0,g.jsx)(`p`,{children:`OpenAI API usage is billed separately from your ChatGPT subscription.`}),p?(0,g.jsxs)(`form`,{className:`openai-settings-form`,onSubmit:async e=>{e.preventDefault();let t=c.trim();l(``),await k({action:`start`,method:`api_key`,apiKey:t})&&m(!1)},children:[(0,g.jsx)(`label`,{htmlFor:`openai-api-key`,children:`OpenAI API key`}),(0,g.jsx)(`input`,{id:`openai-api-key`,type:`password`,value:c,autoComplete:`off`,spellCheck:!1,placeholder:`sk-…`,disabled:E,onChange:e=>l(e.target.value)}),(0,g.jsx)(`button`,{disabled:E||!c.trim(),children:`Connect API key`})]}):(0,g.jsx)(`button`,{disabled:E,onClick:()=>m(!0),children:`Enter API key`})]}),t?.phase===`error`&&(0,g.jsx)(`button`,{className:`openai-disconnect`,disabled:E,onClick:()=>void k({action:`disconnect`,connection:`openai`}),children:`Remove saved credentials`})]}):null,!w&&(0,g.jsx)(`p`,{className:`openai-settings-footer`,children:`Credentials are managed on the server and are never added to shared drafts or browser storage.`})]}),(0,g.jsx)(P,{active:e,connected:n,running:r}),[`mlx-lm`,`ollama`].map(e=>(0,g.jsx)(N,{provider:e,server:t?.localServers?.find(t=>t.provider===e),disabled:D,action:k},e))]})}var L=[`workspace.read`,`snapshot.read`,`findings.report`,`user.ask`];function R(e,t){if(!e||typeof e!=`object`||Array.isArray(e)||Object.keys(e).some(e=>!t.includes(e)))throw Error(`Invalid agent contract fields.`);return e}function z(e,t,n=120){if(typeof e!=`string`||!e.trim()||e.length>n)throw Error(`Invalid ${t}.`);return e}function B(e){let t=z(e,`agent identifier`);if(!/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(t))throw Error(`Invalid agent identifier.`);return t}function V(e){if(!Number.isSafeInteger(e)||e<1)throw Error(`Invalid agent version.`);return e}function ee(e){if(!Array.isArray(e)||e.length>L.length||new Set(e).size!==e.length||e.some(e=>!L.includes(e)))throw Error(`Unsupported or duplicate agent capability. V1 supports bounded reads, findings and user questions only.`);return[...e]}function H(e){let t=R(e,[`schemaVersion`,`projectId`,`id`,`version`,`name`,`instructions`,`requestedCapabilities`,`contextRequirements`,`output`]);if(t.schemaVersion!==1)throw Error(`Unsupported agent schema version.`);let n=ee(t.requestedCapabilities);if(!Array.isArray(t.contextRequirements)||t.contextRequirements.length>3||new Set(t.contextRequirements).size!==t.contextRequirements.length||t.contextRequirements.some(e=>![`prompt`,`workspace`,`snapshot`].includes(e)))throw Error(`Invalid context requirements.`);if(t.output!==`conversation`&&t.output!==`review-findings`)throw Error(`Unsupported output contract.`);let r=[...t.contextRequirements];if(n.includes(`workspace.read`)&&!r.includes(`workspace`))throw Error(`Workspace reads require workspace context.`);if((n.includes(`snapshot.read`)||n.includes(`findings.report`))&&!r.includes(`snapshot`))throw Error(`Snapshot tools require snapshot context.`);if(t.output===`review-findings`&&!n.includes(`findings.report`))throw Error(`Findings output requires findings.report.`);if(t.output===`conversation`&&n.includes(`findings.report`))throw Error(`Conversation output cannot publish findings.`);return{schemaVersion:1,projectId:B(t.projectId),id:B(t.id),version:V(t.version),name:z(t.name,`name`),instructions:z(t.instructions,`instructions`,16e3),requestedCapabilities:n,contextRequirements:r,output:t.output}}function te(e){let t=R(e,[`schemaVersion`,`projectId`,`id`,`version`,`agent`,`placement`,`trigger`,`inputMapping`,`permissionCeiling`,`resultDestination`]),n=R(t.agent,[`id`,`version`]),r=R(t.inputMapping,[`prompt`,`workspace`,`snapshot`]),i={prompt:`user-message`,workspace:`project-workspace`,snapshot:`captured-snapshot`};for(let[e,t]of Object.entries(r))if(t!==i[e])throw Error(`Unsupported input mapping.`);if(r.prompt!==`user-message`)throw Error(`Manual connections require a prompt input mapping.`);if(t.schemaVersion!==1||t.trigger!==`manual`)throw Error(`Only schema v1 manual connections are supported.`);if(t.placement!==`conversation-action`&&t.placement!==`snapshot-action`)throw Error(`Unsupported placement.`);if(t.resultDestination!==`conversation`&&t.resultDestination!==`review-findings`)throw Error(`Unsupported result destination.`);if(t.resultDestination===`review-findings`&&!r.snapshot)throw Error(`Findings destinations require immutable snapshot context.`);if(r.snapshot&&r.workspace)throw Error(`Snapshot context prohibits live workspace context.`);if(t.placement===`snapshot-action`&&(r.workspace||!r.snapshot))throw Error(`Snapshot placement requires immutable snapshot context and prohibits live workspace context.`);let a=ee(t.permissionCeiling);if(r.snapshot&&a.includes(`workspace.read`))throw Error(`Snapshot context prohibits live workspace capabilities.`);return{schemaVersion:1,projectId:B(t.projectId),id:B(t.id),version:V(t.version),agent:{id:B(n.id),version:V(n.version)},placement:t.placement,trigger:`manual`,inputMapping:{...r},permissionCeiling:a,resultDestination:t.resultDestination}}function ne(e){let t=[];for(let n of e){let e=t.at(-1);n.type===`text`&&e?.type===`text`&&e.runId===n.runId?t[t.length-1]={...e,text:e.text+n.text}:n.type!==`usage`&&n.type!==`reasoning`&&t.push(n)}return t}function re(e,t){let n=e.trim(),r=/^```(?:json)?\s*\n([\s\S]*?)\n```$/.exec(n),i=H(JSON.parse(r?.[1]??n));if(i.projectId!==t)throw Error(`Definition belongs to another project.`);return i}function U(e,t){return`Help me create or revise this reusable project-local agent conversationally. Ask about missing requirements; use propose_agent to validate the complete draft and return its JSON in a code block for import in Settings → Agents. Do not save files, execute this agent, install connections, or change project code. Saving and isolated testing are separate explicit user actions in Agents. Instructions and examples are not permission grants. V1 supports only workspace.read, snapshot.read, findings.report and user.ask; snapshots cannot use live workspace context. Output is conversation or review-findings. Preserve projectId/id/version unless I explicitly request a new agent.\n\nCurrent draft (data):\n${JSON.stringify(e,null,2)}\n\nRequested change:\n${t}`}var W=(e,t)=>c(u(`/api/agents${e}`),t===void 0?void 0:{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});function ie({definitions:e,connections:t,reload:n}){let[r,i]=(0,h.useState)(),[a,o]=(0,h.useState)([]),[s,c]=(0,h.useState)(),[l,u]=(0,h.useState)(``),[d,f]=(0,h.useState)(``),[p,m]=(0,h.useState)(!1);async function _(e){m(!0),u(``),f(``);try{await e()}catch(e){u(e instanceof Error?e.message:String(e))}finally{m(!1)}}function v(e){let t=e.contextRequirements.includes(`snapshot`);c(e),o([]),i({schemaVersion:1,projectId:e.projectId,id:`${e.id}-manual`,version:1,agent:{id:e.id,version:e.version},placement:t?`snapshot-action`:`conversation-action`,trigger:`manual`,inputMapping:{prompt:`user-message`,...t?{snapshot:`captured-snapshot`}:e.contextRequirements.includes(`workspace`)?{workspace:`project-workspace`}:{}},permissionCeiling:[...e.requestedCapabilities],resultDestination:e.output})}return(0,g.jsxs)(`section`,{"aria-label":`Saved agent connections`,children:[(0,g.jsx)(`h3`,{children:`Saved connections`}),(0,g.jsx)(`p`,{children:`Connections pin immutable agent versions. Saving configuration never runs an agent. Placement execution is not available yet.`}),(0,g.jsxs)(`label`,{children:[`New connection for saved agent`,(0,g.jsxs)(`select`,{value:``,disabled:p,onChange:t=>{let n=e.find(e=>e.id===t.target.value);n&&v(n)},children:[(0,g.jsx)(`option`,{value:``,children:`Choose a saved agent`}),e.map(e=>(0,g.jsxs)(`option`,{value:e.id,children:[e.name,` · v`,e.version]},e.id))]})]}),t.map(e=>(0,g.jsxs)(`div`,{children:[(0,g.jsxs)(`button`,{disabled:p,onClick:()=>void _(async()=>{let[t,n]=await Promise.all([W(`/connections/versions?id=${encodeURIComponent(e.id)}`),W(`/versions?id=${encodeURIComponent(e.agent.id)}`)]),r=n.versions.find(t=>t.version===e.agent.version);if(!r)throw Error(`Pinned agent version unavailable.`);c(r),o(t.versions),i({...e,version:e.version+1})}),children:[e.id,` · v`,e.version,` · `,e.agent.id,` v`,e.agent.version]}),(0,g.jsxs)(`details`,{children:[(0,g.jsx)(`summary`,{children:`Inspect connection`}),(0,g.jsx)(`pre`,{children:JSON.stringify(e,null,2)})]})]},e.id)),r&&(0,g.jsxs)(`fieldset`,{disabled:p,children:[(0,g.jsxs)(`legend`,{children:[`Unsaved connection revision `,r.version]}),(0,g.jsxs)(`label`,{children:[`Connection ID`,(0,g.jsx)(`input`,{value:r.id,disabled:a.length>0,onChange:e=>i({...r,id:e.target.value})})]}),(0,g.jsxs)(`p`,{children:[`Pinned agent: `,s?.name,` · `,r.agent.id,` v`,r.agent.version]}),(0,g.jsxs)(`details`,{children:[(0,g.jsx)(`summary`,{children:`Inspect pinned definition`}),(0,g.jsx)(`pre`,{children:JSON.stringify(s,null,2)})]}),(0,g.jsxs)(`label`,{children:[`Manual placement`,(0,g.jsxs)(`select`,{value:r.placement,onChange:e=>i({...r,placement:e.target.value}),children:[(0,g.jsx)(`option`,{value:`conversation-action`,children:`Conversation · Run agent`}),(0,g.jsx)(`option`,{value:`snapshot-action`,disabled:!r.inputMapping.snapshot,children:`Reviews · Review with saved agent`})]})]}),(0,g.jsx)(`p`,{children:`Input mappings (fixed sources):`}),(0,g.jsx)(`ul`,{children:Object.entries(r.inputMapping).map(([e,t])=>(0,g.jsxs)(`li`,{children:[e,` ← `,t]},e))}),(0,g.jsx)(`p`,{children:`Permission ceiling`}),L.map(e=>(0,g.jsxs)(`label`,{children:[(0,g.jsx)(`input`,{type:`checkbox`,checked:r.permissionCeiling.includes(e),disabled:!s?.requestedCapabilities.includes(e),onChange:t=>i({...r,permissionCeiling:t.target.checked?[...r.permissionCeiling,e]:r.permissionCeiling.filter(t=>t!==e)})}),e]},e)),(0,g.jsxs)(`p`,{children:[`Result destination:`,` `,r.resultDestination===`conversation`?`Ordinary conversation output`:`Session Reviews · snapshot findings`]}),(0,g.jsx)(`button`,{onClick:()=>void _(async()=>{let e=te(r);await W(`/connections/save`,e),await n(),o([e,...a]),i({...e,version:e.version+1}),f(`Connection saved. No agent was run.`)}),children:`Save connection revision`})]}),a.length>0&&(0,g.jsxs)(`details`,{children:[(0,g.jsx)(`summary`,{children:`Saved connection revisions`}),a.map(e=>(0,g.jsx)(`pre`,{children:JSON.stringify(e,null,2)},e.version))]}),d&&(0,g.jsx)(`p`,{role:`status`,children:d}),l&&(0,g.jsx)(`p`,{role:`alert`,children:l})]})}var G=(e,t)=>c(u(`/api/agents${e}`),t===void 0?void 0:{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});function ae(){let[e,t]=(0,h.useState)(),[n,r]=(0,h.useState)(),[o,s]=(0,h.useState)([]),[l,d]=(0,h.useState)(``),[f,p]=(0,h.useState)(`Help me refine the instructions and decide the required context and permissions.`),[m,_]=(0,h.useState)(``),[v,y]=(0,h.useState)(`Explain what you find, citing the supplied context.`),[b,x]=(0,h.useState)(`{
|
|
2
|
+
"revision": "test-fixture-1",
|
|
3
|
+
"files": { "README.md": "Example project" }
|
|
4
|
+
}`),[S,C]=(0,h.useState)([]),[w,T]=(0,h.useState)(),[E,D]=(0,h.useState)(``),[O,k]=(0,h.useState)(``),[A,j]=(0,h.useState)(!1),M=(0,h.useRef)(void 0),N=(0,h.useRef)(0);async function P(){let e=await G(``);return t(e),e}(0,h.useEffect)(()=>{let e=!0;return G(``).then(n=>{e&&t(n)}).catch(t=>{e&&D(t.message)}),()=>{e=!1}},[]),(0,h.useEffect)(()=>{if(!w||![`prepared`,`running`,`cancelling`].includes(w.invocation.status))return;let e=!0,t=setInterval(()=>{G(`/test?id=${w.invocation.id}`).then(t=>{e&&T(t)}).catch(t=>{e&&D(t.message)})},800);return()=>{e=!1,clearInterval(t)}},[w?.invocation.id,w?.invocation.status]);async function F(e){j(!0),D(``),k(``);try{await e()}catch(e){D(e instanceof Error?e.message:String(e))}finally{j(!1)}}function I(e){r(e),C(e.requestedCapabilities),k(`Unsaved draft. Saving and testing are separate actions.`)}async function R(e){let t=++N.current,n=await G(`/versions?id=${encodeURIComponent(e.id)}`);t===N.current&&(s(n.versions),I({...e,version:e.version+1}))}return(0,g.jsxs)(`section`,{className:`agents-management`,"aria-label":`Project agents`,children:[(0,g.jsx)(`p`,{children:`Project-local reusable definitions. Saving never runs an agent or enables a connection. Shell, writes, plugins and automatic hooks are unsupported.`}),e&&(0,g.jsx)(ie,{definitions:e.definitions,connections:e.connections??[],reload:P}),(0,g.jsxs)(`div`,{className:`agents-actions`,children:[(0,g.jsx)(`button`,{disabled:A||!e,onClick:()=>{s([]),I({...e.examples[1],id:`new-agent`,name:`New agent`})},children:`New agent`}),e?.examples.map(e=>(0,g.jsxs)(`button`,{disabled:A,onClick:()=>{s([]),I(e)},children:[`Draft `,e.name]},e.id)),(0,g.jsx)(`button`,{disabled:A,onClick:()=>void F(async()=>{await P()}),children:`Refresh list`})]}),(0,g.jsx)(`h2`,{children:`Saved agents`}),(0,g.jsx)(`p`,{children:`Showing up to 100 latest definitions. Revisions are immutable; loading one creates an editable draft.`}),(0,g.jsx)(`ul`,{children:e?.definitions.map(e=>(0,g.jsx)(`li`,{children:(0,g.jsxs)(`button`,{disabled:A,onClick:()=>void F(()=>R(e)),children:[e.name,` · v`,e.version]})},e.id))}),e?.definitions.length===0&&(0,g.jsx)(`p`,{children:`No saved agents yet.`}),n&&(0,g.jsxs)(`fieldset`,{disabled:A,children:[(0,g.jsx)(`legend`,{children:`Definition draft`}),(0,g.jsxs)(`label`,{children:[`Identifier`,(0,g.jsx)(`input`,{value:n.id,onChange:e=>I({...n,id:e.target.value,version:1})})]}),(0,g.jsxs)(`label`,{children:[`Name`,(0,g.jsx)(`input`,{value:n.name,onChange:e=>I({...n,name:e.target.value})})]}),(0,g.jsxs)(`p`,{children:[`Project: `,n.projectId,` · Proposed version: `,n.version]}),(0,g.jsxs)(`label`,{children:[`Instructions`,(0,g.jsx)(`textarea`,{rows:6,value:n.instructions,onChange:e=>I({...n,instructions:e.target.value})})]}),(0,g.jsxs)(`fieldset`,{children:[(0,g.jsx)(`legend`,{children:`Requested capabilities (not granted by saving)`}),L.map(e=>(0,g.jsxs)(`label`,{children:[(0,g.jsx)(`input`,{type:`checkbox`,checked:n.requestedCapabilities.includes(e),onChange:t=>I({...n,requestedCapabilities:t.target.checked?[...n.requestedCapabilities,e]:n.requestedCapabilities.filter(t=>t!==e)})}),e]},e))]}),(0,g.jsxs)(`fieldset`,{children:[(0,g.jsx)(`legend`,{children:`Context requirements`}),[`prompt`,`workspace`,`snapshot`].map(e=>(0,g.jsxs)(`label`,{children:[(0,g.jsx)(`input`,{type:`checkbox`,checked:n.contextRequirements.includes(e),onChange:t=>I({...n,contextRequirements:t.target.checked?[...n.contextRequirements,e]:n.contextRequirements.filter(t=>t!==e)})}),e]},e))]}),(0,g.jsxs)(`label`,{children:[`Output contract`,(0,g.jsxs)(`select`,{value:n.output,onChange:e=>I({...n,output:e.target.value}),children:[(0,g.jsx)(`option`,{value:`conversation`,children:`Conversation`}),(0,g.jsx)(`option`,{value:`review-findings`,children:`Review findings + summary`})]})]}),(0,g.jsx)(`button`,{onClick:()=>void F(async()=>{let e=await G(`/save`,H(n));await P(),await R(e.definition),k(`Saved immutable version ${e.definition.version}. Nothing was executed.`)}),children:`Save new revision`}),o.length>0&&(0,g.jsxs)(`details`,{children:[(0,g.jsxs)(`summary`,{children:[`Saved revisions (`,o.length,`)`]}),o.map(e=>(0,g.jsxs)(`details`,{children:[(0,g.jsxs)(`summary`,{children:[`Version `,e.version]}),(0,g.jsx)(`pre`,{children:JSON.stringify(e,null,2)}),(0,g.jsxs)(`button`,{onClick:()=>I({...e,version:o[0].version+1}),children:[`Revise version `,e.version]})]},e.version))]}),(0,g.jsx)(`h2`,{children:`Create or revise conversationally`}),(0,g.jsx)(`p`,{children:`Uses an ordinary conversation and the pure propose_agent tool. Open the conversation, refine the draft, then paste its validated JSON below. No definition is published automatically.`}),(0,g.jsxs)(`label`,{children:[`What should change?`,(0,g.jsx)(`textarea`,{value:f,onChange:e=>p(e.target.value)})]}),(0,g.jsxs)(`details`,{children:[(0,g.jsx)(`summary`,{children:`Conversation input`}),(0,g.jsx)(`pre`,{children:U(n,f)})]}),(0,g.jsx)(`button`,{onClick:()=>void F(async()=>{H(n);let e=crypto.randomUUID();await c(u(`/api/sessions`),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({id:e,title:`Build agent: ${n.name}`.slice(0,120),prompt:U(n,f),useWorktree:!1,permissionMode:`ask`})}),_(u(`/s/${e}`))}),children:`Start builder conversation`}),m&&(0,g.jsx)(`a`,{href:m,target:`_blank`,rel:`noreferrer`,children:`Open builder conversation`}),(0,g.jsx)(`h2`,{children:`Explicit isolated test`}),(0,g.jsx)(`p`,{children:`Tests freeze this draft, without publishing it. Fresh run and session state; no follow-up can widen permissions. Workspace reads use this project's live files. Snapshot tests read only the supplied frozen fixture; results never alter existing reviews.`}),(0,g.jsxs)(`label`,{children:[`Test input`,(0,g.jsx)(`textarea`,{value:v,onChange:e=>y(e.target.value)})]}),n.contextRequirements.includes(`snapshot`)&&(0,g.jsxs)(`label`,{children:[`Immutable snapshot fixture (JSON)`,(0,g.jsx)(`textarea`,{rows:7,value:b,onChange:e=>x(e.target.value)})]}),(0,g.jsxs)(`fieldset`,{children:[(0,g.jsx)(`legend`,{children:`Effective test permissions (explicit ceiling)`}),n.requestedCapabilities.map(e=>(0,g.jsxs)(`label`,{children:[(0,g.jsx)(`input`,{type:`checkbox`,checked:S.includes(e),onChange:t=>C(t.target.checked?[...S,e]:S.filter(t=>t!==e))}),e]},e))]}),(0,g.jsx)(`button`,{onClick:()=>void F(async()=>{let e={definition:H(n),input:{prompt:v,...n.contextRequirements.includes(`snapshot`)?{snapshot:JSON.parse(b)}:{}},permissions:S},t=JSON.stringify(e);M.current?.fingerprint!==t&&(M.current={fingerprint:t,id:crypto.randomUUID()}),T(await G(`/test`,{...e,requestId:M.current.id})),await P()}),children:`Test draft explicitly`}),(0,g.jsx)(`button`,{onClick:()=>{M.current=void 0,k(`Next explicit test will create a fresh run.`)},children:`Prepare a new test attempt`})]}),(0,g.jsxs)(`label`,{children:[`Import conversational definition JSON`,(0,g.jsx)(`textarea`,{rows:5,value:l,onChange:e=>d(e.target.value)})]}),(0,g.jsx)(`button`,{disabled:A||!e,onClick:()=>void F(async()=>{let t=re(l,e.projectId);s([]),I(t)}),children:`Import as unsaved draft`}),O&&(0,g.jsx)(`p`,{role:`status`,children:O}),E&&(0,g.jsx)(`p`,{role:`alert`,children:E}),(0,g.jsx)(`h2`,{children:`Recent isolated tests`}),(0,g.jsx)(`ul`,{children:e?.tests.map(e=>(0,g.jsx)(`li`,{children:(0,g.jsxs)(`button`,{disabled:A,onClick:()=>void F(async()=>T(await G(`/test?id=${e.id}`))),children:[e.definition.name,` · `,e.status,` · `,e.createdAt]})},e.id))}),w&&(0,g.jsxs)(`section`,{"aria-label":`Test conversation`,children:[(0,g.jsxs)(`h3`,{children:[w.invocation.definition.name,` — `,w.invocation.status]}),(0,g.jsxs)(`p`,{children:[`Isolated session: `,w.invocation.sessionId]}),(0,g.jsxs)(`p`,{children:[`Effective permissions: `,w.invocation.effectiveCapabilities.join(`, `)||`text only`]}),(0,g.jsxs)(`details`,{children:[(0,g.jsx)(`summary`,{children:`Frozen definition and context`}),(0,g.jsx)(`pre`,{children:JSON.stringify(w.invocation,null,2)})]}),[`running`,`prepared`].includes(w.invocation.status)&&(0,g.jsx)(`button`,{disabled:A,onClick:()=>void F(async()=>T(await G(`/stop`,{id:w.invocation.id,revision:w.invocation.revision}))),children:`Stop test`}),w.invocation.error&&(0,g.jsx)(`p`,{role:`alert`,children:w.invocation.error}),(0,g.jsx)(i,{text:w.invocation.input.prompt}),ne(w.events).map((e,t)=>e.type===`text`?(0,g.jsx)(i,{text:e.text},t):e.type===`finding`?(0,g.jsxs)(`div`,{children:[(0,g.jsxs)(`strong`,{children:[e.finding.severity,`: `,e.finding.title]}),(0,g.jsxs)(`p`,{children:[e.finding.file,`:`,e.finding.lineStart]}),(0,g.jsx)(i,{text:e.finding.explanation})]},t):e.type===`tool_start`?(0,g.jsxs)(`p`,{children:[`Using `,e.name,`…`]},t):e.type===`tool_end`?(0,g.jsxs)(`details`,{children:[(0,g.jsxs)(`summary`,{children:[e.name,e.isError?` — error`:` — finished`]}),(0,g.jsx)(`pre`,{children:e.output})]},t):null),w.questions.map(e=>(0,g.jsx)(a,{question:e,onInteract:()=>{},disabled:A||w.invocation.status!==`running`,sessionId:w.invocation.sessionId,onAnswer:async t=>{try{return T(await G(`/answer`,{id:w.invocation.id,questionId:e.id,version:e.version,answer:t})),!0}catch(e){return D(String(e)),!1}}},e.id))]})]})}var oe=Object.defineProperty,K=Object.getOwnPropertySymbols,q=Object.prototype.hasOwnProperty,J=Object.prototype.propertyIsEnumerable,se=(e,t,n)=>t in e?oe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Y=(e,t)=>{for(var n in t||={})q.call(t,n)&&se(e,n,t[n]);if(K)for(var n of K(t))J.call(t,n)&&se(e,n,t[n]);return e},X=(e,t)=>{var n={};for(var r in e)q.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&K)for(var r of K(e))t.indexOf(r)<0&&J.call(e,r)&&(n[r]=e[r]);return n},Z;(e=>{let t=class t{constructor(e,n,r,a){if(this.version=e,this.errorCorrectionLevel=n,this.modules=[],this.isFunction=[],e<t.MIN_VERSION||e>t.MAX_VERSION)throw RangeError(`Version value out of range`);if(a<-1||a>7)throw RangeError(`Mask value out of range`);this.size=e*4+17;let o=[];for(let e=0;e<this.size;e++)o.push(!1);for(let e=0;e<this.size;e++)this.modules.push(o.slice()),this.isFunction.push(o.slice());this.drawFunctionPatterns();let s=this.addEccAndInterleave(r);if(this.drawCodewords(s),a==-1){let e=1e9;for(let t=0;t<8;t++){this.applyMask(t),this.drawFormatBits(t);let n=this.getPenaltyScore();n<e&&(a=t,e=n),this.applyMask(t)}}i(0<=a&&a<=7),this.mask=a,this.applyMask(a),this.drawFormatBits(a),this.isFunction=[]}static encodeText(n,r){let i=e.QrSegment.makeSegments(n);return t.encodeSegments(i,r)}static encodeBinary(n,r){let i=e.QrSegment.makeBytes(n);return t.encodeSegments([i],r)}static encodeSegments(e,r,a=1,s=40,c=-1,l=!0){if(!(t.MIN_VERSION<=a&&a<=s&&s<=t.MAX_VERSION)||c<-1||c>7)throw RangeError(`Invalid value`);let u,d;for(u=a;;u++){let n=t.getNumDataCodewords(u,r)*8,i=o.getTotalBits(e,u);if(i<=n){d=i;break}if(u>=s)throw RangeError(`Data too long`)}for(let e of[t.Ecc.MEDIUM,t.Ecc.QUARTILE,t.Ecc.HIGH])l&&d<=t.getNumDataCodewords(u,e)*8&&(r=e);let f=[];for(let t of e){n(t.mode.modeBits,4,f),n(t.numChars,t.mode.numCharCountBits(u),f);for(let e of t.getData())f.push(e)}i(f.length==d);let p=t.getNumDataCodewords(u,r)*8;i(f.length<=p),n(0,Math.min(4,p-f.length),f),n(0,(8-f.length%8)%8,f),i(f.length%8==0);for(let e=236;f.length<p;e^=253)n(e,8,f);let m=[];for(;m.length*8<f.length;)m.push(0);return f.forEach((e,t)=>m[t>>>3]|=e<<7-(t&7)),new t(u,r,m,c)}getModule(e,t){return 0<=e&&e<this.size&&0<=t&&t<this.size&&this.modules[t][e]}getModules(){return this.modules}drawFunctionPatterns(){for(let e=0;e<this.size;e++)this.setFunctionModule(6,e,e%2==0),this.setFunctionModule(e,6,e%2==0);this.drawFinderPattern(3,3),this.drawFinderPattern(this.size-4,3),this.drawFinderPattern(3,this.size-4);let e=this.getAlignmentPatternPositions(),t=e.length;for(let n=0;n<t;n++)for(let r=0;r<t;r++)n==0&&r==0||n==0&&r==t-1||n==t-1&&r==0||this.drawAlignmentPattern(e[n],e[r]);this.drawFormatBits(0),this.drawVersion()}drawFormatBits(e){let t=this.errorCorrectionLevel.formatBits<<3|e,n=t;for(let e=0;e<10;e++)n=n<<1^(n>>>9)*1335;let a=(t<<10|n)^21522;i(!(a>>>15));for(let e=0;e<=5;e++)this.setFunctionModule(8,e,r(a,e));this.setFunctionModule(8,7,r(a,6)),this.setFunctionModule(8,8,r(a,7)),this.setFunctionModule(7,8,r(a,8));for(let e=9;e<15;e++)this.setFunctionModule(14-e,8,r(a,e));for(let e=0;e<8;e++)this.setFunctionModule(this.size-1-e,8,r(a,e));for(let e=8;e<15;e++)this.setFunctionModule(8,this.size-15+e,r(a,e));this.setFunctionModule(8,this.size-8,!0)}drawVersion(){if(this.version<7)return;let e=this.version;for(let t=0;t<12;t++)e=e<<1^(e>>>11)*7973;let t=this.version<<12|e;i(!(t>>>18));for(let e=0;e<18;e++){let n=r(t,e),i=this.size-11+e%3,a=Math.floor(e/3);this.setFunctionModule(i,a,n),this.setFunctionModule(a,i,n)}}drawFinderPattern(e,t){for(let n=-4;n<=4;n++)for(let r=-4;r<=4;r++){let i=Math.max(Math.abs(r),Math.abs(n)),a=e+r,o=t+n;0<=a&&a<this.size&&0<=o&&o<this.size&&this.setFunctionModule(a,o,i!=2&&i!=4)}}drawAlignmentPattern(e,t){for(let n=-2;n<=2;n++)for(let r=-2;r<=2;r++)this.setFunctionModule(e+r,t+n,Math.max(Math.abs(r),Math.abs(n))!=1)}setFunctionModule(e,t,n){this.modules[t][e]=n,this.isFunction[t][e]=!0}addEccAndInterleave(e){let n=this.version,r=this.errorCorrectionLevel;if(e.length!=t.getNumDataCodewords(n,r))throw RangeError(`Invalid argument`);let a=t.NUM_ERROR_CORRECTION_BLOCKS[r.ordinal][n],o=t.ECC_CODEWORDS_PER_BLOCK[r.ordinal][n],s=Math.floor(t.getNumRawDataModules(n)/8),c=a-s%a,l=Math.floor(s/a),u=[],d=t.reedSolomonComputeDivisor(o);for(let n=0,r=0;n<a;n++){let i=e.slice(r,r+l-o+(n<c?0:1));r+=i.length;let a=t.reedSolomonComputeRemainder(i,d);n<c&&i.push(0),u.push(i.concat(a))}let f=[];for(let e=0;e<u[0].length;e++)u.forEach((t,n)=>{(e!=l-o||n>=c)&&f.push(t[e])});return i(f.length==s),f}drawCodewords(e){if(e.length!=Math.floor(t.getNumRawDataModules(this.version)/8))throw RangeError(`Invalid argument`);let n=0;for(let t=this.size-1;t>=1;t-=2){t==6&&(t=5);for(let i=0;i<this.size;i++)for(let a=0;a<2;a++){let o=t-a,s=t+1&2?i:this.size-1-i;!this.isFunction[s][o]&&n<e.length*8&&(this.modules[s][o]=r(e[n>>>3],7-(n&7)),n++)}}i(n==e.length*8)}applyMask(e){if(e<0||e>7)throw RangeError(`Mask value out of range`);for(let t=0;t<this.size;t++)for(let n=0;n<this.size;n++){let r;switch(e){case 0:r=(n+t)%2==0;break;case 1:r=t%2==0;break;case 2:r=n%3==0;break;case 3:r=(n+t)%3==0;break;case 4:r=(Math.floor(n/3)+Math.floor(t/2))%2==0;break;case 5:r=n*t%2+n*t%3==0;break;case 6:r=(n*t%2+n*t%3)%2==0;break;case 7:r=((n+t)%2+n*t%3)%2==0;break;default:throw Error(`Unreachable`)}!this.isFunction[t][n]&&r&&(this.modules[t][n]=!this.modules[t][n])}}getPenaltyScore(){let e=0;for(let n=0;n<this.size;n++){let r=!1,i=0,a=[0,0,0,0,0,0,0];for(let o=0;o<this.size;o++)this.modules[n][o]==r?(i++,i==5?e+=t.PENALTY_N1:i>5&&e++):(this.finderPenaltyAddHistory(i,a),r||(e+=this.finderPenaltyCountPatterns(a)*t.PENALTY_N3),r=this.modules[n][o],i=1);e+=this.finderPenaltyTerminateAndCount(r,i,a)*t.PENALTY_N3}for(let n=0;n<this.size;n++){let r=!1,i=0,a=[0,0,0,0,0,0,0];for(let o=0;o<this.size;o++)this.modules[o][n]==r?(i++,i==5?e+=t.PENALTY_N1:i>5&&e++):(this.finderPenaltyAddHistory(i,a),r||(e+=this.finderPenaltyCountPatterns(a)*t.PENALTY_N3),r=this.modules[o][n],i=1);e+=this.finderPenaltyTerminateAndCount(r,i,a)*t.PENALTY_N3}for(let n=0;n<this.size-1;n++)for(let r=0;r<this.size-1;r++){let i=this.modules[n][r];i==this.modules[n][r+1]&&i==this.modules[n+1][r]&&i==this.modules[n+1][r+1]&&(e+=t.PENALTY_N2)}let n=0;for(let e of this.modules)n=e.reduce((e,t)=>e+ +!!t,n);let r=this.size*this.size,a=Math.ceil(Math.abs(n*20-r*10)/r)-1;return i(0<=a&&a<=9),e+=a*t.PENALTY_N4,i(0<=e&&e<=2568888),e}getAlignmentPatternPositions(){if(this.version==1)return[];{let e=Math.floor(this.version/7)+2,t=this.version==32?26:Math.ceil((this.version*4+4)/(e*2-2))*2,n=[6];for(let r=this.size-7;n.length<e;r-=t)n.splice(1,0,r);return n}}static getNumRawDataModules(e){if(e<t.MIN_VERSION||e>t.MAX_VERSION)throw RangeError(`Version number out of range`);let n=(16*e+128)*e+64;if(e>=2){let t=Math.floor(e/7)+2;n-=(25*t-10)*t-55,e>=7&&(n-=36)}return i(208<=n&&n<=29648),n}static getNumDataCodewords(e,n){return Math.floor(t.getNumRawDataModules(e)/8)-t.ECC_CODEWORDS_PER_BLOCK[n.ordinal][e]*t.NUM_ERROR_CORRECTION_BLOCKS[n.ordinal][e]}static reedSolomonComputeDivisor(e){if(e<1||e>255)throw RangeError(`Degree out of range`);let n=[];for(let t=0;t<e-1;t++)n.push(0);n.push(1);let r=1;for(let i=0;i<e;i++){for(let e=0;e<n.length;e++)n[e]=t.reedSolomonMultiply(n[e],r),e+1<n.length&&(n[e]^=n[e+1]);r=t.reedSolomonMultiply(r,2)}return n}static reedSolomonComputeRemainder(e,n){let r=n.map(e=>0);for(let i of e){let e=i^r.shift();r.push(0),n.forEach((n,i)=>r[i]^=t.reedSolomonMultiply(n,e))}return r}static reedSolomonMultiply(e,t){if(e>>>8||t>>>8)throw RangeError(`Byte out of range`);let n=0;for(let r=7;r>=0;r--)n=n<<1^(n>>>7)*285,n^=(t>>>r&1)*e;return i(!(n>>>8)),n}finderPenaltyCountPatterns(e){let t=e[1];i(t<=this.size*3);let n=t>0&&e[2]==t&&e[3]==t*3&&e[4]==t&&e[5]==t;return(n&&e[0]>=t*4&&e[6]>=t?1:0)+(n&&e[6]>=t*4&&e[0]>=t?1:0)}finderPenaltyTerminateAndCount(e,t,n){return e&&(this.finderPenaltyAddHistory(t,n),t=0),t+=this.size,this.finderPenaltyAddHistory(t,n),this.finderPenaltyCountPatterns(n)}finderPenaltyAddHistory(e,t){t[0]==0&&(e+=this.size),t.pop(),t.unshift(e)}};t.MIN_VERSION=1,t.MAX_VERSION=40,t.PENALTY_N1=3,t.PENALTY_N2=3,t.PENALTY_N3=40,t.PENALTY_N4=10,t.ECC_CODEWORDS_PER_BLOCK=[[-1,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,10,16,26,18,24,16,18,22,22,26,30,22,22,24,24,28,28,26,26,26,26,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],[-1,13,22,18,26,18,24,18,22,20,24,28,26,24,20,30,24,28,28,26,30,28,30,30,30,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,17,28,22,16,22,28,26,26,24,28,24,28,22,24,24,30,28,28,26,28,30,24,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30]],t.NUM_ERROR_CORRECTION_BLOCKS=[[-1,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25],[-1,1,1,1,2,2,4,4,4,5,5,5,8,9,9,10,10,11,13,14,16,17,17,18,20,21,23,25,26,28,29,31,33,35,37,38,40,43,45,47,49],[-1,1,1,2,2,4,4,6,6,8,8,8,10,12,16,12,17,16,18,21,20,23,23,25,27,29,34,34,35,38,40,43,45,48,51,53,56,59,62,65,68],[-1,1,1,2,4,4,4,5,6,8,8,11,11,16,16,18,16,19,21,25,25,25,34,30,32,35,37,40,42,45,48,51,54,57,60,63,66,70,74,77,81]],e.QrCode=t;function n(e,t,n){if(t<0||t>31||e>>>t)throw RangeError(`Value out of range`);for(let r=t-1;r>=0;r--)n.push(e>>>r&1)}function r(e,t){return!!(e>>>t&1)}function i(e){if(!e)throw Error(`Assertion error`)}let a=class e{constructor(e,t,n){if(this.mode=e,this.numChars=t,this.bitData=n,t<0)throw RangeError(`Invalid argument`);this.bitData=n.slice()}static makeBytes(t){let r=[];for(let e of t)n(e,8,r);return new e(e.Mode.BYTE,t.length,r)}static makeNumeric(t){if(!e.isNumeric(t))throw RangeError(`String contains non-numeric characters`);let r=[];for(let e=0;e<t.length;){let i=Math.min(t.length-e,3);n(parseInt(t.substring(e,e+i),10),i*3+1,r),e+=i}return new e(e.Mode.NUMERIC,t.length,r)}static makeAlphanumeric(t){if(!e.isAlphanumeric(t))throw RangeError(`String contains unencodable characters in alphanumeric mode`);let r=[],i=0;for(;i+2<=t.length;i+=2){let a=e.ALPHANUMERIC_CHARSET.indexOf(t.charAt(i))*45;a+=e.ALPHANUMERIC_CHARSET.indexOf(t.charAt(i+1)),n(a,11,r)}return i<t.length&&n(e.ALPHANUMERIC_CHARSET.indexOf(t.charAt(i)),6,r),new e(e.Mode.ALPHANUMERIC,t.length,r)}static makeSegments(t){return t==``?[]:e.isNumeric(t)?[e.makeNumeric(t)]:e.isAlphanumeric(t)?[e.makeAlphanumeric(t)]:[e.makeBytes(e.toUtf8ByteArray(t))]}static makeEci(t){let r=[];if(t<0)throw RangeError(`ECI assignment value out of range`);if(t<128)n(t,8,r);else if(t<16384)n(2,2,r),n(t,14,r);else if(t<1e6)n(6,3,r),n(t,21,r);else throw RangeError(`ECI assignment value out of range`);return new e(e.Mode.ECI,0,r)}static isNumeric(t){return e.NUMERIC_REGEX.test(t)}static isAlphanumeric(t){return e.ALPHANUMERIC_REGEX.test(t)}getData(){return this.bitData.slice()}static getTotalBits(e,t){let n=0;for(let r of e){let e=r.mode.numCharCountBits(t);if(r.numChars>=1<<e)return 1/0;n+=4+e+r.bitData.length}return n}static toUtf8ByteArray(e){e=encodeURI(e);let t=[];for(let n=0;n<e.length;n++)e.charAt(n)==`%`?(t.push(parseInt(e.substring(n+1,n+3),16)),n+=2):t.push(e.charCodeAt(n));return t}};a.NUMERIC_REGEX=/^[0-9]*$/,a.ALPHANUMERIC_REGEX=/^[A-Z0-9 $%*+.\/:-]*$/,a.ALPHANUMERIC_CHARSET=`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:`;let o=a;e.QrSegment=a})(Z||={}),(e=>{(e=>{let t=class{constructor(e,t){this.ordinal=e,this.formatBits=t}};t.LOW=new t(0,1),t.MEDIUM=new t(1,0),t.QUARTILE=new t(2,3),t.HIGH=new t(3,2),e.Ecc=t})(e.QrCode||={})})(Z||={}),(e=>{(e=>{let t=class{constructor(e,t){this.modeBits=e,this.numBitsCharCount=t}numCharCountBits(e){return this.numBitsCharCount[Math.floor((e+7)/17)]}};t.NUMERIC=new t(1,[10,12,14]),t.ALPHANUMERIC=new t(2,[9,11,13]),t.BYTE=new t(4,[8,16,16]),t.KANJI=new t(8,[8,10,12]),t.ECI=new t(7,[0,0,0]),e.Mode=t})(e.QrSegment||={})})(Z||={});var Q=Z,ce={L:Q.QrCode.Ecc.LOW,M:Q.QrCode.Ecc.MEDIUM,Q:Q.QrCode.Ecc.QUARTILE,H:Q.QrCode.Ecc.HIGH},le=128,ue=`L`,de=`#FFFFFF`,fe=`#000000`,pe=!1,me=1,he=4,ge=0,_e=.1;function ve(e,t=0){let n=[];return e.forEach(function(e,r){let i=null;e.forEach(function(a,o){if(!a&&i!==null){n.push(`M${i+t} ${r+t}h${o-i}v1H${i+t}z`),i=null;return}if(o===e.length-1){if(!a)return;i===null?n.push(`M${o+t},${r+t} h1v1H${o+t}z`):n.push(`M${i+t},${r+t} h${o+1-i}v1H${i+t}z`);return}a&&i===null&&(i=o)})}),n.join(``)}function ye(e,t){return e.slice().map((e,n)=>n<t.y||n>=t.y+t.h?e:e.map((e,n)=>n<t.x||n>=t.x+t.w?e:!1))}function be(e,t,n,r){if(r==null)return null;let i=e.length+n*2,a=Math.floor(t*_e),o=i/t,s=(r.width||a)*o,c=(r.height||a)*o,l=r.x==null?e.length/2-s/2:r.x*o,u=r.y==null?e.length/2-c/2:r.y*o,d=r.opacity==null?1:r.opacity,f=null;if(r.excavate){let e=Math.floor(l),t=Math.floor(u);f={x:e,y:t,w:Math.ceil(s+l-e),h:Math.ceil(c+u-t)}}let p=r.crossOrigin;return{x:l,y:u,h:c,w:s,excavation:f,opacity:d,crossOrigin:p}}function xe(e,t){return t==null?e?he:ge:Math.max(Math.floor(t),0)}function Se({value:e,level:t,minVersion:n,includeMargin:r,marginSize:i,imageSettings:a,size:o,boostLevel:s}){let c=h.useMemo(()=>{let r=(Array.isArray(e)?e:[e]).reduce((e,t)=>(e.push(...Q.QrSegment.makeSegments(t)),e),[]);return Q.QrCode.encodeSegments(r,ce[t],n,void 0,void 0,s)},[e,t,n,s]),{cells:l,margin:u,numCells:d,calculatedImageSettings:f}=h.useMemo(()=>{let e=c.getModules(),t=xe(r,i);return{cells:e,margin:t,numCells:e.length+t*2,calculatedImageSettings:be(e,o,t,a)}},[c,o,a,r,i]);return{qrcode:c,margin:u,cells:l,numCells:d,calculatedImageSettings:f}}var Ce=function(){try{new Path2D().addPath(new Path2D)}catch{return!1}return!0}(),we=h.forwardRef(function(e,t){let n=e,{value:r,size:i=le,level:a=ue,bgColor:o=de,fgColor:s=fe,includeMargin:c=pe,minVersion:l=me,boostLevel:u,marginSize:d,imageSettings:f}=n,p=X(n,[`value`,`size`,`level`,`bgColor`,`fgColor`,`includeMargin`,`minVersion`,`boostLevel`,`marginSize`,`imageSettings`]),{style:m}=p,g=X(p,[`style`]),_=f?.src,v=h.useRef(null),y=h.useRef(null),b=h.useCallback(e=>{v.current=e,typeof t==`function`?t(e):t&&(t.current=e)},[t]),[x,S]=h.useState(!1),{margin:C,cells:w,numCells:T,calculatedImageSettings:E}=Se({value:r,level:a,minVersion:l,boostLevel:u,includeMargin:c,marginSize:d,imageSettings:f,size:i});h.useEffect(()=>{if(v.current!=null){let e=v.current,t=e.getContext(`2d`);if(!t)return;let n=w,r=y.current,a=E!=null&&r!==null&&r.complete&&r.naturalHeight!==0&&r.naturalWidth!==0;a&&E.excavation!=null&&(n=ye(w,E.excavation));let c=window.devicePixelRatio||1;e.height=e.width=i*c;let l=i/T*c;t.scale(l,l),t.fillStyle=o,t.fillRect(0,0,T,T),t.fillStyle=s,Ce?t.fill(new Path2D(ve(n,C))):w.forEach(function(e,n){e.forEach(function(e,r){e&&t.fillRect(r+C,n+C,1,1)})}),E&&(t.globalAlpha=E.opacity),a&&t.drawImage(r,E.x+C,E.y+C,E.w,E.h)}}),h.useEffect(()=>{S(!1)},[_]);let D=Y({height:i,width:i},m),O=null;return _!=null&&(O=h.createElement(`img`,{src:_,key:_,style:{display:`none`},onLoad:()=>{S(!0)},ref:y,crossOrigin:E?.crossOrigin})),h.createElement(h.Fragment,null,h.createElement(`canvas`,Y({style:D,height:i,width:i,ref:b,role:`img`},g)),O)});we.displayName=`QRCodeCanvas`;var Te=h.forwardRef(function(e,t){let n=e,{value:r,size:i=le,level:a=ue,bgColor:o=de,fgColor:s=fe,includeMargin:c=pe,minVersion:l=me,boostLevel:u,title:d,marginSize:f,imageSettings:p}=n,m=X(n,[`value`,`size`,`level`,`bgColor`,`fgColor`,`includeMargin`,`minVersion`,`boostLevel`,`title`,`marginSize`,`imageSettings`]),{margin:g,cells:_,numCells:v,calculatedImageSettings:y}=Se({value:r,level:a,minVersion:l,boostLevel:u,includeMargin:c,marginSize:f,imageSettings:p,size:i}),b=_,x=null;p!=null&&y!=null&&(y.excavation!=null&&(b=ye(_,y.excavation)),x=h.createElement(`image`,{href:p.src,height:y.h,width:y.w,x:y.x+g,y:y.y+g,preserveAspectRatio:`none`,opacity:y.opacity,crossOrigin:y.crossOrigin}));let S=ve(b,g);return h.createElement(`svg`,Y({height:i,width:i,viewBox:`0 0 ${v} ${v}`,ref:t,role:`img`},m),!!d&&h.createElement(`title`,null,d),h.createElement(`path`,{fill:o,d:`M0,0 h${v}v${v}H0z`,shapeRendering:`crispEdges`}),h.createElement(`path`,{fill:s,d:S,shapeRendering:`crispEdges`}),x)});Te.displayName=`QRCodeSVG`;function Ee({connected:e,onOrigin:t}){let[n,r]=(0,h.useState)(),[i,a]=(0,h.useState)(``),[o,s]=(0,h.useState)(``),[c,l]=(0,h.useState)(``),[u,d]=(0,h.useState)(0),p=(0,h.useRef)(void 0);(0,h.useEffect)(()=>()=>p.current?.abort(),[]),(0,h.useEffect)(()=>{if(!e||c)return;let n=new AbortController,i;async function a(){try{let e=await f(`/api/tailscale-serve`,void 0,n.signal);n.signal.aborted||(r(e),t(e.tailscaleOrigin),s(``))}catch(e){n.signal.aborted||s(e instanceof Error?e.message:`Could not check Tailscale Serve.`)}finally{n.signal.aborted||(i=setTimeout(()=>void a(),5e3))}}return a(),()=>{n.abort(),clearTimeout(i)}},[e,c,u,t]);async function m(e,i){if(c)return;let o=new AbortController;p.current=o,l(e),a(``);let s=n?.autoStart;e===`set_auto_start`&&r(e=>e&&{...e,autoStart:i});try{let n=await f(`/api/tailscale-serve`,{action:e,enabled:i},o.signal);o.signal.aborted||(r(n),t(n.tailscaleOrigin))}catch(t){o.signal.aborted||(e===`set_auto_start`&&s!==void 0&&r(e=>e&&{...e,autoStart:s}),a(e===`stop`&&location.protocol===`https:`?`The remote connection closed. Open Presubmit on the host computer to check Serve.`:t instanceof Error?t.message:`Could not update Tailscale Serve.`))}finally{o.signal.aborted||l(``)}}let _=!e||!!c||!n||n.phase===`starting`;return(0,g.jsxs)(`div`,{className:`device-serve`,"aria-label":`Tailscale Serve`,children:[(0,g.jsx)(`h3`,{children:`Tailscale Serve`}),(0,g.jsx)(`p`,{role:`status`,children:c===`start`?`Starting Tailscale Serve…`:c===`stop`?`Stopping Tailscale Serve…`:c===`set_auto_start`?`Saving startup preference…`:e?n?.message??`Checking Tailscale Serve…`:`Reconnect to check Serve.`}),n?.phase===`external`?(0,g.jsx)(`p`,{children:`To manage it here, stop the existing Serve command, then refresh its status.`}):(0,g.jsx)(`button`,{type:`button`,disabled:_,onClick:()=>void m(n?.phase===`running`?`stop`:`start`),children:n?.phase===`running`?`Stop Serve`:`Start Serve`}),(0,g.jsx)(`button`,{type:`button`,disabled:!e||!!c,onClick:()=>d(e=>e+1),children:`Refresh Serve status`}),n?.phase===`running`&&location.protocol===`https:`&&(0,g.jsx)(`p`,{children:`Stopping Serve will disconnect this browser. You can restart it on the host computer.`}),n?.phase===`blocked`&&n.message.includes(`HTTPS certificates`)&&(0,g.jsxs)(`p`,{children:[(0,g.jsx)(`a`,{href:`https://login.tailscale.com/admin/dns`,target:`_blank`,rel:`noreferrer`,children:`Open Tailscale DNS settings`}),` `,`to enable HTTPS.`]}),(0,g.jsxs)(`label`,{className:`device-serve-auto`,children:[(0,g.jsx)(`input`,{type:`checkbox`,checked:n?.autoStart??!1,disabled:_,onChange:e=>void m(`set_auto_start`,e.target.checked)}),(0,g.jsx)(`span`,{children:`Start Serve when Presubmit starts`})]}),(0,g.jsx)(`p`,{className:`device-serve-note`,children:`Saved for this host and its Tailscale address. Turning this off does not stop Serve.`}),i&&(0,g.jsx)(`p`,{role:`alert`,children:i}),o&&(0,g.jsx)(`p`,{role:`alert`,children:o})]})}function De({connected:e}){let[t,n]=(0,h.useState)(),[r,i]=(0,h.useState)(),[a,o]=(0,h.useState)(``),[s,c]=(0,h.useState)(``),[l,u]=(0,h.useState)(!1),[d,p]=(0,h.useState)(!1),[m,_]=(0,h.useState)(0),[v,y]=(0,h.useState)(Date.now),b=(0,h.useRef)(void 0),x=(0,h.useRef)(null),S=(0,h.useCallback)(e=>{n({tailscaleOrigin:e})},[]);(0,h.useEffect)(()=>{if(!e)return;let t=new AbortController;return o(``),f(`/api/browser-connection`,void 0,t.signal).then(e=>{t.signal.aborted||n(e)}).catch(e=>{t.signal.aborted||o(e instanceof Error?e.message:`Could not load device access.`)}),()=>t.abort()},[e,m]),(0,h.useEffect)(()=>()=>b.current?.abort(),[]),(0,h.useEffect)(()=>{if(!r)return;let e=setInterval(()=>y(Date.now()),1e3);return()=>clearInterval(e)},[r]);async function C(){if(l)return;let e=new AbortController;b.current=e,u(!0),c(``),p(!1),i(void 0);try{let t=await f(`/api/browser-connection`,{},e.signal);e.signal.aborted||(y(Date.now()),i(t))}catch(t){e.signal.aborted||c(t instanceof Error?t.message:`Could not generate a connection link.`)}finally{e.signal.aborted||u(!1)}}async function w(){if(!(!r||Date.now()>=r.expiresAt)){c(``);try{await navigator.clipboard.writeText(r.url),p(!0)}catch{x.current?.focus(),x.current?.select(),c(`Could not copy automatically. Copy the selected link.`)}}}let T=r&&v>=r.expiresAt;return(0,g.jsxs)(`section`,{className:`device-settings`,"aria-labelledby":`device-settings-title`,children:[(0,g.jsx)(`h2`,{id:`device-settings-title`,children:`Connect another device`}),(0,g.jsx)(`p`,{children:`Connect the other device to your Tailscale network, then scan a QR code or open a link.`}),!e&&(0,g.jsx)(`p`,{role:`status`,children:`Reconnect to Presubmit to generate a connection link.`}),e&&!t&&!a&&(0,g.jsx)(`p`,{role:`status`,children:`Loading device access…`}),a&&(0,g.jsxs)(`div`,{role:`alert`,children:[(0,g.jsx)(`p`,{children:a}),(0,g.jsx)(`button`,{type:`button`,onClick:()=>_(e=>e+1),disabled:!e,children:`Retry`})]}),t?.tailscaleOrigin===null&&(0,g.jsx)(`div`,{className:`device-settings-setup`,children:(0,g.jsx)(`p`,{children:`Start Serve below to connect this computer. Presubmit will find and save its Tailscale address automatically. Tailscale must be installed and signed in on this computer.`})}),t?.tailscaleOrigin&&(0,g.jsxs)(`div`,{className:`device-settings-host`,children:[(0,g.jsx)(`span`,{children:`Host address`}),(0,g.jsx)(`code`,{children:t.tailscaleOrigin})]}),t&&(0,g.jsx)(Ee,{connected:e,onOrigin:S}),t?.tailscaleOrigin&&(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(`button`,{type:`button`,onClick:()=>void C(),disabled:!e||l||!!a,children:l?`Generating…`:r?`Generate new link`:`Generate connection link`}),l&&(0,g.jsx)(`p`,{role:`status`,children:`Generating connection link…`}),r&&!T&&(0,g.jsxs)(`div`,{className:`device-settings-link`,children:[(0,g.jsx)(Te,{value:r.url,size:256,level:`M`,marginSize:4,bgColor:`#ffffff`,fgColor:`#000000`,role:`img`,"aria-label":`Connection QR code`}),(0,g.jsxs)(`div`,{className:`device-settings-link-details`,children:[(0,g.jsx)(`h3`,{children:`Scan with your other device`}),(0,g.jsxs)(`p`,{role:`status`,children:[`Works once. Expires at`,` `,new Date(r.expiresAt).toLocaleTimeString([],{hour:`numeric`,minute:`2-digit`}),` `,`(10 minutes after generation).`]}),(0,g.jsx)(`label`,{htmlFor:`device-connection-link`,children:`Connection link`}),(0,g.jsx)(`input`,{id:`device-connection-link`,ref:x,readOnly:!0,value:r.url,spellCheck:!1,onFocus:e=>e.currentTarget.select()}),(0,g.jsx)(`button`,{type:`button`,onClick:()=>void w(),children:d?`Copied`:`Copy link`})]})]}),T&&(0,g.jsx)(`p`,{role:`status`,children:`This link has expired. Generate a new link to connect.`}),(0,g.jsx)(`p`,{className:`device-settings-access-note`,children:`Anyone with this link on your tailnet can access all hosted projects. Share it only with a device you trust. If the link was already used, generate a new one.`})]}),s&&(0,g.jsx)(`p`,{role:`alert`,children:s})]})}var $=[{id:`agents`,title:`Agents`,group:`Workspace`,description:`Create, revise and explicitly test reusable project-local agents.`,keywords:`builder definitions revisions capabilities reviewer summary`,icon:`folder`},{id:`appearance`,title:`Appearance`,group:`Personal`,description:`Make this workspace feel like yours.`,keywords:`theme color light dark system`,icon:`computer`},{id:`execution`,title:`Execution`,group:`Workspace`,description:`Configure tool execution and automatic shell command evaluation.`,keywords:`parallel file reads tools child sessions concurrency shell safety permissions approval model reasoning policy prompt auto evaluator jev routing traces show hide logs`,icon:`shield`},{id:`search`,title:`Search`,group:`Workspace`,description:`Find past work with local conversation search.`,keywords:`semantic index ollama embeddings retrieval history`,icon:`folder`},{id:`devices`,title:`Devices`,group:`Account`,description:`Connect another device to this Presubmit host.`,keywords:`tailscale remote phone tablet qr code token access link sharing`,icon:`computer`},{id:`connection`,title:`Connection`,group:`Account`,description:`Connect model providers, then choose a model for each session.`,keywords:`openai typesafe jev session routing classifier api key sign in chatgpt account subscription local mlx ollama model endpoint`,icon:`arrow-up-right`}];function Oe(){let e=location.hash.slice(1);return $.find(t=>t.id===e)?.id??`appearance`}function ke({connected:e,running:t,auth:n}){let[r,i]=(0,h.useState)(Oe),[a,c]=(0,h.useState)(``),[l,d]=(0,h.useState)(r===`agents`);(0,h.useEffect)(()=>{r===`agents`&&d(!0)},[r]),(0,h.useEffect)(()=>{let e=()=>i(Oe());return window.addEventListener(`hashchange`,e),window.addEventListener(`popstate`,e),()=>{window.removeEventListener(`hashchange`,e),window.removeEventListener(`popstate`,e)}},[]);let f=$.find(e=>e.id===r),p=$.filter(e=>`${e.title} ${e.keywords}`.toLowerCase().includes(a.trim().toLowerCase()));function m(e){i(e),history.pushState(null,``,`${location.pathname}${location.search}#${e}`),document.querySelector(`.settings-content`)?.scrollTo(0,0)}return(0,g.jsxs)(`main`,{className:`settings-page`,children:[(0,g.jsxs)(`aside`,{className:`settings-sidebar`,"aria-label":`Settings navigation`,children:[(0,g.jsxs)(`a`,{className:`settings-back`,href:u(`/`),children:[(0,g.jsx)(s,{name:`arrow-left`,size:16}),` Back to workspace`]}),(0,g.jsx)(`div`,{className:`settings-sidebar-heading`,children:`Settings`}),(0,g.jsx)(`input`,{className:`settings-filter`,type:`search`,"aria-label":`Search settings`,placeholder:`Search settings…`,value:a,onChange:e=>c(e.target.value)}),(0,g.jsxs)(`nav`,{"aria-label":`Settings categories`,children:[[`Personal`,`Workspace`,`Account`].map(e=>{let t=p.filter(t=>t.group===e);return t.length>0&&(0,g.jsxs)(`div`,{className:`settings-nav-group`,children:[(0,g.jsx)(`p`,{children:e}),t.map(e=>(0,g.jsxs)(`button`,{type:`button`,"aria-current":r===e.id?`page`:void 0,onClick:()=>m(e.id),children:[(0,g.jsx)(s,{name:e.icon,size:17}),` `,e.title]},e.id))]},e)}),p.length===0&&(0,g.jsx)(`p`,{className:`settings-empty`,role:`status`,children:`No matching settings.`})]}),(0,g.jsxs)(`div`,{className:`settings-sidebar-footer`,children:[`presubmit `,(0,g.jsx)(`span`,{children:`Your local workspace`})]})]}),(0,g.jsx)(`div`,{className:`settings-content`,children:(0,g.jsxs)(`div`,{className:`settings-content-inner`,children:[(0,g.jsxs)(`header`,{className:`settings-content-heading`,children:[(0,g.jsx)(`span`,{children:f.group}),(0,g.jsx)(`h1`,{children:f.title}),(0,g.jsx)(`p`,{children:f.description})]}),(0,g.jsx)(`div`,{hidden:r!==`appearance`,children:(0,g.jsx)(_,{})}),(0,g.jsxs)(`div`,{className:`execution-settings`,hidden:r!==`execution`,children:[(0,g.jsx)(j,{}),(0,g.jsx)(M,{connected:e}),(0,g.jsx)(A,{connected:e})]}),(0,g.jsx)(`div`,{hidden:r!==`agents`,children:l&&(0,g.jsx)(ae,{},o()??`main`)}),(0,g.jsx)(`div`,{hidden:r!==`search`,children:(0,g.jsx)(E,{connected:e},o()??`main`)}),(0,g.jsx)(`div`,{hidden:r!==`connection`,children:(0,g.jsx)(I,{active:r===`connection`,state:n,connected:e,running:t})}),r===`devices`&&(0,g.jsx)(De,{connected:e},o()??`main`)]})})]})}export{ke as SettingsPage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.search-settings{border:1px solid var(--border,#d5ddce);background:var(--surface,#fcfcf7);border-radius:10px;margin:24px 0;padding:24px}.search-settings h2{margin:0 0 12px;font-size:20px}.search-settings-description,.search-settings small,.search-settings-fields p{color:var(--muted,#6b786c);font-size:13px;line-height:1.5}.search-settings fieldset{border:0;min-width:0;margin:22px 0 0;padding:0}.search-settings .visually-hidden{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.search-settings-toggle{align-items:start;gap:10px;margin:16px 0;font-weight:600;display:flex}.search-settings-toggle input{flex-shrink:0;margin-top:3px}.search-settings small{margin-top:4px;font-weight:400;display:block}.search-settings-fields{gap:8px;margin-top:24px;display:grid}.search-settings-fields input{width:100%;min-width:0;margin-bottom:8px}.search-settings-fields p{margin:0}.search-settings-status{overflow-wrap:anywhere;margin:20px 0;font-size:13px}.search-settings-status.complete>strong{color:var(--success-text,#49743e)}.search-settings-status p,.search-settings-lock{color:var(--muted,#6b786c);font-size:13px;line-height:1.5}.search-settings-status p{margin:6px 0 0}.search-settings-status progress{width:100%;height:8px;accent-color:var(--success-solid,#5a8b52);margin-top:8px;display:block}.search-settings-actions{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.search-settings-actions span{color:var(--muted,#6b786c);font-size:13px}.ollama-setup{border-top:1px solid var(--border,#d5ddce);margin-top:24px;padding-top:20px;font-size:13px}.ollama-setup-heading{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:10px;display:flex}.ollama-setup h3{margin:0;font-size:15px}.ollama-setup p{color:var(--muted,#6b786c);margin:8px 0;line-height:1.5}.ollama-setup ol{margin:18px 0 0;padding:0;list-style:none}.ollama-setup li+li{margin-top:8px}.ollama-setup-step{align-items:start;gap:10px;padding:8px 0;line-height:1.5;display:flex}.ollama-setup summary{cursor:pointer;border-radius:4px;list-style:none}.ollama-setup summary::-webkit-details-marker{display:none}.ollama-setup summary:hover{background:var(--surface-hover,#edf0e7)}.ollama-setup summary:focus-visible{outline:2px solid var(--success-solid,#5a8b52);outline-offset:3px}.ollama-setup-step-icon{width:18px;height:20px;color:var(--muted,#6b786c);flex-shrink:0;justify-content:center;align-items:center;display:flex}.ollama-setup-step-icon.complete{color:var(--success-text,#49743e)}.ollama-setup-step-title{flex:1;min-width:0}.ollama-setup-step-status{color:var(--muted,#6b786c);margin-top:3px;font-size:12px;display:block}.ollama-setup-disclosure{height:20px;color:var(--muted,#6b786c);align-items:center;display:flex;transform:rotate(-90deg)}.ollama-setup details[open]>summary .ollama-setup-disclosure{transform:none}.ollama-setup-step-content{margin-left:28px;padding-bottom:8px}.ollama-setup-check{color:var(--muted,#6b786c);flex-wrap:wrap;align-items:center;gap:8px 12px;margin-top:12px;font-size:12px;display:flex}.ollama-setup-check button{min-width:104px;padding:5px 8px;font-size:12px}.ollama-setup-command{background:var(--surface-subtle,#f1f2eb);border-radius:6px;align-items:start;gap:10px;margin-top:8px;padding:10px;display:flex}.ollama-setup code{overflow-wrap:anywhere;white-space:pre-wrap;-webkit-user-select:text;user-select:text;flex:1;min-width:0;font-size:12px;line-height:1.5}.ollama-setup-command button{flex-shrink:0;padding:4px 8px;font-size:12px}@media (width<=600px){.ollama-setup-command{flex-direction:column;align-items:stretch}.ollama-setup-command button{align-self:flex-end}}.openai-settings-trigger{white-space:nowrap}.model-connections{gap:20px;display:grid}.model-connections>[aria-live=polite]:empty{display:none}.model-connection-heading{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.model-connections .model-connection-heading h2{margin:0}.model-connection-heading .openai-settings-note{margin:8px 0 0}.model-connection-status{background:var(--surface-hover);color:var(--text);border-radius:20px;flex-shrink:0;padding:4px 9px;font-size:11px;font-weight:600}.local-model-form{margin-top:20px}.local-model-catalog{max-height:200px;margin:4px 0;padding:0;font-size:13px;list-style:none;overflow:auto}.local-model-catalog li{overflow-wrap:anywhere;padding:8px 0}.local-model-catalog li+li{border-top:1px solid var(--border)}.openai-settings{border:1px solid var(--border,#d5ddce);background:var(--surface,#fcfcf7);width:min(560px,100vw - 32px);max-height:calc(100dvh - 48px);color:var(--text,#25352f);border-radius:14px;padding:26px;box-shadow:0 24px 90px #122d2933}.openai-settings::backdrop{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);background:#16261faa}.openai-settings-heading{justify-content:space-between;align-items:flex-start;gap:20px;display:flex}.openai-settings-heading h2{margin:0 0 12px;font-size:23px}.openai-settings-heading .eyebrow{margin-bottom:8px}.openai-settings-heading button{padding:6px 10px;font-size:21px;line-height:1}.openai-settings-note{color:var(--muted,#6b786c);margin:12px 0;font-size:12px}.openai-settings-choice{border-top:1px solid var(--border,#e0e3d9);padding:20px 0}.openai-settings-choice h3{margin-bottom:6px}.openai-settings-choice p{font-size:13px}.openai-settings-actions{flex-wrap:wrap;gap:8px;display:flex}.openai-settings-actions .primary{background:var(--accent-solid,#31543c);color:#fff}.openai-settings-actions .primary:hover:not(:disabled){background:var(--accent-solid,#42684b)}.openai-settings-form{gap:10px;display:grid}.openai-settings-form label{font-size:12px;font-weight:600}.openai-settings-form button{justify-self:start}.session-router-toggle{align-items:flex-start;gap:10px;display:flex}.session-router-toggle input{margin-top:3px}.session-router-toggle span{gap:4px;display:grid}.session-router-toggle small{color:var(--muted,#6b786c);font-weight:400;line-height:1.4}.openai-settings-warning{color:var(--danger-text,#8c4827);background:var(--warning-surface,#faf0e3);overflow-wrap:anywhere;border-radius:6px;padding:12px;font-size:13px}.openai-settings-connected{background:var(--surface-hover,#eaf1e4);border-radius:6px;gap:6px;margin:16px 0;padding:14px;display:grid}.openai-settings-connected span{overflow-wrap:anywhere;font-size:12px}.openai-settings-flow{border-top:1px solid var(--border,#e0e3d9);padding-top:20px}.openai-settings-flow form{margin:18px 0}.openai-device-code{align-items:center;gap:15px;margin:18px 0;display:flex}.openai-device-code code{letter-spacing:2px;font-size:24px}.openai-login-link{width:fit-content;color:var(--text,#31543c);margin-bottom:18px;font-weight:600;display:block}.openai-disconnect{color:var(--danger-text,#8c4827)}.openai-settings-footer{border-top:1px solid var(--border,#e0e3d9);color:var(--muted,#6b786c);margin:20px 0 0;padding-top:16px;font-size:11px}@media (width<=740px){.topbar:has(.openai-settings-trigger){flex-wrap:wrap;gap:12px;height:auto;min-height:66px;padding:12px 0}.openai-settings{padding:20px}}.shell-evaluator-settings fieldset{border:0;min-width:0;margin:22px 0 0;padding:0}.shell-evaluator-settings input,.shell-evaluator-settings textarea,.shell-evaluator-settings select{width:100%;min-width:0}.shell-evaluator-prompt-heading{justify-content:space-between;align-items:center;gap:10px;margin-top:8px;display:flex}.shell-evaluator-prompt-heading button{color:var(--muted);background:0 0;border-color:#0000;padding:4px 8px}.shell-evaluator-settings .openai-settings-note{line-height:1.5}.settings-shell{height:100dvh;overflow:hidden}.settings-shell .dashboard-main{height:100%;min-height:0;padding:0;overflow:hidden}.settings-shell .dashboard-header{display:none}.settings-shell .settings-page{flex:1;grid-template-columns:240px minmax(0,1fr);width:100%;min-height:0;margin:0;padding:0;display:grid;overflow:hidden}.settings-sidebar{background:var(--sidebar);border-right:1px solid var(--border);flex-direction:column;gap:24px;min-height:0;padding:24px 14px 20px;display:flex;overflow-y:auto}.settings-back{color:var(--muted);align-items:center;gap:9px;padding:8px;font-size:13px;text-decoration:none;display:flex}.settings-back:hover{color:var(--text)}.settings-sidebar-heading{letter-spacing:-.5px;padding:0 10px;font-size:21px;font-weight:600}.settings-filter{background:var(--surface);border:1px solid var(--border);border-radius:8px;width:100%;min-width:0;padding:9px 11px;font-size:13px}.settings-nav-group+.settings-nav-group{margin-top:24px}.settings-nav-group>p{color:var(--muted);margin:0 0 8px;padding:0 10px;font-size:11px;font-weight:600}.settings-nav-group button{width:100%;color:var(--muted);text-align:left;background:0 0;border:0;border-radius:7px;align-items:center;gap:10px;margin:2px 0;padding:10px 12px;font-size:13px;font-weight:500;display:flex}.settings-nav-group button:hover,.settings-nav-group button[aria-current]{background:var(--surface-hover,var(--surface));color:var(--text)}.settings-sidebar-footer{color:var(--muted);margin-top:auto;padding:24px 10px 0;font-size:12px}.settings-sidebar-footer span{opacity:.8;margin-top:5px;font-size:11px;display:block}.settings-empty{color:var(--muted);padding:0 10px;font-size:13px}.settings-content{min-width:0;padding:64px clamp(24px,6vw,100px) 80px;overflow-y:auto}.settings-content-inner{max-width:820px;margin:0 auto}.settings-content-heading{margin-bottom:36px}.settings-content-heading>span{color:var(--muted);font-size:11px;font-weight:600}.settings-content-heading h1{letter-spacing:-.7px;margin:8px 0 12px;font-size:28px;font-weight:500}.settings-content-heading>p{color:var(--muted);margin:0;font-size:13px;line-height:1.6}.settings-content [hidden]{display:none}.settings-content .appearance-settings,.settings-content .search-settings,.settings-content .openai-settings,.settings-content .delegated-execution-settings{width:100%;box-shadow:none;border-radius:12px;max-height:none;margin:0;padding:24px}.settings-content h2,.settings-content .openai-settings-heading h2{margin:0 0 20px;font-size:15px;font-weight:600}.settings-content .appearance-setting{border-top:1px solid var(--border);padding-top:20px;font-size:13px}.settings-content .appearance-setting label{font-weight:500}.settings-content .appearance-setting p{font-size:12px}.settings-content .appearance-setting select{border-radius:7px}.settings-content .openai-settings-note{line-height:1.6}.execution-settings{gap:20px;display:grid}.evaluator-trace-setting{align-items:center;gap:20px;font-size:13px;display:flex}.evaluator-trace-setting>div{flex:1;min-width:0}.evaluator-trace-setting label{font-weight:500}.evaluator-trace-setting p{color:var(--muted);margin:8px 0 0;font-size:12px;line-height:1.6}.evaluator-trace-setting input{width:18px;height:18px;accent-color:var(--accent-solid);flex:none}.delegated-execution-settings{border:1px solid var(--border);background:var(--surface)}.tool-execution-toggle{justify-content:space-between;align-items:center;gap:20px;font-size:13px;font-weight:500;display:flex}.tool-execution-toggle input{width:18px;height:18px;accent-color:var(--accent-solid)}.delegated-execution-settings>p,.delegated-execution-settings>small{color:var(--muted);font-size:12px;line-height:1.6}.delegated-execution-control{border-top:1px solid var(--border);align-items:center;gap:12px;margin:20px 0 10px;padding-top:20px;font-size:13px;display:flex}.delegated-execution-control label{flex:1;font-weight:500}.delegated-execution-control input{width:76px;padding:7px 8px}.delegated-execution-control button{padding:7px 12px}.settings-content .search-settings-toggle{border-bottom:1px solid var(--border);margin:0;padding:16px 0;font-size:13px}.settings-content :is(input,textarea,select){max-width:100%}.settings-content :is(button,a,input,select,textarea):focus-visible,.settings-sidebar :is(button,a,input):focus-visible{outline:2px solid var(--accent-solid);outline-offset:3px}@media (width<=700px){.settings-shell .settings-page{grid-template-rows:auto minmax(0,1fr);grid-template-columns:minmax(0,1fr)}.settings-sidebar{border-right:0;border-bottom:1px solid var(--border);gap:12px;max-height:45dvh;padding:12px 16px}.settings-sidebar-heading,.settings-sidebar-footer,.settings-nav-group>p{display:none}.settings-sidebar nav{flex-wrap:wrap;gap:6px;display:flex}.settings-nav-group{display:contents}.settings-nav-group button{width:auto;padding:9px 10px;font-size:12px}.settings-content{padding:28px 16px 48px}.settings-content-heading{margin-bottom:24px}.settings-content .appearance-settings,.settings-content .search-settings,.settings-content .openai-settings,.settings-content .delegated-execution-settings{padding:20px}}.agents-management{gap:16px;display:grid}.agents-management label{gap:6px;margin:10px 0;display:grid}.agents-management label:has(input[type=checkbox]){align-items:center;display:flex}.agents-management input:not([type=checkbox]),.agents-management textarea,.agents-management select{box-sizing:border-box;background:var(--surface);width:100%;color:var(--text);border:1px solid var(--border);font:inherit;border-radius:6px;padding:9px}.agents-management fieldset{border:1px solid var(--border);border-radius:8px;min-width:0;padding:16px}.agents-management pre{white-space:pre-wrap;overflow-wrap:anywhere;max-height:400px;overflow:auto}.agents-actions{flex-wrap:wrap;gap:8px;display:flex}.agents-management button{margin:4px}.agents-management [role=alert]{color:var(--danger,#b42318)}.device-settings{border:1px solid var(--border);background:var(--surface);border-radius:12px;min-width:0;padding:24px;font-size:13px;line-height:1.6}.device-settings p{color:var(--muted)}.device-settings h3{margin:0 0 8px;font-size:13px;font-weight:600}.device-settings button{padding:8px 12px;font-size:13px}.device-settings-host{gap:6px;margin-top:24px;display:grid}.device-settings-host span,.device-settings-link label{font-size:12px;font-weight:500}.device-settings code{overflow-wrap:anywhere}.device-settings-link{border-top:1px solid var(--border);flex-wrap:wrap;align-items:center;gap:24px;margin-top:24px;padding-top:24px;display:flex}.device-settings-link>svg{border-radius:8px;flex:none;width:256px;max-width:100%;height:auto}.device-settings-link-details{flex:220px;min-width:0}.device-settings-link input{width:100%;margin:6px 0 10px;padding:9px;font-size:12px}.device-settings-access-note{margin:24px 0 0;font-size:12px}.device-settings-setup{margin-top:24px}.device-settings [role=alert]{color:var(--danger,var(--text))}.device-serve{border-block:1px solid var(--border);margin:24px 0;padding:20px 0}.device-serve>button{margin:0 8px 8px 0}.device-serve-auto{align-items:center;gap:10px;margin-top:16px;font-weight:500;display:flex}.device-serve-auto input{width:16px;height:16px;accent-color:var(--accent-solid);flex:none}.device-serve-note{margin-bottom:0;font-size:12px}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.xterm{cursor:text;-webkit-user-select:none;user-select:none;position:relative}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;inset:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{z-index:10;color:#0000;pointer-events:none;position:absolute;inset:0}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:#0000}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre;font-family:monospace}.xterm .xterm-accessibility-tree>div{transform-origin:0;width:fit-content}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:underline double;text-decoration:underline double}.xterm-underline-3{-webkit-text-decoration:underline wavy;text-decoration:underline wavy}.xterm-underline-4{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xterm-underline-5{-webkit-text-decoration:underline dashed;text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;z-index:11;background:0 0;transition:opacity .1s linear}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{display:none;position:absolute}.xterm .xterm-scrollable-element>.shadow.top{width:100%;height:3px;box-shadow:var(--vscode-scrollbar-shadow,#000) 0 6px 6px -6px inset;display:block;top:0;left:3px}.xterm .xterm-scrollable-element>.shadow.left{width:3px;height:100%;box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset;display:block;top:3px;left:0}.xterm .xterm-scrollable-element>.shadow.top-left-corner{width:3px;height:3px;display:block;top:0;left:0}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset}.terminal-panel{color:#eee;background:#181818;flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.terminal-toolbar{border-bottom:1px solid var(--border,#333);background:var(--sidebar,#202020);min-width:0;min-height:41px;color:var(--text,#eee);flex-shrink:0;align-items:center;gap:4px;padding:4px 6px 0;display:flex}.terminal-connection-status{text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:100px;color:var(--muted,#aaa);margin-bottom:4px;font-size:11px;overflow:hidden}.terminal-toolbar .terminal-lifecycle{background:var(--surface-hover,#292929);color:inherit;border:0;flex-shrink:0;margin-bottom:4px;padding:4px 7px;font-size:11px}.terminal-viewport{flex:1;min-height:0;padding:10px;overflow:hidden}.terminal-host{height:100%;min-height:0}.terminal-host .xterm{height:100%}.terminal-caption{color:#aaa;border-top:1px solid #333;padding:8px 10px;font-size:10px}.terminal-error{color:#f0aa98;padding:8px 10px;font-size:12px}.terminal-notice{border-top:1px solid var(--border,#333);background:#181818;flex-shrink:0;align-items:flex-start;gap:8px;min-width:0;max-height:40%;margin:0;display:flex;overflow:auto}.terminal-notice>span{overflow-wrap:anywhere;flex:1;min-width:0}.terminal-notice>button{width:24px;height:24px;color:inherit;background:0 0;border:0;flex-shrink:0;place-items:center;padding:0;font-size:16px;display:grid}.terminal-notice>button:hover:not(:disabled){background:#292929}.terminal-host .xterm-viewport{background-color:#181818!important}.terminal-workspace{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.terminal-tabs{scrollbar-width:none;flex:0 auto;align-self:stretch;gap:2px;min-width:0;margin-bottom:-1px;display:flex;position:relative;overflow-x:auto}.terminal-tabs::-webkit-scrollbar{display:none}.terminal-tab{border-bottom:2px solid #0000;border-radius:4px 4px 0 0;flex-shrink:0;align-items:center;display:flex}.terminal-tab[data-selected=true]{border-bottom-color:var(--accent,#aaa)}.terminal-tab[data-selected=true],.terminal-tab:hover,.terminal-tab:focus-within{background:var(--surface-hover,#292929)}.terminal-tabs [role=tab]{max-width:160px;min-height:30px;color:var(--muted,#aaa);white-space:nowrap;background:0 0;border:0;border-radius:4px 0 0;flex-shrink:0;align-items:center;gap:6px;padding:5px 8px;font-size:12px;display:flex}.terminal-tabs [aria-selected=true]{color:var(--text,#eee)}.terminal-toolbar .terminal-tab-close{width:24px;height:26px;color:var(--muted,#aaa);background:0 0;border:0;flex-shrink:0;place-items:center;margin-right:3px;padding:0;font-size:16px;display:grid}.terminal-empty{color:#aaa;padding:16px;font-size:12px}.terminal-tab button:hover:not(:disabled){color:var(--text,#eee);background:0 0}.terminal-tabs [role=tab]:focus-visible{outline-offset:-2px}.terminal-tab-title{text-overflow:ellipsis;overflow:hidden}.terminal-tab-status{background:var(--muted,#aaa);border-radius:50%;flex-shrink:0;width:5px;height:5px}.terminal-tab-status[data-status=running]{background:#6eae7c}.terminal-toolbar .terminal-header-icon{width:28px;height:28px;color:var(--muted,#7b8475);background:0 0;border:0;border-radius:5px;flex-shrink:0;place-items:center;margin-bottom:4px;padding:0;line-height:1;text-decoration:none;display:grid}.terminal-header-icon svg{display:block}.terminal-toolbar>.terminal-actions{margin-bottom:4px;margin-left:auto}.terminal-toolbar .terminal-header-icon:hover:not(:disabled),.terminal-toolbar .terminal-lifecycle:hover:not(:disabled){background:var(--surface-hover,#e8efdf);color:var(--text,#354137)}
|