1import{c as z,i as _e,k as Le,t as Ue,d as Me,u as De,r as x,w as D,l as ee,h as C,j as e,E as _,P as Be,T as Fe,L as Je,f as B,F as V,D as ye,M as se,H as Ve,I as d}from"./index-DkJrtGN6.js";import{u as Ke,R as ze}from"./run-table-CQb8ptc4.js";import{u as $e}from"./useProjectData-CSkE8LFe.js";import{d as Qe,b as te,g as Ne}from"./format-CBwqyYh8.js";import{S as Se}from"./search-owUPMMwo.js";import{P as We}from"./plus-BRqjFKu_.js";/** 2 * @license lucide-react v0.468.0 - ISC 3 * 4 * This source code is licensed under the ISC license. 5 * See the LICENSE file in the root directory of this source tree. 6 */const Ge=z("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** 7 * @license lucide-react v0.468.0 - ISC 8 * 9 * This source code is licensed under the ISC license. 10 * See the LICENSE file in the root directory of this source tree. 11 */const Xe=z("CircleHelp",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** 12 * @license lucide-react v0.468.0 - ISC 13 * 14 * This source code is licensed under the ISC license. 15 * See the LICENSE file in the root directory of this source tree. 16 */const Ye=z("CircleX",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]]);/** 17 * @license lucide-react v0.468.0 - ISC 18 * 19 * This source code is licensed under the ISC license. 20 * See the LICENSE file in the root directory of this source tree. 21 */const Ze=z("Play",[["polygon",{points:"6 3 20 12 6 21 6 3",key:"1oa8hb"}]]),et=[{value:"overview",label:"Overview"},{value:"targets",label:"Targets"}],F=[{id:"basics",label:"Basics",title:"Basic Information",description:"This is the reusable connection profile people will launch scans against."},{id:"auth",label:"Auth",title:"Choose one authentication strategy",description:"Pick the auth style the upstream API expects. Only the fields for that auth type will appear."},{id:"request",label:"Request",title:"Define the HTTP request shell",description:"Choose the HTTP method and any fixed headers that should always go out with each call."},{id:"template",label:"Template",title:"Set the request template",description:"This is the JSON body sent to the target."},{id:"response",label:"Response",title:"Tell the runner where the model output text lives",description:"A Reference to the JSON element for the output."},{id:"advanced",label:"Advanced",title:"Tune limits and retry behavior",description:"These defaults are usually fine, but this page lets you tighten or relax them for one target."}],tt=[{value:"NONE",label:"No auth",description:"Send only the headers you define in this target."},{value:"BEARER_TOKEN_HEADER",label:"Bearer token",description:"Adds a bearer token header, usually Authorization: Bearer <token>."},{value:"STATIC_HEADER",label:"Static header",description:"Sends one fixed header name and value with every request."},{value:"BASIC_AUTH",label:"Basic auth",description:"Sends username and password as an HTTP Basic Authorization header."},{value:"AWS_SIGV4",label:"AWS SigV4",description:"Signs each request with AWS Signature Version 4 credentials."},{value:"OAUTH2_CLIENT_CREDENTIALS",label:"OAuth2",description:"Fetches a client credentials access token and sends it as a bearer token."}],st={NONE:"No auth",BEARER_TOKEN_HEADER:"Bearer token",STATIC_HEADER:"Static header",BASIC_AUTH:"Basic auth",AWS_SIGV4:"AWS SigV4",OAUTH2_CLIENT_CREDENTIALS:"OAuth2"},ve=[{value:"client_secret_basic",label:"Client secret basic",description:"Sends client ID and client secret in the Authorization header."},{value:"client_secret_post",label:"Client secret post",description:"Sends client ID and client secret in the form body."}],at=[{value:"POST",label:"POST",description:"Standard choice for chat and completion APIs."},{value:"PUT",label:"PUT",description:"Use when the upstream endpoint replaces the request resource."},{value:"PATCH",label:"PATCH",description:"Use when the upstream endpoint expects partial updates."}],f={name:"",endpointUrl:"",httpMethod:"POST",authType:"NONE",headers:JSON.stringify({"Content-Type":"application/json"},null,2),requestTemplateJson:JSON.stringify({model:"replace-if-needed",messages:[{role:"system",content:"{{SYSTEM}}"},{role:"user",content:"{{PROMPT}}"}],history:"{{HISTORY}}"},null,2),responseExtractPath:"choices.0.message.content",promptPlaceholder:"{{PROMPT}}",historyPlaceholder:"{{HISTORY}}",systemPlaceholder:"{{SYSTEM}}",timeoutMs:"30000",maxRetries:"2",rateLimitPerMinute:""},rt=/^\$?(?:\.[A-Za-z0-9_-]+|\[[0-9]+\]|[A-Za-z0-9_-]+)(?:\.[A-Za-z0-9_-]+|\[[0-9]+\])*$/,nt={POST:JSON.stringify({"Content-Type":"application/json"},null,2),PUT:JSON.stringify({"Content-Type":"application/json"},null,2),PATCH:JSON.stringify({"Content-Type":"application/json"},null,2)};function Te(t,s){try{return JSON.stringify(t??JSON.parse(s),null,2)}catch{return s}}function it(t){return t==="PUT"||t==="PATCH"?t:"POST"}function Ce(t){return nt[t]}function lt(t){return t.validationStatus==="PASSED"?{label:"Validated",className:"target-validation-indicator-passed",Icon:Ge}:t.validationStatus==="FAILED"?{label:t.validationErrorCode?`Validation failed: ${t.validationErrorCode}`:"Validation failed",className:"target-validation-indicator-failed",Icon:Ye}:{label:"Not validated yet",className:"target-validation-indicator-unknown",Icon:Xe}}function Ae(t){const s=it(t==null?void 0:t.httpMethod),i=!t;return{name:(t==null?void 0:t.name)||f.name,endpointUrl:(t==null?void 0:t.endpointUrl)||f.endpointUrl,authType:(t==null?void 0:t.authType)||f.authType,bearerToken:"",bearerHeaderName:"",staticHeaderName:i?"x-api-key":"",staticHeaderValue:"",basicUsername:"",basicPassword:"",awsAccessKeyId:"",awsSecretAccessKey:"",awsSessionToken:"",awsRegion:i?"us-east-1":"",awsService:i?"bedrock-runtime":"",oauthTokenUrl:"",oauthClientId:"",oauthClientSecret:"",oauthScope:"",oauthAudience:"",oauthClientAuthMethod:i?"client_secret_basic":"",httpMethod:s,headers:t?Te(t.headers||{},f.headers):Ce(s),secretHeaders:"",requestTemplateJson:t!=null&&t.requestTemplateJson?Te(t.requestTemplateJson,f.requestTemplateJson):f.requestTemplateJson,responseExtractPath:(t==null?void 0:t.responseExtractPath)||f.responseExtractPath,timeoutMs:t!=null&&t.timeoutMs?String(t.timeoutMs):f.timeoutMs,maxRetries:(t==null?void 0:t.maxRetries)!==void 0?String(t.maxRetries):f.maxRetries,rateLimitPerMinute:t!=null&&t.rateLimitPerMinute?String(t.rateLimitPerMinute):f.rateLimitPerMinute}}function ot(t){return st[t]}function ct({sourceIps:t,destinationPorts:s}){return e.jsxs("div",{className:"target-prerequisites-card",children:[e.jsx("div",{className:"target-prerequisites-header",children:e.jsx("span",{className:"eyebrow",children:"Target prerequisites"})}),e.jsxs("div",{className:"target-prerequisites-list",children:[e.jsxs("article",{className:"target-prerequisites-item",children:[e.jsxs("div",{className:"target-prerequisites-item-copy",children:[e.jsx("strong",{children:"Source IP allowlist"}),e.jsx("p",{children:"Allow requests from the Austa backend or worker host."})]}),e.jsx("div",{className:"target-prerequisites-item-value",children:t.length?e.jsx("div",{className:"target-prerequisites-chip-grid",children:t.map(i=>e.jsx("code",{className:"target-prerequisites-chip",children:i},i))}):e.jsxs("span",{children:["Configure ",e.jsx("code",{children:"TARGET_EGRESS_SOURCE_IPS"})," to show the exact public IPs here."]})})]}),e.jsxs("article",{className:"target-prerequisites-item",children:[e.jsxs("div",{className:"target-prerequisites-item-copy",children:[e.jsx("strong",{children:"Destination ports"}),e.jsx("p",{children:"Allow the port your endpoint listens on, usually 443 for HTTPS APIs."})]}),e.jsx("div",{className:"target-prerequisites-item-value",children:s.length?e.jsx("div",{className:"target-prerequisites-chip-grid",children:s.map(i=>e.jsx("code",{className:"target-prerequisites-chip",children:i},i))}):e.jsxs("span",{children:["Configure ",e.jsx("code",{children:"TARGET_EGRESS_SOURCE_PORTS"})," to show the expected ports here."]})})]}),e.jsxs("article",{className:"target-prerequisites-item",children:[e.jsxs("div",{className:"target-prerequisites-item-copy",children:[e.jsx("strong",{children:"Response mode"}),e.jsx("p",{children:"Return one complete JSON response per request."})]}),e.jsx("div",{className:"target-prerequisites-item-value",children:e.jsx("span",{children:"No streaming, SSE, or token-by-token chunking."})})]})]})]})}function Ee(t){try{return new URL(t),!0}catch{return!1}}const dt=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/,ut=new Set(["host","content-length","transfer-encoding","connection","keep-alive","te","trailer","upgrade","expect","proxy-authorization","proxy-authenticate","forwarded","via"]);function ht(t){const s=t.trim();return t===s&&dt.test(t)}function mt(t){const s=t.trim().toLowerCase();return s.length>0&&(ut.has(s)||s.startsWith("x-forwarded-"))}function K(t){return ht(t)?mt(t)?`Header "${t}" cannot be configured for target requests.`:null:`Header "${t}" must be a valid HTTP header name.`}function ae(t,s){let i;try{i=JSON.parse(t)}catch{throw new Error(`${s} must be valid JSON.`)}
21if(!i||typeof i!="object"||Array.isArray(i))throw new Error(`${s} must be a JSON object.`);return i}function re(t,s){const i=ae(t,s);for(const[o,j]of Object.entries(i))if(typeof j!="string")throw new Error(`${s} values must all be strings. "${o}" is not a string.`);return i}function we(t,s){return t.trim()?re(t,s):{}}function pt(t){switch(t.authType){case"BEARER_TOKEN_HEADER":return{...t.bearerToken.trim()?{token:t.bearerToken.trim()}:{},...t.bearerHeaderName.trim()?{headerName:t.bearerHeaderName.trim()}:{}};case"STATIC_HEADER":return{...t.staticHeaderName.trim()?{headerName:t.staticHeaderName.trim()}:{},...t.staticHeaderValue.trim()?{value:t.staticHeaderValue.trim()}:{}};case"BASIC_AUTH":return{...t.basicUsername.trim()?{username:t.basicUsername.trim()}:{},...t.basicPassword.trim()?{password:t.basicPassword.trim()}:{}};case"AWS_SIGV4":return{...t.awsAccessKeyId.trim()?{accessKeyId:t.awsAccessKeyId.trim()}:{},...t.awsSecretAccessKey.trim()?{secretAccessKey:t.awsSecretAccessKey.trim()}:{},...t.awsSessionToken.trim()?{sessionToken:t.awsSessionToken.trim()}:{},...t.awsRegion.trim()?{region:t.awsRegion.trim()}:{},...t.awsService.trim()?{service:t.awsService.trim()}:{}};case"OAUTH2_CLIENT_CREDENTIALS":return{...t.oauthTokenUrl.trim()?{tokenUrl:t.oauthTokenUrl.trim()}:{},...t.oauthClientId.trim()?{clientId:t.oauthClientId.trim()}:{},...t.oauthClientSecret.trim()?{clientSecret:t.oauthClientSecret.trim()}:{},...t.oauthScope.trim()?{scope:t.oauthScope.trim()}:{},...t.oauthAudience.trim()?{audience:t.oauthAudience.trim()}:{},...t.oauthClientAuthMethod?{clientAuthMethod:t.oauthClientAuthMethod}:{}};case"NONE":default:return{}}}function ke(t,s){return!!(t&&t.authType===s&&s!=="NONE")}function Re(t,s,i){if(t===0)return s.name.trim()?s.endpointUrl.trim()?Ee(s.endpointUrl.trim())?null:"Endpoint URL must be a valid URL.":"Endpoint URL is required.":"Name is required.";if(t===1){const o=ke(i,s.authType);if(s.authType==="BEARER_TOKEN_HEADER"&&!s.bearerToken.trim()&&!o)return"Enter a bearer token for this target.";if(s.authType==="BEARER_TOKEN_HEADER"&&/\s/.test(s.bearerToken.trim()))return"Bearer token must not contain whitespace.";if(s.authType==="BEARER_TOKEN_HEADER"&&s.bearerHeaderName.trim()){const j=K(s.bearerHeaderName.trim());if(j)return j}if(s.authType==="STATIC_HEADER"&&(!s.staticHeaderName.trim()||!s.staticHeaderValue.trim())&&!o)return"Static header auth requires a header name and value.";if(s.authType==="STATIC_HEADER"&&s.staticHeaderName.trim()){const j=K(s.staticHeaderName.trim());if(j)return j}if(s.authType==="BASIC_AUTH"){if(o){if(!s.basicUsername.trim()&&!s.basicPassword.trim())return null}else if(!s.basicUsername.trim()||!s.basicPassword.trim())return"Basic auth requires both a username and password.";if(s.basicUsername.trim().includes(":"))return"Basic auth username must not contain ':'.";if(/[\u0000-\u001F\u007F]/.test(s.basicUsername)||/[\u0000-\u001F\u007F]/.test(s.basicPassword))return"Basic auth username and password must not contain control characters."}if(s.authType==="AWS_SIGV4"&&!o&&(!s.awsAccessKeyId.trim()||!s.awsSecretAccessKey.trim()||!s.awsRegion.trim()))return"AWS SigV4 requires an access key ID, secret access key, and region.";if(s.authType==="OAUTH2_CLIENT_CREDENTIALS"){if(!o&&(!s.oauthTokenUrl.trim()||!s.oauthClientId.trim()||!s.oauthClientSecret.trim()))return"OAuth2 requires a token URL, client ID, and client secret.";if(s.oauthTokenUrl.trim()&&!Ee(s.oauthTokenUrl.trim()))return"OAuth token URL must be a valid URL."}return null}if(t===2)try{const o=re(s.headers,"Headers JSON"),j=we(s.secretHeaders,"Secret headers JSON");for(const T of Object.keys(o)){const p=K(T);if(p)return p}for(const T of Object.keys(j)){const p=K(T);if(p)return p}return null}catch(o){return o instanceof Error?o.message:"Header JSON is invali
21d."}if(t===3)try{const o=ae(s.requestTemplateJson,"Request template JSON");return JSON.stringify(o).includes(f.promptPlaceholder)?null:`Request template JSON must include ${f.promptPlaceholder}.`}catch(o){return o instanceof Error?o.message:"Request template JSON is invalid."}if(t===4)return s.responseExtractPath.trim()?rt.test(s.responseExtractPath.trim())?null:`EX: 22 choices.0.message.content 23 $.choices[0].message.content.`:"Response path is required.";if(!Number.isInteger(Number(s.timeoutMs))||Number(s.timeoutMs)<1e3||Number(s.timeoutMs)>12e4)return"Timeout must be an integer between 1000 and 120000 ms.";if(!Number.isInteger(Number(s.maxRetries))||Number(s.maxRetries)<0||Number(s.maxRetries)>10)return"Max retries must be an integer between 0 and 10.";if(s.rateLimitPerMinute.trim()){const o=Number(s.rateLimitPerMinute);if(!Number.isInteger(o)||o<=0)return"Rate limit per minute must be a positive integer when provided."}return null}function xt(t,s){for(let i=0;i<F.length;i+=1){const o=Re(i,t,s);if(o)return{stepIndex:i,message:o}}return null}function ft(t,s){const i=re(t.headers,"Headers JSON"),o=we(t.secretHeaders,"Secret headers JSON"),j=ae(t.requestTemplateJson,"Request template JSON");return{name:t.name.trim(),endpointUrl:t.endpointUrl.trim(),httpMethod:t.httpMethod,authType:t.authType,authConfig:pt(t),headers:i,secretHeaders:o,reuseStoredSecretHeaders:!!(s!=null&&s.hasSecretHeaders&&!t.secretHeaders.trim()),requestTemplateJson:j,promptInjectionMode:"TEMPLATE_PLACEHOLDER",promptPlaceholder:f.promptPlaceholder,historyPlaceholder:f.historyPlaceholder,systemPlaceholder:f.systemPlaceholder,responseExtractPath:t.responseExtractPath.trim(),timeoutMs:Number(t.timeoutMs),maxRetries:Number(t.maxRetries),rateLimitPerMinute:t.rateLimitPerMinute.trim()?Number(t.rateLimitPerMinute):null}}function gt({open:t,editingTarget:s,onClose:i,onResetError:o,onSave:j,isPending:T,errorMessage:p}){const[u,b]=x.useState(0),[l,O]=x.useState(()=>Ae(s)),[N,w]=x.useState(null),[I,J]=x.useState(()=>!!s);x.useEffect(()=>{t&&(b(0),O(Ae(s)),w(null),J(!!s),o())},[s==null?void 0:s.id,t]);const H=F[u],g=ke(s,l.authType);function c(n,r){O(k=>({...k,[n]:r})),N&&w(null),p&&o()}function A(n){J(!0),c("headers",n)}function L(n){O(r=>({...r,httpMethod:n,headers:I?r.headers:Ce(n)})),N&&w(null),p&&o()}function $(n){O(r=>{const k={...r,authType:n};return n==="STATIC_HEADER"&&!r.staticHeaderName.trim()&&(k.staticHeaderName="x-api-key"),n==="AWS_SIGV4"&&(r.awsRegion.trim()||(k.awsRegion="us-east-1"),r.awsService.trim()||(k.awsService="bedrock-runtime")),n==="OAUTH2_CLIENT_CREDENTIALS"&&!r.oauthClientAuthMethod&&(k.oauthClientAuthMethod="client_secret_basic"),k}),N&&w(null),p&&o()}function U(){const n=Re(u,l,s);if(n){w(n);return}b(r=>Math.min(r+1,F.length-1))}function M(){const n=xt(l,s);if(n){b(n.stepIndex),w(n.message);return}try{const r=ft(l,s);j({targetId:s==null?void 0:s.id,body:r})}catch(r){w(r instanceof Error?r.message:"Unable to save target.")}}function Q(){var n;return l.authType==="BEARER_TOKEN_HEADER"?e.jsxs("div",{className:"form-grid",children:[e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Bearer token",info:"Only the raw token is needed here. The runner adds the Bearer prefix automatically."}),e.jsx("input",{value:l.bearerToken,onChange:r=>c("bearerToken",r.target.value),placeholder:g?"Leave blank to keep the stored token":"sk-live-..."})]}),e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Header name",info:"Optional. Leave blank to use Authorization, which is the usual bearer token header."}),e.jsx("input",{value:l.bearerHeaderName,onChange:r=>c("bearerHeaderName",r.target.value),placeholder:"Authorization"})]})]}):l.authType==="STATIC_HEADER"?e.jsxs("div",{className:"form-grid",children:[e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Header name",info:"Exact header name to send with every request."}),e.jsx("input",{value:l.staticHeaderName,onChange:r=>c("staticHeaderName",r.target.value),placeholder:g?"Leave blank to keep the stored name":"x-api-key"})]}),e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Header value",info:"Full value to send in that header on every request."}),e.jsx("input",{value:l.staticHeaderValue,onChange:r=>c("staticHeaderValue",r.target.value),placeholder:g?"Leave blank to keep the stored value":"secret-key"})]})]}):l.authType==="BASIC_AUTH"?e.jsxs("div",{className:"form-grid",children:[e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Username",info:"Username portion of the Basic Authorization header."}),e.jsx("input",{value:l.basicUsername,onChange:r=>c("basicUsername",r.target.value),placeholder:g?"Leave blank to keep the stored username":"service-account"})]}),e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Password",info:"Password portion of the Basic Authorization header."}),e.jsx("input",{type:"password",value:l.basicPassword,onChange:r=>c("basicPassword",r.target.value),placeholder:g?"Leave blank to keep the stored password":"password"})]})]}):l.authType==="AWS_SIGV4"?e.jsxs("div",{className:"form-grid",children:[e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Access key ID",info:"AWS access key ID used to sign the request."}),e.jsx("input",{value:l.awsAccessKeyId,onChange:r=>c("awsAccessKeyId",r.target.value),placeholder:g?"Leave blank to keep the stored access key":"AKIA..."})]}),e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Secret access key",info:"AWS secret access key paired with the access key ID."}),e.jsx("input",{type:"password",value:l.awsSecretAccessKey,onChange:r=>c("awsSecretAccessKey",r.target.value),placeholder:g?"Leave blank to keep the stored secret":"Secret access key"})]}),e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Session token",info:"Optional. Required for temporary AWS credentials."}),e.jsx("input",{value:l.awsSessionToken,onChange:r=>c("awsSessionToken",r.target.value),placeholder:g?"Leave blank to keep the stored session token":"Optional session token"})]}),e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Region",info:"AWS region used in the credential scope, such as us-east-1."}),e.jsx("input",{value:l.awsRegion,onChange:r=>c("awsRegion",r.target.value),placeholder:"us-east-1"})]}),e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Service",info:"Optional. Defaults to bedrock-runtime. Change it only if the upstream AWS service name is different."}),e.jsx("input",{value:l.awsService,onChange:r=>c("awsService",r.target.value),placeholder:"bedrock-runtime"})]})]}):l.authType==="OAUTH2_CLIENT_CREDENTIALS"?e.jsxs("div",{className:"form-grid",children:[e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Token URL",info:"OAuth2 token endpoint for the client credentials flow."}),e.jsx("input",{value:l.oauthTokenUrl,onChange:r=>c("oauthTokenUrl",r.target.value),placeholder:g?"Leave blank to keep the stored token URL":"https://auth.example.com/oauth/token"})]}),e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Client ID",info:"OAuth2 client ID."}),e.jsx("input",{value:l.oauthClientId,onChange:r=>c("oauthClientId",r.target.value),placeholder:g?"Leave blank to keep the stored client ID":"client-id"})]}),e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Client secret",info:"OAuth2 client secret."}),e.jsx("input",{type:"password",value:l.oauthClientSecret,onChange:r=>c("oauthClientSecret",r.target.value),placeholder:g?"Leave blank to keep the stored client secret":"client-secret"})]}),e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Scope",info:"Optional. Space-delimited scopes to request."}
23),e.jsx("input",{value:l.oauthScope,onChange:r=>c("oauthScope",r.target.value),placeholder:"Optional scope"})]}),e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Audience",info:"Optional. Useful for providers like Auth0 that require an audience parameter."}),e.jsx("input",{value:l.oauthAudience,onChange:r=>c("oauthAudience",r.target.value),placeholder:"Optional audience"})]}),e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Client auth",info:"How the client credentials should be sent to the token endpoint."}),e.jsxs("select",{value:l.oauthClientAuthMethod,onChange:r=>c("oauthClientAuthMethod",r.target.value),children:[g&&!l.oauthClientAuthMethod?e.jsx("option",{value:"",children:"Keep stored setting"}):null,ve.map(r=>e.jsx("option",{value:r.value,children:r.label},r.value))]})]}),e.jsx("div",{className:"target-page-note",children:((n=ve.find(r=>r.value===l.oauthClientAuthMethod))==null?void 0:n.description)||"Choose how the client credentials are sent to the token endpoint."})]}):e.jsx("div",{className:"target-page-note",children:"No auth will be attached. Use this for public endpoints or providers that only need the headers you define yourself."})}function q(){return u===0?e.jsxs("div",{className:"form-grid",children:[e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Name",info:"The name for this target."}),e.jsx("input",{value:l.name,onChange:n=>c("name",n.target.value),placeholder:"Target Name"})]}),e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Endpoint URL",info:"Full URL the worker should call, such as https://api.example.com/v1/chat/completions."}),e.jsx("input",{value:l.endpointUrl,onChange:n=>c("endpointUrl",n.target.value),placeholder:"https://api.example.com/v1/chat/completions"})]})]}):u===1?e.jsxs("div",{className:"target-modal-page",children:[e.jsx("div",{className:"target-choice-grid",children:tt.map(n=>e.jsxs("button",{type:"button",className:`target-choice-card ${l.authType===n.value?"target-choice-card-active":""}`.trim(),onClick:()=>$(n.value),children:[e.jsx("strong",{children:n.label}),e.jsx("p",{children:n.description})]},n.value))}),g?e.jsx("div",{className:"target-page-note",children:"Stored auth settings are not returned to the browser. Leave these fields blank to keep what is already stored, or fill only the values you want to replace."}):null,Q()]}):u===2?e.jsxs("div",{className:"target-modal-page",children:[e.jsx("div",{className:"target-choice-grid target-choice-grid-compact",children:at.map(n=>e.jsxs("button",{type:"button",className:`target-choice-card ${l.httpMethod===n.value?"target-choice-card-active":""}`.trim(),onClick:()=>L(n.value),children:[e.jsx("strong",{children:n.label}),e.jsx("p",{children:n.description})]},n.value))}),e.jsxs("label",{className:"field field-code",children:[e.jsx(d,{label:"Headers JSON",info:"Static non-secret headers merged into every outbound request. Values must be strings. Use the auth section for Authorization, Cookie, X-API-Key, and other secrets."}),e.jsx("textarea",{value:l.headers,rows:8,spellCheck:!1,onChange:n=>A(n.target.value)})]}),s!=null&&s.hasSecretHeaders?e.jsxs("div",{className:"target-page-note",children:["Stored secret headers are not returned to the browser. Leave the secret header field blank to keep what is already stored, or enter JSON to replace it. Submit ",e.jsx("code",{children:"{}"})," to clear stored secret headers."]}):null,e.jsxs("label",{className:"field field-code",children:[e.jsx(d,{label:"Secret headers JSON",info:"Encrypted at rest and merged into outbound requests only at send time. Use this for custom tenant tokens, vendor-specific signatures, and any header value that should not stay in plaintext storage."}),e.jsx("textarea",{value:l.secretHeaders,rows:6,spellCheck:!1,placeholder:JSON.stringify({"X-Customer-Secret":"replace-me"},null,2),onChange:n=>c("secretHeaders",n.target.value)})]})]}):u===3?e.jsxs("div",{className:"target-modal-page",children:[e.jsxs("div",{className:"target-page-note target-page-note-strong",children:["Please match the JSON schema below to what your target is expecting. ",e.jsx("br",{})," ",e.jsx("br",{}),"You are required to place ",e.jsx("code",{children:f.promptPlaceholder})," in the prompt input field.",e.jsx("br",{})," ",e.jsx("br",{}),"If your target expects a system preable, include ",e.jsx("code",{children:f.systemPlaceholder})," where necessary.",e.jsx("br",{}),"If your target expects a chat history, include ",e.jsx("code",{children:f.historyPlaceholder})," where necessary."]}),e.jsxs("label",{className:"field field-code",children:[e.jsx(d,{label:"Request template JSON",info:"This is sent to the target after placeholder replacement. It must stay a JSON object and must include the prompt placeholder."}),e.jsx("textarea",{value:l.requestTemplateJson,rows:16,spellCheck:!1,onChange:n=>c("requestTemplateJson",n.target.value)})]})]}):u===4?e.jsxs("div",{className:"target-modal-page",children:[e.jsxs("div",{className:"target-page-note",children:["Examples:",e.jsx("br",{})," ",e.jsx("code",{children:"choices.0.message.content"})," ",e.jsx("br",{})," ",e.jsx("code",{children:"messages.response"})]}),e.jsxs("label",{className:"field field-code",children:[e.jsx(d,{label:"Response path",info:"Path to the text value we should score after the target responds."}),e.jsx("input",{value:l.responseExtractPath,spellCheck:!1,onChange:n=>c("responseExtractPath",n.target.value),placeholder:"choices.0.message.content"})]})]}):e.jsx("div",{className:"target-modal-page",children:e.jsxs("div",{className:"target-advanced-grid",children:[e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Rate limit per minute",info:"Optional cap for how many requests per minute this target should receive from the worker."}),e.jsx("input",{type:"number",value:l.rateLimitPerMinute,onChange:n=>c("rateLimitPerMinute",n.target.value),placeholder:"Blank = no extra limit"})]}),e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Timeout ms",info:"How long the worker waits for the target before the request is treated as timed out."}),e.jsx("input",{type:"number",value:l.timeoutMs,onChange:n=>c("timeoutMs",n.target.value)})]}),e.jsxs("label",{className:"field",children:[e.jsx(d,{label:"Max retries",info:"How many times the worker should retry after a retryable failure."}),e.jsx("input",{type:"number",value:l.maxRetries,onChange:n=>c("maxRetries",n.target.value)})]})]})})}
23return e.jsx(se,{open:t,onClose:i,title:s?"Edit target":"Create target",description:"",size:"wide",children:e.jsxs("form",{className:"form-stack",onSubmit:n=>{if(n.preventDefault(),u===F.length-1){M();return}U()},children:[e.jsxs("div",{className:"target-step-copy",children:[e.jsx("h3",{children:H.title}),e.jsx("p",{children:H.description})]}),e.jsx(B,{notice:N?{tone:"error",message:N}:p?{tone:"error",message:p}:null}),q(),e.jsxs("div",{className:"modal-actions",children:[e.jsx("button",{type:"button",className:"button button-ghost",onClick:i,children:"Cancel"}),u>0?e.jsx("button",{type:"button",className:"button button-secondary",onClick:()=>b(n=>n-1),children:"Back"}):null,e.jsx("button",{type:"submit",className:"button button-primary",disabled:T,children:T?"Savingâ¦":u===F.length-1?s?"Save target":"Create target":"Next"})]})]})})}function Tt(){var ce,de,ue,he,me,pe,xe,fe,ge,je;const t=_e(),s=Le(),{projectId:i=""}=Ue(),[o,j]=Me(),T=o.get("tab")==="targets"?"targets":"overview",{data:p}=De(),{project:u,canManage:b,isLoading:l}=$e(i,p||null),[O,N]=x.useState(!1),[w,I]=x.useState(!1),[J,H]=x.useState(!1),[g,c]=x.useState(null),[A,L]=x.useState(null),[$,U]=x.useState(null),[M,Q]=x.useState(""),[q,n]=x.useState("ALL"),[r,k]=x.useState(""),R=D({queryKey:["project-runs",i],queryFn:()=>C.getProjectRuns(i),enabled:!!i}),W=D({queryKey:["queue-stats",i],queryFn:()=>C.getQueueStats(i),enabled:!!i}),G=D({queryKey:["suites"],queryFn:()=>C.getSuites()}),X=D({queryKey:["credits",u==null?void 0:u.workspaceId],queryFn:()=>C.getCredits(u.workspaceId),enabled:!!(u!=null&&u.workspaceId)}),S=D({queryKey:["targets",i],queryFn:()=>C.getTargets(i),enabled:!!i}),Y=ee({mutationFn:a=>{if(!a.confirmedCompliance)throw new Error("Acknowledgement is required before queueing a run.");return C.createRun({projectId:i,targetId:a.targetId,suiteId:a.suiteId,idempotencyKey:Ve("run"),confirmedAuthorizedUse:!0,confirmedRulesOfEngagement:!0,settings:{stopOnFirstFail:a.stopOnFirstFail}})},onSuccess:async a=>{N(!1),await s.invalidateQueries({queryKey:["project-runs",i]}),t(`/projects/${i}/runs/${a.run.id}`)},onError:a=>{U({tone:"error",message:a instanceof Error?a.message:"Unable to queue run."})}}),P=ee({mutationFn:async a=>a.targetId?C.updateTarget(i,a.targetId,a.body):C.createTarget(i,a.body),onSuccess:async()=>{U({tone:"success",message:g?"Target updated.":"Target created."}),I(!1),c(null),await s.invalidateQueries({queryKey:["targets",i]})},onError:a=>{U({tone:"error",message:a instanceof Error?a.message:"Unable to save target."})}}),v=ee({mutationFn:a=>C.validateTarget(i,a),onSuccess:async()=>{await s.invalidateQueries({queryKey:["targets",i]})}}),h=((ce=v.data)==null?void 0:ce.validation)||null,ne=v.error?"Validation could not complete because the server hit an internal error.":null,Pe=a=>{L(a),H(!0),v.reset(),v.mutate(a.id)},Oe=()=>{A&&(v.reset(),v.mutate(A.id))},ie=x.useMemo(()=>{var E,be;const a=[...((E=R.data)==null?void 0:E.runs)||[]],m=new Map((((be=S.data)==null?void 0:be.targets)||[]).map(y=>[y.id,y.name]));return a.sort((y,qe)=>new Date(qe.createdAt).getTime()-new Date(y.createdAt).getTime()).filter(y=>q==="ALL"?!0:y.status===q).filter(y=>`${y.id} ${y.suiteId} ${y.status} ${y.targetName||""} ${m.get(y.targetId)||""}`.toLowerCase().includes(M.toLowerCase()))},[M,q,(de=R.data)==null?void 0:de.runs,(ue=S.data)==null?void 0:ue.targets]),le=x.useMemo(()=>{var m;return(((m=S.data)==null?void 0:m.targets)||[]).filter(E=>`${E.name} ${E.endpointUrl}`.toLowerCase().includes(r.toLowerCase()))},[r,(he=S.data)==null?void 0:he.targets]),Z=x.useMemo(()=>{var a;return(((a=R.data)==null?void 0:a.runs)||[]).filter(m=>!Qe(m.status))},[(me=R.data)==null?void 0:me.runs]),oe=Ke({queries:Z.map(a=>({queryKey:["run-status",a.id],queryFn:()=>C.getRunStatus(a.id),enabled:!!a.id,refetchInterval:5e3}))}),Ie=x.useMemo(()=>new Map(Z.map((a,m)=>{var E;return[a.id,(E=oe[m])==null?void 0:E.data]})),[Z,oe]),He=x.useMemo(()=>{var a;return new Map((((a=S.data)==null?void 0:a.targets)||[]).map(m=>[m.id,m.name]))},[(pe=S.data)==null?void 0:pe.targets]);return l||!R.data||!W.data||!G.data||!X.data||b&&!S.data?e.jsx("div",{className:"loading-screen-inline",children:"Loading projectâ¦"}):u?e.jsxs("div",{className:"page-stack",children:[e.jsx(Be,{eyebrow:"Project",title:u.name,description:u.description||void 0,actions:e.jsxs(e.Fragment,{children:[e.jsx(Je,{className:"button button-secondary",to:"/projects",children:"All projects"}),b?e.jsxs("button",{type:"button",className:"button button-primary",onClick:()=>N(!0),children:[e.jsx(Ze,{size:16}),"Launch scan"]}):null]}),tabs:e.jsx(Fe,{items:et,value:T,onChange:a=>j({tab:a})})}),e.jsx(B,{notice:$}),e.jsxs("section",{className:"stats-grid",children:[e.jsx(V,{label:"Runs",value:te(R.data.pagination.total),hint:"Tracked in this project",tone:"strong"}),e.jsx(V,{label:"Queued",value:te(W.data.counts.queued),hint:"Waiting for worker claim"}),e.jsx(V,{label:"Active",value:te(W.data.counts.claimed),hint:"Currently executing"}),e.jsx(V,{label:"Credits",value:Ne(X.data.availableCredits),hint:"Workspace credits available to launch"})]}),T==="overview"?e.jsx("section",{className:"dashboard-grid dashboard-grid-full",children:e.jsxs(ye,{children:[e.jsxs("div",{className:"section-heading section-heading-compact",children:[e.jsxs("div",{children:[e.jsx("span",{className:"eyebrow",children:"Runs"}),e.jsx("h2",{children:"Run activity"})]}),e.jsxs("div",{className:"table-tools",children:[e.jsxs("label",{className:"table-search-inline","aria-label":"Search runs",children:[e.jsx(Se,{size:15}),e.jsx("input",{value:M,onChange:a=>Q(a.target.value),placeholder:"Run, suite, or target"})]}),e.jsxs("label",{className:"table-select-inline",children:[e.jsx("span",{children:"Status"}),e.jsxs("select",{value:q,onChange:a=>n(a.target.value),children:[e.jsx("option",{value:"ALL",children:"All"}),e.jsx("option",{value:"QUEUED",children:"Queued"}),e.jsx("option",{value:"RUNNING",children:"Running"}),e.jsx("option",{value:"COMPLETED",children:"Completed"}),e.jsx("option",{value:"COMPLETED_WITH_ERRORS",children:"Completed with errors"}),e.jsx("option",{value:"FAILED",children:"Failed"}),e.jsx("option",{value:"CANCELLED",children:"Cancelled"})]})]})]})]}
23),ie.length===0?e.jsx(_,{title:R.data.runs.length===0?"No runs yet":"No runs match",description:R.data.runs.length===0?"Launch the first run once a target is configured.":"Change the search or status filter to see a different slice.",action:b?e.jsx("button",{type:"button",className:"button button-primary",onClick:()=>N(!0),children:"Launch first run"}):void 0}):e.jsx(ze,{runs:ie,statusByRunId:Ie,targetNamesById:He,canViewReports:b})]})}):null,T==="targets"?e.jsx(ye,{children:b?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"section-heading",children:[e.jsxs("div",{children:[e.jsx("span",{className:"eyebrow",children:"Target profiles"}),e.jsx("h2",{children:"Reusable connection definitions"})]}),e.jsxs("button",{type:"button",className:"button button-primary",onClick:()=>{c(null),P.reset(),I(!0)},children:[e.jsx(We,{size:16}),"New target"]})]}),e.jsx(ct,{sourceIps:((xe=p==null?void 0:p.targetPrerequisites)==null?void 0:xe.sourceIps)||[],destinationPorts:((fe=p==null?void 0:p.targetPrerequisites)==null?void 0:fe.destinationPorts)||[]}),e.jsx("div",{className:"toolbar",children:e.jsxs("label",{className:"field field-search",children:[e.jsx("span",{children:"Search"}),e.jsxs("div",{className:"search-field",children:[e.jsx(Se,{size:16}),e.jsx("input",{value:r,onChange:a=>k(a.target.value),placeholder:"Target name or endpoint"})]})]})}),le.length===0?e.jsx(_,{title:"No targets yet",description:"Add the first target profile to start launching scans."}):e.jsx("div",{className:"table-shell",children:e.jsxs("table",{className:"data-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Name"}),e.jsx("th",{children:"Validation"}),e.jsx("th",{children:"Endpoint"}),e.jsx("th",{children:"Auth"}),e.jsx("th",{children:"Timeout"}),e.jsx("th",{})]})}),e.jsx("tbody",{children:le.map(a=>{const m=lt(a),E=m.Icon;return e.jsxs("tr",{children:[e.jsxs("td",{children:[e.jsx("strong",{children:a.name}),e.jsx("p",{children:a.httpMethod})]}),e.jsx("td",{children:e.jsx("span",{className:`target-validation-indicator ${m.className}`.trim(),title:m.label,"aria-label":m.label,children:e.jsx(E,{size:16})})}),e.jsx("td",{children:a.endpointUrl}),e.jsx("td",{children:ot(a.authType)}),e.jsxs("td",{children:[a.timeoutMs||3e4," ms"]}),e.jsx("td",{children:e.jsxs("div",{className:"target-table-actions",children:[e.jsx("button",{type:"button",className:"button button-primary",onClick:()=>Pe(a),disabled:v.isPending,children:v.isPending&&(A==null?void 0:A.id)===a.id?"Validatingâ¦":"Validate"}),e.jsx("button",{type:"button",className:"button button-secondary",onClick:()=>{c(a),P.reset(),I(!0)},children:"Edit"})]})})]},a.id)})})]})})]}):e.jsx(_,{title:"Target configuration is restricted",description:"Only owners and admins can view or edit target profiles."})}):null,e.jsx(se,{open:O,onClose:()=>N(!1),title:"Launch scan",description:`Queue a run for ${u.name}. ${b?`Available credits: ${Ne(X.data.availableCredits)}.`:""}`,children:b?!S.data||S.data.targets.length===0?e.jsx(_,{title:"No targets yet",description:"Create a target profile before launching a scan."}):e.jsxs("form",{className:"form-stack",onSubmit:a=>{a.preventDefault();const m=new FormData(a.currentTarget);Y.mutate({targetId:String(m.get("targetId")||""),suiteId:String(m.get("suiteId")||""),stopOnFirstFail:String(m.get("stopOnFirstFail")||"false")==="true",confirmedCompliance:String(m.get("confirmedCompliance")||"")==="true"})},children:[e.jsxs("label",{className:"field",children:[e.jsx("span",{children:"Target"}),e.jsx("select",{name:"targetId",defaultValue:(ge=S.data.targets[0])==null?void 0:ge.id,children:S.data.targets.map(a=>e.jsx("option",{value:a.id,children:a.name},a.id))})]}),e.jsxs("label",{className:"field",children:[e.jsx("span",{children:"Suite"}),e.jsx("select",{name:"suiteId",defaultValue:(je=G.data.suites[0])==null?void 0:je.id,children:G.data.suites.map(a=>e.jsxs("option",{value:a.id,children:[a.name," (",a.version,")"]},a.id))})]}),e.jsxs("label",{className:"field",children:[e.jsx("span",{children:"Stop on first fail"}),e.jsxs("select",{name:"stopOnFirstFail",defaultValue:"false",children:[e.jsx("option",{value:"false",children:"false"}),e.jsx("option",{value:"true",children:"true"})]})]}),e.jsxs("div",{className:"legal-inline-notice",children:[e.jsx("span",{className:"eyebrow",children:"Authorization and processing notice"}),e.jsx("p",{children:"Runs are only for authorized defensive security testing. Prompts, target outputs, transcripts, and related metadata may be sent to OpenAI and its subprocessors for evaluation. Use non-production environments where practical, and if real credentials or sensitive data are exposed, you are responsible for rotating or revoking them."})]}),e.jsxs("label",{className:"checkbox-field",children:[e.jsx("input",{name:"confirmedCompliance",type:"checkbox",value:"true",required:!0}),e.jsx("span",{children:"I confirm this run is authorized, within applicable rules of engagement, uses third-party processing as de
23scribed above, and that I am responsible for approvals, production-use decisions, and rotating any exposed credentials."})]}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("button",{type:"button",className:"button button-ghost",onClick:()=>N(!1),children:"Cancel"}),e.jsx("button",{type:"submit",className:"button button-primary",disabled:Y.isPending,children:Y.isPending?"Queueingâ¦":"Queue run"})]})]}):e.jsx(_,{title:"Restricted",description:"Only owners and admins can queue runs."})}),e.jsx(se,{open:J,onClose:()=>{H(!1),L(null)},title:A?`Validate ${A.name}`:"Validate target",description:"Runs a sample request using the saved endpoint, auth settings, headers, request template, and response path.",children:e.jsxs("div",{className:"form-stack",children:[v.isPending?e.jsx("div",{className:"target-validation-state",children:e.jsx("span",{className:"eyebrow",children:"Running validation"})}):ne?e.jsxs(e.Fragment,{children:[e.jsx(B,{notice:{tone:"error",message:ne}}),e.jsx("div",{className:"stack-list stack-list-tight",children:e.jsx("article",{className:"list-row",children:e.jsxs("div",{children:[e.jsx("strong",{children:"What to do next"}),e.jsx("p",{children:"Try the validation again. If it keeps failing, check the API logs for the underlying server-side error."})]})})})]}):h?e.jsxs(e.Fragment,{children:[e.jsx(B,{notice:{tone:h.ok?"success":"error",message:h.summary}}),h.suggestions.length?e.jsx("div",{className:"stack-list stack-list-tight",children:h.suggestions.map(a=>e.jsx("article",{className:"list-row",children:e.jsxs("div",{children:[e.jsx("strong",{children:"Suggestion"}),e.jsx("p",{children:a})]})},a))}):e.jsx("p",{className:"target-validation-note",children:"No changes look necessary based on this validation check."}),e.jsxs("div",{className:"stack-list stack-list-tight",children:[e.jsxs("article",{className:"list-row",children:[e.jsxs("div",{children:[e.jsx("strong",{children:"Response path"}),e.jsx("p",{children:"Saved extraction path used for this check."})]}),e.jsx("span",{className:"target-validation-code",children:h.diagnostics.responseExtractPath})]}),h.diagnostics.statusCode?e.jsxs("article",{className:"list-row",children:[e.jsxs("div",{children:[e.jsx("strong",{children:"HTTP status"}),e.jsx("p",{children:"Returned by the target during validation."})]}),e.jsx("span",{className:"target-validation-code",children:h.diagnostics.statusCode})]}):null,h.diagnostics.contentType?e.jsxs("article",{className:"list-row",children:[e.jsxs("div",{children:[e.jsx("strong",{children:"Content type"}),e.jsx("p",{children:"Response content type observed by the app."})]}),e.jsx("span",{className:"target-validation-code",children:h.diagnostics.contentType})]}):null,h.diagnostics.latencyMs!==null?e.jsxs("article",{className:"list-row",children:[e.jsxs("div",{children:[e.jsx("strong",{children:"Latency"}),e.jsx("p",{children:"Round-trip time for the validation request."})]}),e.jsxs("span",{className:"target-validation-code",children:[h.diagnostics.latencyMs," ms"]})]}):null,h.diagnostics.topLevelKeys.length?e.jsxs("article",{className:"list-row",children:[e.jsxs("div",{children:[e.jsx("strong",{children:"Top-level keys"}),e.jsx("p",{children:"Useful when the response path starts in the wrong place."})]}),e.jsx("span",{className:"target-validation-code",children:h.diagnostics.topLevelKeys.join(", ")})]}):null,h.diagnostics.candidatePaths.length&&!h.ok?e.jsxs("article",{className:"list-row",children:[e.jsxs("div",{children:[e.jsx("strong",{children:"Possible text paths"}),e.jsx("p",{children:"String-valued fields discovered in the last response body."})]}),e.jsx("span",{className:"target-validation-code",children:h.diagnostics.candidatePaths.join(", ")})]}):null]}),h.diagnostics.extractedPreview?e.jsxs("div",{className:"target-validation-preview-shell",children:[e.jsx("span",{className:"eyebrow",children:h.ok?"Extracted preview":"Observed text preview"}),e.jsx("pre",{className:"target-validation-preview",children:h.diagnostics.extractedPreview})]}):null]}):e.jsx(B,{notice:{tone:"info",message:"Run validation to test the saved target configuration."}}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("button",{type:"button",className:"button button-ghost",onClick:()=>{H(!1),L(null)},children:"Close"}),A?e.jsx("button",{type:"button",className:"button button-primary",onClick:Oe,disabled:v.isPending,children:v.isPending?"Validatingâ¦":h?"Validate again":"Run validation"}):null]})]})}),e.jsx(gt,{open:w,editingTarget:g,onClose:()=>{I(!1),c(null),P.reset()},onResetError:P.reset,onSave:a=>P.mutate(a),isPending:P.isPending,errorMessage:P.error instanceof Error?P.error.message:null})]}):e.jsx(_,{title:"Project unavailable",description:"This project is outside the current account context."})}export{Tt as ProjectPage};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.