diff --git a/cmd/gomodel/docs/docs.go b/cmd/gomodel/docs/docs.go index 541d4e6d5..d9d600f73 100644 --- a/cmd/gomodel/docs/docs.go +++ b/cmd/gomodel/docs/docs.go @@ -257,7 +257,7 @@ const docTemplate = `{ }, "/admin/audit/sessions": { "get": { - "description": "Groups audit log entries by session id into threads and returns\none summary per thread — its latest entry, entry count, and time\nspan — ordered by latest activity. Entries without a session id\nappear as single-entry threads. Filters apply to entries before\ngrouping.", + "description": "Groups audit log entries by session id into threads and returns\none summary per thread — its latest matching entry and complete\nrequest count — ordered by latest activity. Entries without a session id\nappear as single-entry threads. Filters apply to entries before\ngrouping.", "produces": [ "application/json" ], @@ -6857,6 +6857,10 @@ const docTemplate = `{ }, "USAGE_PRICING_RECALCULATION_ENABLED": { "type": "string" + }, + "VIRTUAL_MODEL_STRATEGIES": { + "description": "VirtualModelStrategies is the comma-separated list of load-balancing\nstrategies this deployment supports. \"adaptive\" appears only when a\nroute-selector extension is registered, so the dashboard never offers\na strategy that would silently fall back to round robin.", + "type": "string" } } }, @@ -6929,6 +6933,9 @@ const docTemplate = `{ "path": { "type": "string" }, + "principal_id": { + "type": "string" + }, "provider": { "description": "canonical provider type used for routing and filters", "type": "string" @@ -6994,20 +7001,11 @@ const docTemplate = `{ "admin.auditSessionResponse": { "type": "object", "properties": { - "count": { - "type": "integer" - }, - "first_timestamp": { - "type": "string" - }, - "last_timestamp": { - "type": "string" - }, "latest": { "$ref": "#/definitions/admin.auditLogEntryResponse" }, - "session_id": { - "type": "string" + "request_count": { + "type": "integer" } } }, @@ -7391,6 +7389,9 @@ const docTemplate = `{ "service_account_json_base64": { "type": "string" }, + "session_sticky_keys": { + "type": "boolean" + }, "type": { "type": "string" }, @@ -7789,6 +7790,9 @@ const docTemplate = `{ "service_account_json_base64": { "type": "string" }, + "session_sticky_keys": { + "type": "boolean" + }, "type": { "type": "string" }, @@ -7839,6 +7843,10 @@ const docTemplate = `{ "description": "SessionAffinity keeps a detected session on the target that served it\nbefore. Omitted means enabled; false restores stateless balancing.", "type": "boolean" }, + "slowdown": { + "description": "Slowdown is an extra-time factor from 0.1 to 10; zero disables it.", + "type": "number" + }, "source": { "type": "string" }, @@ -8043,6 +8051,9 @@ const docTemplate = `{ "anthropicapi.MessagesRequest": { "type": "object", "properties": { + "cache_control": { + "type": "object" + }, "max_tokens": { "type": "integer" }, @@ -8181,6 +8192,9 @@ const docTemplate = `{ "anthropicapi.Tool": { "type": "object", "properties": { + "cache_control": { + "type": "object" + }, "description": { "type": "string" }, @@ -8305,6 +8319,10 @@ const docTemplate = `{ "description": "Error details (message can be long, so kept in JSON)", "type": "string" }, + "event_type": { + "description": "EventType identifies non-request security lifecycle entries written\nthrough the extension authentication event recorder.", + "type": "string" + }, "failover": { "description": "Failover captures runtime redirect details when translated execution\nmoved from the primary selector to a configured failover target.", "allOf": [ @@ -11137,6 +11155,10 @@ const docTemplate = `{ "session_affinity": { "type": "boolean" }, + "slowdown": { + "description": "Slowdown is an extra-time factor from 0.1 to 10; zero disables it.", + "type": "number" + }, "source": { "type": "string" }, @@ -11189,6 +11211,10 @@ const docTemplate = `{ "description": "SessionAffinity keeps requests of one detected session on the target that\nserved it before, while that target stays available. Tri-state: nil means\nenabled (the default); explicit false restores stateless balancing.", "type": "boolean" }, + "slowdown": { + "description": "Slowdown is an extra-time factor from 0.1 to 10; zero disables it. Nil\nleaves the setting unspecified so an alias can inherit its target model.", + "type": "number" + }, "source": { "type": "string" }, diff --git a/docs/features/session-keeping.mdx b/docs/features/session-keeping.mdx index 017144e45..2b98b74e7 100644 --- a/docs/features/session-keeping.mdx +++ b/docs/features/session-keeping.mdx @@ -100,8 +100,11 @@ checkbox. Requests with no detected session remain round robin. Audit entries record the session id (`session_id`), and the Audit Logs page groups them by default ("Group by session" toggle). Each thread shows its latest request with a count badge; the expander on the left unfolds the older -requests. `GET /admin/audit/sessions` serves the thread list; -`GET /admin/audit/log?session_id=…` returns one session's entries. +requests. The badge counts the complete session. Filters select which sessions +appear and which matching request represents each thread. +`GET /admin/audit/sessions` returns each thread's `request_count` and latest +matching audit-log entry. `GET /admin/audit/log?session_id=…` returns all +requests in an expanded session. ## Configuration diff --git a/docs/openapi.json b/docs/openapi.json index 2aea14a61..6c29efd45 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -340,7 +340,7 @@ }, "/admin/audit/sessions": { "get": { - "description": "Groups audit log entries by session id into threads and returns\none summary per thread — its latest entry, entry count, and time\nspan — ordered by latest activity. Entries without a session id\nappear as single-entry threads. Filters apply to entries before\ngrouping.", + "description": "Groups audit log entries by session id into threads and returns\none summary per thread — its latest matching entry and complete\nrequest count — ordered by latest activity. Entries without a session id\nappear as single-entry threads. Filters apply to entries before\ngrouping.", "tags": [ "admin" ], @@ -10259,6 +10259,10 @@ }, "USAGE_PRICING_RECALCULATION_ENABLED": { "type": "string" + }, + "VIRTUAL_MODEL_STRATEGIES": { + "description": "VirtualModelStrategies is the comma-separated list of load-balancing\nstrategies this deployment supports. \"adaptive\" appears only when a\nroute-selector extension is registered, so the dashboard never offers\na strategy that would silently fall back to round robin.", + "type": "string" } } }, @@ -10331,6 +10335,9 @@ "path": { "type": "string" }, + "principal_id": { + "type": "string" + }, "provider": { "description": "canonical provider type used for routing and filters", "type": "string" @@ -10396,20 +10403,11 @@ "admin.auditSessionResponse": { "type": "object", "properties": { - "count": { - "type": "integer" - }, - "first_timestamp": { - "type": "string" - }, - "last_timestamp": { - "type": "string" - }, "latest": { "$ref": "#/components/schemas/admin.auditLogEntryResponse" }, - "session_id": { - "type": "string" + "request_count": { + "type": "integer" } } }, @@ -10811,6 +10809,9 @@ "service_account_json_base64": { "type": "string" }, + "session_sticky_keys": { + "type": "boolean" + }, "type": { "type": "string" }, @@ -11220,6 +11221,9 @@ "service_account_json_base64": { "type": "string" }, + "session_sticky_keys": { + "type": "boolean" + }, "type": { "type": "string" }, @@ -11490,6 +11494,9 @@ "anthropicapi.MessagesRequest": { "type": "object", "properties": { + "cache_control": { + "type": "object" + }, "max_tokens": { "type": "integer" }, @@ -11628,6 +11635,9 @@ "anthropicapi.Tool": { "type": "object", "properties": { + "cache_control": { + "type": "object" + }, "description": { "type": "string" }, @@ -11752,6 +11762,10 @@ "description": "Error details (message can be long, so kept in JSON)", "type": "string" }, + "event_type": { + "description": "EventType identifies non-request security lifecycle entries written\nthrough the extension authentication event recorder.", + "type": "string" + }, "failover": { "description": "Failover captures runtime redirect details when translated execution\nmoved from the primary selector to a configured failover target.", "allOf": [ diff --git a/internal/admin/dashboard/static/dist/assets/index-SJFFXBLZ.js b/internal/admin/dashboard/static/dist/assets/index-s6JXpqTB.js similarity index 95% rename from internal/admin/dashboard/static/dist/assets/index-SJFFXBLZ.js rename to internal/admin/dashboard/static/dist/assets/index-s6JXpqTB.js index d763f315d..ec215a144 100644 --- a/internal/admin/dashboard/static/dist/assets/index-SJFFXBLZ.js +++ b/internal/admin/dashboard/static/dist/assets/index-s6JXpqTB.js @@ -37,7 +37,7 @@ /team/alpha /non-existing`),D(g);var y=I(g,2);Tk(y,{id:`virtual-model-description`,label:`Description`,children:(e,t)=>{var r=BN();ut(r),L(()=>r.disabled=n.vmFormManaged),la(r,()=>n.vmForm.description,e=>n.vmForm.description=e),V(e,r)},$$slots:{default:!0}});var b=I(y,2),x=e=>{Tk(e,{id:`virtual-model-slowdown`,label:`Slowdown (extra inference time)`,children:(e,t)=>{var r=VN(),i=F(r);ea(i),Ve(2),L(()=>i.disabled=n.vmFormManaged),la(i,()=>n.vmForm.slowdown,e=>n.vmForm.slowdown=e),V(e,r)},$$slots:{default:!0}})},S=A(()=>n.vmFormSupportsSlowdown());U(b,e=>{R(S)&&e(x)});var C=I(b,2),w=P(C),T=e=>{var t=HN(),r=P(t,!0);D(t),L(()=>H(r,`Default enabled: `+(n.vmFormDefaultEnabled?`yes`:`no`)+` · Effective now: `+(n.vmFormEffectiveEnabled?`yes`:`no`))),V(e,t)};U(w,e=>{n.vmFormMode===`edit`&&e(T)});var E=I(w,2),ee=P(E);{let e=A(()=>n.vmFormToggleRestricted()),t=A(()=>n.vmFormToggleLabel());TN(ee,{get enabled(){return n.vmForm.enabled},get restricted(){return R(e)},label:`virtual model`,get disabled(){return n.vmFormManaged},get text(){return R(t)},onclick:()=>{n.vmFormManaged||(n.vmForm.enabled=!n.vmForm.enabled)}})}D(E),D(C),L(()=>{f.disabled=n.vmFormManaged,v.disabled=n.vmFormManaged}),z(`click`,f,()=>n.addVmTarget()),la(v,()=>n.vmForm.user_paths,e=>n.vmForm.user_paths=e),V(e,r)},$$slots:{header:!0,extraActions:!0,default:!0}})}k()}Br([`click`]);var GN=B(`

Pricing override

`,1),KN=B(``),qN=B(``),JN=B(``),YN=B(``),XN=B(`
`),ZN=B(`
Tiered pricing exists for this override and will be preserved. Tier editing can be added without a database migration.
`),QN=B(`
No pricing fields set.
`),$N=B(`
`),eP=B(`

Currency is USD. Saved fields override model registry and config.yaml pricing for this - selector; unset fields continue to inherit.

Price Type USD Source
`,1);function tP(e,t){O(t,!0);let n=TM;Ck(e,{get open(){return n.modelPricingOverrideFormOpen},ariaLabel:`Model pricing editor`,dialogClass:`model-pricing-editor`,get error(){return n.modelPricingOverrideError},get submitting(){return n.modelPricingOverrideSubmitting},submitLabel:`Save Pricing`,onclose:()=>n.closeModelPricingOverrideForm(),onsubmit:()=>n.submitModelPricingOverrideForm(),header:e=>{var t=GN(),r=I(F(t),2),i=P(r,!0);D(r),L(()=>H(i,n.modelPricingOverrideFormDisplayName||n.modelPricingOverrideForm.selector||`Pricing`)),V(e,t)},extraActions:e=>{var t=Xr(),r=F(t),i=e=>{var t=KN();L(()=>t.disabled=n.modelPricingOverrideSubmitting),z(`click`,t,()=>n.deleteModelPricingOverride()),V(e,t)};U(r,e=>{n.modelPricingOverrideFormHasExistingOverride&&e(i)}),V(e,t)},children:(e,t)=>{var r=eP(),i=F(r),a=P(i);Tk(a,{id:`model-pricing-override-selector`,label:`Selector`,children:(e,t)=>{var r=qN();ea(r),la(r,()=>n.modelPricingOverrideForm.selector,e=>n.modelPricingOverrideForm.selector=e),V(e,r)},$$slots:{default:!0}});var o=I(a,2),s=e=>{Tk(e,{id:`model-pricing-override-scope`,label:`Scope`,children:(e,t)=>{var r=YN();W(r,21,()=>n.modelPricingOverrideFormScopeOptions,e=>e.value,(e,t)=>{var n=JN(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(r),z(`change`,r,()=>n.setModelPricingOverrideScope(n.modelPricingOverrideFormScope)),Ui(r,()=>n.modelPricingOverrideFormScope,e=>n.modelPricingOverrideFormScope=e),V(e,r)},$$slots:{default:!0}})};U(o,e=>{n.modelPricingOverrideFormScopeOptions.length>1&&e(s)}),D(i);var c=I(i,4);W(c,21,()=>n.modelPricingOverrideRows,e=>e.id,(e,t,r)=>{var i=XN(),a=P(i),o=P(a),s=I(o,2);W(s,21,()=>n.availablePricingFieldOptions(R(t)),e=>e.value,(e,t)=>{var n=JN(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).group+` - `+R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(s),D(a);var c=I(a,2),l=P(c),u=I(l,2);ea(u),D(c);var d=I(c,2);{let e=A(()=>`Remove `+n.pricingFieldLabel(R(t).field));yO(d,{get label(){return R(e)},class:`table-action-btn-danger table-icon-btn pricing-override-remove-row`,onclick:()=>n.removeModelPricingOverrideRow(R(t)),children:(e,t)=>{J(e,{get icon(){return Ol},class:`table-icon-svg`})},$$slots:{default:!0}})}D(i),L(()=>{K(o,`for`,`pricing-type-`+R(t).id),K(s,`id`,`pricing-type-`+R(t).id),K(l,`for`,`pricing-value-`+R(t).id),K(u,`id`,`pricing-value-`+R(t).id)}),Ui(s,()=>R(t).field,e=>R(t).field=e),la(u,()=>R(t).value,e=>R(t).value=e),V(e,i)}),D(c);var l=I(c,2),u=P(l);J(P(u),{get icon(){return il},class:`form-action-icon`}),Ve(2),D(u),D(l);var d=I(l,2),f=e=>{V(e,ZN())};U(d,e=>{n.modelPricingOverrideFormPreservedTiers.length>0&&e(f)});var p=I(d,2),m=I(P(p),2),h=e=>{V(e,QN())},g=A(()=>n.modelPricingEffectivePreviewRows().length===0);U(m,e=>{R(g)&&e(h)}),W(I(m,2),17,()=>n.modelPricingEffectivePreviewRows(),e=>e.field,(e,t)=>{var n=$N(),r=P(n),i=P(r,!0);D(r);var a=I(r,2),o=P(a,!0);D(a);var s=I(a,2),c=P(s,!0);D(s),D(n),L(e=>{H(i,R(t).label),H(o,e),H(c,R(t).source)},[()=>R(t).value===null||R(t).value===void 0?`-`:dd(Number(R(t).value))]),V(e,n)}),D(p),z(`click`,u,()=>n.addModelPricingOverrideRow()),V(e,r)},$$slots:{header:!0,extraActions:!0,default:!0}}),k()}Br([`click`,`change`]);var nP=B(`

Failover mapping

`,1),rP=B(``),iP=B(`

This failover mapping is defined in configuration and is read-only here.

`),aP=B(``),oP=B(`
`),sP=B(`
`,1),cP=B(`
`);function lP(e,t){O(t,!0);{let t=e=>{var t=nP(),n=I(F(t),2),r=P(n,!0);D(n),L(()=>H(r,Q.failoverForm.source||`Failover`)),V(e,t)},n=e=>{var t=Xr(),n=F(t),r=e=>{var t=rP();L(()=>t.disabled=Q.failoverSaving||Q.failoverGenerating),z(`click`,t,()=>Q.deleteFailoverRule()),V(e,t)};U(n,e=>{Q.failoverFormMode===`edit`&&!Q.failoverFormManaged&&e(r)}),V(e,t)},r=A(()=>Q.failoverGenerating||Q.failoverFormManaged);Ck(e,{get open(){return Q.failoverFormOpen},ariaLabel:`Failover editor`,get error(){return Q.failoverError},get submitting(){return Q.failoverSaving},get submitDisabled(){return R(r)},submitLabel:`Save`,onclose:()=>Q.closeFailoverForm(),onsubmit:()=>Q.submitFailoverForm(),header:t,extraActions:n,children:(e,t)=>{var n=cP(),r=P(n),i=e=>{V(e,iP())};U(r,e=>{Q.failoverFormManaged&&e(i)});var a=I(r,2);W(a,21,()=>Id.models,ii,(e,t)=>{var n=aP(),r=P(n,!0);D(n);var i={};L((e,t)=>{H(r,e),i!==(i=t)&&(n.value=(n.__value=t)??``)},[()=>ij(R(t)),()=>ij(R(t))]),V(e,n)}),D(a);var o=I(a,2);Tk(o,{id:`failover-target`,label:`Fallback models`,children:(e,t)=>{var n=sP(),r=F(n),i=P(r),a=P(i);ea(a);var o=I(a,2),s=e=>{yO(e,{label:`Remove fallback model`,class:`table-action-btn-danger table-icon-btn vm-target-remove`,onclick:()=>Q.removePrimaryFailoverTarget(),get disabled(){return Q.failoverFormManaged},children:(e,t)=>{J(e,{get icon(){return xl},class:`table-icon-svg`})},$$slots:{default:!0}})};U(o,e=>{Q.failoverForm.target_model&&e(s)}),D(i),W(I(i,2),17,()=>Q.failoverForm.targets,ii,(e,t,n)=>{var r=oP(),i=P(r);ea(i),yO(I(i,2),{label:`Remove fallback model`,class:`table-action-btn-danger table-icon-btn vm-target-remove`,onclick:()=>Q.removeFailoverTarget(n),get disabled(){return Q.failoverFormManaged},children:(e,t)=>{J(e,{get icon(){return xl},class:`table-icon-svg`})},$$slots:{default:!0}}),D(r),L(()=>i.disabled=Q.failoverFormManaged),la(i,()=>R(t).model,e=>R(t).model=e),V(e,r)}),D(r);var c=I(r,2),l=P(c);J(P(l),{get icon(){return il},class:`form-action-icon`}),Ve(2),D(l);var u=I(l,2),d=P(u);J(d,{get icon(){return El},class:`form-action-icon`});var f=I(d,2),p=P(f,!0);D(f),D(u),D(c),L(e=>{a.disabled=Q.failoverFormManaged,l.disabled=Q.failoverFormManaged||Q.failoverGenerating||Q.failoverSaving,u.disabled=e,H(p,Q.failoverGenerating?`Generating...`:`Generate automatically`)},[()=>Q.failoverFormManaged||Q.failoverGenerating||Q.failoverSaving||!Q.failoverEnabled()]),la(a,()=>Q.failoverForm.target_model,e=>Q.failoverForm.target_model=e),z(`click`,l,()=>Q.addFailoverTarget()),z(`click`,u,()=>Q.generateFailoverForForm()),V(e,n)},$$slots:{default:!0}});var s=I(o,2),c=P(s);TN(P(c),{get enabled(){return Q.failoverForm.enabled},label:`failover mapping`,get disabled(){return Q.failoverFormManaged},onclick:()=>{Q.failoverFormManaged||(Q.failoverForm.enabled=!Q.failoverForm.enabled)}}),D(c),D(s),D(n),V(e,n)},$$slots:{header:!0,extraActions:!0,default:!0}})}k()}Br([`click`]);var uP=B(` `),dP=B(`
`),fP=B(``),pP=B(`
`),mP=B(`

No failover suggestions were generated.

`),hP=B(`

No failover drafts match the filter.

`),gP=B(``),_P=B(``);function vP(e,t){O(t,!0),Nu(e,{get open(){return Q.failoverDraftsOpen},variant:`editor`,onclose:()=>Q.closeFailoverDraftsModal(),children:(e,t)=>{var n=_P(),r=P(n),i=I(P(r),2),a=P(i),o=e=>{var t=uP(),n=P(t,!0);D(t),L(e=>H(n,e),[()=>Q.failoverDraftCountLabel()]),V(e,t)};U(a,e=>{Q.failoverGeneratedRules.length>0&&e(o)}),ku(I(a,2),{label:`Close failover drafts`,onclick:()=>Q.closeFailoverDraftsModal(),get disabled(){return Q.failoverDraftSaving}}),D(i),D(r);var s=I(r,2),c=e=>{_O(e,{label:`Generating failover drafts...`,class:`failover-drafts-loading`})};U(s,e=>{Q.failoverGenerating&&e(c)});var l=I(s,2),u=e=>{var t=dP(),n=P(t);SD(n,{placeholder:`Filter failover drafts...`,label:`Filter failover drafts`,get value(){return Q.failoverDraftFilter},set value(e){Q.failoverDraftFilter=e}});var r=I(n,2),i=P(r);J(i,{get icon(){return Mc},class:`form-action-icon`});var a=I(i,2),o=P(a,!0);D(a),D(r),D(t),L(e=>{r.disabled=Q.failoverDraftSaving,H(o,e)},[()=>Q.allFailoverDraftsSelected()?`Deselect all`:`Select all`]),z(`click`,r,()=>Q.toggleAllFailoverDrafts()),V(e,t)};U(l,e=>{!Q.failoverGenerating&&Q.failoverGeneratedRules.length>0&&e(u)});var d=I(l,2),f=e=>{var t=pP();W(t,21,()=>Q.filteredFailoverDrafts(),e=>`failover-draft:`+Q.failoverPrimaryModel(e),(e,t)=>{var n=fP(),r=P(n);ea(r);var i=I(r,2),a=P(i),o=P(a,!0);D(a);var s=I(a,2),c=P(s,!0);D(s),D(i),D(n),L((e,t,n,i)=>{na(r,e),r.disabled=Q.failoverDraftSaving,K(r,`aria-label`,t),H(o,n),H(c,i)},[()=>Q.failoverDraftSelected(R(t)),()=>`Select failover draft for `+Q.failoverPrimaryModel(R(t)),()=>Q.failoverPrimaryModel(R(t)),()=>Q.failoverTargetLabel(R(t))]),z(`change`,r,e=>Q.setFailoverDraftSelected(R(t),e.currentTarget.checked)),V(e,n)}),D(t),V(e,t)},p=A(()=>!Q.failoverGenerating&&Q.filteredFailoverDrafts().length>0);U(d,e=>{R(p)&&e(f)});var m=I(d,2),h=e=>{V(e,mP())};U(m,e=>{!Q.failoverGenerating&&Q.failoverGeneratedRules.length===0&&!Q.failoverError&&e(h)});var g=I(m,2),_=e=>{V(e,hP())},v=A(()=>!Q.failoverGenerating&&Q.failoverGeneratedRules.length>0&&Q.filteredFailoverDrafts().length===0);U(g,e=>{R(v)&&e(_)});var y=I(g,2),b=e=>{var t=gP(),n=P(t,!0);D(t),L(()=>H(n,Q.failoverError)),V(e,t)};U(y,e=>{Q.failoverError&&e(b)});var x=I(y,2),S=P(x),C=I(S,2),w=P(C);J(w,{get icon(){return cl},class:`form-action-icon`});var T=I(w,2),E=P(T,!0);D(T),D(C),D(x),D(n),L(e=>{S.disabled=Q.failoverDraftSaving,C.disabled=e,H(E,Q.failoverDraftSaving?`Saving...`:`Save selected`)},[()=>Q.failoverGenerating||Q.failoverDraftSaving||Q.selectedFailoverDraftCount()===0]),z(`click`,S,()=>Q.closeFailoverDraftsModal()),z(`click`,C,()=>Q.saveSelectedFailoverDrafts()),V(e,n)},$$slots:{default:!0}}),k()}Br([`click`,`change`]);var yP=B(`
Rate limit management is unavailable.
`),bP=B(` Add`,1),xP=B(`

`),SP=B(`

No rules.

`),CP=B(` Edit`,1),wP=B(`
`),TP=B(`
`),EP=B(`

`),DP=B(``),OP=B(``);function kP(e,t){O(t,!0);function n(){Y.dialogOpen||Z.closeRateLimitInspector()}Nu(e,{get open(){return Z.rateLimitInspectorOpen},variant:`editor`,onclose:n,children:(e,t)=>{var n=OP(),r=P(n),i=P(r),a=I(P(i),2),o=P(a),s=P(o,!0);D(o),D(a),D(i),ku(I(i,2),{label:`Close rate limits inspector`,onclick:()=>Z.closeRateLimitInspector()}),D(r);var c=I(r,2),l=e=>{_O(e,{label:`Loading rate limits...`})},u=e=>{V(e,yP())},d=e=>{var t=Xr();W(F(t),17,()=>Z.rateLimitInspectorSections(),e=>e.key,(e,t)=>{var n=EP(),r=P(n),i=P(r),a=P(i,!0);D(i);var o=I(i,2);{let e=A(()=>`Add `+R(t).title.toLowerCase());yO(o,{get label(){return R(e)},class:`budget-action-btn`,onclick:()=>Z.openRateLimitFormFromInspector(R(t).scope,R(t).subject),children:(e,t)=>{var n=bP();J(F(n),{get icon(){return il},class:`table-icon-svg`}),Ve(2),V(e,n)},$$slots:{default:!0}})}D(r);var s=I(r,2),c=e=>{var n=xP(),r=P(n,!0);D(n),L(()=>H(r,R(t).hint)),V(e,n)};U(s,e=>{R(t).hint&&e(c)});var l=I(s,2),u=e=>{V(e,SP())},d=e=>{var n=TP();W(n,21,()=>R(t).items,e=>Z.rateLimitKey(e),(e,t)=>{var n=wP(),r=P(n),i=P(r),a=P(i),o=P(a,!0);D(a);var s=I(a,2),c=P(s),l=P(c);{let e=A(()=>Z.rateLimitIsConcurrent(R(t))?xc:bl);J(l,{get icon(){return R(e)},class:`budget-period-icon`})}var u=I(l,2),d=P(u,!0);D(u),D(c),D(s);var f=I(s,2),p=P(f),m=P(p),h=P(m,!0);D(m);var g=I(m,2),_=P(g,!0);D(g),D(p);var v=I(p,2),y=P(v),b=e=>{yO(e,{label:`Edit rate limit`,class:`budget-action-btn`,onclick:()=>Z.openRateLimitFormFromInspector(null,null,R(t)),children:(e,t)=>{var n=CP();J(F(n),{get icon(){return nl},class:`budget-action-icon`}),Ve(2),V(e,n)},$$slots:{default:!0}})},x=A(()=>!Z.rateLimitIsReadOnly(R(t)));U(y,e=>{R(x)&&e(b)}),D(v),D(f),D(i),D(r),D(n),L((e,t,r,i,a,s,c,l)=>{G(n,1,`budget-row ${e??``}`),Bi(n,t),K(n,`title`,r),H(o,i),H(d,a),H(h,s),K(g,`title`,c),H(_,l)},[()=>Z.rateLimitPressureClass(R(t)),()=>Z.rateLimitPressureStyle(R(t)),()=>Z.rateLimitPressurePercent(R(t))+`% of the most constrained cap used`,()=>Z.rateLimitSubject(R(t)),()=>Z.rateLimitPeriodLabel(R(t)),()=>Z.rateLimitInspectorSummary(R(t)),()=>Z.rateLimitIsReadOnly(R(t))?`Declared in configuration; read-only in the dashboard`:`Managed via dashboard or admin API`,()=>Z.rateLimitSourceLabel(R(t))]),V(e,n)}),D(n),V(e,n)};U(l,e=>{R(t).items.length===0?e(u):e(d,-1)}),D(n),L(()=>H(a,R(t).title)),V(e,n)}),V(e,t)};U(c,e=>{Z.rateLimitsLoading?e(l):Z.rateLimitsAvailable?e(d,-1):e(u,1)});var f=I(c,2),p=P(f),m=I(p,2),h=e=>{var t=DP();z(`click`,t,()=>{Z.closeRateLimitInspector(),Bl.navigate(`rate-limits`)}),V(e,t)},g=A(()=>Z.rateLimitsEnabled());U(m,e=>{R(g)&&e(h)}),D(f),D(n),L(()=>H(s,Z.rateLimitInspector.title)),z(`click`,p,()=>Z.closeRateLimitInspector()),V(e,n)},$$slots:{default:!0}}),k()}Br([`click`]);var AP=B(`
models
`),jP=B(`
Virtual models feature is unavailable.
`),MP=B(`
`),NP=B(``),PP=B(`
`),FP=B(``),IP=B(`
`),LP=B(`

No models registered.

`),RP=B(`

No models in this category.

`),zP=B(`

No models match your filter.

`),BP=B(`
`);function VP(e,t){O(t,!0),On(()=>{Y.refreshTick,Bl.page===`models`&&(iM.fetchVirtualModels(),TM.fetchModelPricingOverrides(),Q.fetchFailoverRules(),Z.fetchRateLimitsPage())}),On(()=>{let e=iM.filteredDisplayModels.length;return wr(()=>iM.restartModelRendering(e)),()=>iM.stopModelRendering()});let n=A(()=>Y.needsAuth);var r=BP(),i=P(r),a=I(P(i),2),o=e=>{var t=AP(),n=P(t),r=P(n,!0);D(n),Ve(),D(t),L(()=>H(r,Id.filter?iM.filteredDisplayModels.length+` / `+iM.displayModels.length:iM.displayModels.length)),V(e,t)};U(a,e=>{iM.displayModels.length>0&&e(o)}),D(i);var s=I(i,2);Rd(s,{});var c=I(s,2),l=e=>{V(e,jP())};U(c,e=>{!iM.virtualModelsAvailable&&!R(n)&&e(l)});var u=I(c,2),d=e=>{var t=MP(),n=P(t,!0);D(t),L(()=>H(n,iM.aliasError)),V(e,t)};U(u,e=>{iM.aliasError&&!R(n)&&e(d)});var f=I(u,2),p=e=>{var t=MP(),n=P(t,!0);D(t),L(()=>H(n,TM.modelPricingOverrideError)),V(e,t)};U(f,e=>{TM.modelPricingOverrideError&&!R(n)&&!TM.modelPricingOverrideFormOpen&&e(p)});var m=I(f,2),h=e=>{var t=PP();W(t,21,()=>Id.categories,e=>e.category,(e,t)=>{var n=NP();let r;var i=P(n),a=P(i,!0);D(i);var o=I(i,2),s=P(o,!0);D(o),D(n),L(()=>{r=G(n,1,`category-tab svelte-scpjps`,null,r,{active:Id.activeCategory===R(t).category}),H(a,R(t).display_name),H(s,R(t).count)}),z(`click`,n,()=>Id.selectCategory(R(t).category)),V(e,n)}),D(t),V(e,t)};U(m,e=>{Id.categories.length>0&&e(h)});var g=I(m,2),_=e=>{var t=IP(),n=P(t);SD(P(n),{placeholder:`Filter by provider, provider/model, alias, or owner...`,label:`Filter models by provider, provider/model, alias, or owner`,get value(){return Id.filter},set value(e){Id.filter=e}}),D(n);var r=I(n,2),i=P(r),a=e=>{var t=FP();J(P(t),{get icon(){return il},class:`alias-create-icon`}),Ve(2),D(t),z(`click`,t,()=>iM.openVirtualModelCreate()),V(e,t)};U(i,e=>{iM.virtualModelsAvailable&&e(a)}),D(r),D(t),V(e,t)};U(g,e=>{(iM.displayModels.length>0||Id.filter||iM.virtualModelsAvailable)&&e(_)});var v=I(g,2),y=e=>{{let t=A(()=>iM.modelLoadingText());_O(e,{get label(){return R(t)},class:`models-loading-state`})}},b=A(()=>iM.modelsBusy()&&!R(n));U(v,e=>{R(b)&&e(y)});var x=I(v,2);WN(x,{});var S=I(x,2);tP(S,{});var C=I(S,2),w=e=>{CN(e,{})};U(C,e=>{(iM.displayModels.length>0||Id.filter)&&e(w)});var T=I(C,2),E=e=>{V(e,LP())};U(T,e=>{iM.displayModels.length===0&&!Id.loading&&!R(n)&&!Id.filter&&(Id.activeCategory===`all`||!Id.activeCategory)&&e(E)});var ee=I(T,2),te=e=>{V(e,RP())};U(ee,e=>{iM.displayModels.length===0&&!Id.loading&&!R(n)&&!Id.filter&&Id.activeCategory&&Id.activeCategory!==`all`&&e(te)});var ne=I(ee,2),re=e=>{V(e,zP())};U(ne,e=>{iM.displayModels.length>0&&iM.filteredDisplayModels.length===0&&Id.filter&&e(re)});var ie=I(ne,2);kP(ie,{});var ae=I(ie,2);RA(ae,{});var oe=I(ae,2);lP(oe,{}),vP(I(oe,2),{}),D(r),V(e,r),k()}Br([`click`]);var HP=`draft-workflow-preview`;function UP(){return{scope_provider:``,scope_model:``,scope_user_path:``,name:``,description:``,features:{cache:!0,audit:!0,usage:!0,budget:!0,guardrails:!1,failover:!0},guardrails:[]}}function WP(){return{scope_provider:``,scope_model:``,scope_user_path:``}}function GP(e){return{ref:``,step:Number.isFinite(e)?e:10}}function KP(e){let t=e==null?``:String(e).trim();if(t===``)return NaN;let n=Number(t);return Number.isFinite(n)?n:NaN}function qP(e,t,n){if(!e||typeof e!=`object`||Array.isArray(e))return n;let r=t.charAt(0).toUpperCase()+t.slice(1);for(let n of[t,r])if(Object.prototype.hasOwnProperty.call(e,n)&&e[n]!==null&&e[n]!==void 0)return e[n];return n}function JP(e,t){return!e||typeof e!=`object`||Array.isArray(e)?!1:[t,t.charAt(0).toUpperCase()+t.slice(1)].some(t=>Object.prototype.hasOwnProperty.call(e,t)&&e[t]!==null&&e[t]!==void 0)}function YP(e){return{cache:!!qP(e,`cache`,!1),audit:!!qP(e,`audit`,!1),usage:!!qP(e,`usage`,!1),budget:qP(e,`budget`,!0)!==!1,guardrails:!!qP(e,`guardrails`,!1),failover:qP(e,`failover`,!0)!==!1}}function XP(e,t){let n=YP(e),r=t||{},i=n.usage&&!!r.usage;return{cache:n.cache&&!!r.cache,audit:n.audit&&!!r.audit,usage:i,budget:i&&n.budget&&!!r.budget,guardrails:n.guardrails&&!!r.guardrails,failover:n.failover&&!!r.failover}}function ZP(e,t){let n=e&&e.workflow_payload&&e.workflow_payload.features?e.workflow_payload.features:e&&e.features?e.features:{};return{...XP((e&&e.effective_features&&typeof e.effective_features==`object`&&!Array.isArray(e.effective_features)?e.effective_features:null)||n,t),failover:YP(n).failover}}function QP(e,t){return ZP(e,t).failover?`On`:`Off`}function $P(e){return(Array.isArray(e&&e.workflow_payload&&e.workflow_payload.guardrails)?e.workflow_payload.guardrails:Array.isArray(e&&e.guardrails)?e.guardrails:[]).map(e=>({ref:String(e&&e.ref||``).trim(),step:KP(e&&e.step)})).filter(e=>Number.isInteger(e.step)&&e.step>=0)}function eF(e,t){return ZP(e,t).guardrails&&Array.isArray(e&&e.workflow_payload&&e.workflow_payload.guardrails)?e.workflow_payload.guardrails:[]}function tF(e){return String(e&&(e.scope_provider_name||e.scope_provider)||``).trim()}function nF(e){return String(e&&(e.provider_name||e.provider_type)||``).trim()}function rF(e,t){let n=new Set,r=String(t&&t.scope_provider||``).trim();return r&&n.add(r),(Array.isArray(e)?e:[]).forEach(e=>{let t=nF(e);t&&n.add(t)}),[...n].sort()}function iF(e,t,n){let r=String(t||``).trim(),i=new Set,a=String(n&&n.scope_provider||``).trim(),o=String(n&&n.scope_model||``).trim();return r&&r===a&&o&&i.add(o),(Array.isArray(e)?e:[]).forEach(e=>{if(r&&nF(e)!==r)return;let t=String(e&&e.model&&e.model.id||``).trim();t&&i.add(t)}),[...i].sort()}function aF(e){let t=String(e&&e.scope_type||``).trim();return t===`provider_model`?`Provider Name + Model`:t===`provider_model_path`?`Provider Name + Model + Path`:t===`provider_path`?`Provider Name + Path`:t===`path`?`Path`:t===`provider`?`Provider Name`:`Global`}function oF(e){return String(e&&e.scope_display||`global`).trim()||`global`}function sF(e){let t=String(e&&e.name||``).trim();if(t)return t;let n=oF(e);return n===`global`?`All models`:n}function cF(e){let t=String(e||``).trim();if(!t)return``;let n=(t.startsWith(`/`)?t:`/`+t).split(`/`);for(let e of n){let t=String(e||``).trim();if(t){if(t===`.`||t===`..`)return`User path cannot contain "." or ".." segments.`;if(t.includes(`:`))return`User path cannot contain ":" segments.`}}return``}function lF(e){if(cF(e))return``;let t=String(e||``).trim();if(!t)return``;let n=(t.startsWith(`/`)?t:`/`+t).split(`/`),r=[];for(let e of n){let t=String(e||``).trim();t&&r.push(t)}return r.length?`/`+r.join(`/`):`/`}function uF(e){let t=e||UP(),n=String(t.scope_provider||``).trim(),r=lF(t.scope_user_path);return{scope_provider:n,scope_model:n?String(t.scope_model||``).trim():``,scope_user_path:r}}function dF(e){let t=String(e&&e.scope_provider||``).trim(),n=t?String(e&&e.scope_model||``).trim():``,r=lF(e&&e.scope_user_path);return!t&&!r?`global`:!t&&r?`path`:!n&&!r?`provider`:!n&&r?`provider_path`:r?`provider_model_path`:`provider_model`}function fF(e){let t=String(e&&e.scope_provider||``).trim(),n=t?String(e&&e.scope_model||``).trim():``,r=lF(e&&e.scope_user_path),i=dF({scope_provider:t,scope_model:n,scope_user_path:r});return i===`global`?`global`:i===`path`?r:i===`provider`?t:i===`provider_path`?t+` @ `+r:i===`provider_model_path`?t+`/`+n+` @ `+r:t+`/`+n}function pF(e,t){let n=t||WP(),r=tF(e&&e.scope),i=r?String(e&&e.scope&&e.scope.scope_model||``).trim():``,a=lF(e&&e.scope&&e.scope.scope_user_path);return r===String(n.scope_provider||``).trim()&&i===String(n.scope_model||``).trim()&&a===lF(n.scope_user_path)}function mF(e,t,n){let r=uF(t);return!(r.scope_provider!==``||r.scope_model!==``||r.scope_user_path!==``)&&!n?null:(Array.isArray(e)?e:[]).find(e=>pF(e,r))||null}function hF(e){return String(e&&e.scope_type||``).trim()!==`global`}function gF(e){let t=String(e||``).trim();return t?t.length<=14?t:t.slice(0,12)+`…`:`—`}function _F(e,t){let n=Array.isArray(e)?e:[];if(!t)return n;let r=String(t).toLowerCase();return n.filter(e=>[e.name,e.description,e.scope_display,e.scope_type,tF(e&&e.scope),e.scope&&e.scope.scope_model,e.scope&&e.scope.scope_user_path,e.workflow_hash,...Array.isArray(e.workflow_payload&&e.workflow_payload.guardrails)?e.workflow_payload.guardrails.map(e=>e.ref):[]].some(e=>String(e||``).toLowerCase().includes(r)))}function vF(e,t){let n=e||UP(),r=uF(n),i=YP(n.features||{}),a=XP(i,t);a.failover=i.failover;let o=!!a.guardrails,s=o?$P(n):[];return{id:HP,scope_type:dF(r),scope_display:fF(r),scope:{scope_provider_name:r.scope_provider,scope_model:r.scope_model,...r.scope_user_path?{scope_user_path:r.scope_user_path}:{}},name:String(n.name||``).trim(),description:String(n.description||``).trim(),workflow_payload:{schema_version:1,features:{cache:!!a.cache,audit:!!a.audit,usage:!!a.usage,budget:!!a.budget,guardrails:o,failover:!!a.failover},guardrails:s}}}function yF({form:e,caps:t,workflows:n=[],formHydrated:r=!1,hydratedScope:i=null}){let a=e||UP(),o=String(a.scope_provider||``).trim(),s=o?String(a.scope_model||``).trim():``,c=lF(a.scope_user_path),l=YP(a.features||{}),u=XP(l,t),d=mF(n,a,r),f=d&&d.workflow_payload&&d.workflow_payload.features,p=JP(f,`failover`),m=p?qP(f,`failover`,!0)!==!1:null,h=i||WP(),g=String(h.scope_provider||``).trim()===o&&String(h.scope_model||``).trim()===s&&lF(h.scope_user_path)===lF(c),_=!!(t&&t.failover),v=_||!!r&&g&&Object.prototype.hasOwnProperty.call(l,`failover`)||!r&&!!d&&p,y=u.guardrails?(Array.isArray(a.guardrails)?a.guardrails:[]).map(e=>({ref:String(e&&e.ref||``).trim(),step:KP(e&&e.step)})):[],b={scope_provider_name:o,scope_model:s,...c?{scope_user_path:c}:{},name:String(a.name||``).trim(),description:String(a.description||``).trim(),workflow_payload:{schema_version:1,features:{cache:!!u.cache,audit:!!u.audit,usage:!!u.usage,budget:!!u.budget,guardrails:!!u.guardrails},guardrails:y}};return v&&(b.workflow_payload.features.failover=!_&&!r&&d&&p?m:!!l.failover),b}function bF(e,{models:t=[],hydratedScope:n=null}={}){let r=n||WP(),i=String(r.scope_provider||``).trim(),a=String(r.scope_model||``).trim(),o=String(e&&(e.scope_provider_name||e.scope_provider)||``).trim(),s=String(e&&e.scope_model||``).trim();if(o&&!rF(t,r).includes(o)&&o!==i)return`Choose a registered provider name.`;if(s&&!o)return`Model selection requires a provider name.`;if(s){let e=iF(t,o,r),n=o===i&&s===a;if(!e.includes(s)&&!n)return`Choose a registered model for the selected provider name.`}let c=cF(e.scope_user_path);if(c)return c;let l=e.workflow_payload&&e.workflow_payload.features?e.workflow_payload.features:{},u=Array.isArray(e.workflow_payload&&e.workflow_payload.guardrails)?e.workflow_payload.guardrails:[];if(!l.guardrails)return``;let d=new Set;for(let e of u){if(!e.ref)return`Each guardrail step needs a guardrail ref.`;if(!Number.isInteger(e.step)||e.step<0)return`Each guardrail step must use a non-negative integer step number.`;if(d.has(e.ref))return`Each guardrail ref may appear only once in a workflow.`;d.add(e.ref)}return``}var xF=new class{#e=j(N([]));get workflows(){return R(this.#e)}set workflows(e){M(this.#e,e,!0)}#t=j(!0);get available(){return R(this.#t)}set available(e){M(this.#t,e,!0)}#n=j(!1);get loading(){return R(this.#n)}set loading(e){M(this.#n,e,!0)}#r=j(``);get error(){return R(this.#r)}set error(e){M(this.#r,e,!0)}#i=j(``);get filter(){return R(this.#i)}set filter(e){M(this.#i,e,!0)}#a=j(!1);get formOpen(){return R(this.#a)}set formOpen(e){M(this.#a,e,!0)}#o=j(!1);get submitting(){return R(this.#o)}set submitting(e){M(this.#o,e,!0)}#s=j(``);get deactivatingID(){return R(this.#s)}set deactivatingID(e){M(this.#s,e,!0)}#c=j(``);get formError(){return R(this.#c)}set formError(e){M(this.#c,e,!0)}#l=j(!1);get formHydrated(){return R(this.#l)}set formHydrated(e){M(this.#l,e,!0)}#u=j(N(WP()));get hydratedScope(){return R(this.#u)}set hydratedScope(e){M(this.#u,e,!0)}#d=j(N([]));get guardrailRefs(){return R(this.#d)}set guardrailRefs(e){M(this.#d,e,!0)}#f=j(N(UP()));get form(){return R(this.#f)}set form(e){M(this.#f,e,!0)}#p=null;failoverVisible(){return bu.booleanFlag(`FAILOVER_ENABLED`,!0)}featureCaps(){return{cache:bu.cacheVisible(),audit:bu.auditVisible(),usage:bu.usageVisible(),budget:bu.budgetsVisible(),guardrails:bu.guardrailsVisible(),failover:this.failoverVisible()}}get filteredWorkflows(){return _F(this.workflows,this.filter)}providerOptions(){return rF(Id.models,this.hydratedScope)}modelOptions(e){return iF(Id.models,e,this.hydratedScope)}activeScopeMatch(){return mF(this.workflows,this.form,this.formHydrated)}submitMode(){return this.activeScopeMatch()?`save`:`create`}submitLabel(){return this.submitMode()===`save`?`Save`:`Create`}submittingLabel(){return this.submitMode()===`save`?`Saving...`:`Creating...`}preview(){return vF(this.form,this.featureCaps())}openCreate(e){if(this.formOpen=!0,this.submitting=!1,this.formError=``,!e){this.formHydrated=!1,this.hydratedScope=WP(),this.form=UP();return}this.formHydrated=!0,this.hydratedScope={scope_provider:tF(e.scope),scope_model:String(e.scope&&e.scope.scope_model||``).trim(),scope_user_path:String(e.scope&&e.scope.scope_user_path||``).trim()};let t=e.workflow_payload&&e.workflow_payload.features?YP(e.workflow_payload.features):ZP(e,this.featureCaps()),n=Array.isArray(e.workflow_payload&&e.workflow_payload.guardrails)?e.workflow_payload.guardrails.map(e=>({ref:String(e&&e.ref||``).trim(),step:KP(e&&e.step)})).filter(e=>Number.isInteger(e.step)&&e.step>=0):$P(e);this.form={scope_provider:tF(e.scope),scope_model:String(e.scope&&e.scope.scope_model||``),scope_user_path:String(e.scope&&e.scope.scope_user_path||``),name:String(e.name||``),description:String(e.description||``),features:{cache:!!t.cache,audit:!!t.audit,usage:!!t.usage,budget:!!t.budget,guardrails:!!t.guardrails,failover:!!t.failover},guardrails:n.map(e=>({ref:String(e&&e.ref||``),step:Number.isFinite(e&&e.step)?e.step:10}))}}closeForm(){this.formOpen=!1,this.submitting=!1,this.formError=``,this.formHydrated=!1,this.hydratedScope=WP(),this.form=UP()}setProvider(e){if(this.form.scope_provider=String(e||``).trim(),!this.form.scope_provider){this.form.scope_model=``;return}this.modelOptions(this.form.scope_provider).includes(String(this.form.scope_model||``).trim())||(this.form.scope_model=``)}addGuardrailStep(){let e=(Array.isArray(this.form.guardrails)?this.form.guardrails:[]).reduce((e,t)=>{let n=Number(t&&t.step);return Number.isFinite(n)?Math.max(e,n):e},0)+10;this.form.guardrails.push(GP(e))}removeGuardrailStep(e){Array.isArray(this.form.guardrails)&&this.form.guardrails.splice(e,1)}buildRequest(){return yF({form:this.form,caps:this.featureCaps(),workflows:this.workflows,formHydrated:this.formHydrated,hydratedScope:this.hydratedScope})}async fetchWorkflows(){this.#p&&this.#p.abort();let e=new AbortController;this.#p=e,this.loading=!0,this.error=``;let t=setTimeout(()=>e.abort(),1e4),n=await bO(`/admin/workflows`,{label:`workflows`,options:{signal:e.signal}});if(clearTimeout(t),this.#p===e&&(this.#p=null,this.loading=!1,n.status!==`stale`)){if(n.status===`unavailable`){this.available=!1,this.workflows=[];return}if(n.result&&(this.available=!0),n.status===`error`){this.workflows=[],this.error=e.signal.aborted?`Loading workflows timed out.`:n.error;return}this.workflows=n.items}}async fetchGuardrailRefs(){let e=await bO(`/admin/workflows/guardrails`,{label:`workflow guardrails`});e.status!==`stale`&&(this.guardrailRefs=e.items)}async fetchPage(){await Promise.all([bu.ensureLoaded(),this.fetchWorkflows(),this.fetchGuardrailRefs()])}async submitForm(){if(this.submitting)return;this.formError=``;let e=this.buildRequest(),t=bF(e,{models:Id.models,hydratedScope:this.hydratedScope});if(t){this.formError=t;return}this.submitting=!0;try{let t=await xO(`/admin/workflows`,`POST`,e,{label:`create workflow`,unavailableStatuses:[]});if(t.status===`stale`||t.result&&t.result.status===401)return;if(t.status===`error`){this.formError=t.error;return}ed.success(`Workflow created and activated.`),this.closeForm(),this.fetchPage()}finally{this.submitting=!1}}async deactivate(e){let t=String(e&&e.id||``).trim();if(!t||this.deactivatingID||!hF(e))return;let n=sF(e);if(confirm(`Deactivate workflow "`+n+`"? Requests will fall back to the next active workflow for this scope.`)){this.deactivatingID=t;try{let e=await xO(`/admin/workflows/`+encodeURIComponent(t)+`/deactivate`,`POST`,void 0,{label:`deactivate workflow`,unavailableStatuses:[]});if(e.status===`stale`||e.result&&e.result.status===401)return;if(e.status===`error`){ed.error(e.error);return}ed.success(`Workflow deactivated.`),this.fetchPage()}finally{this.deactivatingID=``}}}};function SF(e){let t=String(e??``),n=typeof navigator<`u`?navigator.clipboard:null;if(n&&typeof n.writeText==`function`)return n.writeText(t);let r=typeof document<`u`?document:null;if(!r||!r.body||typeof r.execCommand!=`function`)return Promise.reject(Error(`Clipboard API unavailable`));let i=r.createElement(`textarea`);i.value=t,i.setAttribute(`readonly`,``),i.style.position=`fixed`,i.style.top=`0`,i.style.left=`0`,i.style.opacity=`0`;try{if(r.body.appendChild(i),i.focus(),i.select(),i.setSelectionRange(0,i.value.length),!r.execCommand(`copy`))throw Error(`execCommand copy returned false`)}finally{i.parentNode&&i.parentNode.removeChild(i)}return Promise.resolve()}function CF({resetDelayMs:e=2e3,logPrefix:t}={}){let n=N({copied:!1,error:!1}),r=null;function i(){r!==null&&clearTimeout(r),r=null}function a(){i(),r=setTimeout(()=>{n.copied=!1,n.error=!1,r=null},e)}return{get copied(){return n.copied},get error(){return n.error},reset(){i(),n.copied=!1,n.error=!1},async copy(e,r){if(!(e==null||e===``)){i(),n.copied=!1,n.error=!1;try{await SF(typeof r==`function`?r(e):String(e)),n.copied=!0,n.error=!1}catch(e){console.error(t||`Failed to copy text:`,e),n.copied=!1,n.error=!0}a()}}}}var wF=B(``);function TF(e,t){O(t,!0);let n=q(t,`workflowID`,3,``),r=CF({logPrefix:`Failed to copy workflow ID:`});On(()=>{n(),r.reset()});let i=A(()=>r.error?`Unable to copy workflow ID`:r.copied?`Workflow ID copied`:`Copy workflow ID`),a=A(()=>n()?R(i)+` `+n():R(i));async function o(e){e.preventDefault(),n()&&await r.copy(n())}var s=wF();let c;var l=I(P(s),4),u=P(l,!0);D(l);var d=I(l,2);J(P(d),{get icon(){return Bc}}),D(d),D(s),L(()=>{c=G(s,1,`workflow-pipeline-meta mono svelte-1viff7o`,null,c,{"workflow-pipeline-meta-copied":r.copied,"workflow-pipeline-meta-error":r.error}),K(s,`title`,R(i)),K(s,`aria-label`,R(a)),H(u,n())}),z(`click`,s,o),V(e,s),k()}Br([`click`]);var EF=(e,t)=>{let n=()=>(t?.()).icon,r=()=>(t?.()).label,i=Et(()=>h((t?.()).variant,`workflow-node-feature`)),a=()=>(t?.()).state,o=()=>(t?.()).sub,s=()=>(t?.()).badge;var c=AF(),l=P(c),u=e=>{var t=DF();let r;J(P(t),{get icon(){return n()}}),D(t),L(()=>r=G(t,1,`workflow-node-icon svelte-nbptrg`,null,r,{"workflow-node-icon-endpoint":R(i)===`workflow-node-endpoint`})),V(e,t)};U(l,e=>{n()&&e(u)});var d=I(l,2),f=P(d,!0);D(d);var p=I(d,2),m=e=>{var t=OF(),n=P(t,!0);D(t),L(()=>H(n,s())),V(e,t)};U(p,e=>{s()&&e(m)});var g=I(p,2),_=e=>{var t=kF(),n=P(t,!0);D(t),L(()=>H(n,o())),V(e,t)};U(g,e=>{o()&&e(_)}),D(c),L(()=>{G(c,1,Ni([`workflow-node`,R(i),a()]),`svelte-nbptrg`),H(f,r())}),V(e,c)},DF=B(`
`),OF=B(` `),kF=B(` `),AF=B(`
`),jF=B(`
`,1),MF=B(`
`,1),NF=B(`
`),PF=B(`
Async
`),FF=B(`
`);function IF(e,t){O(t,!0);let n=q(t,`chart`,19,()=>({}));var r=FF();let i;var a=P(r),o=e=>{TF(e,{get workflowID(){return n().workflowID}})};U(a,e=>{n().workflowID&&e(o)});var s=I(a,2),c=P(s);EF(c,()=>({icon:wl,label:`Client`,variant:`workflow-node-endpoint`}));var l=I(c,4);EF(l,()=>({icon:Hc,label:`Auth`,state:n().authNodeClass,sub:n().authNodeSublabel}));var u=I(l,2),d=e=>{var t=jF(),r=F(t);EF(I(r,2),()=>({icon:Hc,label:`Cache`,state:n().cacheNodeClass,badge:n().cacheStatusLabel})),L(()=>G(r,1,Ni([`workflow-conn`,n().cacheConnClass]),`svelte-nbptrg`)),V(e,t)};U(u,e=>{n().showCache&&e(d)});var f=I(u,2),p=e=>{var t=MF();EF(I(F(t),2),()=>({icon:Tl,label:`Budget`,state:n().budgetNodeClass,badge:n().budgetStatusLabel})),V(e,t)};U(f,e=>{n().showBudget&&e(p)});var m=I(f,2),h=e=>{var t=MF();EF(I(F(t),2),()=>({icon:gl,label:`Guardrails`,sub:n().guardrailLabel})),V(e,t)};U(m,e=>{n().showGuardrails&&e(h)});var g=I(m,2),_=I(g,2);EF(_,()=>({label:n().aiLabel,variant:`workflow-node-ai`,state:n().aiNodeClass,sub:n().aiSublabel}));var v=I(_,2),y=e=>{var t=jF(),r=F(t);EF(I(r,2),()=>({icon:Qc,label:`Failover`,state:n().failoverNodeClass,badge:n().failoverStatusLabel,sub:n().failoverTargetLabel})),L(()=>G(r,1,Ni([`workflow-conn`,n().failoverConnClass]),`svelte-nbptrg`)),V(e,t)};U(v,e=>{n().showFailover&&e(y)});var b=I(v,2);EF(I(b,2),()=>({icon:Ic,label:`Response`,variant:`workflow-node-endpoint`,state:n().responseNodeClass,sub:n().responseNodeSublabel})),D(s);var x=I(s,2),S=e=>{var t=PF(),r=P(t),i=P(r),a=e=>{EF(e,()=>({icon:Ac,label:`Usage`,variant:`workflow-node-feature workflow-node-async`,state:n().usageNodeClass}))};U(i,e=>{n().showUsage&&e(a)});var o=I(i,2),s=e=>{V(e,NF())};U(o,e=>{n().showUsage&&n().showAudit&&e(s)});var c=I(o,2),l=e=>{EF(e,()=>({icon:Uc,label:`Audit Log`,variant:`workflow-node-feature workflow-node-async`,state:n().auditNodeClass}))};U(c,e=>{n().showAudit&&e(l)}),D(r),Ve(4),D(t),V(e,t)};U(x,e=>{n().showAsync&&e(S)}),D(r),L(()=>{i=G(r,1,`workflow-pipeline svelte-nbptrg`,null,i,{"workflow-pipeline-has-meta":n().workflowID}),G(g,1,Ni([`workflow-conn`,n().aiConnClass]),`svelte-nbptrg`),G(b,1,Ni([`workflow-conn`,n().responseConnClass]),`svelte-nbptrg`)}),V(e,r),k()}function LF(e){let t=$P(e).length;return t===0?``:t===1?`1 step`:t+` steps`}function RF(e,t){return t&&t.provider?t.provider:tF(e&&e.scope)||`AI`}function zF(e,t){return t&&t.model?t.model:e&&e.scope&&e.scope.scope_model||null}function BF(e,t){let n=String(e&&e.id||``).trim();if(n&&n!==`draft-workflow-preview`)return n;let r=String(t&&t.workflow_version_id||``).trim();return r&&r!==`draft-workflow-preview`?r:null}function VF(e){let t=e&&e.data&&e.data.workflow_features;return!t||typeof t!=`object`||Array.isArray(t)?null:YP(t)}function HF(e){let t=e&&e.data&&e.data.failover;if(!t||typeof t!=`object`||Array.isArray(t))return null;let n=String(t.target_model||t.targetModel||``).trim()||null;return n?{targetModel:n}:null}function UF(e,t=0){if(t>4||e==null)return``;if(typeof e==`string`){let n=e.trim();if(!n||n[0]!==`{`&&n[0]!==`[`)return``;try{return UF(JSON.parse(n),t+1)}catch{return``}}if(Array.isArray(e)){for(let n of e){let e=UF(n,t+1);if(e)return e}return``}return typeof e==`object`?String(e.code||``).trim()||(e.error===void 0?``:UF(e.error,t+1)):``}function WF(e){let t=e&&e.data&&typeof e.data==`object`&&!Array.isArray(e.data)?e.data:{};return String(t.error_code||t.errorCode||``).trim()||UF(t.response_body)}function GF(e){let t=String(e||``).trim();if(!t)return null;let n=t.indexOf(`/`);return n<=0||n>=t.length-1?null:{provider:t.slice(0,n),model:t.slice(n+1)}}function KF(e,t){let n=String(e&&(e.requested_model||e.model)||``).trim(),r=HF(e);if(!(r&&r.targetModel))return{provider:String(e&&e.provider||``).trim()||null,model:n||null};let i=GF(n);if(i)return i;let a=tF(t&&t.scope),o=a?String(t&&t.scope&&t.scope.scope_model||``).trim():``;return a||o?{provider:a||null,model:o||n||null}:{provider:null,model:n||null}}function qF(e,t){if(!e)return null;let n=(()=>{let t=String(e.cache_type||``).trim().toLowerCase();return t===`exact`||t===`semantic`?t:null})(),r=(()=>{if(e.status_code===void 0||e.status_code===null)return null;let t=String(e.status_code).trim();if(!t)return null;let n=Number(t);return Number.isFinite(n)?n:null})(),i=n?!0:e.cache_hit!==void 0&&e.cache_hit!==null&&!!e.cache_hit,a=HF(e),o=KF(e,t),s=Number.isFinite(r)&&r>=200&&r<300,c=String(e.error_type||``).trim().toLowerCase()===`authentication_error`,l=String(e.auth_method||``).trim().toLowerCase()||null,u=WF(e).toLowerCase()===`budget_exceeded`;return{cacheHit:i,cacheType:n||null,failoverTarget:a&&a.targetModel?a.targetModel:null,provider:o.provider,model:o.model,statusCode:r,responseSuccess:s,aiSuccess:s&&!i,authError:c,authMethod:l,budgetExceeded:u}}function JF(e){return!!(e&&e.cacheHit)}function YF(e){return!!(e&&e.failoverTarget)}function XF(e){return!!(e&&e.budgetExceeded)}function ZF(e,t){return t?`workflow-node-current`:e&&e.cacheHit?`workflow-node-success`:``}function QF(e){return e&&e.cacheHit?`workflow-conn-hit`:``}function $F(e){return!e||!e.cacheHit?null:e.cacheType===`semantic`?`Hit (Semantic)`:`Hit (Exact)`}function eI(e,t,n,r){return e?XF(t)?`workflow-node-error`:r?`workflow-node-current`:n?`workflow-node-success`:``:``}function tI(e){return XF(e)?`Exceeded`:null}function nI(e){return e&&e.cacheHit?`workflow-node-skipped`:e&&e.failoverTarget?`workflow-node-success`:``}function rI(e){return e&&e.cacheHit?`workflow-conn-dim`:e&&e.failoverTarget?`workflow-conn-hit`:``}function iI(e){return e&&e.failoverTarget?`Redirected`:null}function aI(e){return e&&e.failoverTarget?e.failoverTarget:null}function oI(e){return e&&e.cacheHit?`workflow-conn-dim`:``}function sI(e,t){return e?e.cacheHit?`workflow-node-skipped`:t?`workflow-node-current`:e.aiSuccess?`workflow-node-success`:``:``}function cI(e,t){if(!e)return``;let n=e.statusCode;return!Number.isFinite(n)&&t?`workflow-node-current`:Number.isFinite(n)?n>=500?`workflow-node-error`:n>=400?`workflow-node-warning`:n>=300?`workflow-node-neutral`:n>=200?`workflow-node-success`:``:``}function lI(e){return!e||!Number.isFinite(e.statusCode)?null:String(e.statusCode)}function uI(e,t){return e?e.authError?`workflow-node-error`:t?`workflow-node-current`:e.authMethod===`api_key`||e.authMethod===`master_key`?`workflow-node-success`:``:``}function dI(e){return!e||!e.authMethod?null:e.authMethod}function fI(e,t,n){return e?n?`workflow-node-current`:t?`workflow-node-success`:``:``}function pI(e,t){if(!e||!e._live)return!!t;let n=String(e._live_state||``).trim();return!!e._audit_flushed||n===`audit.flushed`||n===`audit.detail`}function mI(e,t){if(!e)return!!t;let n=e.usage||{},r=Number(n.entries||0)>0;if(!e._live)return r;let i=String(e._usage_live_state||``).trim();return e._usage_flushed||i===`usage.flushed`?!0:!e._usage_live_pending&&r&&!e._live_pending}function hI(e){return!!(e&&e._live&&e._usage_live_pending&&!e._usage_flushed)}function gI(e,t){return!e||!e._live||pI(e,!1)?!1:String(e._live_state||``).trim()===`audit.completed`||!!(t&&Number.isFinite(t.statusCode))}function _I(e,t,n){return!e||!e._live?``:hI(e)?`usage`:gI(e,t)?`audit`:pI(e,!1)&&!e._live_pending?``:t&&t.cacheHit?`cache`:t&&(t.provider||t.model)?`ai`:n&&n.budget&&(e.workflow_version_id||e.requested_model)?`budget`:t&&t.authMethod?``:`auth`}function vI(e,t,n,r){let i=n||{},a=i.features&&typeof i.features==`object`&&!Array.isArray(i.features)?YP(i.features):ZP(e,r),o=!!i.forceAudit,s=!!i.highlightAsyncPresent,c=!!a.budget||XF(t),l=!!a.guardrails,u=!!a.usage,d=o||!!a.audit,f=!!i.forceAsync||!!(u||d),p=!!a.failover||YF(t),m=BF(e,i.entry),h=_I(i.entry,t,a),g=hI(i.entry),_=gI(i.entry,t),v=pI(i.entry,s),y=mI(i.entry,s);return{showBudget:c,budgetNodeClass:eI(c,t,s,h===`budget`),budgetStatusLabel:tI(t),showGuardrails:l,guardrailLabel:l?LF(e):``,showCache:!!i.forceCache||!!a.cache||JF(t),cacheNodeClass:ZF(t,h===`cache`),cacheConnClass:QF(t),cacheStatusLabel:$F(t),showFailover:p,failoverNodeClass:p?nI(t):``,failoverConnClass:p?rI(t):``,failoverStatusLabel:p?iI(t):null,failoverTargetLabel:p?aI(t):null,aiLabel:RF(e,t),aiSublabel:zF(e,t),aiConnClass:oI(t),aiNodeClass:sI(t,h===`ai`),responseConnClass:oI(t),responseNodeClass:cI(t,h===`response`),responseNodeSublabel:lI(t),authNodeClass:uI(t,h===`auth`),authNodeSublabel:dI(t),usageNodeClass:fI(u,y,g),auditNodeClass:fI(d,v,_),showAsync:f,showUsage:u,showAudit:d,workflowID:m}}function yI(e,t){return vI(e,null,{forceCache:!1},t)}function bI(e,t,n){return vI(t,qF(e,t),{entry:e,features:VF(e)||(t?ZP(t,n):{cache:!1,audit:!1,usage:!1,budget:!1,guardrails:!1,failover:!1}),forceAudit:!0,forceAsync:!0,highlightAsyncPresent:!0},n)}var xI=B(`

`),SI=B(`

`),CI=B(`
`),wI=B(`
`),TI=B(`

No guardrails configured for this workflow.

`),EI=B(`

Guardrails

`),DI=B(``),OI=B(`

`);function kI(e,t){O(t,!0);let n=q(t,`preview`,3,!1),r=A(()=>xF.featureCaps()),i=A(()=>sF(t.workflow)),a=A(()=>eF(t.workflow,R(r))),o=A(()=>yI(t.workflow,R(r))),s=A(()=>n()?`draft-workflow-preview-guardrail-`:t.workflow.id+`-guardrail-`);var c=OI();let l;var u=P(c),d=P(u),f=P(d),p=P(f,!0);D(f);var m=I(f,2),h=P(m,!0);D(m),D(d);var g=I(d,2),_=P(g),v=P(_,!0);D(_),D(g),D(u);var y=I(u,2),b=e=>{var n=xI(),r=P(n,!0);D(n),L(()=>H(r,t.workflow.description)),V(e,n)};U(y,e=>{t.workflow.description&&e(b)});var x=I(y,2),S=e=>{var n=SI(),i=P(n);D(n),L(e=>H(i,`Failover: ${e??``}`),[()=>QP(t.workflow,R(r))]),V(e,n)},C=A(()=>xF.failoverVisible());U(x,e=>{R(C)&&e(S)});var w=I(x,2);IF(w,{get chart(){return R(o)}});var T=I(w,2),E=e=>{var t=EI(),n=P(t),r=I(P(n),2),i=P(r,!0);D(r),D(n);var o=I(n,2),c=e=>{var t=wI();W(t,23,()=>R(a),(e,t)=>R(s)+t,(e,t)=>{var n=CI(),r=P(n),i=P(r,!0);D(r);var a=I(r,2),o=P(a);D(a),D(n),L(()=>{H(i,R(t).ref),H(o,`step ${R(t).step??``}`)}),V(e,n)}),D(t),V(e,t)},l=e=>{V(e,TI())};U(o,e=>{R(a).length>0?e(c):e(l,-1)}),D(t),L(()=>H(i,R(a).length?R(a).length+` steps`:`None`)),V(e,t)},ee=A(()=>bu.guardrailsVisible());U(T,e=>{R(ee)&&e(E)});var te=I(T,2),ne=e=>{var n=DI(),r=P(n),a=P(r),o=P(a,!0);D(a);var s=I(a,2);{let e=A(()=>`Edit workflow `+R(i));yO(s,{get label(){return R(e)},class:`table-icon-btn`,onclick:()=>xF.openCreate(t.workflow),children:(e,t)=>{J(e,{get icon(){return nl},class:`table-icon-svg`})},$$slots:{default:!0}})}D(r);var c=I(r,2),l=P(c),u=P(l);D(l);var d=I(l,2),f=P(d);D(d);var p=I(d,2),m=P(p);D(p),D(c),D(n),L((e,n,r,s)=>{a.disabled=e,K(a,`aria-label`,`Deactivate workflow `+R(i)),K(a,`title`,n),H(o,xF.deactivatingID===t.workflow.id?`Deactivating...`:`Deactivate`),H(u,`version: v${t.workflow.version??``}`),H(f,`created: ${r??``}`),H(m,`hash: ${s??``}`)},[()=>xF.deactivatingID===t.workflow.id||!hF(t.workflow),()=>hF(t.workflow)?`Deactivate active workflow`:`The global workflow cannot be deactivated.`,()=>lu.formatTimestamp(t.workflow.created_at),()=>gF(t.workflow.workflow_hash)]),z(`click`,a,()=>xF.deactivate(t.workflow)),V(e,n)};U(te,e=>{n()||e(ne)}),D(c),L((e,t)=>{l=G(c,1,`workflow-card svelte-1fo9fvq`,null,l,{"workflow-preview-card":n()}),H(p,e),H(h,R(i)),H(v,t)},[()=>aF(t.workflow),()=>oF(t.workflow)]),V(e,c),k()}Br([`click`]);var AI=B(`

`),jI=B(``),MI=B(``),NI=B(``),PI=B(``),FI=B(``),II=B(``),LI=B(``),RI=B(``),zI=B(``),BI=B(``),VI=B(``),HI=B(``),UI=B(`
No named guardrails are currently registered on this deployment. You can still draft a workflow, but guardrail-backed creation may be rejected.
`),WI=B(`
`),GI=B(`
`),KI=B(`

No guardrail steps configured yet.

`),qI=B(`

Guardrail Steps

Guardrails in the same numeric step run together. Later steps wait for earlier ones to finish.

`),JI=B(`

Leave provider name empty to target all providers and models. Select a provider name without a model to target all models for that configured provider.

Add a path to scope the workflow to that subtree. Leading slashes are optional and will be normalized; you can enter "team/alpha" or "/team/alpha". Matching checks the deepest user path first, then falls back toward the root.

If you leave the name empty, the workflow will display as the matched provider/model scope or “All models”.

Preview

Live
`,1);function YI(e,t){O(t,!0);{let t=e=>{YT(e,{copyId:`workflow-help-copy`,label:`workflow help`,text:`Create immutable version. Submitting activates it for the selected scope.`,title:e=>{var t=AI(),n=P(t,!0);D(t),L(e=>H(n,e),[()=>xF.submitMode()===`save`?`Edit Workflow`:`Create Workflow`]),V(e,t)},$$slots:{title:!0}})},n=A(()=>xF.submitLabel()),r=A(()=>xF.submittingLabel()),i=A(()=>xF.submitMode()===`create`?il:cl);Ck(e,{get open(){return xF.formOpen},ariaLabel:`Workflow editor`,get error(){return xF.formError},get submitting(){return xF.submitting},get submitLabel(){return R(n)},get submittingLabel(){return R(r)},get submitIcon(){return R(i)},dialogClass:`workflow-editor`,onclose:()=>xF.closeForm(),onsubmit:()=>xF.submitForm(),header:t,children:(e,t)=>{var n=JI(),r=F(n),i=P(r);Tk(i,{id:`workflow-scope-provider`,label:`Provider Name`,children:(e,t)=>{var n=MI(),r=P(n);r.value=r.__value=``,W(I(r),16,()=>xF.providerOptions(),e=>e,(e,t)=>{var n=jI(),r=P(n,!0);D(n);var i={};L(()=>{H(r,t),i!==(i=t)&&(n.value=(n.__value=t)??``)}),V(e,n)}),D(n),z(`change`,n,e=>xF.setProvider(e.currentTarget.value)),Ui(n,()=>xF.form.scope_provider,e=>xF.form.scope_provider=e),V(e,n)},$$slots:{default:!0}});var a=I(i,2),o=e=>{Tk(e,{id:`workflow-scope-model`,label:`Model`,children:(e,t)=>{var n=NI(),r=P(n);r.value=r.__value=``,W(I(r),17,()=>xF.modelOptions(xF.form.scope_provider),e=>xF.form.scope_provider+`-`+e,(e,t)=>{var n=jI(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t)),i!==(i=R(t))&&(n.value=(n.__value=R(t))??``)}),V(e,n)}),D(n),Ui(n,()=>xF.form.scope_model,e=>xF.form.scope_model=e),V(e,n)},$$slots:{default:!0}})};U(a,e=>{xF.form.scope_provider&&e(o)});var s=I(a,2);Tk(s,{id:`workflow-name`,label:`Name`,children:(e,t)=>{var n=PI();ea(n),la(n,()=>xF.form.name,e=>xF.form.name=e),V(e,n)},$$slots:{default:!0}}),Tk(I(s,2),{id:`workflow-user-path`,label:`User Path`,children:(e,t)=>{var n=FI();ea(n),la(n,()=>xF.form.scope_user_path,e=>xF.form.scope_user_path=e),V(e,n)},$$slots:{default:!0}}),D(r);var c=I(r,8);Tk(c,{id:`workflow-description`,label:`Description`,children:(e,t)=>{var n=II();ut(n),la(n,()=>xF.form.description,e=>xF.form.description=e),V(e,n)},$$slots:{default:!0}});var l=I(c,2),u=P(l),d=e=>{var t=LI(),n=P(t);ea(n),Ve(2),D(t),ua(n,()=>xF.form.features.cache,e=>xF.form.features.cache=e),V(e,t)},f=A(()=>bu.cacheVisible());U(u,e=>{R(f)&&e(d)});var p=I(u,2),m=e=>{var t=RI(),n=P(t);ea(n),Ve(2),D(t),ua(n,()=>xF.form.features.audit,e=>xF.form.features.audit=e),V(e,t)},h=A(()=>bu.auditVisible());U(p,e=>{R(h)&&e(m)});var g=I(p,2),_=e=>{var t=zI(),n=P(t);ea(n),Ve(2),D(t),ua(n,()=>xF.form.features.usage,e=>xF.form.features.usage=e),V(e,t)},v=A(()=>bu.usageVisible());U(g,e=>{R(v)&&e(_)});var y=I(g,2),b=e=>{var t=BI(),n=P(t);ea(n),Ve(2),D(t),ua(n,()=>xF.form.features.budget,e=>xF.form.features.budget=e),V(e,t)},x=A(()=>bu.budgetsVisible());U(y,e=>{R(x)&&e(b)});var S=I(y,2),C=e=>{var t=VI(),n=P(t);ea(n),Ve(2),D(t),ua(n,()=>xF.form.features.guardrails,e=>xF.form.features.guardrails=e),V(e,t)},w=A(()=>bu.guardrailsVisible());U(S,e=>{R(w)&&e(C)});var T=I(S,2),E=e=>{var t=HI(),n=P(t);ea(n),Ve(2),D(t),ua(n,()=>xF.form.features.failover,e=>xF.form.features.failover=e),V(e,t)},ee=A(()=>xF.failoverVisible());U(T,e=>{R(ee)&&e(E)}),D(l);var te=I(l,2),ne=I(P(te),2);{let e=A(()=>xF.preview());kI(ne,{get workflow(){return R(e)},preview:!0})}D(te);var re=I(te,2),ie=e=>{var t=qI(),n=P(t),r=I(P(n),2);D(n);var i=I(n,2),a=e=>{var t=UI(),n=I(P(t),2);D(t),z(`click`,n,()=>Bl.navigate(`guardrails`)),V(e,t)};U(i,e=>{xF.guardrailRefs.length===0&&e(a)});var o=I(i,2),s=e=>{var t=GI();W(t,21,()=>xF.form.guardrails,ii,(e,t,n)=>{var r=WI(),i=P(r),a=P(i);K(a,`for`,`workflow-guardrail-ref-`+n);var o=I(a,2);ea(o),K(o,`id`,`workflow-guardrail-ref-`+n),K(o,`aria-label`,`Guardrail reference `+(n+1)),D(i);var s=I(i,2),c=P(s);K(c,`for`,`workflow-guardrail-step-`+n);var l=I(c,2);ea(l),K(l,`id`,`workflow-guardrail-step-`+n),K(l,`aria-label`,`Guardrail step `+(n+1)),D(s);var u=I(s,2);D(r),la(o,()=>R(t).ref,e=>R(t).ref=e),la(l,()=>R(t).step,e=>R(t).step=e),z(`click`,u,()=>xF.removeGuardrailStep(n)),V(e,r)}),D(t),V(e,t)},c=e=>{V(e,KI())};U(o,e=>{xF.form.guardrails.length>0?e(s):e(c,-1)}),D(t),z(`click`,r,()=>xF.addGuardrailStep()),V(e,t)},ae=A(()=>xF.form.features.guardrails&&bu.guardrailsVisible());U(re,e=>{R(ae)&&e(ie)}),V(e,n)},$$slots:{header:!0,default:!0}})}k()}Br([`change`,`click`]);var XI=B(`

Loading workflows...

`),ZI=B(`
`),QI=B(`

No active workflows found.

`),$I=B(`

No workflows match your filter.

`),eL=B(`
`);function tL(e,t){O(t,!0);var n=eL(),r=P(n),i=e=>{var t=XI();wT(P(t),{size:16,label:`Loading workflows`}),Ve(),D(t),V(e,t)};U(r,e=>{xF.loading&&!Y.authError&&e(i)});var a=I(r,2),o=e=>{var t=ZI();W(t,21,()=>xF.filteredWorkflows,e=>e.id,(e,t)=>{kI(e,{get workflow(){return R(t)}})}),D(t),V(e,t)};U(a,e=>{xF.filteredWorkflows.length>0&&e(o)});var s=I(a,2),c=e=>{V(e,QI())};U(s,e=>{xF.workflows.length===0&&!xF.loading&&!Y.authError&&xF.available&&e(c)});var l=I(s,2),u=e=>{V(e,$I())};U(l,e=>{xF.workflows.length>0&&xF.filteredWorkflows.length===0&&!xF.loading&&e(u)}),D(n),V(e,n),k()}var nL=B(``),rL=B(`
Workflows feature is unavailable.
`),iL=B(`
`),aL=B(`
`),oL=B(``),sL=B(`
`);function cL(e,t){O(t,!0),On(()=>{Y.refreshTick,xF.fetchPage()});var n=sL(),r=P(n),i=I(P(r),2),a=P(i),o=e=>{var t=nL();J(P(t),{get icon(){return il},class:`form-action-icon`,"aria-hidden":`true`}),Ve(2),D(t),z(`click`,t,()=>xF.openCreate()),V(e,t)};U(a,e=>{xF.available&&e(o)}),D(i),D(r);var s=I(r,2),c=e=>{V(e,rL())};U(s,e=>{!xF.available&&!Y.authError&&e(c)});var l=I(s,2),u=e=>{var t=iL(),n=P(t,!0);D(t),L(()=>H(n,xF.error)),V(e,t)};U(l,e=>{xF.error&&!Y.authError&&e(u)});var d=I(l,2),f=e=>{var t=aL(),n=P(t);SD(P(n),{placeholder:`Filter by scope, name, hash, or guardrail...`,label:`Filter workflows by scope, name, hash, or guardrail`,get value(){return xF.filter},set value(e){xF.filter=e}}),D(n);var r=I(n,2),i=P(r),a=P(i,!0);D(i),D(r),D(t),L(()=>H(a,xF.filteredWorkflows.length+` active scopes`)),V(e,t)};U(d,e=>{xF.available&&e(f)});var p=I(d,2);YI(p,{});var m=I(p,2);tL(m,{});var h=I(m,2);W(h,20,()=>xF.guardrailRefs,e=>e,(e,t)=>{var n=oL(),r={};L(()=>{r!==(r=t)&&(n.value=(n.__value=t)??``)}),V(e,n)}),D(h),D(n),V(e,n),k()}Br([`click`]);function lL(e,{from:t,to:n},r={}){var{delay:i=0,duration:a=e=>Math.sqrt(e)*120,easing:o=Zu}=r,s=getComputedStyle(e),c=s.transform===`none`?``:s.transform,[l,u]=s.transformOrigin.split(` `).map(parseFloat);l/=e.clientWidth,u/=e.clientHeight;var d=uL(e),f=e.clientWidth/n.width/d,p=e.clientHeight/n.height/d,m=t.left+t.width*l,h=t.top+t.height*u,g=n.left+n.width*l,_=n.top+n.height*u,v=(m-g)*f,y=(h-_)*p,b=t.width/n.width,x=t.height/n.height;return{delay:i,duration:typeof a==`function`?a(Math.sqrt(v*v+y*y)):a,easing:o,css:(e,t)=>`transform: ${c} translate(${t*v}px, ${t*y}px) scale(${e+t*b}, ${e+t*x});`}}function uL(e){if(`currentCSSZoom`in e)return e.currentCSSZoom;for(var t=e,n=1;t!==null;)n*=+getComputedStyle(t).zoom,t=t.parentElement;return n}var dL=null;function fL(){return dL===null&&(dL=typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(prefers-reduced-motion: reduce)`)),!!(dL&&dL.matches)}function pL(e){return fL()?0:e}function mL(e,t){return!t||!t.live?{duration:0}:Yu(e,{duration:pL(150)})}var hL=new class{#e=j(N({}));get workflowVersionsByID(){return R(this.#e)}set workflowVersionsByID(e){M(this.#e,e,!0)}workflowVersionRequests={};workflowFeatureCaps(){return{cache:bu.cacheVisible(),audit:bu.auditVisible(),usage:bu.usageVisible(),budget:bu.budgetsVisible(),guardrails:bu.guardrailsVisible(),failover:bu.booleanFlag(`FAILOVER_ENABLED`,!0)}}cacheWorkflowVersion(e){let t=String(e&&e.id||``).trim();return t?(this.workflowVersionsByID={...this.workflowVersionsByID||{},[t]:e},e):null}cacheMissingWorkflowVersion(e){let t=String(e||``).trim();t&&(this.workflowVersionsByID={...this.workflowVersionsByID||{},[t]:null})}workflowVersionCacheHas(e){return Object.prototype.hasOwnProperty.call(this.workflowVersionsByID||{},String(e||``).trim())}workflowVersionByID(e){let t=String(e||``).trim();return t&&this.workflowVersionCacheHas(t)?this.workflowVersionsByID[t]:null}async fetchWorkflowVersion(e){let t=String(e||``).trim();if(!t)return null;if(this.workflowVersionCacheHas(t))return this.workflowVersionsByID[t];if(this.workflowVersionRequests[t])return this.workflowVersionRequests[t];let n=(async()=>{let e=typeof AbortController==`function`?new AbortController:null,n=e?setTimeout(()=>e.abort(),1e4):null;try{let n=await hu(`/admin/workflows/`+encodeURIComponent(t),{label:`workflow`,signal:e?e.signal:void 0});if(n.stale)return null;if(n.status===404)return this.cacheMissingWorkflowVersion(t),null;if(!n.ok)return null;let r=n.data;return!r||typeof r!=`object`||Array.isArray(r)?(this.cacheMissingWorkflowVersion(t),null):this.cacheWorkflowVersion(r)}catch(e){return e&&e.name===`AbortError`||console.error(`Failed to fetch workflow version:`,e),null}finally{n!==null&&clearTimeout(n),delete this.workflowVersionRequests[t]}})();return this.workflowVersionRequests[t]=n,n}async prefetchAuditWorkflows(e){let t=[...new Set((Array.isArray(e)?e:[]).map(e=>String(e&&e.workflow_version_id||``).trim()).filter(Boolean))];t.length!==0&&await Promise.all(t.map(e=>this.fetchWorkflowVersion(e)))}auditEntryWorkflow(e){let t=String(e&&e.workflow_version_id||``).trim();return t?this.workflowVersionByID(t):null}},gL=6;function _L(e){if(typeof e!=`string`)return null;try{return JSON.parse(e)}catch{return null}}function vL(e,t=0,n=null){let r=String(e||``).trim();if(!r)return``;if(t>gL)return r;let i=_L(r);return i==null?r:yL(i,t+1,n)||n&&n(i)||r}function yL(e,t=0,n=null,r=null){if(e==null||t>gL)return``;if(typeof e==`string`){let i=_L(e.trim());return i==null?``:yL(i,t+1,n,r)}if(typeof e!=`object`)return``;let i=r||new Set;if(i.has(e))return``;if(i.add(e),Array.isArray(e)){for(let r=0;r=400||SL(t&&t.response_body)}function wL(e){let t=e&&e.data?e.data:null;return t?bL(t.error_message)||(CL(e,t)?yL(t.response_body,0):``):``}function TL(e){if(e==null||String(e).trim()===``)return null;let t=Number(e);return!Number.isInteger(t)||t<0?null:t}function EL(e){let t=TL(e);return t===null?``:t===0?`Audit logs are retained indefinitely.`:t===1?`Audit logs are retained for 1 day.`:`Audit logs are retained for `+t+` days.`}function DL(e){let t=TL(e);return t===null?``:t===0?`Audit logs are retained `:`Audit logs are retained for `}function OL(e){let t=TL(e);return t===null?``:t===0?`indefinitely`:t===1?`1 day`:t+` days`}function kL({dateQuery:e,limit:t,offset:n,search:r,method:i,statusCode:a,stream:o}){let s=e;return s+=`&limit=`+t+`&offset=`+n,r&&(s+=`&search=`+encodeURIComponent(r)),i&&(s+=`&method=`+encodeURIComponent(i)),a&&(s+=`&status_code=`+encodeURIComponent(a)),o&&(s+=`&stream=`+encodeURIComponent(o)),s}function AL({sessionId:e,limit:t}){return`session_id=`+encodeURIComponent(e)+`&limit=`+(t||100)+`&offset=0`}function jL(e){return String(e&&e.session_id||``).trim()}function ML(e){let t=Number(e&&e.session_count);return Number.isFinite(t)&&t>1?t:1}function NL(e){return!!jL(e)&&ML(e)>1}function PL(e){return{entries:(Array.isArray(e&&e.sessions)?e.sessions:[]).filter(e=>e&&e.latest).map(e=>({...e.latest,session_id:jL(e.latest)||String(e.session_id||``).trim(),session_count:Number(e.count||1)})),total:Number(e&&e.total||0),limit:Number(e&&e.limit||25),offset:Number(e&&e.offset||0)}}function FL(e,t,n){let r=new Set((Array.isArray(n)?n:[]).flatMap(e=>zL(e))),i=(Array.isArray(t)?t:[]).filter(e=>!zL(e).some(e=>r.has(e))),a=new Set([...r,...i.flatMap(e=>zL(e))]),o=(e&&Array.isArray(e.entries)?e.entries:[]).filter(e=>e&&e._live&&!zL(e).some(e=>a.has(e)));return{entries:[...o,...i],preservedCount:o.length}}function IL(e,t){let n=e||{};if(!t)return n;if(n[t]){let e={...n};return delete e[t],e}return{...n,[t]:!0}}function LL(e,t){let n=e||{},r=new Set((Array.isArray(t)?t:[]).map(e=>jL(e)).filter(Boolean)),i={},a=!1;return Object.keys(n).forEach(e=>{if(r.has(e)){i[e]=n[e];return}a=!0}),a?i:n}function RL(e){return String(e&&e.id||``).trim()}function zL(e){if(!e)return[];let t=[],n=String(e.id||``).trim(),r=String(e.request_id||``).trim();return n&&t.push(`id:`+n),r&&t.push(`request:`+r),t}function BL(e){return!!(e&&e._live&&e._live_pending&&!e._audit_flushed)}function VL(e){let t=e&&e.customStartDate,n=e&&e.customEndDate;if(!t&&!n)return!0;let r=new Date;if(t){let e=new Date(t);if(e.setHours(0,0,0,0),Number.isFinite(e.getTime())&&re)return!1}return!0}function HL(e,t){return e&&Number(e.offset||0)===0&&!(t&&t.search)&&!(t&&t.method)&&!(t&&t.statusCode)&&!(t&&t.stream)&&VL(t)}function UL(e,t,n){let r=e&&typeof e==`object`?{...e}:{entries:[],total:0,limit:25,offset:0},i=Array.isArray(r.entries)?r.entries:[];if(r.entries=i,!HL(r,n))return r;let a=(Array.isArray(t)?t:[]).filter(e=>BL(e));if(a.length===0)return r;let o=new Set(i.flatMap(e=>zL(e))),s=[];return a.forEach(e=>{let t=zL(e);t.length!==0&&(t.some(e=>o.has(e))||(t.forEach(e=>o.add(e)),s.push(e)))}),s.length===0?r:(r.entries=[...s,...i].slice(0,r.limit||25),r.total=Number(r.total||0)+s.length,r)}function WL(e,t,n){let r=e&&typeof e==`object`?{...e}:{entries:[],total:0,limit:25,offset:0},i=Array.isArray(r.entries)?r.entries:[];if(r.entries=i,!HL(r,n))return r;let a=(Array.isArray(t)?t:[]).filter(e=>BL(e));if(a.length===0)return r;let o=new Set(i.flatMap(e=>zL(e))),s=new Map;i.forEach((e,t)=>{let n=jL(e);n&&!s.has(n)&&s.set(n,t)});let c=[],l=i;return a.forEach(e=>{let t=zL(e);if(t.length===0||t.some(e=>o.has(e)))return;let n=jL(e);if(n&&s.has(n)){let r=s.get(n);l===i&&(l=[...i]),l[r]={...e,session_count:Math.max(ML(l[r]),ML(e))},t.forEach(e=>o.add(e));return}t.forEach(e=>o.add(e)),c.push(e)}),r.entries=[...c,...l].slice(0,r.limit||25),r.total=Number(r.total||0)+c.length,r}function GL(e,t){let n=RL(t),r=e||{};return n?r[n]?{}:{[n]:!0}:r}function KL(e,t){let n=e||{},r=new Set((Array.isArray(t)?t:[]).map(e=>RL(e)).filter(Boolean)),i={},a=!1;return Object.keys(n).forEach(e=>{if(r.has(e)){i[e]=!0;return}a=!0}),a?i:n}function qL(e){if(e==null)return`-`;let t=Number(e);return Number.isFinite(t)?t<=0?`pending`:t<1e6?Math.round(t/1e3)+` µs`:t<1e9?(t/1e6).toFixed(2)+` ms`:(t/1e9).toFixed(2)+` s`:`-`}function JL(e){if(e==null||e===``)return`status-unknown`;let t=Number(e);return Number.isFinite(t)?t>=500?`status-error`:t>=400?`status-warning`:t>=300?`status-neutral`:`status-success`:`status-unknown`}function YL(e){if(!e||!e._live||!e._live_pending)return!1;let t=String(e._live_state||``).trim();if(t===`audit.completed`||t===`audit.flushed`||t===`audit.detail`)return!1;if(e._response_partial)return!0;if(e.status_code!==null&&e.status_code!==void 0&&e.status_code!==``||Number(e.duration_ns||0)>0||e.error_type||e.error_message)return!1;let n=e.data||{};return!(n.response_headers||n.response_body||n.error_message)}function XL(e){let t=e&&e.data&&e.data.failover;return!t||typeof t!=`object`||Array.isArray(t)?null:String(t.target_model||t.targetModel||``).trim()||null}function ZL(e){return(e&&e.data&&Array.isArray(e.data.attempts)?e.data.attempts:[]).map((e,t)=>({...e,seq:Number(e&&e.seq||t+1)})).sort((e,t)=>e.seq-t.seq)}function QL(e){let t=ZL(e);return t.length>1||t.some(e=>!(e&&e.success))}function $L(e){if(!e)return`-`;let t=e.status_code||e.status;return t?String(t):e.success?`ok`:`error`}function eR(e){return String(e&&e.kind||``).trim()||`attempt`}function tR(e){if(!e)return`-`;let t=String(e.provider_name||``).trim(),n=String(e.provider_type||e.provider||``).trim();return t&&n&&t!==n?t+` (`+n+`)`:t||n||`-`}function nR(e){return String(e&&e.model||``).trim()||`-`}function rR(e){let t=ZL(e);return t.length>1||t.some(e=>!(e&&e.success))?t:[]}function iR(e){return ZL(e).length+`×`}function aR(e){let t=ZL(e),n=t.filter(e=>!(e&&e.success)).length,r=t.length===1?`attempt`:`attempts`,i=t.length+` provider `+r;return n>0?i+` · `+n+` failed`:i}function oR(e){if(!e)return``;let t=[`#`+Number(e.seq||0)],n=eR(e);n&&n!==`attempt`&&t.push(n),t.push($L(e));let r=tR(e);r&&r!==`-`&&t.push(r);let i=nR(e);return i&&i!==`-`&&t.push(i),t.push(e.success?`succeeded`:`failed`),t.join(` · `)}function sR(e,t){if(!t)return null;if(t.success){let t=e&&e.data?e.data:null;return t&&t.response_body!=null?t.response_body:null}return t.response_body!=null&&t.response_body!==``?t.response_body:null}function cR(e){if(!e||e.success)return``;let t=String(e.error_message||``).trim(),n=String(e.error_code||``).trim(),r=String(e.error_type||``).trim();return t&&n?n+`: `+t:t||n||r||`Provider attempt failed`}function lR(e,t){if(!t)return null;if(t.success){let t=e&&e.data?e.data:null;return t?t.response_headers:null}return t.response_headers||null}function uR(e){let t=Number(e&&e.status_code);return Number.isFinite(t)&&t>0?t:null}function dR(e,t){let n=!!(t&&t.success),r=e&&e.data?e.data:null,i=sR(e,t),a=lR(e,t),o=cR(t),s=i!=null&&i!==``,c=eR(t),l=ZL(e).length<=1;return{title:`Response`,direction:`response`,seq:l?0:Number(t&&t.seq||0),kind:l||c===`attempt`?``:c,statusCode:l?null:uR(t),layout:`split`,entry:e,copyHeaders:a,copyBody:i,showErrorMessage:!!o,errorMessage:o,showHeaders:!!a,headers:a,showBody:s,body:i,showEmpty:!o&&!s&&!a,emptyMessage:`No response was captured for this attempt.`,showTooLarge:!!(n&&r&&r.response_body_too_big_to_handle),tooLargeMessage:`Response body was too large to capture.`}}function fR(e){return e&&e.data&&Array.isArray(e.data.request_revisions)?e.data.request_revisions:[]}function pR(e){return fR(e).filter(e=>!(e&&e.no_change))}function mR(e){return fR(e).filter(e=>e&&e.no_change).map(e=>{let t=String(e.rewriter||`rewriter`);return{id:`step-`+Number(e.seq||0),rewriter:t,label:t+`: no change`,title:t+` ran and forwarded the request unchanged`}})}function hR(e){let t=Number(e&&e.bytes_before),n=Number(e&&e.bytes_after);if(!Number.isFinite(t)||!Number.isFinite(n)||t<=0||n>=t)return``;let r=(1-n/t)*100;return`-`+(r>=10?String(Math.round(r)):r.toFixed(1))+`%`}function gR(e,t){let n=t&&t.body,r=n!=null&&n!==``,i=pR(e).length<=1,a={rewriter:t&&t.rewriter||``,bytes:Number(t&&t.bytes_before||0)+` → `+Number(t&&t.bytes_after||0)};return t&&t.detail!=null&&(a.detail=t.detail),{title:`Rewritten`,direction:`request`,seq:i?0:Number(t&&t.seq||0),kind:t&&t.rewriter?String(t.rewriter):``,savingsLabel:hR(t),layout:`split`,entry:e,copyHeaders:a,copyBody:n,showErrorMessage:!1,errorMessage:null,showHeaders:!0,headers:a,headersTitle:`What changed`,showBody:r,body:n,showEmpty:!1,emptyMessage:``,showTooLarge:!r,tooLargeMessage:`Rewritten body not captured (body logging disabled or body too large).`}}function _R(e){let t=e&&e.usage;return!t||typeof t!=`object`?null:t}function vR(e){let t=_R(e);return Number(t&&t.cached_input_tokens||0)>0}function yR(e){let t=_R(e),n=Number(t&&t.input_tokens||0),r=Number(t&&t.cached_input_tokens||0);return!Number.isFinite(n)||n<=0||!Number.isFinite(r)||r<=0?0:Math.max(0,Math.min(100,r/n*100))}function bR(e){let t=_R(e);if(!t)return``;let n=Number(t.input_tokens||0),r=Number(t.cached_input_tokens||0);return n<=0?cd(r)+` cached`:yR(e).toFixed(1)+`% cached`}function xR(e){return vR(e)?bR(e):``}function SR(e,t){let n=_R(e);if(!n||!e||!e.data||!e.data.request_body)return null;let r=Number(n.estimated_cached_characters||0);if(!Number.isFinite(r)||r<=0||typeof t!=`function`)return null;let i=t(e.data.request_body);return!Array.isArray(i)||i.length===0?null:{characters:r,segments:i}}function CR(e,t){let n=e&&e.data?e.data:null,r=!n||!n.request_headers&&!n.request_body,i=r&&YL(e);return{title:`Request`,direction:`request`,layout:`split`,entry:e,copyHeaders:n&&n.request_headers,copyBody:n&&n.request_body,showErrorMessage:!1,errorMessage:null,showHeaders:!!(n&&n.request_headers),headers:n&&n.request_headers,showBody:!!(n&&n.request_body),body:n&&n.request_body,bodyCacheRatioLabel:xR(e),promptCacheHighlight:SR(e,t),noChangeSteps:mR(e),showEmpty:r&&!i,emptyMessage:`Request details were not captured.`,showPending:i,pendingMessage:`Waiting for request data…`,showTooLarge:!!(n&&n.request_body_too_big_to_handle),tooLargeMessage:`Request body was too large to capture.`}}function wR(e){let t=e&&e.data?e.data:null,n=wL(e),r=!t||!n&&!t.response_headers&&!t.response_body,i=r&&YL(e);return{title:`Response`,direction:`response`,layout:`split`,entry:e,copyHeaders:t&&t.response_headers,copyBody:t&&t.response_body,showErrorMessage:!!n,errorMessage:n,showHeaders:!!(t&&t.response_headers),headers:t&&t.response_headers,showBody:!!(t&&t.response_body),body:t&&t.response_body,streaming:!!(e&&e._response_partial&&t&&t.response_body)&&YL(e),showEmpty:r&&!i,emptyMessage:`Response details were not captured.`,showPending:i,pendingMessage:`Response in progress…`,showTooLarge:!!(t&&t.response_body_too_big_to_handle),tooLargeMessage:`Response body was too large to capture.`}}function TR(e,t){let n=[{id:`request`,pane:CR(e,t)}];return pR(e).forEach(t=>{n.push({id:`revision-`+Number(t&&t.seq||0),pane:gR(e,t)})}),QL(e)?ZL(e).forEach(t=>{n.push({id:`response-`+Number(t&&t.seq||0),pane:dR(e,t)})}):n.push({id:`response`,pane:wR(e)}),n}function ER(e){if(!QL(e))return`response`;let t=ZL(e),n=null;return t.forEach(e=>{e&&e.success&&(n=e)}),n||=t[t.length-1],n?`response-`+Number(n.seq||0):`request`}function DR(e,t,n){return e&&(Array.isArray(n)?n:TR(t)).some(t=>t.id===e)?e:ER(t)}function OR(e,t,n){if(!t||!t.length)return null;let r=t.indexOf(n);r<0&&(r=0);let i;switch(e){case`ArrowRight`:case`ArrowDown`:i=(r+1)%t.length;break;case`ArrowLeft`:case`ArrowUp`:i=(r-1+t.length)%t.length;break;case`Home`:i=0;break;case`End`:i=t.length-1;break;default:return null}return t[i]}var kR=100;function AR(){return{entries:[],total:0,limit:25,offset:0}}var jR=new class{#e=j(N({}));get auditExpandedEntries(){return R(this.#e)}set auditExpandedEntries(e){M(this.#e,e,!0)}#t=j(N({}));get auditExpandedThreads(){return R(this.#t)}set auditExpandedThreads(e){M(this.#t,e,!0)}#n=j(!1);get loading(){return R(this.#n)}set loading(e){M(this.#n,e,!0)}auditFetchToken=0;get auditLog(){return PE.auditLog}set auditLog(e){PE.auditLog=e}get auditSearch(){return PE.auditSearch}set auditSearch(e){PE.auditSearch=e}get auditMethod(){return PE.auditMethod}set auditMethod(e){PE.auditMethod=e}get auditStatusCode(){return PE.auditStatusCode}set auditStatusCode(e){PE.auditStatusCode=e}get auditStream(){return PE.auditStream}set auditStream(e){PE.auditStream=e}get auditGroupSessions(){return PE.auditGroupSessions}liveFilters(){return{search:this.auditSearch,method:this.auditMethod,statusCode:this.auditStatusCode,stream:this.auditStream,customStartDate:Fd.customStartDate,customEndDate:Fd.customEndDate}}toggleAuditGroupSessions(){PE.auditGroupSessions=!PE.auditGroupSessions,Ya(`gomodel_audit_group_sessions`,PE.auditGroupSessions),this.auditExpandedThreads={},PE.auditThreadChildren={},this.fetchAuditLog(!0)}async fetchAuditLog(e){let t=++this.auditFetchToken;this.loading=!0;try{e&&(this.auditLog.offset=0);let n=this.auditGroupSessions,r=kL({dateQuery:Fd.queryStr(),limit:this.auditLog.limit,offset:this.auditLog.offset,search:this.auditSearch,method:this.auditMethod,statusCode:this.auditStatusCode,stream:this.auditStream}),i=await hu((n?`/admin/audit/sessions?`:`/admin/audit/log?`)+r,{label:`audit log`});if(i.stale||t!==this.auditFetchToken)return;if(!i.ok){this.auditLog=AR();return}let a=n?PL(i.data):i.data,o=(n?WL:UL)(a,this.auditLog&&this.auditLog.entries,this.liveFilters());Array.isArray(o.entries)||(o.entries=[]),o.entries=PE.upsertAuditRecords(o.entries,`audit.list`),this.auditLog=o,this.auditExpandedThreads=LL(this.auditExpandedThreads,o.entries),PE.auditThreadChildren=LL(PE.auditThreadChildren,o.entries);let s=[...o.entries,...this.loadedThreadChildren()];this.auditExpandedEntries=KL(this.auditExpandedEntries,s);try{await hL.prefetchAuditWorkflows(s)}catch(e){console.error(`Failed to prefetch audit workflows:`,e)}}catch(e){if(console.error(`Failed to fetch audit log:`,e),t!==this.auditFetchToken)return;this.auditLog=AR()}finally{t===this.auditFetchToken&&(this.loading=!1)}}loadedThreadChildren(){let e=PE.auditThreadChildren||{};return Object.keys(e).flatMap(t=>Array.isArray(e[t]&&e[t].entries)?e[t].entries:[])}isThreadExpanded(e){return!!(e&&this.auditExpandedThreads[e])}threadChildren(e){return e&&PE.auditThreadChildren[e]||null}async toggleThread(e){let t=jL(e);if(!t)return;let n=!this.isThreadExpanded(t);this.auditExpandedThreads=IL(this.auditExpandedThreads,t);let r=PE.auditThreadChildren[t];n&&!(r&&(r.loaded||r.loading))&&await this.fetchThreadEntries(e)}async fetchThreadEntries(e){let t=jL(e);if(!t)return;let n=PE.auditThreadChildren[t];PE.auditThreadChildren={...PE.auditThreadChildren,[t]:{loading:!0,loaded:!1,entries:n&&Array.isArray(n.entries)?n.entries:[],total:Number(n&&n.total||0)}};let r=()=>{let e={...PE.auditThreadChildren},n=e[t],r=n&&Array.isArray(n.entries)?n.entries:[];r.length>0?e[t]={loading:!1,loaded:!1,entries:r,total:r.length}:(delete e[t],this.auditExpandedThreads[t]&&(this.auditExpandedThreads=IL(this.auditExpandedThreads,t))),PE.auditThreadChildren=e};try{let n=await hu(`/admin/audit/log?`+AL({sessionId:t,limit:kR}),{label:`audit session`});if(n.stale){r();return}if(!n.ok)throw Error(`audit session fetch failed`);let i=PE.auditThreadChildren[t],a=this.auditLog.entries.find(e=>jL(e)===t),o=FL(i,n.data.entries,a?[a]:[e]);o.entries=PE.upsertAuditRecords(o.entries,`audit.thread`),PE.auditThreadChildren={...PE.auditThreadChildren,[t]:{loading:!1,loaded:!0,entries:o.entries,total:Number(n.data.total||0)+o.preservedCount}}}catch(e){console.error(`Failed to fetch audit session entries:`,e),r()}}clearAuditFilters(){this.auditSearch=``,this.auditMethod=``,this.auditStatusCode=``,this.auditStream=``,this.fetchAuditLog(!0)}auditLogNextPage(){this.auditLog.offset+this.auditLog.limit0&&(this.auditLog.offset=Math.max(0,this.auditLog.offset-this.auditLog.limit),this.fetchAuditLog(!1))}isAuditEntryExpanded(e){let t=RL(e);return t?!!(this.auditExpandedEntries&&this.auditExpandedEntries[t]):!1}toggleAuditEntryExpanded(e){this.auditExpandedEntries=GL(this.auditExpandedEntries,e);let t=this.isAuditEntryExpanded(e);return t&&typeof PE.fetchAuditEntryDetail==`function`&&PE.fetchAuditEntryDetail(e),t}expandAuditEntry(e){this.isAuditEntryExpanded(e)||this.toggleAuditEntryExpanded(e)}};PE.fetchAuditLog=e=>jR.fetchAuditLog(e),PE.isAuditEntryExpanded=e=>jR.isAuditEntryExpanded(e);var MR=B(`
`);function NR(e,t){O(t,!0);let n=CD(()=>jR.fetchAuditLog(!0));On(()=>n.cancel);var r=MR(),i=P(r);SD(P(i),{id:`audit-filter-search`,placeholder:`Search by request ID, model, provider, path, user path, or error...`,label:`Search by request ID, model, provider, path, user path, or error`,get oninput(){return n},get value(){return jR.auditSearch},set value(e){jR.auditSearch=e}}),D(i);var a=I(i,2),o=P(a),s=P(o);s.value=s.__value=``;var c=I(s);c.value=c.__value=`GET`;var l=I(c);l.value=l.__value=`POST`;var u=I(l);u.value=u.__value=`PUT`;var d=I(u);d.value=d.__value=`PATCH`;var f=I(d);f.value=f.__value=`DELETE`,D(o);var p=I(o,2),m=P(p);m.value=m.__value=``;var h=I(m);h.value=h.__value=`200`;var g=I(h);g.value=g.__value=`201`;var _=I(g);_.value=_.__value=`400`;var v=I(_);v.value=v.__value=`401`;var y=I(v);y.value=y.__value=`403`;var b=I(y);b.value=b.__value=`404`;var x=I(b);x.value=x.__value=`429`;var S=I(x);S.value=S.__value=`500`;var C=I(S);C.value=C.__value=`502`;var w=I(C);w.value=w.__value=`503`;var T=I(w);T.value=T.__value=`504`,D(p);var E=I(p,2),ee=P(E);ee.value=ee.__value=``;var te=I(ee);te.value=te.__value=`true`;var ne=I(te);ne.value=ne.__value=`false`,D(E);var re=I(E,2);J(P(re),{get icon(){return Ol},class:`table-icon-svg`}),Ve(2),D(re),D(a),D(r),z(`change`,o,()=>jR.fetchAuditLog(!0)),Ui(o,()=>jR.auditMethod,e=>jR.auditMethod=e),z(`change`,p,()=>jR.fetchAuditLog(!0)),Ui(p,()=>jR.auditStatusCode,e=>jR.auditStatusCode=e),z(`change`,E,()=>jR.fetchAuditLog(!0)),Ui(E,()=>jR.auditStream,e=>jR.auditStream=e),z(`click`,re,()=>jR.clearAuditFilters()),V(e,r),k()}Br([`change`,`click`]);var PR=B(`Live stream connecting…`),FR=B(` `),IR=B(`Live`),LR=B(` `);function RR(e,t){O(t,!0);let n=A(()=>PE.auditLivePauseReason()),r=A(()=>PE.liveLogsStreaming&&!R(n));var i=Xr(),a=F(i),o=e=>{var t=LR(),i=P(t);let a;var o=I(i,2),s=e=>{V(e,PR())},c=e=>{var t=FR(),r=P(t,!0);D(t),L(e=>H(r,e),[()=>SE(R(n))]),V(e,t)},l=e=>{V(e,IR())};U(o,e=>{PE.liveLogsStreaming?R(n)?e(c,1):e(l,-1):e(s)}),D(t),L(()=>a=G(i,1,`live-dot svelte-tve6yv`,null,a,{"is-streaming":R(r)})),V(e,t)},s=A(()=>bu.liveLogsVisible());U(a,e=>{R(s)&&e(o)}),V(e,i),k()}var zR=B(` `),BR=B(``);function VR(e,t){O(t,!0);let n=A(()=>[{key:`provider`,text:vd(t.entry)||`-`},{key:`model`,text:t.entry.requested_model||t.entry.model||`-`,mono:!0},{key:`user_path`,text:t.entry.user_path,mono:!0},{key:`request_id`,text:`request_id: `+(t.entry.request_id||`-`),mono:!0},{key:`ip`,text:t.entry.client_ip&&`ip: `+t.entry.client_ip,mono:!0},{key:`auth_key_id`,text:t.entry.auth_key_id&&`auth_key_id: `+t.entry.auth_key_id,mono:!0},{key:`alias`,text:t.entry.alias_used&&`alias`,class:`audit-alias-badge`},{key:`resolved`,text:t.entry.alias_used&&t.entry.resolved_model&&`resolved: `+xd(t.entry),mono:!0},{key:`failover`,text:XL(t.entry)&&`failover: `+XL(t.entry),mono:!0},{key:`stream`,text:t.entry.stream&&`stream`},{key:`error_type`,text:t.entry.error_type}].filter(e=>!!e.text));var r=BR(),i=I(P(r),2);W(i,21,()=>R(n),e=>e.key,(e,t)=>{var n=zR(),r=P(n,!0);D(n),L(()=>{G(n,1,Ni([`provider-badge`,R(t).class,{mono:R(t).mono}]),`svelte-hyopt0`),H(r,R(t).text)}),V(e,n)}),D(i),D(r),V(e,r),k()}var HR=B(``),UR=B(` `);function WR(e,t){O(t,!0);let n=A(()=>rR(t.entry)),r=A(()=>R(n).length>0?aR(t.entry):``),i=A(()=>R(n).length>0?iR(t.entry):``);var a=Xr(),o=F(a),s=e=>{var a=UR(),o=P(a);W(o,21,()=>R(n),e=>t.entry.id+`-pip-`+e.seq,(e,t)=>{var n=HR();let r;L(e=>{r=G(n,1,`audit-attempt-pip svelte-1eu22xn`,null,r,{"audit-attempt-success":!!(R(t)&&R(t).success),"audit-attempt-error":!(R(t)&&R(t).success)}),K(n,`title`,e)},[()=>oR(R(t))]),V(e,n)}),D(o);var s=I(o,2),c=P(s,!0);D(s),D(a),L(()=>{K(a,`title`,R(r)),K(a,`aria-label`,R(r)),H(c,R(i))}),V(e,a)};U(o,e=>{R(n).length>0&&e(s)}),V(e,a),k()}var GR=new Set([`instructions`,`messages`,`input`,`previous_response_id`,`choices`,`output`]);function KR(e){if(!e||typeof e!=`object`)return``;let t=String(e.type||``).toLowerCase();if(t===`image`||t===`image_url`||t===`input_image`||t===`output_image`)return`[Image]`;if(t===`audio`||t===`input_audio`||t===`output_audio`)return`[Audio]`;if(t===`file`||t===`input_file`||t===`output_file`){let t=String(e.filename||e.name||``).trim();return t?`[File: `+t+`]`:`[File]`}return typeof e.refusal==`string`?e.refusal:``}function qR(e){if(e==null)return``;if(typeof e==`string`)return e.trim();if(Array.isArray(e))return e.map(e=>typeof e==`string`?e:!e||typeof e!=`object`?``:typeof e.text==`string`?e.text:typeof e.output_text==`string`?e.output_text:KR(e)).filter(Boolean).join(` + selector; unset fields continue to inherit.

Price Type USD Source
`,1);function tP(e,t){O(t,!0);let n=TM;Ck(e,{get open(){return n.modelPricingOverrideFormOpen},ariaLabel:`Model pricing editor`,dialogClass:`model-pricing-editor`,get error(){return n.modelPricingOverrideError},get submitting(){return n.modelPricingOverrideSubmitting},submitLabel:`Save Pricing`,onclose:()=>n.closeModelPricingOverrideForm(),onsubmit:()=>n.submitModelPricingOverrideForm(),header:e=>{var t=GN(),r=I(F(t),2),i=P(r,!0);D(r),L(()=>H(i,n.modelPricingOverrideFormDisplayName||n.modelPricingOverrideForm.selector||`Pricing`)),V(e,t)},extraActions:e=>{var t=Xr(),r=F(t),i=e=>{var t=KN();L(()=>t.disabled=n.modelPricingOverrideSubmitting),z(`click`,t,()=>n.deleteModelPricingOverride()),V(e,t)};U(r,e=>{n.modelPricingOverrideFormHasExistingOverride&&e(i)}),V(e,t)},children:(e,t)=>{var r=eP(),i=F(r),a=P(i);Tk(a,{id:`model-pricing-override-selector`,label:`Selector`,children:(e,t)=>{var r=qN();ea(r),la(r,()=>n.modelPricingOverrideForm.selector,e=>n.modelPricingOverrideForm.selector=e),V(e,r)},$$slots:{default:!0}});var o=I(a,2),s=e=>{Tk(e,{id:`model-pricing-override-scope`,label:`Scope`,children:(e,t)=>{var r=YN();W(r,21,()=>n.modelPricingOverrideFormScopeOptions,e=>e.value,(e,t)=>{var n=JN(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(r),z(`change`,r,()=>n.setModelPricingOverrideScope(n.modelPricingOverrideFormScope)),Ui(r,()=>n.modelPricingOverrideFormScope,e=>n.modelPricingOverrideFormScope=e),V(e,r)},$$slots:{default:!0}})};U(o,e=>{n.modelPricingOverrideFormScopeOptions.length>1&&e(s)}),D(i);var c=I(i,4);W(c,21,()=>n.modelPricingOverrideRows,e=>e.id,(e,t,r)=>{var i=XN(),a=P(i),o=P(a),s=I(o,2);W(s,21,()=>n.availablePricingFieldOptions(R(t)),e=>e.value,(e,t)=>{var n=JN(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t).group+` - `+R(t).label),i!==(i=R(t).value)&&(n.value=(n.__value=R(t).value)??``)}),V(e,n)}),D(s),D(a);var c=I(a,2),l=P(c),u=I(l,2);ea(u),D(c);var d=I(c,2);{let e=A(()=>`Remove `+n.pricingFieldLabel(R(t).field));yO(d,{get label(){return R(e)},class:`table-action-btn-danger table-icon-btn pricing-override-remove-row`,onclick:()=>n.removeModelPricingOverrideRow(R(t)),children:(e,t)=>{J(e,{get icon(){return Ol},class:`table-icon-svg`})},$$slots:{default:!0}})}D(i),L(()=>{K(o,`for`,`pricing-type-`+R(t).id),K(s,`id`,`pricing-type-`+R(t).id),K(l,`for`,`pricing-value-`+R(t).id),K(u,`id`,`pricing-value-`+R(t).id)}),Ui(s,()=>R(t).field,e=>R(t).field=e),la(u,()=>R(t).value,e=>R(t).value=e),V(e,i)}),D(c);var l=I(c,2),u=P(l);J(P(u),{get icon(){return il},class:`form-action-icon`}),Ve(2),D(u),D(l);var d=I(l,2),f=e=>{V(e,ZN())};U(d,e=>{n.modelPricingOverrideFormPreservedTiers.length>0&&e(f)});var p=I(d,2),m=I(P(p),2),h=e=>{V(e,QN())},g=A(()=>n.modelPricingEffectivePreviewRows().length===0);U(m,e=>{R(g)&&e(h)}),W(I(m,2),17,()=>n.modelPricingEffectivePreviewRows(),e=>e.field,(e,t)=>{var n=$N(),r=P(n),i=P(r,!0);D(r);var a=I(r,2),o=P(a,!0);D(a);var s=I(a,2),c=P(s,!0);D(s),D(n),L(e=>{H(i,R(t).label),H(o,e),H(c,R(t).source)},[()=>R(t).value===null||R(t).value===void 0?`-`:dd(Number(R(t).value))]),V(e,n)}),D(p),z(`click`,u,()=>n.addModelPricingOverrideRow()),V(e,r)},$$slots:{header:!0,extraActions:!0,default:!0}}),k()}Br([`click`,`change`]);var nP=B(`

Failover mapping

`,1),rP=B(``),iP=B(`

This failover mapping is defined in configuration and is read-only here.

`),aP=B(``),oP=B(`
`),sP=B(`
`,1),cP=B(`
`);function lP(e,t){O(t,!0);{let t=e=>{var t=nP(),n=I(F(t),2),r=P(n,!0);D(n),L(()=>H(r,Q.failoverForm.source||`Failover`)),V(e,t)},n=e=>{var t=Xr(),n=F(t),r=e=>{var t=rP();L(()=>t.disabled=Q.failoverSaving||Q.failoverGenerating),z(`click`,t,()=>Q.deleteFailoverRule()),V(e,t)};U(n,e=>{Q.failoverFormMode===`edit`&&!Q.failoverFormManaged&&e(r)}),V(e,t)},r=A(()=>Q.failoverGenerating||Q.failoverFormManaged);Ck(e,{get open(){return Q.failoverFormOpen},ariaLabel:`Failover editor`,get error(){return Q.failoverError},get submitting(){return Q.failoverSaving},get submitDisabled(){return R(r)},submitLabel:`Save`,onclose:()=>Q.closeFailoverForm(),onsubmit:()=>Q.submitFailoverForm(),header:t,extraActions:n,children:(e,t)=>{var n=cP(),r=P(n),i=e=>{V(e,iP())};U(r,e=>{Q.failoverFormManaged&&e(i)});var a=I(r,2);W(a,21,()=>Id.models,ii,(e,t)=>{var n=aP(),r=P(n,!0);D(n);var i={};L((e,t)=>{H(r,e),i!==(i=t)&&(n.value=(n.__value=t)??``)},[()=>ij(R(t)),()=>ij(R(t))]),V(e,n)}),D(a);var o=I(a,2);Tk(o,{id:`failover-target`,label:`Fallback models`,children:(e,t)=>{var n=sP(),r=F(n),i=P(r),a=P(i);ea(a);var o=I(a,2),s=e=>{yO(e,{label:`Remove fallback model`,class:`table-action-btn-danger table-icon-btn vm-target-remove`,onclick:()=>Q.removePrimaryFailoverTarget(),get disabled(){return Q.failoverFormManaged},children:(e,t)=>{J(e,{get icon(){return xl},class:`table-icon-svg`})},$$slots:{default:!0}})};U(o,e=>{Q.failoverForm.target_model&&e(s)}),D(i),W(I(i,2),17,()=>Q.failoverForm.targets,ii,(e,t,n)=>{var r=oP(),i=P(r);ea(i),yO(I(i,2),{label:`Remove fallback model`,class:`table-action-btn-danger table-icon-btn vm-target-remove`,onclick:()=>Q.removeFailoverTarget(n),get disabled(){return Q.failoverFormManaged},children:(e,t)=>{J(e,{get icon(){return xl},class:`table-icon-svg`})},$$slots:{default:!0}}),D(r),L(()=>i.disabled=Q.failoverFormManaged),la(i,()=>R(t).model,e=>R(t).model=e),V(e,r)}),D(r);var c=I(r,2),l=P(c);J(P(l),{get icon(){return il},class:`form-action-icon`}),Ve(2),D(l);var u=I(l,2),d=P(u);J(d,{get icon(){return El},class:`form-action-icon`});var f=I(d,2),p=P(f,!0);D(f),D(u),D(c),L(e=>{a.disabled=Q.failoverFormManaged,l.disabled=Q.failoverFormManaged||Q.failoverGenerating||Q.failoverSaving,u.disabled=e,H(p,Q.failoverGenerating?`Generating...`:`Generate automatically`)},[()=>Q.failoverFormManaged||Q.failoverGenerating||Q.failoverSaving||!Q.failoverEnabled()]),la(a,()=>Q.failoverForm.target_model,e=>Q.failoverForm.target_model=e),z(`click`,l,()=>Q.addFailoverTarget()),z(`click`,u,()=>Q.generateFailoverForForm()),V(e,n)},$$slots:{default:!0}});var s=I(o,2),c=P(s);TN(P(c),{get enabled(){return Q.failoverForm.enabled},label:`failover mapping`,get disabled(){return Q.failoverFormManaged},onclick:()=>{Q.failoverFormManaged||(Q.failoverForm.enabled=!Q.failoverForm.enabled)}}),D(c),D(s),D(n),V(e,n)},$$slots:{header:!0,extraActions:!0,default:!0}})}k()}Br([`click`]);var uP=B(` `),dP=B(`
`),fP=B(``),pP=B(`
`),mP=B(`

No failover suggestions were generated.

`),hP=B(`

No failover drafts match the filter.

`),gP=B(``),_P=B(``);function vP(e,t){O(t,!0),Nu(e,{get open(){return Q.failoverDraftsOpen},variant:`editor`,onclose:()=>Q.closeFailoverDraftsModal(),children:(e,t)=>{var n=_P(),r=P(n),i=I(P(r),2),a=P(i),o=e=>{var t=uP(),n=P(t,!0);D(t),L(e=>H(n,e),[()=>Q.failoverDraftCountLabel()]),V(e,t)};U(a,e=>{Q.failoverGeneratedRules.length>0&&e(o)}),ku(I(a,2),{label:`Close failover drafts`,onclick:()=>Q.closeFailoverDraftsModal(),get disabled(){return Q.failoverDraftSaving}}),D(i),D(r);var s=I(r,2),c=e=>{_O(e,{label:`Generating failover drafts...`,class:`failover-drafts-loading`})};U(s,e=>{Q.failoverGenerating&&e(c)});var l=I(s,2),u=e=>{var t=dP(),n=P(t);SD(n,{placeholder:`Filter failover drafts...`,label:`Filter failover drafts`,get value(){return Q.failoverDraftFilter},set value(e){Q.failoverDraftFilter=e}});var r=I(n,2),i=P(r);J(i,{get icon(){return Mc},class:`form-action-icon`});var a=I(i,2),o=P(a,!0);D(a),D(r),D(t),L(e=>{r.disabled=Q.failoverDraftSaving,H(o,e)},[()=>Q.allFailoverDraftsSelected()?`Deselect all`:`Select all`]),z(`click`,r,()=>Q.toggleAllFailoverDrafts()),V(e,t)};U(l,e=>{!Q.failoverGenerating&&Q.failoverGeneratedRules.length>0&&e(u)});var d=I(l,2),f=e=>{var t=pP();W(t,21,()=>Q.filteredFailoverDrafts(),e=>`failover-draft:`+Q.failoverPrimaryModel(e),(e,t)=>{var n=fP(),r=P(n);ea(r);var i=I(r,2),a=P(i),o=P(a,!0);D(a);var s=I(a,2),c=P(s,!0);D(s),D(i),D(n),L((e,t,n,i)=>{na(r,e),r.disabled=Q.failoverDraftSaving,K(r,`aria-label`,t),H(o,n),H(c,i)},[()=>Q.failoverDraftSelected(R(t)),()=>`Select failover draft for `+Q.failoverPrimaryModel(R(t)),()=>Q.failoverPrimaryModel(R(t)),()=>Q.failoverTargetLabel(R(t))]),z(`change`,r,e=>Q.setFailoverDraftSelected(R(t),e.currentTarget.checked)),V(e,n)}),D(t),V(e,t)},p=A(()=>!Q.failoverGenerating&&Q.filteredFailoverDrafts().length>0);U(d,e=>{R(p)&&e(f)});var m=I(d,2),h=e=>{V(e,mP())};U(m,e=>{!Q.failoverGenerating&&Q.failoverGeneratedRules.length===0&&!Q.failoverError&&e(h)});var g=I(m,2),_=e=>{V(e,hP())},v=A(()=>!Q.failoverGenerating&&Q.failoverGeneratedRules.length>0&&Q.filteredFailoverDrafts().length===0);U(g,e=>{R(v)&&e(_)});var y=I(g,2),b=e=>{var t=gP(),n=P(t,!0);D(t),L(()=>H(n,Q.failoverError)),V(e,t)};U(y,e=>{Q.failoverError&&e(b)});var x=I(y,2),S=P(x),C=I(S,2),w=P(C);J(w,{get icon(){return cl},class:`form-action-icon`});var T=I(w,2),E=P(T,!0);D(T),D(C),D(x),D(n),L(e=>{S.disabled=Q.failoverDraftSaving,C.disabled=e,H(E,Q.failoverDraftSaving?`Saving...`:`Save selected`)},[()=>Q.failoverGenerating||Q.failoverDraftSaving||Q.selectedFailoverDraftCount()===0]),z(`click`,S,()=>Q.closeFailoverDraftsModal()),z(`click`,C,()=>Q.saveSelectedFailoverDrafts()),V(e,n)},$$slots:{default:!0}}),k()}Br([`click`,`change`]);var yP=B(`
Rate limit management is unavailable.
`),bP=B(` Add`,1),xP=B(`

`),SP=B(`

No rules.

`),CP=B(` Edit`,1),wP=B(`
`),TP=B(`
`),EP=B(`

`),DP=B(``),OP=B(``);function kP(e,t){O(t,!0);function n(){Y.dialogOpen||Z.closeRateLimitInspector()}Nu(e,{get open(){return Z.rateLimitInspectorOpen},variant:`editor`,onclose:n,children:(e,t)=>{var n=OP(),r=P(n),i=P(r),a=I(P(i),2),o=P(a),s=P(o,!0);D(o),D(a),D(i),ku(I(i,2),{label:`Close rate limits inspector`,onclick:()=>Z.closeRateLimitInspector()}),D(r);var c=I(r,2),l=e=>{_O(e,{label:`Loading rate limits...`})},u=e=>{V(e,yP())},d=e=>{var t=Xr();W(F(t),17,()=>Z.rateLimitInspectorSections(),e=>e.key,(e,t)=>{var n=EP(),r=P(n),i=P(r),a=P(i,!0);D(i);var o=I(i,2);{let e=A(()=>`Add `+R(t).title.toLowerCase());yO(o,{get label(){return R(e)},class:`budget-action-btn`,onclick:()=>Z.openRateLimitFormFromInspector(R(t).scope,R(t).subject),children:(e,t)=>{var n=bP();J(F(n),{get icon(){return il},class:`table-icon-svg`}),Ve(2),V(e,n)},$$slots:{default:!0}})}D(r);var s=I(r,2),c=e=>{var n=xP(),r=P(n,!0);D(n),L(()=>H(r,R(t).hint)),V(e,n)};U(s,e=>{R(t).hint&&e(c)});var l=I(s,2),u=e=>{V(e,SP())},d=e=>{var n=TP();W(n,21,()=>R(t).items,e=>Z.rateLimitKey(e),(e,t)=>{var n=wP(),r=P(n),i=P(r),a=P(i),o=P(a,!0);D(a);var s=I(a,2),c=P(s),l=P(c);{let e=A(()=>Z.rateLimitIsConcurrent(R(t))?xc:bl);J(l,{get icon(){return R(e)},class:`budget-period-icon`})}var u=I(l,2),d=P(u,!0);D(u),D(c),D(s);var f=I(s,2),p=P(f),m=P(p),h=P(m,!0);D(m);var g=I(m,2),_=P(g,!0);D(g),D(p);var v=I(p,2),y=P(v),b=e=>{yO(e,{label:`Edit rate limit`,class:`budget-action-btn`,onclick:()=>Z.openRateLimitFormFromInspector(null,null,R(t)),children:(e,t)=>{var n=CP();J(F(n),{get icon(){return nl},class:`budget-action-icon`}),Ve(2),V(e,n)},$$slots:{default:!0}})},x=A(()=>!Z.rateLimitIsReadOnly(R(t)));U(y,e=>{R(x)&&e(b)}),D(v),D(f),D(i),D(r),D(n),L((e,t,r,i,a,s,c,l)=>{G(n,1,`budget-row ${e??``}`),Bi(n,t),K(n,`title`,r),H(o,i),H(d,a),H(h,s),K(g,`title`,c),H(_,l)},[()=>Z.rateLimitPressureClass(R(t)),()=>Z.rateLimitPressureStyle(R(t)),()=>Z.rateLimitPressurePercent(R(t))+`% of the most constrained cap used`,()=>Z.rateLimitSubject(R(t)),()=>Z.rateLimitPeriodLabel(R(t)),()=>Z.rateLimitInspectorSummary(R(t)),()=>Z.rateLimitIsReadOnly(R(t))?`Declared in configuration; read-only in the dashboard`:`Managed via dashboard or admin API`,()=>Z.rateLimitSourceLabel(R(t))]),V(e,n)}),D(n),V(e,n)};U(l,e=>{R(t).items.length===0?e(u):e(d,-1)}),D(n),L(()=>H(a,R(t).title)),V(e,n)}),V(e,t)};U(c,e=>{Z.rateLimitsLoading?e(l):Z.rateLimitsAvailable?e(d,-1):e(u,1)});var f=I(c,2),p=P(f),m=I(p,2),h=e=>{var t=DP();z(`click`,t,()=>{Z.closeRateLimitInspector(),Bl.navigate(`rate-limits`)}),V(e,t)},g=A(()=>Z.rateLimitsEnabled());U(m,e=>{R(g)&&e(h)}),D(f),D(n),L(()=>H(s,Z.rateLimitInspector.title)),z(`click`,p,()=>Z.closeRateLimitInspector()),V(e,n)},$$slots:{default:!0}}),k()}Br([`click`]);var AP=B(`
models
`),jP=B(`
Virtual models feature is unavailable.
`),MP=B(`
`),NP=B(``),PP=B(`
`),FP=B(``),IP=B(`
`),LP=B(`

No models registered.

`),RP=B(`

No models in this category.

`),zP=B(`

No models match your filter.

`),BP=B(`
`);function VP(e,t){O(t,!0),On(()=>{Y.refreshTick,Bl.page===`models`&&(iM.fetchVirtualModels(),TM.fetchModelPricingOverrides(),Q.fetchFailoverRules(),Z.fetchRateLimitsPage())}),On(()=>{let e=iM.filteredDisplayModels.length;return wr(()=>iM.restartModelRendering(e)),()=>iM.stopModelRendering()});let n=A(()=>Y.needsAuth);var r=BP(),i=P(r),a=I(P(i),2),o=e=>{var t=AP(),n=P(t),r=P(n,!0);D(n),Ve(),D(t),L(()=>H(r,Id.filter?iM.filteredDisplayModels.length+` / `+iM.displayModels.length:iM.displayModels.length)),V(e,t)};U(a,e=>{iM.displayModels.length>0&&e(o)}),D(i);var s=I(i,2);Rd(s,{});var c=I(s,2),l=e=>{V(e,jP())};U(c,e=>{!iM.virtualModelsAvailable&&!R(n)&&e(l)});var u=I(c,2),d=e=>{var t=MP(),n=P(t,!0);D(t),L(()=>H(n,iM.aliasError)),V(e,t)};U(u,e=>{iM.aliasError&&!R(n)&&e(d)});var f=I(u,2),p=e=>{var t=MP(),n=P(t,!0);D(t),L(()=>H(n,TM.modelPricingOverrideError)),V(e,t)};U(f,e=>{TM.modelPricingOverrideError&&!R(n)&&!TM.modelPricingOverrideFormOpen&&e(p)});var m=I(f,2),h=e=>{var t=PP();W(t,21,()=>Id.categories,e=>e.category,(e,t)=>{var n=NP();let r;var i=P(n),a=P(i,!0);D(i);var o=I(i,2),s=P(o,!0);D(o),D(n),L(()=>{r=G(n,1,`category-tab svelte-scpjps`,null,r,{active:Id.activeCategory===R(t).category}),H(a,R(t).display_name),H(s,R(t).count)}),z(`click`,n,()=>Id.selectCategory(R(t).category)),V(e,n)}),D(t),V(e,t)};U(m,e=>{Id.categories.length>0&&e(h)});var g=I(m,2),_=e=>{var t=IP(),n=P(t);SD(P(n),{placeholder:`Filter by provider, provider/model, alias, or owner...`,label:`Filter models by provider, provider/model, alias, or owner`,get value(){return Id.filter},set value(e){Id.filter=e}}),D(n);var r=I(n,2),i=P(r),a=e=>{var t=FP();J(P(t),{get icon(){return il},class:`alias-create-icon`}),Ve(2),D(t),z(`click`,t,()=>iM.openVirtualModelCreate()),V(e,t)};U(i,e=>{iM.virtualModelsAvailable&&e(a)}),D(r),D(t),V(e,t)};U(g,e=>{(iM.displayModels.length>0||Id.filter||iM.virtualModelsAvailable)&&e(_)});var v=I(g,2),y=e=>{{let t=A(()=>iM.modelLoadingText());_O(e,{get label(){return R(t)},class:`models-loading-state`})}},b=A(()=>iM.modelsBusy()&&!R(n));U(v,e=>{R(b)&&e(y)});var x=I(v,2);WN(x,{});var S=I(x,2);tP(S,{});var C=I(S,2),w=e=>{CN(e,{})};U(C,e=>{(iM.displayModels.length>0||Id.filter)&&e(w)});var T=I(C,2),E=e=>{V(e,LP())};U(T,e=>{iM.displayModels.length===0&&!Id.loading&&!R(n)&&!Id.filter&&(Id.activeCategory===`all`||!Id.activeCategory)&&e(E)});var ee=I(T,2),te=e=>{V(e,RP())};U(ee,e=>{iM.displayModels.length===0&&!Id.loading&&!R(n)&&!Id.filter&&Id.activeCategory&&Id.activeCategory!==`all`&&e(te)});var ne=I(ee,2),re=e=>{V(e,zP())};U(ne,e=>{iM.displayModels.length>0&&iM.filteredDisplayModels.length===0&&Id.filter&&e(re)});var ie=I(ne,2);kP(ie,{});var ae=I(ie,2);RA(ae,{});var oe=I(ae,2);lP(oe,{}),vP(I(oe,2),{}),D(r),V(e,r),k()}Br([`click`]);var HP=`draft-workflow-preview`;function UP(){return{scope_provider:``,scope_model:``,scope_user_path:``,name:``,description:``,features:{cache:!0,audit:!0,usage:!0,budget:!0,guardrails:!1,failover:!0},guardrails:[]}}function WP(){return{scope_provider:``,scope_model:``,scope_user_path:``}}function GP(e){return{ref:``,step:Number.isFinite(e)?e:10}}function KP(e){let t=e==null?``:String(e).trim();if(t===``)return NaN;let n=Number(t);return Number.isFinite(n)?n:NaN}function qP(e,t,n){if(!e||typeof e!=`object`||Array.isArray(e))return n;let r=t.charAt(0).toUpperCase()+t.slice(1);for(let n of[t,r])if(Object.prototype.hasOwnProperty.call(e,n)&&e[n]!==null&&e[n]!==void 0)return e[n];return n}function JP(e,t){return!e||typeof e!=`object`||Array.isArray(e)?!1:[t,t.charAt(0).toUpperCase()+t.slice(1)].some(t=>Object.prototype.hasOwnProperty.call(e,t)&&e[t]!==null&&e[t]!==void 0)}function YP(e){return{cache:!!qP(e,`cache`,!1),audit:!!qP(e,`audit`,!1),usage:!!qP(e,`usage`,!1),budget:qP(e,`budget`,!0)!==!1,guardrails:!!qP(e,`guardrails`,!1),failover:qP(e,`failover`,!0)!==!1}}function XP(e,t){let n=YP(e),r=t||{},i=n.usage&&!!r.usage;return{cache:n.cache&&!!r.cache,audit:n.audit&&!!r.audit,usage:i,budget:i&&n.budget&&!!r.budget,guardrails:n.guardrails&&!!r.guardrails,failover:n.failover&&!!r.failover}}function ZP(e,t){let n=e&&e.workflow_payload&&e.workflow_payload.features?e.workflow_payload.features:e&&e.features?e.features:{};return{...XP((e&&e.effective_features&&typeof e.effective_features==`object`&&!Array.isArray(e.effective_features)?e.effective_features:null)||n,t),failover:YP(n).failover}}function QP(e,t){return ZP(e,t).failover?`On`:`Off`}function $P(e){return(Array.isArray(e&&e.workflow_payload&&e.workflow_payload.guardrails)?e.workflow_payload.guardrails:Array.isArray(e&&e.guardrails)?e.guardrails:[]).map(e=>({ref:String(e&&e.ref||``).trim(),step:KP(e&&e.step)})).filter(e=>Number.isInteger(e.step)&&e.step>=0)}function eF(e,t){return ZP(e,t).guardrails&&Array.isArray(e&&e.workflow_payload&&e.workflow_payload.guardrails)?e.workflow_payload.guardrails:[]}function tF(e){return String(e&&(e.scope_provider_name||e.scope_provider)||``).trim()}function nF(e){return String(e&&(e.provider_name||e.provider_type)||``).trim()}function rF(e,t){let n=new Set,r=String(t&&t.scope_provider||``).trim();return r&&n.add(r),(Array.isArray(e)?e:[]).forEach(e=>{let t=nF(e);t&&n.add(t)}),[...n].sort()}function iF(e,t,n){let r=String(t||``).trim(),i=new Set,a=String(n&&n.scope_provider||``).trim(),o=String(n&&n.scope_model||``).trim();return r&&r===a&&o&&i.add(o),(Array.isArray(e)?e:[]).forEach(e=>{if(r&&nF(e)!==r)return;let t=String(e&&e.model&&e.model.id||``).trim();t&&i.add(t)}),[...i].sort()}function aF(e){let t=String(e&&e.scope_type||``).trim();return t===`provider_model`?`Provider Name + Model`:t===`provider_model_path`?`Provider Name + Model + Path`:t===`provider_path`?`Provider Name + Path`:t===`path`?`Path`:t===`provider`?`Provider Name`:`Global`}function oF(e){return String(e&&e.scope_display||`global`).trim()||`global`}function sF(e){let t=String(e&&e.name||``).trim();if(t)return t;let n=oF(e);return n===`global`?`All models`:n}function cF(e){let t=String(e||``).trim();if(!t)return``;let n=(t.startsWith(`/`)?t:`/`+t).split(`/`);for(let e of n){let t=String(e||``).trim();if(t){if(t===`.`||t===`..`)return`User path cannot contain "." or ".." segments.`;if(t.includes(`:`))return`User path cannot contain ":" segments.`}}return``}function lF(e){if(cF(e))return``;let t=String(e||``).trim();if(!t)return``;let n=(t.startsWith(`/`)?t:`/`+t).split(`/`),r=[];for(let e of n){let t=String(e||``).trim();t&&r.push(t)}return r.length?`/`+r.join(`/`):`/`}function uF(e){let t=e||UP(),n=String(t.scope_provider||``).trim(),r=lF(t.scope_user_path);return{scope_provider:n,scope_model:n?String(t.scope_model||``).trim():``,scope_user_path:r}}function dF(e){let t=String(e&&e.scope_provider||``).trim(),n=t?String(e&&e.scope_model||``).trim():``,r=lF(e&&e.scope_user_path);return!t&&!r?`global`:!t&&r?`path`:!n&&!r?`provider`:!n&&r?`provider_path`:r?`provider_model_path`:`provider_model`}function fF(e){let t=String(e&&e.scope_provider||``).trim(),n=t?String(e&&e.scope_model||``).trim():``,r=lF(e&&e.scope_user_path),i=dF({scope_provider:t,scope_model:n,scope_user_path:r});return i===`global`?`global`:i===`path`?r:i===`provider`?t:i===`provider_path`?t+` @ `+r:i===`provider_model_path`?t+`/`+n+` @ `+r:t+`/`+n}function pF(e,t){let n=t||WP(),r=tF(e&&e.scope),i=r?String(e&&e.scope&&e.scope.scope_model||``).trim():``,a=lF(e&&e.scope&&e.scope.scope_user_path);return r===String(n.scope_provider||``).trim()&&i===String(n.scope_model||``).trim()&&a===lF(n.scope_user_path)}function mF(e,t,n){let r=uF(t);return!(r.scope_provider!==``||r.scope_model!==``||r.scope_user_path!==``)&&!n?null:(Array.isArray(e)?e:[]).find(e=>pF(e,r))||null}function hF(e){return String(e&&e.scope_type||``).trim()!==`global`}function gF(e){let t=String(e||``).trim();return t?t.length<=14?t:t.slice(0,12)+`…`:`—`}function _F(e,t){let n=Array.isArray(e)?e:[];if(!t)return n;let r=String(t).toLowerCase();return n.filter(e=>[e.name,e.description,e.scope_display,e.scope_type,tF(e&&e.scope),e.scope&&e.scope.scope_model,e.scope&&e.scope.scope_user_path,e.workflow_hash,...Array.isArray(e.workflow_payload&&e.workflow_payload.guardrails)?e.workflow_payload.guardrails.map(e=>e.ref):[]].some(e=>String(e||``).toLowerCase().includes(r)))}function vF(e,t){let n=e||UP(),r=uF(n),i=YP(n.features||{}),a=XP(i,t);a.failover=i.failover;let o=!!a.guardrails,s=o?$P(n):[];return{id:HP,scope_type:dF(r),scope_display:fF(r),scope:{scope_provider_name:r.scope_provider,scope_model:r.scope_model,...r.scope_user_path?{scope_user_path:r.scope_user_path}:{}},name:String(n.name||``).trim(),description:String(n.description||``).trim(),workflow_payload:{schema_version:1,features:{cache:!!a.cache,audit:!!a.audit,usage:!!a.usage,budget:!!a.budget,guardrails:o,failover:!!a.failover},guardrails:s}}}function yF({form:e,caps:t,workflows:n=[],formHydrated:r=!1,hydratedScope:i=null}){let a=e||UP(),o=String(a.scope_provider||``).trim(),s=o?String(a.scope_model||``).trim():``,c=lF(a.scope_user_path),l=YP(a.features||{}),u=XP(l,t),d=mF(n,a,r),f=d&&d.workflow_payload&&d.workflow_payload.features,p=JP(f,`failover`),m=p?qP(f,`failover`,!0)!==!1:null,h=i||WP(),g=String(h.scope_provider||``).trim()===o&&String(h.scope_model||``).trim()===s&&lF(h.scope_user_path)===lF(c),_=!!(t&&t.failover),v=_||!!r&&g&&Object.prototype.hasOwnProperty.call(l,`failover`)||!r&&!!d&&p,y=u.guardrails?(Array.isArray(a.guardrails)?a.guardrails:[]).map(e=>({ref:String(e&&e.ref||``).trim(),step:KP(e&&e.step)})):[],b={scope_provider_name:o,scope_model:s,...c?{scope_user_path:c}:{},name:String(a.name||``).trim(),description:String(a.description||``).trim(),workflow_payload:{schema_version:1,features:{cache:!!u.cache,audit:!!u.audit,usage:!!u.usage,budget:!!u.budget,guardrails:!!u.guardrails},guardrails:y}};return v&&(b.workflow_payload.features.failover=!_&&!r&&d&&p?m:!!l.failover),b}function bF(e,{models:t=[],hydratedScope:n=null}={}){let r=n||WP(),i=String(r.scope_provider||``).trim(),a=String(r.scope_model||``).trim(),o=String(e&&(e.scope_provider_name||e.scope_provider)||``).trim(),s=String(e&&e.scope_model||``).trim();if(o&&!rF(t,r).includes(o)&&o!==i)return`Choose a registered provider name.`;if(s&&!o)return`Model selection requires a provider name.`;if(s){let e=iF(t,o,r),n=o===i&&s===a;if(!e.includes(s)&&!n)return`Choose a registered model for the selected provider name.`}let c=cF(e.scope_user_path);if(c)return c;let l=e.workflow_payload&&e.workflow_payload.features?e.workflow_payload.features:{},u=Array.isArray(e.workflow_payload&&e.workflow_payload.guardrails)?e.workflow_payload.guardrails:[];if(!l.guardrails)return``;let d=new Set;for(let e of u){if(!e.ref)return`Each guardrail step needs a guardrail ref.`;if(!Number.isInteger(e.step)||e.step<0)return`Each guardrail step must use a non-negative integer step number.`;if(d.has(e.ref))return`Each guardrail ref may appear only once in a workflow.`;d.add(e.ref)}return``}var xF=new class{#e=j(N([]));get workflows(){return R(this.#e)}set workflows(e){M(this.#e,e,!0)}#t=j(!0);get available(){return R(this.#t)}set available(e){M(this.#t,e,!0)}#n=j(!1);get loading(){return R(this.#n)}set loading(e){M(this.#n,e,!0)}#r=j(``);get error(){return R(this.#r)}set error(e){M(this.#r,e,!0)}#i=j(``);get filter(){return R(this.#i)}set filter(e){M(this.#i,e,!0)}#a=j(!1);get formOpen(){return R(this.#a)}set formOpen(e){M(this.#a,e,!0)}#o=j(!1);get submitting(){return R(this.#o)}set submitting(e){M(this.#o,e,!0)}#s=j(``);get deactivatingID(){return R(this.#s)}set deactivatingID(e){M(this.#s,e,!0)}#c=j(``);get formError(){return R(this.#c)}set formError(e){M(this.#c,e,!0)}#l=j(!1);get formHydrated(){return R(this.#l)}set formHydrated(e){M(this.#l,e,!0)}#u=j(N(WP()));get hydratedScope(){return R(this.#u)}set hydratedScope(e){M(this.#u,e,!0)}#d=j(N([]));get guardrailRefs(){return R(this.#d)}set guardrailRefs(e){M(this.#d,e,!0)}#f=j(N(UP()));get form(){return R(this.#f)}set form(e){M(this.#f,e,!0)}#p=null;failoverVisible(){return bu.booleanFlag(`FAILOVER_ENABLED`,!0)}featureCaps(){return{cache:bu.cacheVisible(),audit:bu.auditVisible(),usage:bu.usageVisible(),budget:bu.budgetsVisible(),guardrails:bu.guardrailsVisible(),failover:this.failoverVisible()}}get filteredWorkflows(){return _F(this.workflows,this.filter)}providerOptions(){return rF(Id.models,this.hydratedScope)}modelOptions(e){return iF(Id.models,e,this.hydratedScope)}activeScopeMatch(){return mF(this.workflows,this.form,this.formHydrated)}submitMode(){return this.activeScopeMatch()?`save`:`create`}submitLabel(){return this.submitMode()===`save`?`Save`:`Create`}submittingLabel(){return this.submitMode()===`save`?`Saving...`:`Creating...`}preview(){return vF(this.form,this.featureCaps())}openCreate(e){if(this.formOpen=!0,this.submitting=!1,this.formError=``,!e){this.formHydrated=!1,this.hydratedScope=WP(),this.form=UP();return}this.formHydrated=!0,this.hydratedScope={scope_provider:tF(e.scope),scope_model:String(e.scope&&e.scope.scope_model||``).trim(),scope_user_path:String(e.scope&&e.scope.scope_user_path||``).trim()};let t=e.workflow_payload&&e.workflow_payload.features?YP(e.workflow_payload.features):ZP(e,this.featureCaps()),n=Array.isArray(e.workflow_payload&&e.workflow_payload.guardrails)?e.workflow_payload.guardrails.map(e=>({ref:String(e&&e.ref||``).trim(),step:KP(e&&e.step)})).filter(e=>Number.isInteger(e.step)&&e.step>=0):$P(e);this.form={scope_provider:tF(e.scope),scope_model:String(e.scope&&e.scope.scope_model||``),scope_user_path:String(e.scope&&e.scope.scope_user_path||``),name:String(e.name||``),description:String(e.description||``),features:{cache:!!t.cache,audit:!!t.audit,usage:!!t.usage,budget:!!t.budget,guardrails:!!t.guardrails,failover:!!t.failover},guardrails:n.map(e=>({ref:String(e&&e.ref||``),step:Number.isFinite(e&&e.step)?e.step:10}))}}closeForm(){this.formOpen=!1,this.submitting=!1,this.formError=``,this.formHydrated=!1,this.hydratedScope=WP(),this.form=UP()}setProvider(e){if(this.form.scope_provider=String(e||``).trim(),!this.form.scope_provider){this.form.scope_model=``;return}this.modelOptions(this.form.scope_provider).includes(String(this.form.scope_model||``).trim())||(this.form.scope_model=``)}addGuardrailStep(){let e=(Array.isArray(this.form.guardrails)?this.form.guardrails:[]).reduce((e,t)=>{let n=Number(t&&t.step);return Number.isFinite(n)?Math.max(e,n):e},0)+10;this.form.guardrails.push(GP(e))}removeGuardrailStep(e){Array.isArray(this.form.guardrails)&&this.form.guardrails.splice(e,1)}buildRequest(){return yF({form:this.form,caps:this.featureCaps(),workflows:this.workflows,formHydrated:this.formHydrated,hydratedScope:this.hydratedScope})}async fetchWorkflows(){this.#p&&this.#p.abort();let e=new AbortController;this.#p=e,this.loading=!0,this.error=``;let t=setTimeout(()=>e.abort(),1e4),n=await bO(`/admin/workflows`,{label:`workflows`,options:{signal:e.signal}});if(clearTimeout(t),this.#p===e&&(this.#p=null,this.loading=!1,n.status!==`stale`)){if(n.status===`unavailable`){this.available=!1,this.workflows=[];return}if(n.result&&(this.available=!0),n.status===`error`){this.workflows=[],this.error=e.signal.aborted?`Loading workflows timed out.`:n.error;return}this.workflows=n.items}}async fetchGuardrailRefs(){let e=await bO(`/admin/workflows/guardrails`,{label:`workflow guardrails`});e.status!==`stale`&&(this.guardrailRefs=e.items)}async fetchPage(){await Promise.all([bu.ensureLoaded(),this.fetchWorkflows(),this.fetchGuardrailRefs()])}async submitForm(){if(this.submitting)return;this.formError=``;let e=this.buildRequest(),t=bF(e,{models:Id.models,hydratedScope:this.hydratedScope});if(t){this.formError=t;return}this.submitting=!0;try{let t=await xO(`/admin/workflows`,`POST`,e,{label:`create workflow`,unavailableStatuses:[]});if(t.status===`stale`||t.result&&t.result.status===401)return;if(t.status===`error`){this.formError=t.error;return}ed.success(`Workflow created and activated.`),this.closeForm(),this.fetchPage()}finally{this.submitting=!1}}async deactivate(e){let t=String(e&&e.id||``).trim();if(!t||this.deactivatingID||!hF(e))return;let n=sF(e);if(confirm(`Deactivate workflow "`+n+`"? Requests will fall back to the next active workflow for this scope.`)){this.deactivatingID=t;try{let e=await xO(`/admin/workflows/`+encodeURIComponent(t)+`/deactivate`,`POST`,void 0,{label:`deactivate workflow`,unavailableStatuses:[]});if(e.status===`stale`||e.result&&e.result.status===401)return;if(e.status===`error`){ed.error(e.error);return}ed.success(`Workflow deactivated.`),this.fetchPage()}finally{this.deactivatingID=``}}}};function SF(e){let t=String(e??``),n=typeof navigator<`u`?navigator.clipboard:null;if(n&&typeof n.writeText==`function`)return n.writeText(t);let r=typeof document<`u`?document:null;if(!r||!r.body||typeof r.execCommand!=`function`)return Promise.reject(Error(`Clipboard API unavailable`));let i=r.createElement(`textarea`);i.value=t,i.setAttribute(`readonly`,``),i.style.position=`fixed`,i.style.top=`0`,i.style.left=`0`,i.style.opacity=`0`;try{if(r.body.appendChild(i),i.focus(),i.select(),i.setSelectionRange(0,i.value.length),!r.execCommand(`copy`))throw Error(`execCommand copy returned false`)}finally{i.parentNode&&i.parentNode.removeChild(i)}return Promise.resolve()}function CF({resetDelayMs:e=2e3,logPrefix:t}={}){let n=N({copied:!1,error:!1}),r=null;function i(){r!==null&&clearTimeout(r),r=null}function a(){i(),r=setTimeout(()=>{n.copied=!1,n.error=!1,r=null},e)}return{get copied(){return n.copied},get error(){return n.error},reset(){i(),n.copied=!1,n.error=!1},async copy(e,r){if(!(e==null||e===``)){i(),n.copied=!1,n.error=!1;try{await SF(typeof r==`function`?r(e):String(e)),n.copied=!0,n.error=!1}catch(e){console.error(t||`Failed to copy text:`,e),n.copied=!1,n.error=!0}a()}}}}var wF=B(``);function TF(e,t){O(t,!0);let n=q(t,`workflowID`,3,``),r=CF({logPrefix:`Failed to copy workflow ID:`});On(()=>{n(),r.reset()});let i=A(()=>r.error?`Unable to copy workflow ID`:r.copied?`Workflow ID copied`:`Copy workflow ID`),a=A(()=>n()?R(i)+` `+n():R(i));async function o(e){e.preventDefault(),n()&&await r.copy(n())}var s=wF();let c;var l=I(P(s),4),u=P(l,!0);D(l);var d=I(l,2);J(P(d),{get icon(){return Bc}}),D(d),D(s),L(()=>{c=G(s,1,`workflow-pipeline-meta mono svelte-1viff7o`,null,c,{"workflow-pipeline-meta-copied":r.copied,"workflow-pipeline-meta-error":r.error}),K(s,`title`,R(i)),K(s,`aria-label`,R(a)),H(u,n())}),z(`click`,s,o),V(e,s),k()}Br([`click`]);var EF=(e,t)=>{let n=()=>(t?.()).icon,r=()=>(t?.()).label,i=Et(()=>h((t?.()).variant,`workflow-node-feature`)),a=()=>(t?.()).state,o=()=>(t?.()).sub,s=()=>(t?.()).badge;var c=AF(),l=P(c),u=e=>{var t=DF();let r;J(P(t),{get icon(){return n()}}),D(t),L(()=>r=G(t,1,`workflow-node-icon svelte-nbptrg`,null,r,{"workflow-node-icon-endpoint":R(i)===`workflow-node-endpoint`})),V(e,t)};U(l,e=>{n()&&e(u)});var d=I(l,2),f=P(d,!0);D(d);var p=I(d,2),m=e=>{var t=OF(),n=P(t,!0);D(t),L(()=>H(n,s())),V(e,t)};U(p,e=>{s()&&e(m)});var g=I(p,2),_=e=>{var t=kF(),n=P(t,!0);D(t),L(()=>H(n,o())),V(e,t)};U(g,e=>{o()&&e(_)}),D(c),L(()=>{G(c,1,Ni([`workflow-node`,R(i),a()]),`svelte-nbptrg`),H(f,r())}),V(e,c)},DF=B(`
`),OF=B(` `),kF=B(` `),AF=B(`
`),jF=B(`
`,1),MF=B(`
`,1),NF=B(`
`),PF=B(`
Async
`),FF=B(`
`);function IF(e,t){O(t,!0);let n=q(t,`chart`,19,()=>({}));var r=FF();let i;var a=P(r),o=e=>{TF(e,{get workflowID(){return n().workflowID}})};U(a,e=>{n().workflowID&&e(o)});var s=I(a,2),c=P(s);EF(c,()=>({icon:wl,label:`Client`,variant:`workflow-node-endpoint`}));var l=I(c,4);EF(l,()=>({icon:Hc,label:`Auth`,state:n().authNodeClass,sub:n().authNodeSublabel}));var u=I(l,2),d=e=>{var t=jF(),r=F(t);EF(I(r,2),()=>({icon:Hc,label:`Cache`,state:n().cacheNodeClass,badge:n().cacheStatusLabel})),L(()=>G(r,1,Ni([`workflow-conn`,n().cacheConnClass]),`svelte-nbptrg`)),V(e,t)};U(u,e=>{n().showCache&&e(d)});var f=I(u,2),p=e=>{var t=MF();EF(I(F(t),2),()=>({icon:Tl,label:`Budget`,state:n().budgetNodeClass,badge:n().budgetStatusLabel})),V(e,t)};U(f,e=>{n().showBudget&&e(p)});var m=I(f,2),h=e=>{var t=MF();EF(I(F(t),2),()=>({icon:gl,label:`Guardrails`,sub:n().guardrailLabel})),V(e,t)};U(m,e=>{n().showGuardrails&&e(h)});var g=I(m,2),_=I(g,2);EF(_,()=>({label:n().aiLabel,variant:`workflow-node-ai`,state:n().aiNodeClass,sub:n().aiSublabel}));var v=I(_,2),y=e=>{var t=jF(),r=F(t);EF(I(r,2),()=>({icon:Qc,label:`Failover`,state:n().failoverNodeClass,badge:n().failoverStatusLabel,sub:n().failoverTargetLabel})),L(()=>G(r,1,Ni([`workflow-conn`,n().failoverConnClass]),`svelte-nbptrg`)),V(e,t)};U(v,e=>{n().showFailover&&e(y)});var b=I(v,2);EF(I(b,2),()=>({icon:Ic,label:`Response`,variant:`workflow-node-endpoint`,state:n().responseNodeClass,sub:n().responseNodeSublabel})),D(s);var x=I(s,2),S=e=>{var t=PF(),r=P(t),i=P(r),a=e=>{EF(e,()=>({icon:Ac,label:`Usage`,variant:`workflow-node-feature workflow-node-async`,state:n().usageNodeClass}))};U(i,e=>{n().showUsage&&e(a)});var o=I(i,2),s=e=>{V(e,NF())};U(o,e=>{n().showUsage&&n().showAudit&&e(s)});var c=I(o,2),l=e=>{EF(e,()=>({icon:Uc,label:`Audit Log`,variant:`workflow-node-feature workflow-node-async`,state:n().auditNodeClass}))};U(c,e=>{n().showAudit&&e(l)}),D(r),Ve(4),D(t),V(e,t)};U(x,e=>{n().showAsync&&e(S)}),D(r),L(()=>{i=G(r,1,`workflow-pipeline svelte-nbptrg`,null,i,{"workflow-pipeline-has-meta":n().workflowID}),G(g,1,Ni([`workflow-conn`,n().aiConnClass]),`svelte-nbptrg`),G(b,1,Ni([`workflow-conn`,n().responseConnClass]),`svelte-nbptrg`)}),V(e,r),k()}function LF(e){let t=$P(e).length;return t===0?``:t===1?`1 step`:t+` steps`}function RF(e,t){return t&&t.provider?t.provider:tF(e&&e.scope)||`AI`}function zF(e,t){return t&&t.model?t.model:e&&e.scope&&e.scope.scope_model||null}function BF(e,t){let n=String(e&&e.id||``).trim();if(n&&n!==`draft-workflow-preview`)return n;let r=String(t&&t.workflow_version_id||``).trim();return r&&r!==`draft-workflow-preview`?r:null}function VF(e){let t=e&&e.data&&e.data.workflow_features;return!t||typeof t!=`object`||Array.isArray(t)?null:YP(t)}function HF(e){let t=e&&e.data&&e.data.failover;if(!t||typeof t!=`object`||Array.isArray(t))return null;let n=String(t.target_model||t.targetModel||``).trim()||null;return n?{targetModel:n}:null}function UF(e,t=0){if(t>4||e==null)return``;if(typeof e==`string`){let n=e.trim();if(!n||n[0]!==`{`&&n[0]!==`[`)return``;try{return UF(JSON.parse(n),t+1)}catch{return``}}if(Array.isArray(e)){for(let n of e){let e=UF(n,t+1);if(e)return e}return``}return typeof e==`object`?String(e.code||``).trim()||(e.error===void 0?``:UF(e.error,t+1)):``}function WF(e){let t=e&&e.data&&typeof e.data==`object`&&!Array.isArray(e.data)?e.data:{};return String(t.error_code||t.errorCode||``).trim()||UF(t.response_body)}function GF(e){let t=String(e||``).trim();if(!t)return null;let n=t.indexOf(`/`);return n<=0||n>=t.length-1?null:{provider:t.slice(0,n),model:t.slice(n+1)}}function KF(e,t){let n=String(e&&(e.requested_model||e.model)||``).trim(),r=HF(e);if(!(r&&r.targetModel))return{provider:String(e&&e.provider||``).trim()||null,model:n||null};let i=GF(n);if(i)return i;let a=tF(t&&t.scope),o=a?String(t&&t.scope&&t.scope.scope_model||``).trim():``;return a||o?{provider:a||null,model:o||n||null}:{provider:null,model:n||null}}function qF(e,t){if(!e)return null;let n=(()=>{let t=String(e.cache_type||``).trim().toLowerCase();return t===`exact`||t===`semantic`?t:null})(),r=(()=>{if(e.status_code===void 0||e.status_code===null)return null;let t=String(e.status_code).trim();if(!t)return null;let n=Number(t);return Number.isFinite(n)?n:null})(),i=n?!0:e.cache_hit!==void 0&&e.cache_hit!==null&&!!e.cache_hit,a=HF(e),o=KF(e,t),s=Number.isFinite(r)&&r>=200&&r<300,c=String(e.error_type||``).trim().toLowerCase()===`authentication_error`,l=String(e.auth_method||``).trim().toLowerCase()||null,u=WF(e).toLowerCase()===`budget_exceeded`;return{cacheHit:i,cacheType:n||null,failoverTarget:a&&a.targetModel?a.targetModel:null,provider:o.provider,model:o.model,statusCode:r,responseSuccess:s,aiSuccess:s&&!i,authError:c,authMethod:l,budgetExceeded:u}}function JF(e){return!!(e&&e.cacheHit)}function YF(e){return!!(e&&e.failoverTarget)}function XF(e){return!!(e&&e.budgetExceeded)}function ZF(e,t){return t?`workflow-node-current`:e&&e.cacheHit?`workflow-node-success`:``}function QF(e){return e&&e.cacheHit?`workflow-conn-hit`:``}function $F(e){return!e||!e.cacheHit?null:e.cacheType===`semantic`?`Hit (Semantic)`:`Hit (Exact)`}function eI(e,t,n,r){return e?XF(t)?`workflow-node-error`:r?`workflow-node-current`:n?`workflow-node-success`:``:``}function tI(e){return XF(e)?`Exceeded`:null}function nI(e){return e&&e.cacheHit?`workflow-node-skipped`:e&&e.failoverTarget?`workflow-node-success`:``}function rI(e){return e&&e.cacheHit?`workflow-conn-dim`:e&&e.failoverTarget?`workflow-conn-hit`:``}function iI(e){return e&&e.failoverTarget?`Redirected`:null}function aI(e){return e&&e.failoverTarget?e.failoverTarget:null}function oI(e){return e&&e.cacheHit?`workflow-conn-dim`:``}function sI(e,t){return e?e.cacheHit?`workflow-node-skipped`:t?`workflow-node-current`:e.aiSuccess?`workflow-node-success`:``:``}function cI(e,t){if(!e)return``;let n=e.statusCode;return!Number.isFinite(n)&&t?`workflow-node-current`:Number.isFinite(n)?n>=500?`workflow-node-error`:n>=400?`workflow-node-warning`:n>=300?`workflow-node-neutral`:n>=200?`workflow-node-success`:``:``}function lI(e){return!e||!Number.isFinite(e.statusCode)?null:String(e.statusCode)}function uI(e,t){return e?e.authError?`workflow-node-error`:t?`workflow-node-current`:e.authMethod===`api_key`||e.authMethod===`master_key`?`workflow-node-success`:``:``}function dI(e){return!e||!e.authMethod?null:e.authMethod}function fI(e,t,n){return e?n?`workflow-node-current`:t?`workflow-node-success`:``:``}function pI(e,t){if(!e||!e._live)return!!t;let n=String(e._live_state||``).trim();return!!e._audit_flushed||n===`audit.flushed`||n===`audit.detail`}function mI(e,t){if(!e)return!!t;let n=e.usage||{},r=Number(n.entries||0)>0;if(!e._live)return r;let i=String(e._usage_live_state||``).trim();return e._usage_flushed||i===`usage.flushed`?!0:!e._usage_live_pending&&r&&!e._live_pending}function hI(e){return!!(e&&e._live&&e._usage_live_pending&&!e._usage_flushed)}function gI(e,t){return!e||!e._live||pI(e,!1)?!1:String(e._live_state||``).trim()===`audit.completed`||!!(t&&Number.isFinite(t.statusCode))}function _I(e,t,n){return!e||!e._live?``:hI(e)?`usage`:gI(e,t)?`audit`:pI(e,!1)&&!e._live_pending?``:t&&t.cacheHit?`cache`:t&&(t.provider||t.model)?`ai`:n&&n.budget&&(e.workflow_version_id||e.requested_model)?`budget`:t&&t.authMethod?``:`auth`}function vI(e,t,n,r){let i=n||{},a=i.features&&typeof i.features==`object`&&!Array.isArray(i.features)?YP(i.features):ZP(e,r),o=!!i.forceAudit,s=!!i.highlightAsyncPresent,c=!!a.budget||XF(t),l=!!a.guardrails,u=!!a.usage,d=o||!!a.audit,f=!!i.forceAsync||!!(u||d),p=!!a.failover||YF(t),m=BF(e,i.entry),h=_I(i.entry,t,a),g=hI(i.entry),_=gI(i.entry,t),v=pI(i.entry,s),y=mI(i.entry,s);return{showBudget:c,budgetNodeClass:eI(c,t,s,h===`budget`),budgetStatusLabel:tI(t),showGuardrails:l,guardrailLabel:l?LF(e):``,showCache:!!i.forceCache||!!a.cache||JF(t),cacheNodeClass:ZF(t,h===`cache`),cacheConnClass:QF(t),cacheStatusLabel:$F(t),showFailover:p,failoverNodeClass:p?nI(t):``,failoverConnClass:p?rI(t):``,failoverStatusLabel:p?iI(t):null,failoverTargetLabel:p?aI(t):null,aiLabel:RF(e,t),aiSublabel:zF(e,t),aiConnClass:oI(t),aiNodeClass:sI(t,h===`ai`),responseConnClass:oI(t),responseNodeClass:cI(t,h===`response`),responseNodeSublabel:lI(t),authNodeClass:uI(t,h===`auth`),authNodeSublabel:dI(t),usageNodeClass:fI(u,y,g),auditNodeClass:fI(d,v,_),showAsync:f,showUsage:u,showAudit:d,workflowID:m}}function yI(e,t){return vI(e,null,{forceCache:!1},t)}function bI(e,t,n){return vI(t,qF(e,t),{entry:e,features:VF(e)||(t?ZP(t,n):{cache:!1,audit:!1,usage:!1,budget:!1,guardrails:!1,failover:!1}),forceAudit:!0,forceAsync:!0,highlightAsyncPresent:!0},n)}var xI=B(`

`),SI=B(`

`),CI=B(`
`),wI=B(`
`),TI=B(`

No guardrails configured for this workflow.

`),EI=B(`

Guardrails

`),DI=B(``),OI=B(`

`);function kI(e,t){O(t,!0);let n=q(t,`preview`,3,!1),r=A(()=>xF.featureCaps()),i=A(()=>sF(t.workflow)),a=A(()=>eF(t.workflow,R(r))),o=A(()=>yI(t.workflow,R(r))),s=A(()=>n()?`draft-workflow-preview-guardrail-`:t.workflow.id+`-guardrail-`);var c=OI();let l;var u=P(c),d=P(u),f=P(d),p=P(f,!0);D(f);var m=I(f,2),h=P(m,!0);D(m),D(d);var g=I(d,2),_=P(g),v=P(_,!0);D(_),D(g),D(u);var y=I(u,2),b=e=>{var n=xI(),r=P(n,!0);D(n),L(()=>H(r,t.workflow.description)),V(e,n)};U(y,e=>{t.workflow.description&&e(b)});var x=I(y,2),S=e=>{var n=SI(),i=P(n);D(n),L(e=>H(i,`Failover: ${e??``}`),[()=>QP(t.workflow,R(r))]),V(e,n)},C=A(()=>xF.failoverVisible());U(x,e=>{R(C)&&e(S)});var w=I(x,2);IF(w,{get chart(){return R(o)}});var T=I(w,2),E=e=>{var t=EI(),n=P(t),r=I(P(n),2),i=P(r,!0);D(r),D(n);var o=I(n,2),c=e=>{var t=wI();W(t,23,()=>R(a),(e,t)=>R(s)+t,(e,t)=>{var n=CI(),r=P(n),i=P(r,!0);D(r);var a=I(r,2),o=P(a);D(a),D(n),L(()=>{H(i,R(t).ref),H(o,`step ${R(t).step??``}`)}),V(e,n)}),D(t),V(e,t)},l=e=>{V(e,TI())};U(o,e=>{R(a).length>0?e(c):e(l,-1)}),D(t),L(()=>H(i,R(a).length?R(a).length+` steps`:`None`)),V(e,t)},ee=A(()=>bu.guardrailsVisible());U(T,e=>{R(ee)&&e(E)});var te=I(T,2),ne=e=>{var n=DI(),r=P(n),a=P(r),o=P(a,!0);D(a);var s=I(a,2);{let e=A(()=>`Edit workflow `+R(i));yO(s,{get label(){return R(e)},class:`table-icon-btn`,onclick:()=>xF.openCreate(t.workflow),children:(e,t)=>{J(e,{get icon(){return nl},class:`table-icon-svg`})},$$slots:{default:!0}})}D(r);var c=I(r,2),l=P(c),u=P(l);D(l);var d=I(l,2),f=P(d);D(d);var p=I(d,2),m=P(p);D(p),D(c),D(n),L((e,n,r,s)=>{a.disabled=e,K(a,`aria-label`,`Deactivate workflow `+R(i)),K(a,`title`,n),H(o,xF.deactivatingID===t.workflow.id?`Deactivating...`:`Deactivate`),H(u,`version: v${t.workflow.version??``}`),H(f,`created: ${r??``}`),H(m,`hash: ${s??``}`)},[()=>xF.deactivatingID===t.workflow.id||!hF(t.workflow),()=>hF(t.workflow)?`Deactivate active workflow`:`The global workflow cannot be deactivated.`,()=>lu.formatTimestamp(t.workflow.created_at),()=>gF(t.workflow.workflow_hash)]),z(`click`,a,()=>xF.deactivate(t.workflow)),V(e,n)};U(te,e=>{n()||e(ne)}),D(c),L((e,t)=>{l=G(c,1,`workflow-card svelte-1fo9fvq`,null,l,{"workflow-preview-card":n()}),H(p,e),H(h,R(i)),H(v,t)},[()=>aF(t.workflow),()=>oF(t.workflow)]),V(e,c),k()}Br([`click`]);var AI=B(`

`),jI=B(``),MI=B(``),NI=B(``),PI=B(``),FI=B(``),II=B(``),LI=B(``),RI=B(``),zI=B(``),BI=B(``),VI=B(``),HI=B(``),UI=B(`
No named guardrails are currently registered on this deployment. You can still draft a workflow, but guardrail-backed creation may be rejected.
`),WI=B(`
`),GI=B(`
`),KI=B(`

No guardrail steps configured yet.

`),qI=B(`

Guardrail Steps

Guardrails in the same numeric step run together. Later steps wait for earlier ones to finish.

`),JI=B(`

Leave provider name empty to target all providers and models. Select a provider name without a model to target all models for that configured provider.

Add a path to scope the workflow to that subtree. Leading slashes are optional and will be normalized; you can enter "team/alpha" or "/team/alpha". Matching checks the deepest user path first, then falls back toward the root.

If you leave the name empty, the workflow will display as the matched provider/model scope or “All models”.

Preview

Live
`,1);function YI(e,t){O(t,!0);{let t=e=>{YT(e,{copyId:`workflow-help-copy`,label:`workflow help`,text:`Create immutable version. Submitting activates it for the selected scope.`,title:e=>{var t=AI(),n=P(t,!0);D(t),L(e=>H(n,e),[()=>xF.submitMode()===`save`?`Edit Workflow`:`Create Workflow`]),V(e,t)},$$slots:{title:!0}})},n=A(()=>xF.submitLabel()),r=A(()=>xF.submittingLabel()),i=A(()=>xF.submitMode()===`create`?il:cl);Ck(e,{get open(){return xF.formOpen},ariaLabel:`Workflow editor`,get error(){return xF.formError},get submitting(){return xF.submitting},get submitLabel(){return R(n)},get submittingLabel(){return R(r)},get submitIcon(){return R(i)},dialogClass:`workflow-editor`,onclose:()=>xF.closeForm(),onsubmit:()=>xF.submitForm(),header:t,children:(e,t)=>{var n=JI(),r=F(n),i=P(r);Tk(i,{id:`workflow-scope-provider`,label:`Provider Name`,children:(e,t)=>{var n=MI(),r=P(n);r.value=r.__value=``,W(I(r),16,()=>xF.providerOptions(),e=>e,(e,t)=>{var n=jI(),r=P(n,!0);D(n);var i={};L(()=>{H(r,t),i!==(i=t)&&(n.value=(n.__value=t)??``)}),V(e,n)}),D(n),z(`change`,n,e=>xF.setProvider(e.currentTarget.value)),Ui(n,()=>xF.form.scope_provider,e=>xF.form.scope_provider=e),V(e,n)},$$slots:{default:!0}});var a=I(i,2),o=e=>{Tk(e,{id:`workflow-scope-model`,label:`Model`,children:(e,t)=>{var n=NI(),r=P(n);r.value=r.__value=``,W(I(r),17,()=>xF.modelOptions(xF.form.scope_provider),e=>xF.form.scope_provider+`-`+e,(e,t)=>{var n=jI(),r=P(n,!0);D(n);var i={};L(()=>{H(r,R(t)),i!==(i=R(t))&&(n.value=(n.__value=R(t))??``)}),V(e,n)}),D(n),Ui(n,()=>xF.form.scope_model,e=>xF.form.scope_model=e),V(e,n)},$$slots:{default:!0}})};U(a,e=>{xF.form.scope_provider&&e(o)});var s=I(a,2);Tk(s,{id:`workflow-name`,label:`Name`,children:(e,t)=>{var n=PI();ea(n),la(n,()=>xF.form.name,e=>xF.form.name=e),V(e,n)},$$slots:{default:!0}}),Tk(I(s,2),{id:`workflow-user-path`,label:`User Path`,children:(e,t)=>{var n=FI();ea(n),la(n,()=>xF.form.scope_user_path,e=>xF.form.scope_user_path=e),V(e,n)},$$slots:{default:!0}}),D(r);var c=I(r,8);Tk(c,{id:`workflow-description`,label:`Description`,children:(e,t)=>{var n=II();ut(n),la(n,()=>xF.form.description,e=>xF.form.description=e),V(e,n)},$$slots:{default:!0}});var l=I(c,2),u=P(l),d=e=>{var t=LI(),n=P(t);ea(n),Ve(2),D(t),ua(n,()=>xF.form.features.cache,e=>xF.form.features.cache=e),V(e,t)},f=A(()=>bu.cacheVisible());U(u,e=>{R(f)&&e(d)});var p=I(u,2),m=e=>{var t=RI(),n=P(t);ea(n),Ve(2),D(t),ua(n,()=>xF.form.features.audit,e=>xF.form.features.audit=e),V(e,t)},h=A(()=>bu.auditVisible());U(p,e=>{R(h)&&e(m)});var g=I(p,2),_=e=>{var t=zI(),n=P(t);ea(n),Ve(2),D(t),ua(n,()=>xF.form.features.usage,e=>xF.form.features.usage=e),V(e,t)},v=A(()=>bu.usageVisible());U(g,e=>{R(v)&&e(_)});var y=I(g,2),b=e=>{var t=BI(),n=P(t);ea(n),Ve(2),D(t),ua(n,()=>xF.form.features.budget,e=>xF.form.features.budget=e),V(e,t)},x=A(()=>bu.budgetsVisible());U(y,e=>{R(x)&&e(b)});var S=I(y,2),C=e=>{var t=VI(),n=P(t);ea(n),Ve(2),D(t),ua(n,()=>xF.form.features.guardrails,e=>xF.form.features.guardrails=e),V(e,t)},w=A(()=>bu.guardrailsVisible());U(S,e=>{R(w)&&e(C)});var T=I(S,2),E=e=>{var t=HI(),n=P(t);ea(n),Ve(2),D(t),ua(n,()=>xF.form.features.failover,e=>xF.form.features.failover=e),V(e,t)},ee=A(()=>xF.failoverVisible());U(T,e=>{R(ee)&&e(E)}),D(l);var te=I(l,2),ne=I(P(te),2);{let e=A(()=>xF.preview());kI(ne,{get workflow(){return R(e)},preview:!0})}D(te);var re=I(te,2),ie=e=>{var t=qI(),n=P(t),r=I(P(n),2);D(n);var i=I(n,2),a=e=>{var t=UI(),n=I(P(t),2);D(t),z(`click`,n,()=>Bl.navigate(`guardrails`)),V(e,t)};U(i,e=>{xF.guardrailRefs.length===0&&e(a)});var o=I(i,2),s=e=>{var t=GI();W(t,21,()=>xF.form.guardrails,ii,(e,t,n)=>{var r=WI(),i=P(r),a=P(i);K(a,`for`,`workflow-guardrail-ref-`+n);var o=I(a,2);ea(o),K(o,`id`,`workflow-guardrail-ref-`+n),K(o,`aria-label`,`Guardrail reference `+(n+1)),D(i);var s=I(i,2),c=P(s);K(c,`for`,`workflow-guardrail-step-`+n);var l=I(c,2);ea(l),K(l,`id`,`workflow-guardrail-step-`+n),K(l,`aria-label`,`Guardrail step `+(n+1)),D(s);var u=I(s,2);D(r),la(o,()=>R(t).ref,e=>R(t).ref=e),la(l,()=>R(t).step,e=>R(t).step=e),z(`click`,u,()=>xF.removeGuardrailStep(n)),V(e,r)}),D(t),V(e,t)},c=e=>{V(e,KI())};U(o,e=>{xF.form.guardrails.length>0?e(s):e(c,-1)}),D(t),z(`click`,r,()=>xF.addGuardrailStep()),V(e,t)},ae=A(()=>xF.form.features.guardrails&&bu.guardrailsVisible());U(re,e=>{R(ae)&&e(ie)}),V(e,n)},$$slots:{header:!0,default:!0}})}k()}Br([`change`,`click`]);var XI=B(`

Loading workflows...

`),ZI=B(`
`),QI=B(`

No active workflows found.

`),$I=B(`

No workflows match your filter.

`),eL=B(`
`);function tL(e,t){O(t,!0);var n=eL(),r=P(n),i=e=>{var t=XI();wT(P(t),{size:16,label:`Loading workflows`}),Ve(),D(t),V(e,t)};U(r,e=>{xF.loading&&!Y.authError&&e(i)});var a=I(r,2),o=e=>{var t=ZI();W(t,21,()=>xF.filteredWorkflows,e=>e.id,(e,t)=>{kI(e,{get workflow(){return R(t)}})}),D(t),V(e,t)};U(a,e=>{xF.filteredWorkflows.length>0&&e(o)});var s=I(a,2),c=e=>{V(e,QI())};U(s,e=>{xF.workflows.length===0&&!xF.loading&&!Y.authError&&xF.available&&e(c)});var l=I(s,2),u=e=>{V(e,$I())};U(l,e=>{xF.workflows.length>0&&xF.filteredWorkflows.length===0&&!xF.loading&&e(u)}),D(n),V(e,n),k()}var nL=B(``),rL=B(`
Workflows feature is unavailable.
`),iL=B(`
`),aL=B(`
`),oL=B(``),sL=B(`
`);function cL(e,t){O(t,!0),On(()=>{Y.refreshTick,xF.fetchPage()});var n=sL(),r=P(n),i=I(P(r),2),a=P(i),o=e=>{var t=nL();J(P(t),{get icon(){return il},class:`form-action-icon`,"aria-hidden":`true`}),Ve(2),D(t),z(`click`,t,()=>xF.openCreate()),V(e,t)};U(a,e=>{xF.available&&e(o)}),D(i),D(r);var s=I(r,2),c=e=>{V(e,rL())};U(s,e=>{!xF.available&&!Y.authError&&e(c)});var l=I(s,2),u=e=>{var t=iL(),n=P(t,!0);D(t),L(()=>H(n,xF.error)),V(e,t)};U(l,e=>{xF.error&&!Y.authError&&e(u)});var d=I(l,2),f=e=>{var t=aL(),n=P(t);SD(P(n),{placeholder:`Filter by scope, name, hash, or guardrail...`,label:`Filter workflows by scope, name, hash, or guardrail`,get value(){return xF.filter},set value(e){xF.filter=e}}),D(n);var r=I(n,2),i=P(r),a=P(i,!0);D(i),D(r),D(t),L(()=>H(a,xF.filteredWorkflows.length+` active scopes`)),V(e,t)};U(d,e=>{xF.available&&e(f)});var p=I(d,2);YI(p,{});var m=I(p,2);tL(m,{});var h=I(m,2);W(h,20,()=>xF.guardrailRefs,e=>e,(e,t)=>{var n=oL(),r={};L(()=>{r!==(r=t)&&(n.value=(n.__value=t)??``)}),V(e,n)}),D(h),D(n),V(e,n),k()}Br([`click`]);function lL(e,{from:t,to:n},r={}){var{delay:i=0,duration:a=e=>Math.sqrt(e)*120,easing:o=Zu}=r,s=getComputedStyle(e),c=s.transform===`none`?``:s.transform,[l,u]=s.transformOrigin.split(` `).map(parseFloat);l/=e.clientWidth,u/=e.clientHeight;var d=uL(e),f=e.clientWidth/n.width/d,p=e.clientHeight/n.height/d,m=t.left+t.width*l,h=t.top+t.height*u,g=n.left+n.width*l,_=n.top+n.height*u,v=(m-g)*f,y=(h-_)*p,b=t.width/n.width,x=t.height/n.height;return{delay:i,duration:typeof a==`function`?a(Math.sqrt(v*v+y*y)):a,easing:o,css:(e,t)=>`transform: ${c} translate(${t*v}px, ${t*y}px) scale(${e+t*b}, ${e+t*x});`}}function uL(e){if(`currentCSSZoom`in e)return e.currentCSSZoom;for(var t=e,n=1;t!==null;)n*=+getComputedStyle(t).zoom,t=t.parentElement;return n}var dL=null;function fL(){return dL===null&&(dL=typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(prefers-reduced-motion: reduce)`)),!!(dL&&dL.matches)}function pL(e){return fL()?0:e}function mL(e,t){return!t||!t.live?{duration:0}:Yu(e,{duration:pL(150)})}var hL=new class{#e=j(N({}));get workflowVersionsByID(){return R(this.#e)}set workflowVersionsByID(e){M(this.#e,e,!0)}workflowVersionRequests={};workflowFeatureCaps(){return{cache:bu.cacheVisible(),audit:bu.auditVisible(),usage:bu.usageVisible(),budget:bu.budgetsVisible(),guardrails:bu.guardrailsVisible(),failover:bu.booleanFlag(`FAILOVER_ENABLED`,!0)}}cacheWorkflowVersion(e){let t=String(e&&e.id||``).trim();return t?(this.workflowVersionsByID={...this.workflowVersionsByID||{},[t]:e},e):null}cacheMissingWorkflowVersion(e){let t=String(e||``).trim();t&&(this.workflowVersionsByID={...this.workflowVersionsByID||{},[t]:null})}workflowVersionCacheHas(e){return Object.prototype.hasOwnProperty.call(this.workflowVersionsByID||{},String(e||``).trim())}workflowVersionByID(e){let t=String(e||``).trim();return t&&this.workflowVersionCacheHas(t)?this.workflowVersionsByID[t]:null}async fetchWorkflowVersion(e){let t=String(e||``).trim();if(!t)return null;if(this.workflowVersionCacheHas(t))return this.workflowVersionsByID[t];if(this.workflowVersionRequests[t])return this.workflowVersionRequests[t];let n=(async()=>{let e=typeof AbortController==`function`?new AbortController:null,n=e?setTimeout(()=>e.abort(),1e4):null;try{let n=await hu(`/admin/workflows/`+encodeURIComponent(t),{label:`workflow`,signal:e?e.signal:void 0});if(n.stale)return null;if(n.status===404)return this.cacheMissingWorkflowVersion(t),null;if(!n.ok)return null;let r=n.data;return!r||typeof r!=`object`||Array.isArray(r)?(this.cacheMissingWorkflowVersion(t),null):this.cacheWorkflowVersion(r)}catch(e){return e&&e.name===`AbortError`||console.error(`Failed to fetch workflow version:`,e),null}finally{n!==null&&clearTimeout(n),delete this.workflowVersionRequests[t]}})();return this.workflowVersionRequests[t]=n,n}async prefetchAuditWorkflows(e){let t=[...new Set((Array.isArray(e)?e:[]).map(e=>String(e&&e.workflow_version_id||``).trim()).filter(Boolean))];t.length!==0&&await Promise.all(t.map(e=>this.fetchWorkflowVersion(e)))}auditEntryWorkflow(e){let t=String(e&&e.workflow_version_id||``).trim();return t?this.workflowVersionByID(t):null}},gL=6;function _L(e){if(typeof e!=`string`)return null;try{return JSON.parse(e)}catch{return null}}function vL(e,t=0,n=null){let r=String(e||``).trim();if(!r)return``;if(t>gL)return r;let i=_L(r);return i==null?r:yL(i,t+1,n)||n&&n(i)||r}function yL(e,t=0,n=null,r=null){if(e==null||t>gL)return``;if(typeof e==`string`){let i=_L(e.trim());return i==null?``:yL(i,t+1,n,r)}if(typeof e!=`object`)return``;let i=r||new Set;if(i.has(e))return``;if(i.add(e),Array.isArray(e)){for(let r=0;r=400||SL(t&&t.response_body)}function wL(e){let t=e&&e.data?e.data:null;return t?bL(t.error_message)||(CL(e,t)?yL(t.response_body,0):``):``}function TL(e){if(e==null||String(e).trim()===``)return null;let t=Number(e);return!Number.isInteger(t)||t<0?null:t}function EL(e){let t=TL(e);return t===null?``:t===0?`Audit logs are retained indefinitely.`:t===1?`Audit logs are retained for 1 day.`:`Audit logs are retained for `+t+` days.`}function DL(e){let t=TL(e);return t===null?``:t===0?`Audit logs are retained `:`Audit logs are retained for `}function OL(e){let t=TL(e);return t===null?``:t===0?`indefinitely`:t===1?`1 day`:t+` days`}function kL({dateQuery:e,limit:t,offset:n,search:r,method:i,statusCode:a,stream:o}){let s=e;return s+=`&limit=`+t+`&offset=`+n,r&&(s+=`&search=`+encodeURIComponent(r)),i&&(s+=`&method=`+encodeURIComponent(i)),a&&(s+=`&status_code=`+encodeURIComponent(a)),o&&(s+=`&stream=`+encodeURIComponent(o)),s}function AL({sessionId:e,limit:t}){return`session_id=`+encodeURIComponent(e)+`&limit=`+(t||100)+`&offset=0`}function jL(e){return String(e&&e.session_id||``).trim()}function ML(e){let t=Number(e&&e.session_count);return Number.isFinite(t)&&t>1?t:1}function NL(e){return!!jL(e)&&ML(e)>1}function PL(e){return{entries:(Array.isArray(e&&e.sessions)?e.sessions:[]).filter(e=>e&&e.latest).map(e=>({...e.latest,session_count:Math.max(1,Number(e.request_count)||1)})),total:Number(e&&e.total||0),limit:Number(e&&e.limit||25),offset:Number(e&&e.offset||0)}}function FL(e,t,n){let r=new Set((Array.isArray(n)?n:[]).flatMap(e=>zL(e))),i=(Array.isArray(t)?t:[]).filter(e=>!zL(e).some(e=>r.has(e))),a=new Set([...r,...i.flatMap(e=>zL(e))]),o=(e&&Array.isArray(e.entries)?e.entries:[]).filter(e=>e&&e._live&&!zL(e).some(e=>a.has(e)));return{entries:[...o,...i],preservedCount:o.length}}function IL(e,t){let n=e||{};if(!t)return n;if(n[t]){let e={...n};return delete e[t],e}return{...n,[t]:!0}}function LL(e,t){let n=e||{},r=new Set((Array.isArray(t)?t:[]).map(e=>jL(e)).filter(Boolean)),i={},a=!1;return Object.keys(n).forEach(e=>{if(r.has(e)){i[e]=n[e];return}a=!0}),a?i:n}function RL(e){return String(e&&e.id||``).trim()}function zL(e){if(!e)return[];let t=[],n=String(e.id||``).trim(),r=String(e.request_id||``).trim();return n&&t.push(`id:`+n),r&&t.push(`request:`+r),t}function BL(e){return!!(e&&e._live&&e._live_pending&&!e._audit_flushed)}function VL(e){let t=e&&e.customStartDate,n=e&&e.customEndDate;if(!t&&!n)return!0;let r=new Date;if(t){let e=new Date(t);if(e.setHours(0,0,0,0),Number.isFinite(e.getTime())&&re)return!1}return!0}function HL(e,t){return e&&Number(e.offset||0)===0&&!(t&&t.search)&&!(t&&t.method)&&!(t&&t.statusCode)&&!(t&&t.stream)&&VL(t)}function UL(e,t,n){let r=e&&typeof e==`object`?{...e}:{entries:[],total:0,limit:25,offset:0},i=Array.isArray(r.entries)?r.entries:[];if(r.entries=i,!HL(r,n))return r;let a=(Array.isArray(t)?t:[]).filter(e=>BL(e));if(a.length===0)return r;let o=new Set(i.flatMap(e=>zL(e))),s=[];return a.forEach(e=>{let t=zL(e);t.length!==0&&(t.some(e=>o.has(e))||(t.forEach(e=>o.add(e)),s.push(e)))}),s.length===0?r:(r.entries=[...s,...i].slice(0,r.limit||25),r.total=Number(r.total||0)+s.length,r)}function WL(e,t,n){let r=e&&typeof e==`object`?{...e}:{entries:[],total:0,limit:25,offset:0},i=Array.isArray(r.entries)?r.entries:[];if(r.entries=i,!HL(r,n))return r;let a=(Array.isArray(t)?t:[]).filter(e=>BL(e));if(a.length===0)return r;let o=new Set(i.flatMap(e=>zL(e))),s=new Map;i.forEach((e,t)=>{let n=jL(e);n&&!s.has(n)&&s.set(n,t)});let c=[],l=i;return a.forEach(e=>{let t=zL(e);if(t.length===0||t.some(e=>o.has(e)))return;let n=jL(e);if(n&&s.has(n)){let r=s.get(n);l===i&&(l=[...i]);let a=ML(l[r]),c=Number(e&&e.session_count),u=Number.isFinite(c)&&c>1?c:null;l[r]={...e,session_count:u===null?a+1:Math.max(a,u)},t.forEach(e=>o.add(e));return}t.forEach(e=>o.add(e)),c.push(e)}),r.entries=[...c,...l].slice(0,r.limit||25),r.total=Number(r.total||0)+c.length,r}function GL(e,t){let n=RL(t),r=e||{};return n?r[n]?{}:{[n]:!0}:r}function KL(e,t){let n=e||{},r=new Set((Array.isArray(t)?t:[]).map(e=>RL(e)).filter(Boolean)),i={},a=!1;return Object.keys(n).forEach(e=>{if(r.has(e)){i[e]=!0;return}a=!0}),a?i:n}function qL(e){if(e==null)return`-`;let t=Number(e);return Number.isFinite(t)?t<=0?`pending`:t<1e6?Math.round(t/1e3)+` µs`:t<1e9?(t/1e6).toFixed(2)+` ms`:(t/1e9).toFixed(2)+` s`:`-`}function JL(e){if(e==null||e===``)return`status-unknown`;let t=Number(e);return Number.isFinite(t)?t>=500?`status-error`:t>=400?`status-warning`:t>=300?`status-neutral`:`status-success`:`status-unknown`}function YL(e){if(!e||!e._live||!e._live_pending)return!1;let t=String(e._live_state||``).trim();if(t===`audit.completed`||t===`audit.flushed`||t===`audit.detail`)return!1;if(e._response_partial)return!0;if(e.status_code!==null&&e.status_code!==void 0&&e.status_code!==``||Number(e.duration_ns||0)>0||e.error_type||e.error_message)return!1;let n=e.data||{};return!(n.response_headers||n.response_body||n.error_message)}function XL(e){let t=e&&e.data&&e.data.failover;return!t||typeof t!=`object`||Array.isArray(t)?null:String(t.target_model||t.targetModel||``).trim()||null}function ZL(e){return(e&&e.data&&Array.isArray(e.data.attempts)?e.data.attempts:[]).map((e,t)=>({...e,seq:Number(e&&e.seq||t+1)})).sort((e,t)=>e.seq-t.seq)}function QL(e){let t=ZL(e);return t.length>1||t.some(e=>!(e&&e.success))}function $L(e){if(!e)return`-`;let t=e.status_code||e.status;return t?String(t):e.success?`ok`:`error`}function eR(e){return String(e&&e.kind||``).trim()||`attempt`}function tR(e){if(!e)return`-`;let t=String(e.provider_name||``).trim(),n=String(e.provider_type||e.provider||``).trim();return t&&n&&t!==n?t+` (`+n+`)`:t||n||`-`}function nR(e){return String(e&&e.model||``).trim()||`-`}function rR(e){let t=ZL(e);return t.length>1||t.some(e=>!(e&&e.success))?t:[]}function iR(e){return ZL(e).length+`×`}function aR(e){let t=ZL(e),n=t.filter(e=>!(e&&e.success)).length,r=t.length===1?`attempt`:`attempts`,i=t.length+` provider `+r;return n>0?i+` · `+n+` failed`:i}function oR(e){if(!e)return``;let t=[`#`+Number(e.seq||0)],n=eR(e);n&&n!==`attempt`&&t.push(n),t.push($L(e));let r=tR(e);r&&r!==`-`&&t.push(r);let i=nR(e);return i&&i!==`-`&&t.push(i),t.push(e.success?`succeeded`:`failed`),t.join(` · `)}function sR(e,t){if(!t)return null;if(t.success){let t=e&&e.data?e.data:null;return t&&t.response_body!=null?t.response_body:null}return t.response_body!=null&&t.response_body!==``?t.response_body:null}function cR(e){if(!e||e.success)return``;let t=String(e.error_message||``).trim(),n=String(e.error_code||``).trim(),r=String(e.error_type||``).trim();return t&&n?n+`: `+t:t||n||r||`Provider attempt failed`}function lR(e,t){if(!t)return null;if(t.success){let t=e&&e.data?e.data:null;return t?t.response_headers:null}return t.response_headers||null}function uR(e){let t=Number(e&&e.status_code);return Number.isFinite(t)&&t>0?t:null}function dR(e,t){let n=!!(t&&t.success),r=e&&e.data?e.data:null,i=sR(e,t),a=lR(e,t),o=cR(t),s=i!=null&&i!==``,c=eR(t),l=ZL(e).length<=1;return{title:`Response`,direction:`response`,seq:l?0:Number(t&&t.seq||0),kind:l||c===`attempt`?``:c,statusCode:l?null:uR(t),layout:`split`,entry:e,copyHeaders:a,copyBody:i,showErrorMessage:!!o,errorMessage:o,showHeaders:!!a,headers:a,showBody:s,body:i,showEmpty:!o&&!s&&!a,emptyMessage:`No response was captured for this attempt.`,showTooLarge:!!(n&&r&&r.response_body_too_big_to_handle),tooLargeMessage:`Response body was too large to capture.`}}function fR(e){return e&&e.data&&Array.isArray(e.data.request_revisions)?e.data.request_revisions:[]}function pR(e){return fR(e).filter(e=>!(e&&e.no_change))}function mR(e){return fR(e).filter(e=>e&&e.no_change).map(e=>{let t=String(e.rewriter||`rewriter`);return{id:`step-`+Number(e.seq||0),rewriter:t,label:t+`: no change`,title:t+` ran and forwarded the request unchanged`}})}function hR(e){let t=Number(e&&e.bytes_before),n=Number(e&&e.bytes_after);if(!Number.isFinite(t)||!Number.isFinite(n)||t<=0||n>=t)return``;let r=(1-n/t)*100;return`-`+(r>=10?String(Math.round(r)):r.toFixed(1))+`%`}function gR(e,t){let n=t&&t.body,r=n!=null&&n!==``,i=pR(e).length<=1,a={rewriter:t&&t.rewriter||``,bytes:Number(t&&t.bytes_before||0)+` → `+Number(t&&t.bytes_after||0)};return t&&t.detail!=null&&(a.detail=t.detail),{title:`Rewritten`,direction:`request`,seq:i?0:Number(t&&t.seq||0),kind:t&&t.rewriter?String(t.rewriter):``,savingsLabel:hR(t),layout:`split`,entry:e,copyHeaders:a,copyBody:n,showErrorMessage:!1,errorMessage:null,showHeaders:!0,headers:a,headersTitle:`What changed`,showBody:r,body:n,showEmpty:!1,emptyMessage:``,showTooLarge:!r,tooLargeMessage:`Rewritten body not captured (body logging disabled or body too large).`}}function _R(e){let t=e&&e.usage;return!t||typeof t!=`object`?null:t}function vR(e){let t=_R(e);return Number(t&&t.cached_input_tokens||0)>0}function yR(e){let t=_R(e),n=Number(t&&t.input_tokens||0),r=Number(t&&t.cached_input_tokens||0);return!Number.isFinite(n)||n<=0||!Number.isFinite(r)||r<=0?0:Math.max(0,Math.min(100,r/n*100))}function bR(e){let t=_R(e);if(!t)return``;let n=Number(t.input_tokens||0),r=Number(t.cached_input_tokens||0);return n<=0?cd(r)+` cached`:yR(e).toFixed(1)+`% cached`}function xR(e){return vR(e)?bR(e):``}function SR(e,t){let n=_R(e);if(!n||!e||!e.data||!e.data.request_body)return null;let r=Number(n.estimated_cached_characters||0);if(!Number.isFinite(r)||r<=0||typeof t!=`function`)return null;let i=t(e.data.request_body);return!Array.isArray(i)||i.length===0?null:{characters:r,segments:i}}function CR(e,t){let n=e&&e.data?e.data:null,r=!n||!n.request_headers&&!n.request_body,i=r&&YL(e);return{title:`Request`,direction:`request`,layout:`split`,entry:e,copyHeaders:n&&n.request_headers,copyBody:n&&n.request_body,showErrorMessage:!1,errorMessage:null,showHeaders:!!(n&&n.request_headers),headers:n&&n.request_headers,showBody:!!(n&&n.request_body),body:n&&n.request_body,bodyCacheRatioLabel:xR(e),promptCacheHighlight:SR(e,t),noChangeSteps:mR(e),showEmpty:r&&!i,emptyMessage:`Request details were not captured.`,showPending:i,pendingMessage:`Waiting for request data…`,showTooLarge:!!(n&&n.request_body_too_big_to_handle),tooLargeMessage:`Request body was too large to capture.`}}function wR(e){let t=e&&e.data?e.data:null,n=wL(e),r=!t||!n&&!t.response_headers&&!t.response_body,i=r&&YL(e);return{title:`Response`,direction:`response`,layout:`split`,entry:e,copyHeaders:t&&t.response_headers,copyBody:t&&t.response_body,showErrorMessage:!!n,errorMessage:n,showHeaders:!!(t&&t.response_headers),headers:t&&t.response_headers,showBody:!!(t&&t.response_body),body:t&&t.response_body,streaming:!!(e&&e._response_partial&&t&&t.response_body)&&YL(e),showEmpty:r&&!i,emptyMessage:`Response details were not captured.`,showPending:i,pendingMessage:`Response in progress…`,showTooLarge:!!(t&&t.response_body_too_big_to_handle),tooLargeMessage:`Response body was too large to capture.`}}function TR(e,t){let n=[{id:`request`,pane:CR(e,t)}];return pR(e).forEach(t=>{n.push({id:`revision-`+Number(t&&t.seq||0),pane:gR(e,t)})}),QL(e)?ZL(e).forEach(t=>{n.push({id:`response-`+Number(t&&t.seq||0),pane:dR(e,t)})}):n.push({id:`response`,pane:wR(e)}),n}function ER(e){if(!QL(e))return`response`;let t=ZL(e),n=null;return t.forEach(e=>{e&&e.success&&(n=e)}),n||=t[t.length-1],n?`response-`+Number(n.seq||0):`request`}function DR(e,t,n){return e&&(Array.isArray(n)?n:TR(t)).some(t=>t.id===e)?e:ER(t)}function OR(e,t,n){if(!t||!t.length)return null;let r=t.indexOf(n);r<0&&(r=0);let i;switch(e){case`ArrowRight`:case`ArrowDown`:i=(r+1)%t.length;break;case`ArrowLeft`:case`ArrowUp`:i=(r-1+t.length)%t.length;break;case`Home`:i=0;break;case`End`:i=t.length-1;break;default:return null}return t[i]}var kR=100;function AR(){return{entries:[],total:0,limit:25,offset:0}}var jR=new class{#e=j(N({}));get auditExpandedEntries(){return R(this.#e)}set auditExpandedEntries(e){M(this.#e,e,!0)}#t=j(N({}));get auditExpandedThreads(){return R(this.#t)}set auditExpandedThreads(e){M(this.#t,e,!0)}#n=j(!1);get loading(){return R(this.#n)}set loading(e){M(this.#n,e,!0)}auditFetchToken=0;get auditLog(){return PE.auditLog}set auditLog(e){PE.auditLog=e}get auditSearch(){return PE.auditSearch}set auditSearch(e){PE.auditSearch=e}get auditMethod(){return PE.auditMethod}set auditMethod(e){PE.auditMethod=e}get auditStatusCode(){return PE.auditStatusCode}set auditStatusCode(e){PE.auditStatusCode=e}get auditStream(){return PE.auditStream}set auditStream(e){PE.auditStream=e}get auditGroupSessions(){return PE.auditGroupSessions}liveFilters(){return{search:this.auditSearch,method:this.auditMethod,statusCode:this.auditStatusCode,stream:this.auditStream,customStartDate:Fd.customStartDate,customEndDate:Fd.customEndDate}}toggleAuditGroupSessions(){PE.auditGroupSessions=!PE.auditGroupSessions,Ya(`gomodel_audit_group_sessions`,PE.auditGroupSessions),this.auditExpandedThreads={},PE.auditThreadChildren={},this.fetchAuditLog(!0)}async fetchAuditLog(e){let t=++this.auditFetchToken;this.loading=!0;try{e&&(this.auditLog.offset=0);let n=this.auditGroupSessions,r=kL({dateQuery:Fd.queryStr(),limit:this.auditLog.limit,offset:this.auditLog.offset,search:this.auditSearch,method:this.auditMethod,statusCode:this.auditStatusCode,stream:this.auditStream}),i=await hu((n?`/admin/audit/sessions?`:`/admin/audit/log?`)+r,{label:`audit log`});if(i.stale||t!==this.auditFetchToken)return;if(!i.ok){this.auditLog=AR();return}let a=n?PL(i.data):i.data,o=(n?WL:UL)(a,this.auditLog&&this.auditLog.entries,this.liveFilters());Array.isArray(o.entries)||(o.entries=[]),o.entries=PE.upsertAuditRecords(o.entries,`audit.list`),this.auditLog=o,this.auditExpandedThreads=LL(this.auditExpandedThreads,o.entries),PE.auditThreadChildren=LL(PE.auditThreadChildren,o.entries);let s=[...o.entries,...this.loadedThreadChildren()];this.auditExpandedEntries=KL(this.auditExpandedEntries,s);try{await hL.prefetchAuditWorkflows(s)}catch(e){console.error(`Failed to prefetch audit workflows:`,e)}}catch(e){if(console.error(`Failed to fetch audit log:`,e),t!==this.auditFetchToken)return;this.auditLog=AR()}finally{t===this.auditFetchToken&&(this.loading=!1)}}loadedThreadChildren(){let e=PE.auditThreadChildren||{};return Object.keys(e).flatMap(t=>Array.isArray(e[t]&&e[t].entries)?e[t].entries:[])}isThreadExpanded(e){return!!(e&&this.auditExpandedThreads[e])}threadChildren(e){return e&&PE.auditThreadChildren[e]||null}async toggleThread(e){let t=jL(e);if(!t)return;let n=!this.isThreadExpanded(t);this.auditExpandedThreads=IL(this.auditExpandedThreads,t);let r=PE.auditThreadChildren[t];n&&!(r&&(r.loaded||r.loading))&&await this.fetchThreadEntries(e)}async fetchThreadEntries(e){let t=jL(e);if(!t)return;let n=PE.auditThreadChildren[t];PE.auditThreadChildren={...PE.auditThreadChildren,[t]:{loading:!0,loaded:!1,entries:n&&Array.isArray(n.entries)?n.entries:[],total:Number(n&&n.total||0)}};let r=()=>{let e={...PE.auditThreadChildren},n=e[t],r=n&&Array.isArray(n.entries)?n.entries:[];r.length>0?e[t]={loading:!1,loaded:!1,entries:r,total:r.length}:(delete e[t],this.auditExpandedThreads[t]&&(this.auditExpandedThreads=IL(this.auditExpandedThreads,t))),PE.auditThreadChildren=e};try{let n=await hu(`/admin/audit/log?`+AL({sessionId:t,limit:kR}),{label:`audit session`});if(n.stale){r();return}if(!n.ok)throw Error(`audit session fetch failed`);let i=PE.auditThreadChildren[t],a=this.auditLog.entries.find(e=>jL(e)===t),o=FL(i,n.data.entries,a?[a]:[e]);o.entries=PE.upsertAuditRecords(o.entries,`audit.thread`),PE.auditThreadChildren={...PE.auditThreadChildren,[t]:{loading:!1,loaded:!0,entries:o.entries,total:Number(n.data.total||0)+o.preservedCount}}}catch(e){console.error(`Failed to fetch audit session entries:`,e),r()}}clearAuditFilters(){this.auditSearch=``,this.auditMethod=``,this.auditStatusCode=``,this.auditStream=``,this.fetchAuditLog(!0)}auditLogNextPage(){this.auditLog.offset+this.auditLog.limit0&&(this.auditLog.offset=Math.max(0,this.auditLog.offset-this.auditLog.limit),this.fetchAuditLog(!1))}isAuditEntryExpanded(e){let t=RL(e);return t?!!(this.auditExpandedEntries&&this.auditExpandedEntries[t]):!1}toggleAuditEntryExpanded(e){this.auditExpandedEntries=GL(this.auditExpandedEntries,e);let t=this.isAuditEntryExpanded(e);return t&&typeof PE.fetchAuditEntryDetail==`function`&&PE.fetchAuditEntryDetail(e),t}expandAuditEntry(e){this.isAuditEntryExpanded(e)||this.toggleAuditEntryExpanded(e)}};PE.fetchAuditLog=e=>jR.fetchAuditLog(e),PE.isAuditEntryExpanded=e=>jR.isAuditEntryExpanded(e);var MR=B(`
`);function NR(e,t){O(t,!0);let n=CD(()=>jR.fetchAuditLog(!0));On(()=>n.cancel);var r=MR(),i=P(r);SD(P(i),{id:`audit-filter-search`,placeholder:`Search by request ID, model, provider, path, user path, or error...`,label:`Search by request ID, model, provider, path, user path, or error`,get oninput(){return n},get value(){return jR.auditSearch},set value(e){jR.auditSearch=e}}),D(i);var a=I(i,2),o=P(a),s=P(o);s.value=s.__value=``;var c=I(s);c.value=c.__value=`GET`;var l=I(c);l.value=l.__value=`POST`;var u=I(l);u.value=u.__value=`PUT`;var d=I(u);d.value=d.__value=`PATCH`;var f=I(d);f.value=f.__value=`DELETE`,D(o);var p=I(o,2),m=P(p);m.value=m.__value=``;var h=I(m);h.value=h.__value=`200`;var g=I(h);g.value=g.__value=`201`;var _=I(g);_.value=_.__value=`400`;var v=I(_);v.value=v.__value=`401`;var y=I(v);y.value=y.__value=`403`;var b=I(y);b.value=b.__value=`404`;var x=I(b);x.value=x.__value=`429`;var S=I(x);S.value=S.__value=`500`;var C=I(S);C.value=C.__value=`502`;var w=I(C);w.value=w.__value=`503`;var T=I(w);T.value=T.__value=`504`,D(p);var E=I(p,2),ee=P(E);ee.value=ee.__value=``;var te=I(ee);te.value=te.__value=`true`;var ne=I(te);ne.value=ne.__value=`false`,D(E);var re=I(E,2);J(P(re),{get icon(){return Ol},class:`table-icon-svg`}),Ve(2),D(re),D(a),D(r),z(`change`,o,()=>jR.fetchAuditLog(!0)),Ui(o,()=>jR.auditMethod,e=>jR.auditMethod=e),z(`change`,p,()=>jR.fetchAuditLog(!0)),Ui(p,()=>jR.auditStatusCode,e=>jR.auditStatusCode=e),z(`change`,E,()=>jR.fetchAuditLog(!0)),Ui(E,()=>jR.auditStream,e=>jR.auditStream=e),z(`click`,re,()=>jR.clearAuditFilters()),V(e,r),k()}Br([`change`,`click`]);var PR=B(`Live stream connecting…`),FR=B(` `),IR=B(`Live`),LR=B(` `);function RR(e,t){O(t,!0);let n=A(()=>PE.auditLivePauseReason()),r=A(()=>PE.liveLogsStreaming&&!R(n));var i=Xr(),a=F(i),o=e=>{var t=LR(),i=P(t);let a;var o=I(i,2),s=e=>{V(e,PR())},c=e=>{var t=FR(),r=P(t,!0);D(t),L(e=>H(r,e),[()=>SE(R(n))]),V(e,t)},l=e=>{V(e,IR())};U(o,e=>{PE.liveLogsStreaming?R(n)?e(c,1):e(l,-1):e(s)}),D(t),L(()=>a=G(i,1,`live-dot svelte-tve6yv`,null,a,{"is-streaming":R(r)})),V(e,t)},s=A(()=>bu.liveLogsVisible());U(a,e=>{R(s)&&e(o)}),V(e,i),k()}var zR=B(` `),BR=B(``);function VR(e,t){O(t,!0);let n=A(()=>[{key:`provider`,text:vd(t.entry)||`-`},{key:`model`,text:t.entry.requested_model||t.entry.model||`-`,mono:!0},{key:`user_path`,text:t.entry.user_path,mono:!0},{key:`request_id`,text:`request_id: `+(t.entry.request_id||`-`),mono:!0},{key:`ip`,text:t.entry.client_ip&&`ip: `+t.entry.client_ip,mono:!0},{key:`auth_key_id`,text:t.entry.auth_key_id&&`auth_key_id: `+t.entry.auth_key_id,mono:!0},{key:`alias`,text:t.entry.alias_used&&`alias`,class:`audit-alias-badge`},{key:`resolved`,text:t.entry.alias_used&&t.entry.resolved_model&&`resolved: `+xd(t.entry),mono:!0},{key:`failover`,text:XL(t.entry)&&`failover: `+XL(t.entry),mono:!0},{key:`stream`,text:t.entry.stream&&`stream`},{key:`error_type`,text:t.entry.error_type}].filter(e=>!!e.text));var r=BR(),i=I(P(r),2);W(i,21,()=>R(n),e=>e.key,(e,t)=>{var n=zR(),r=P(n,!0);D(n),L(()=>{G(n,1,Ni([`provider-badge`,R(t).class,{mono:R(t).mono}]),`svelte-hyopt0`),H(r,R(t).text)}),V(e,n)}),D(i),D(r),V(e,r),k()}var HR=B(``),UR=B(` `);function WR(e,t){O(t,!0);let n=A(()=>rR(t.entry)),r=A(()=>R(n).length>0?aR(t.entry):``),i=A(()=>R(n).length>0?iR(t.entry):``);var a=Xr(),o=F(a),s=e=>{var a=UR(),o=P(a);W(o,21,()=>R(n),e=>t.entry.id+`-pip-`+e.seq,(e,t)=>{var n=HR();let r;L(e=>{r=G(n,1,`audit-attempt-pip svelte-1eu22xn`,null,r,{"audit-attempt-success":!!(R(t)&&R(t).success),"audit-attempt-error":!(R(t)&&R(t).success)}),K(n,`title`,e)},[()=>oR(R(t))]),V(e,n)}),D(o);var s=I(o,2),c=P(s,!0);D(s),D(a),L(()=>{K(a,`title`,R(r)),K(a,`aria-label`,R(r)),H(c,R(i))}),V(e,a)};U(o,e=>{R(n).length>0&&e(s)}),V(e,a),k()}var GR=new Set([`instructions`,`messages`,`input`,`previous_response_id`,`choices`,`output`]);function KR(e){if(!e||typeof e!=`object`)return``;let t=String(e.type||``).toLowerCase();if(t===`image`||t===`image_url`||t===`input_image`||t===`output_image`)return`[Image]`;if(t===`audio`||t===`input_audio`||t===`output_audio`)return`[Audio]`;if(t===`file`||t===`input_file`||t===`output_file`){let t=String(e.filename||e.name||``).trim();return t?`[File: `+t+`]`:`[File]`}return typeof e.refusal==`string`?e.refusal:``}function qR(e){if(e==null)return``;if(typeof e==`string`)return e.trim();if(Array.isArray(e))return e.map(e=>typeof e==`string`?e:!e||typeof e!=`object`?``:typeof e.text==`string`?e.text:typeof e.output_text==`string`?e.output_text:KR(e)).filter(Boolean).join(` `).trim();if(typeof e==`object`){if(typeof e.text==`string`)return e.text.trim();try{return JSON.stringify(e,null,2)}catch{return``}}return String(e).trim()}function JR(e){return!e||typeof e!=`object`?``:qR(e.content)||(typeof e.refusal==`string`?e.refusal.trim():``)}function YR(e){if(e==null)return[];if(typeof e==`string`)return e?[e]:[];if(Array.isArray(e))return e.flatMap(e=>typeof e==`string`?e?[e]:[]:!e||typeof e!=`object`?[]:typeof e.text==`string`?e.text?[e.text]:[]:typeof e.output_text==`string`&&e.output_text?[e.output_text]:[]);if(typeof e==`object`)return typeof e.text==`string`&&e.text?[e.text]:[];let t=String(e);return t?[t]:[]}function XR(e){if(e==null)return[];if(Array.isArray(e))return e.flatMap(XR);if(typeof e==`object`)return Object.entries(e).flatMap(([e,t])=>[e,...XR(t)]);let t=String(e);return t?[t]:[]}function ZR(e){return qz(e).flatMap(e=>[...e.name?[String(e.name)]:[],...XR(e.arguments)])}function QR(e){return Array.isArray(e)?e.flatMap(e=>e&&typeof e==`object`&&e.type===`tool_use`?ZR([e]):YR(e)):YR(e)}function $R(e){let t=e&&e.usage?e.usage.estimated_cached_characters:null;if(t==null)return null;let n=Number(t);return Number.isFinite(n)&&n>0?Math.floor(n):0}function ez(e,t){if(!e)return null;let n=(Array.isArray(t)?t:[]).reduce((e,t)=>e+String(t||``).length,0),r=Math.min(String(e).length,n);return r>0?{total:r}:null}function tz(e){let t=e&&e.arguments!==void 0?e.arguments:``,n=``;if(typeof t==`string`)n=t;else try{n=JSON.stringify(t)}catch{n=String(t)}return(String(e&&e.name||``)+`(`+n+`)`).length}function nz(e){return{characters:(Array.isArray(e)?e:[]).map(tz)}}function rz(e,t){let n=Math.max(0,Number(t||0));return e.map(e=>{if(!e||e.role===`error`)return e;let t=Math.max(0,Number(e._promptTextCharacters||0)),r=Math.min(n,t);n-=r;let i=0;(Array.isArray(e._toolPromptCharacters)?e._toolPromptCharacters:[]).forEach(e=>{let t=Math.max(0,Number(e||0)),r=Math.min(n,t);n-=r,i+=r});let a=t+(e._toolPromptCharacters||[]).reduce((e,t)=>e+Math.max(0,Number(t||0)),0);return{...e,promptCacheRatio:a>0?(r+i)/a:0}})}function iz(e){if(e==null)return[];if(typeof e==`string`){let t=e.trim();return t?[{role:`user`,text:t}]:[]}if(!Array.isArray(e)){let t=qR(e);return t?[{role:`user`,text:t}]:[]}return e.map(e=>{if(!e||typeof e!=`object`)return null;let t=String(e.role||`user`).toLowerCase(),n=qR(e.content);return n?{role:t,text:n}:null}).filter(Boolean)}function az(e){return JR(e)}function oz(e){if(!e||typeof e!=`object`)return[];let t=[];return t.push(...YR(e.instructions)),Array.isArray(e.messages)&&e.messages.forEach(e=>{!e||typeof e!=`object`||(t.push(...QR(e.content)),t.push(...ZR(e.tool_calls)))}),typeof e.input==`string`?t.push(e.input):Array.isArray(e.input)?e.input.forEach(e=>{if(!(!e||typeof e!=`object`)){if(e.type===`function_call`||e.type===`tool_use`){t.push(...ZR([e]));return}t.push(...QR(e.content)),typeof e.text==`string`&&t.push(e.text)}}):e.input&&typeof e.input==`object`&&(t.push(...YR(e.input.content)),typeof e.input.text==`string`&&t.push(e.input.text)),t.map(e=>String(e||``)).filter(e=>e.length>0)}var sz=e=>qR(e);function cz(e){if(!e||!e.data)return``;let t=yL(e.data.response_body,0,sz);if(t)return t;let n=e.data.error_message;if(n==null)return``;if(typeof n==`string`){let e=n.trim();return e?yL(_L(e),0,sz)||e:``}return yL(n,0,sz)||qR(n)}function lz(e){return Array.isArray(e)?e.some(e=>!e||typeof e!=`object`?!1:e.type===`message`||e.role===`assistant`||e.role===`user`||e.role===`system`?!0:Array.isArray(e.content)?e.content.some(e=>!e||typeof e!=`object`?!1:typeof e.text==`string`||e.type===`output_text`||e.type===`input_text`):!1):!1}function uz(e){if(!e)return!1;let t=String(e).toLowerCase();return t===`/v1/embeddings`||t===`/v1/embeddings/`||t.startsWith(`/v1/embeddings?`)||t.startsWith(`/v1/embeddings/`)}function dz(e){return e?!!pz(e):!1}function fz(e){let t=String(e||``).trim().split(`?`)[0].replace(/\/+$/,``).toLowerCase();return t.startsWith(`/v1/`)?t.slice(3):t}function pz(e){switch(fz(e)){case`/chat/completions`:return`chat`;case`/responses`:return`responses`;case`/messages`:return`messages`;default:return``}}function mz(e){if(!e||typeof e!=`object`)return null;try{return JSON.parse(JSON.stringify(e))}catch{return null}}function hz(e,t){if(!t||typeof t!=`object`)return;let n=e[e.length-1];try{if(n&&JSON.stringify(n)===JSON.stringify(t))return}catch{}e.push(t)}function gz(e){let t=pz(e&&e.path),n=e&&e.data&&e.data.request_body;return!t||!n||typeof n!=`object`?!1:t!==`responses`||(e.data&&e.data.response_body&&typeof e.data.response_body.id==`string`?e.data.response_body.id.trim():``)!==``||eB(n)!==``}function _z(e,t){let n=String(t||``).trim(),r=pz(e&&e.path),i=mz(e&&e.data&&e.data.request_body);if(!n||!r||!i)return null;let a=e&&e.data?e.data.response_body:null;if(r===`responses`){let e=a&&typeof a.id==`string`?a.id.trim():``,t=eB(i);return!e&&!t?null:(i.input=n,e&&!t?i.previous_response_id=e:delete i.previous_response_id,i)}let o=Array.isArray(i.messages)?i.messages:[];if(r===`chat`){let e=a&&Array.isArray(a.choices)?a.choices[0]:null;e&&e.message&&hz(o,mz(e.message)),o.push({role:`user`,content:n})}else a&&a.content!==void 0&&hz(o,{role:String(a.role||`assistant`),content:mz(a.content)||a.content}),o.push({role:`user`,content:n});return i.messages=o,i}var vz=new Set(`authorization.proxy-authorization.cookie.content-type.content-length.host.accept.connection.accept-encoding.content-encoding.transfer-encoding.user-agent.date.expect.upgrade.via.te.trailer.keep-alive.origin.referer.forwarded.x-real-ip.traceparent.tracestate.x-request-id.idempotency-key.x-idempotency-key.x-gomodel-timezone.x-gomodel-interaction-parent`.split(`.`));function yz(e,t,n=``){let r=e&&e.data&&e.data.request_headers,i={};return r&&typeof r==`object`&&Object.keys(r).forEach(e=>{let t=String(e).toLowerCase(),n=String(r[e]==null?``:r[e]);!e||!n||n===`[REDACTED]`||vz.has(t)||t.startsWith(`sec-`)||t.startsWith(`cf-`)||t.startsWith(`x-forwarded-`)||(i[e]=n)}),i[`X-GoModel-Interaction-Parent`]=String(t||e&&e.id||``).trim(),String(n||``).trim()&&(i[`X-Request-ID`]=String(n).trim()),i}function bz(e,t){let n=String(t||``).trim();return!n||!Array.isArray(e)?null:e.find(e=>String(e&&e.request_id||``).trim()===n)||null}function xz(e,t,n,r,i){let a=Array.isArray(e)?e:[],o=String(i&&i.id||``).trim(),s=String(i&&i.request_id||``).trim(),c=String(i&&i.session_id||``).trim(),l=String(r||``).trim(),u=Sz(i),d=a.some(e=>o&&String(e&&e.id||``).trim()===o||s&&String(e&&e.request_id||``).trim()===s),f=!!l&&s===l,p=!!n&&c===String(n).trim(),m=!!u&&(u===String(t||``).trim()||a.some(e=>String(e&&e.id||``).trim()===u)),h=d||f||!l&&(p||m);return{accepted:h,submittedChild:f,followUpRequestID:h&&f&&o?``:l}}function Sz(e){let t=e&&e.data&&e.data.request_headers;if(!t||typeof t!=`object`)return``;let n=Object.keys(t).find(e=>e.toLowerCase()===`x-gomodel-interaction-parent`);return n?String(t[n]||``).trim():``}function Cz(e,t){return!Array.isArray(e)||!t?null:e.find(e=>String(e&&e.id||``)===String(t))||null}function wz(e){return!Array.isArray(e)||e.length===0?null:e.reduce((e,t)=>e?tB(t,e)>=0?t:e:t,null)}function Tz(e,t){let n=new Set(Array.isArray(t)?t.map(String):[]);return wz((Array.isArray(e)?e:[]).filter(e=>{let t=String(e&&e.id||``);return n.has(t)&&e&&e.data&&e.data.request_body!=null}))}function Ez(e,t){let n=wz(e);return!!n&&String(n.id||``)===String(t||``)}function Dz(e,t,n){return String(e||``).trim()===`audit.flushed`&&String(t||``).trim()!==``&&String(t||``).trim()===String(n||``).trim()}function Oz(e,t){let n=Array.isArray(e)?e.filter(Boolean).map(String):[];return(Array.isArray(t)?t:[]).forEach(e=>{let t=String(e&&(e.id||e.request_id)||``).trim();t&&!n.includes(t)&&n.push(t)}),n}function kz(e){if(e&&e.conversation_payload)return!0;let t=e&&e.data?e.data.request_body:null,n=e&&e.data?e.data.response_body:null,r=t&&(Array.isArray(t.messages)||t.input!==void 0||typeof t.instructions==`string`||typeof t.previous_response_id==`string`),i=n&&(Array.isArray(n.choices)||lz(n.output));return!!(r||i)}function Az(e){return!e||uz(e.path)?!1:dz(e.path)||kz(e)}function jz(e){let t=0,n=!1,r=!1,i=String(e||``);for(let e=0;e0&&a+1`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}function Fz(e){return!!(e&&typeof e==`object`&&e.__audio__===!0)}function Iz(e){let t=Number(e||0);if(!Number.isFinite(t)||t<=0)return`0 B`;let n=[`B`,`KB`,`MB`,`GB`],r=0,i=t;for(;i>=1024&&r`
`+Pz(t)+``+Pz(Rz(e[t]))+`
`);return t.length?``:``}function Bz(e){let t=Lz(e.content_type),n=Pz(t+` · `+Iz(e.bytes)),r=zz(e.meta);if(e.stored&&e.encoding===`base64`&&e.data){let i=String(e.data).replace(/[^A-Za-z0-9+/=]/g,``);return`
`+n+`
`+r+`
`}let i=e.too_large?`Audio too large to store.`:`Audio not logged. Set LOGGING_LOG_AUDIO_BODIES=true to capture playable audio.`;return`
`+n+`
`+Pz(i)+`
`+r+`
`}function Vz(e){try{return JSON.stringify(String(e)).slice(1,-1)}catch{return``}}function Hz(e){if(!e||typeof e!=`object`)return null;let t=Number(e.characters||0);if(!Number.isFinite(t)||t<=0)return null;let n=Array.isArray(e.segments)?e.segments.map(e=>String(e||``)).filter(Boolean):[];return n.length===0?null:{remaining:Math.floor(t),segments:n,segmentIndex:0}}function Uz(e,t){if(!t||t.remaining<=0||t.segmentIndex>=t.segments.length)return Pz(e);let n=``,r=0,i=0;for(;t.remaining>0&&t.segmentIndex`+Pz(l)+``,r=s+l.length,i=s+o.length,t.remaining-=c,c>=a.length){t.segmentIndex++;continue}break}return n?n+Pz(e.slice(r)):Pz(e)}function Wz(e,t,n){let r=n&&typeof n.formatJSON==`function`?n.formatJSON:e=>String(e),i=n&&typeof n.canShowConversation==`function`?n.canShowConversation:()=>!1,a=Hz(n&&n.promptCacheHighlight),o=r(t);if(!o||o===`Not captured`)return Pz(o);if(!i(e))return o.split(` `).map(e=>Uz(e,a)).join(` `);let s=o.split(` @@ -47,7 +47,7 @@ `):e.text||``}function iB(e){return e?[String(e.text||``),Array.isArray(e.toolCalls)&&e.toolCalls.length>0?rB({role:`function_call`,toolCalls:e.toolCalls}):``].filter(Boolean).join(` -`):``}function aB(e){let t=e&&e.arguments!==void 0?e.arguments:``;if(typeof t!=`string`)try{return JSON.stringify(t,null,2)}catch{return String(t)}try{return JSON.stringify(JSON.parse(t),null,2)}catch{return t}}var oB=600*1e3,sB=15*1e3,cB=250,lB=class{#e=j(!1);get conversationOpen(){return R(this.#e)}set conversationOpen(e){M(this.#e,e,!0)}#t=j(!1);get conversationLoading(){return R(this.#t)}set conversationLoading(e){M(this.#t,e,!0)}#n=j(``);get conversationError(){return R(this.#n)}set conversationError(e){M(this.#n,e,!0)}#r=j(``);get conversationAnchorID(){return R(this.#r)}set conversationAnchorID(e){M(this.#r,e,!0)}#i=j(N([]));get conversationEntryIDs(){return R(this.#i)}set conversationEntryIDs(e){M(this.#i,e,!0)}#a=j(``);get conversationSessionID(){return R(this.#a)}set conversationSessionID(e){M(this.#a,e,!0)}#o=j(!1);get conversationTruncated(){return R(this.#o)}set conversationTruncated(e){M(this.#o,e,!0)}#s=j(!1);get conversationFollowLatest(){return R(this.#s)}set conversationFollowLatest(e){M(this.#s,e,!0)}#c=j(``);get conversationOpenedFromID(){return R(this.#c)}set conversationOpenedFromID(e){M(this.#c,e,!0)}#l=j(``);get followUpText(){return R(this.#l)}set followUpText(e){M(this.#l,e,!0)}#u=j(!1);get followUpSending(){return R(this.#u)}set followUpSending(e){M(this.#u,e,!0)}#d=j(``);get followUpError(){return R(this.#d)}set followUpError(e){M(this.#d,e,!0)}followUpRequestID=``;followUpAbort=null;conversationRequestToken=0;conversationReturnFocusEl=null;bodyPointerStart=null;#f=j(null);get conversationDialogEl(){return R(this.#f)}set conversationDialogEl(e){M(this.#f,e,!0)}#p=j(null);get conversationCloseBtnEl(){return R(this.#p)}set conversationCloseBtnEl(e){M(this.#p,e,!0)}#m=j(null);get conversationThreadEl(){return R(this.#m)}set conversationThreadEl(e){M(this.#m,e,!0)}get conversationEntries(){return(this.conversationEntryIDs||[]).map(e=>PE.auditRecord(e)).filter(Boolean)}#h=A(()=>nB(this.conversationEntries,this.conversationAnchorID));get conversationView(){return R(this.#h)}set conversationView(e){M(this.#h,e)}get conversationMessages(){return this.conversationView.messages}get conversationBranchEntryIDs(){return this.conversationView.entryIDs}_setConversationEntryIDs(e){this.conversationEntryIDs=[...new Set((Array.isArray(e)?e:[]).filter(Boolean))],PE.pinAuditRecords(this.conversationEntryIDs)}canShowConversation(e){return Az(e)}startBodyInteraction(e){this.bodyPointerStart={x:e.clientX,y:e.clientY}}_isBodyDrag(e){if(!this.bodyPointerStart)return!1;let t=Math.abs(e.clientX-this.bodyPointerStart.x),n=Math.abs(e.clientY-this.bodyPointerStart.y);return t>4||n>4}_hasActiveSelection(){let e=window.getSelection?window.getSelection():null;return!e||e.isCollapsed?!1:String(e.toString()||``).trim().length>0}handleBodyConversationClick(e,t){let n=this._isBodyDrag(e);if(this.bodyPointerStart=null,n||this._hasActiveSelection()||!this.canShowConversation(t))return;let r=e.target&&e.target.closest?e.target.closest(`[data-conversation-trigger="1"]`):null;r&&(e.preventDefault(),e.stopPropagation(),this.openConversation(t,r))}handleErrorConversationClick(e,t){let n=this._isBodyDrag(e);this.bodyPointerStart=null,!n&&(this._hasActiveSelection()||this.canShowConversation(t)&&(e.preventDefault(),e.stopPropagation(),this.openConversation(t,e.currentTarget)))}formatJSON(e){return sd(e)}renderBodyWithConversationHighlights(e,t,n){return Wz(e,t,{formatJSON:e=>this.formatJSON(e),canShowConversation:e=>this.canShowConversation(e),promptCacheHighlight:n&&n.promptCacheHighlight})}async openConversation(e,t){if(!e||!e.id||!this.canShowConversation(e))return;let n=document.activeElement instanceof HTMLElement?document.activeElement:null;t instanceof HTMLElement?this.conversationReturnFocusEl=t:n&&n!==document.body&&(this.conversationReturnFocusEl=n);let r=++this.conversationRequestToken;if(this.conversationOpen=!0,this.conversationError=``,this.conversationAnchorID=e.id,this.conversationOpenedFromID=e.id,this.conversationSessionID=String(e.session_id||``).trim(),this._setConversationEntryIDs([]),this.conversationTruncated=!1,this.conversationFollowLatest=!1,this.followUpText=``,this.followUpError=``,this.followUpRequestID=``,requestAnimationFrame(()=>this._focusConversationDrawer()),this._conversationEntryLivePending(e)){this.conversationFollowLatest=!0,this.conversationLoading=!1,this._addConversationRecord(PE.upsertAuditRecord(e,`conversation.live`));return}this.conversationLoading=!0,await this.fetchConversation(e.id,r,!0,!0)}_conversationEntryLivePending(e){return typeof PE.auditEntryLiveDetailPending==`function`&&PE.auditEntryLiveDetailPending(e)}_applyConversationView(){let e=this.conversationEntries,t=nB(e,this.conversationAnchorID);if(this.conversationFollowLatest){let n=Tz(e,t.entryIDs);n&&n.id&&String(n.id)!==this.conversationAnchorID&&(this.conversationAnchorID=String(n.id))}}handleAuditRecordChange(e,t){if(!this.conversationOpen||!e)return;let n=String(e.id||``).trim(),r=xz(this.conversationEntries,this.conversationAnchorID,this.conversationSessionID,this.followUpRequestID,e);if(r.accepted&&(this.followUpRequestID=r.followUpRequestID,n&&r.submittedChild&&(this.conversationAnchorID=n,this.conversationFollowLatest=!0),this._addConversationRecord(e),Dz(String(t||e._live_state||``).trim(),n,this.conversationAnchorID))){this.conversationMessages.length===0&&(this.conversationLoading=!0);let e=++this.conversationRequestToken;this.fetchConversation(n,e,!1)}}_addConversationRecord(e){let t=DE(e);t&&!this.conversationEntryIDs.includes(t)&&this._setConversationEntryIDs([...this.conversationEntryIDs,t]),!this.conversationSessionID&&e.session_id&&(this.conversationSessionID=String(e.session_id).trim()),this._applyConversationView(),this.conversationFollowLatest&&this._scheduleLatestScroll()}conversationLiveWaiting(){if(!this.conversationOpen)return!1;let e=new Set(this.conversationBranchEntryIDs||[]);return(this.conversationEntries||[]).some(t=>e.has(String(t&&t.id||``))&&t._live&&(typeof PE.liveAuditStateSettled!=`function`||!PE.liveAuditStateSettled(t._live_state)))}conversationLiveStatusText(){return(this.conversationMessages||[]).length>0?`Model is responding…`:`Waiting for request data…`}closeConversation(){this.followUpAbort&&this.followUpAbort.abort(),this.conversationOpen=!1,this.conversationRequestToken++,this.conversationSessionID=``,this._setConversationEntryIDs([]),this.conversationFollowLatest=!1,this.conversationOpenedFromID=``,this.followUpRequestID=``,this.followUpSending=!1;let e=this.conversationReturnFocusEl;this.conversationReturnFocusEl=null,e&&typeof e.focus==`function`&&document.contains(e)&&requestAnimationFrame(()=>e.focus())}_focusConversationDrawer(){if(!this.conversationOpen)return;let e=this.conversationCloseBtnEl;if(e&&typeof e.focus==`function`){e.focus();return}let t=this.conversationDialogEl;t&&typeof t.focus==`function`&&t.focus()}async fetchConversation(e,t,n=!0,r=!1){try{let i=await hu(`/admin/audit/conversation?`+(`log_id=`+encodeURIComponent(e)+`&limit=120`),{label:`audit conversation`});if(t!==this.conversationRequestToken||i.stale)return;if(!i.ok){this.conversationError=`Unable to load interactions.`;return}let a=i.data||{},o=a.anchor_id||e,s=Array.isArray(a.entries)?a.entries:[],c=PE.upsertAuditRecords(s,`conversation.hydrated`),l=Oz(this.conversationEntryIDs,c);l.length>this.conversationEntryIDs.length&&this._setConversationEntryIDs(l),r&&(this.conversationFollowLatest=Ez(c,o)),this.conversationAnchorID=o;let u=this.conversationEntries.find(e=>e.id===this.conversationAnchorID);u&&u.session_id&&(this.conversationSessionID=String(u.session_id).trim()),this.conversationTruncated=!!a.truncated,this._applyConversationView(),this.conversationFollowLatest?this._scheduleLatestScroll():n&&this._scheduleAnchorScroll()}catch(e){if(t!==this.conversationRequestToken)return;console.error(`Failed to fetch audit conversation:`,e),this.conversationError=`Failed to load interactions.`}finally{t===this.conversationRequestToken&&(this.conversationLoading=!1)}}selectedConversationEntry(){return Cz(this.conversationEntries,this.conversationAnchorID)}followUpKind(){let e=this.selectedConversationEntry();return gz(e)?pz(e.path):``}canSendFollowUp(){return!!this.followUpKind()&&!!String(this.followUpText||``).trim()&&!this.followUpSending&&!this.conversationLiveWaiting()}async sendFollowUp(){if(!this.canSendFollowUp())return;let e=this.selectedConversationEntry(),t=_z(e,this.followUpText);if(!e||!t)return;let n=this.conversationAnchorID,r=dB(),i=new AbortController,a=!1,o=setTimeout(()=>{a=!0,i.abort()},oB);this.followUpSending=!0,this.followUpError=``,this.followUpRequestID=r,this.followUpAbort=i;try{let a=yz(e,n,r),o=await pu(e.path,{method:`POST`,headers:a,body:JSON.stringify(t),signal:i.signal}),s=String(o.headers.get(`X-Request-ID`)||``).trim();if(s&&this.followUpRequestID&&(this.followUpRequestID=s),!o.ok){let e=`Unable to send message.`;try{let t=await o.json();e=t&&t.error&&t.error.message||e}catch{}this.followUpError=e,(this.followUpRequestID===r||this.followUpRequestID===s)&&(this.followUpRequestID=``);return}if(this.followUpText=``,await uB(o),!PE.liveLogsStreaming&&this.conversationOpen){let e=++this.conversationRequestToken;await this._selectPersistedFollowUp(n,this.followUpRequestID,e,i.signal)}}catch(e){_u(e)||i.signal.aborted?a&&this.conversationOpen&&(this.followUpError=`The request timed out.`):(console.error(`Failed to send interaction follow-up:`,e),this.followUpError=`Failed to send message.`)}finally{clearTimeout(o),this.followUpAbort===i&&(this.followUpAbort=null,this.followUpSending=!1)}}async _selectPersistedFollowUp(e,t,n,r){let i=Date.now()+sB;for(;this.conversationOpen&&n===this.conversationRequestToken&&Date.now(){let e=this.conversationThreadEl;if(!e)return;let t=e.querySelectorAll(`[data-conversation-anchor="true"]`),n=t[t.length-1];n&&typeof n.scrollIntoView==`function`&&n.scrollIntoView({block:`center`})})}_scheduleLatestScroll(){requestAnimationFrame(()=>{let e=this.conversationThreadEl;if(!e)return;let t=e.lastElementChild;t&&typeof t.scrollIntoView==`function`&&t.scrollIntoView({block:`end`})})}};async function uB(e){let t=e&&e.body&&typeof e.body.getReader==`function`?e.body.getReader():null;if(!t){await e.text();return}for(;!(await t.read()).done;);}function dB(){return globalThis.crypto&&typeof globalThis.crypto.randomUUID==`function`?globalThis.crypto.randomUUID():`dashboard-`+Date.now().toString(36)+`-`+Math.random().toString(36).slice(2)}function fB(e,t){return new Promise((n,r)=>{let i,a=()=>{clearTimeout(i),r(new DOMException(`Aborted`,`AbortError`))};if(i=setTimeout(()=>{t&&t.removeEventListener(`abort`,a),n()},e),t){if(t.aborted){a();return}t.addEventListener(`abort`,a,{once:!0})}})}var pB=new lB,mB=0;An(()=>{On(()=>{let e=kE(PE.auditRecordChanges,mB);e.length!==0&&(mB=Number(e[e.length-1].version||0),wr(()=>{e.forEach(e=>{if(!AE(e))return;let t=PE.auditRecord(e.key);pB.handleAuditRecordChange(t,e.eventType)})}))})});var hB=B(``),gB=B(` `),_B=B(` `),vB=B(``),yB=B(`
`);function bB(e,t){O(t,!0);let n=q(t,`thread`,3,null),r=q(t,`expanded`,3,!1),i=q(t,`onactivate`,3,null),a=q(t,`hidePath`,3,!1),o=A(()=>lu.formatTimestamp(t.entry.timestamp)),s=A(()=>R(o)===`-`?R(o):R(o).slice(R(o).lastIndexOf(` `)+1)),c=A(()=>pB.conversationOpen&&String(pB.conversationAnchorID||``)===String(t.entry.id||``));function l(e){e.preventDefault(),i()&&i()()}function u(e){e.stopPropagation(),e.preventDefault(),n().ontoggle()}function d(e){if(e.stopPropagation(),e.preventDefault(),R(c)){pB.closeConversation();return}pB.openConversation(t.entry,e.currentTarget)}var f=yB();let p;var m=P(f),h=P(m),g=e=>{var t=hB(),r=P(t);{let e=A(()=>n().expanded?Nc:Fc);J(r,{get icon(){return R(e)},class:`audit-thread-expander-svg`})}var i=I(r,2),a=P(i,!0);D(i),D(t),L(()=>{K(t,`aria-expanded`,n().expanded),K(t,`title`,`Session with `+n().count+` requests`),K(t,`aria-label`,`Session with `+n().count+` requests, `+(n().expanded?`collapse`:`expand`)),H(a,n().count)}),z(`click`,t,u),V(e,t)};U(h,e=>{n()&&e(g)});var _=I(h,2),v=P(_),y=P(v,!0);D(v);var b=I(v,2),x=P(b,!0);D(b),D(_);var S=I(_,2),C=e=>{var n=gB(),r=P(n,!0);D(n),L(e=>H(r,e),[()=>Sd(t.entry)]),V(e,n)};U(S,e=>{(t.entry.requested_model||t.entry.model)&&e(C)});var w=I(S,2),T=e=>{var n=_B(),r=P(n,!0);D(n),L(()=>H(r,t.entry.path||`-`)),V(e,n)};U(w,e=>{a()||e(T)}),D(m);var E=I(m,2),ee=P(E);WR(ee,{get entry(){return t.entry}});var te=I(ee,2),ne=P(te),re=P(ne,!0);D(ne);var ie=I(ne,2),ae=P(ie,!0);D(ie),D(te);var oe=I(te,2),se=P(oe,!0);D(oe);var ce=I(oe,2),le=e=>{var t=vB();let n;var r=P(t);{let e=A(()=>R(c)?Pc:Fc);J(r,{get icon(){return R(e)},class:`audit-conversation-trigger-svg`})}D(t),L(()=>{n=G(t,1,`audit-conversation-trigger svelte-17mysgz`,null,n,{"audit-conversation-trigger-active":R(c)}),K(t,`title`,R(c)?`Close interactions`:`Open interactions`),K(t,`aria-label`,R(c)?`Close interactions`:`Open interactions`),K(t,`aria-pressed`,R(c))}),z(`click`,t,d),V(e,t)},ue=A(()=>pB.canShowConversation(t.entry));U(ce,e=>{R(ue)&&e(le)}),D(E),D(f),L((e,n,i,a)=>{p=G(f,1,`audit-entry-summary svelte-17mysgz`,null,p,e),K(f,`aria-expanded`,r()),G(_,1,`audit-status-badge audit-request-badge ${n??``}`,`svelte-17mysgz`),K(_,`title`,`Status `+(t.entry.status_code||`-`)+` · `+(t.entry.method||`-`)),K(_,`aria-label`,(t.entry.status_code||`-`)+` `+(t.entry.method||`-`)),H(y,t.entry.status_code||`-`),H(x,t.entry.method||`-`),K(te,`title`,i),K(te,`aria-label`,R(o)),H(re,R(o)),H(ae,R(s)),H(se,a)},[()=>({"audit-entry-summary-live-in-progress":YL(t.entry),"audit-entry-summary-has-interactions":pB.canShowConversation(t.entry)}),()=>JL(t.entry.status_code),()=>gd(t.entry.timestamp),()=>qL(t.entry.duration_ns)]),z(`click`,f,l),V(e,f),k()}Br([`click`]);var xB=B(``);function SB(e,t){O(t,!0);let n=q(t,`label`,3,`Copy`),r=q(t,`copiedLabel`,3,`Copied`),i=q(t,`errorLabel`,3,``),a=q(t,`class`,3,`btn`),o=A(()=>t.state.error&&i()?i():t.state.copied?r():n());var s=xB();let c;var l=P(s),u=e=>{J(e,{get icon(){return Lc},width:`14`,height:`14`,"stroke-width":`2.5`})},d=e=>{J(e,{get icon(){return Bc},width:`14`,height:`14`})};U(l,e=>{t.state.copied?e(u):e(d,-1)});var f=I(l,2),p=P(f,!0);D(f),D(s),L(()=>{c=G(s,1,Ni([`copy-feedback-btn`,a()]),null,c,{"copy-feedback-btn-copied":t.state.copied}),H(p,R(o))}),z(`click`,s,e=>{e.preventDefault(),t.onclick?.(e)}),V(e,s),k()}Br([`click`]);var CB=B(`
Error Message
 
`),wB=B(`
 
`),TB=B(` `),EB=B(` streaming`),DB=B(`
Body
`),OB=B(`

`),kB=B(`

`),AB=B(`

`),jB=B(`
`);function MB(e,t){O(t,!0);let n=CF({logPrefix:`Failed to copy audit payload:`}),r=CF({logPrefix:`Failed to copy audit payload:`}),i=A(()=>t.pane&&t.pane.showHeaders?sd(t.pane.headers):``),a=A(()=>!t.pane||!t.pane.showBody?``:Fz(t.pane.body)?Bz(t.pane.body):pB.renderBodyWithConversationHighlights(t.pane.entry,t.pane.body,{promptCacheHighlight:t.pane.promptCacheHighlight})),o=A(()=>!!(t.pane&&pB.canShowConversation(t.pane.entry)));function s(e){e.key!==`Enter`&&e.key!==` `||(e.preventDefault(),pB.handleErrorConversationClick(e,t.pane.entry))}var c=jB();let l;var u=P(c),d=e=>{var n=CB(),r=I(P(n),2);let i;var a=P(r,!0);D(r),D(n),L(()=>{i=G(r,1,`audit-json audit-pane-error-message svelte-1h5puht`,null,i,{"audit-pane-clickable-preview":R(o)}),K(r,`role`,R(o)?`button`:null),K(r,`tabindex`,R(o)?0:null),H(a,t.pane.errorMessage)}),z(`mousedown`,r,e=>pB.startBodyInteraction(e)),z(`keydown`,r,s),z(`click`,r,e=>pB.handleErrorConversationClick(e,t.pane.entry)),V(e,n)};U(u,e=>{t.pane.showErrorMessage&&e(d)});var f=I(u,2),p=e=>{var n=wB(),a=P(n),o=P(a),s=P(o,!0);D(o),SB(I(o,2),{get state(){return r},label:`Copy Headers`,errorLabel:`Copy failed`,class:`audit-copy-btn`,onclick:()=>r.copy(t.pane.copyHeaders,sd)}),D(a);var c=I(a,2),l=P(c,!0);D(c),D(n),L(()=>{H(s,t.pane.headersTitle||`Headers`),H(l,R(i))}),V(e,n)};U(f,e=>{t.pane.showHeaders&&e(p)});var m=I(f,2),h=e=>{var r=DB(),i=P(r),o=P(i),s=I(P(o),2),c=e=>{var n=TB(),r=P(n,!0);D(n),L(()=>H(r,t.pane.bodyCacheRatioLabel)),V(e,n)};U(s,e=>{t.pane.bodyCacheRatioLabel&&e(c)});var l=I(s,2),u=e=>{V(e,EB())};U(l,e=>{t.pane.streaming&&e(u)}),D(o),SB(I(o,2),{get state(){return n},label:`Copy Body`,errorLabel:`Copy failed`,class:`audit-copy-btn`,onclick:()=>n.copy(t.pane.copyBody,sd)}),D(i);var d=I(i,2);pi(d,()=>R(a),!0),D(d),D(r),z(`mousedown`,d,e=>pB.startBodyInteraction(e)),z(`click`,d,e=>pB.handleBodyConversationClick(e,t.pane.entry)),V(e,r)};U(m,e=>{t.pane.showBody&&e(h)});var g=I(m,2),_=e=>{var n=OB(),r=P(n,!0);D(n),L(()=>H(r,t.pane.emptyMessage)),V(e,n)};U(g,e=>{t.pane.showEmpty&&e(_)});var v=I(g,2),y=e=>{var n=kB(),r=I(P(n),2),i=P(r,!0);D(r),D(n),L(()=>H(i,t.pane.pendingMessage)),V(e,n)};U(v,e=>{t.pane.showPending&&e(y)});var b=I(v,2),x=e=>{var n=AB(),r=P(n,!0);D(n),L(()=>H(r,t.pane.tooLargeMessage)),V(e,n)};U(b,e=>{t.pane.showTooLarge&&e(x)}),D(c),L(()=>l=G(c,1,`audit-pane svelte-1h5puht`,null,l,{"audit-pane-split":t.pane&&t.pane.layout===`split`,"audit-pane-split-single":t.pane&&t.pane.layout===`split`&&!(t.pane.showHeaders&&t.pane.showBody)})),V(e,c),k()}Br([`mousedown`,`keydown`,`click`]);var NB=B(` `),PB=B(` `),FB=B(` `),IB=B(` `),LB=B(``),RB=B(`
`),zB=B(`
`);function BB(e,t){O(t,!0);let n=q(t,`panes`,19,()=>[]),r=j(null),i=A(()=>DR(R(r),t.entry,n())),a=e=>`audit-tab-`+t.entry.id+`-`+e,o=e=>`audit-tabpanel-`+t.entry.id+`-`+e;function s(e,t){let i=n().map(e=>e.id),a=OR(e.key,i,t);a!=null&&(e.preventDefault(),((e.currentTarget?.closest?.(`.audit-pane-tablist`))?.querySelectorAll(`.audit-pane-tab`)[i.indexOf(a)])?.focus?.(),M(r,a,!0))}var c=zB(),l=P(c);W(l,21,n,e=>e.id,(e,t)=>{var n=LB();let c;var l=P(n),u=P(l),d=e=>{J(e,{get icon(){return wc}})},f=e=>{J(e,{get icon(){return Cc}})};U(u,e=>{R(t).pane.direction===`request`?e(d):R(t).pane.direction===`response`&&e(f,1)}),D(l);var p=I(l,2),m=P(p,!0);D(p);var h=I(p,2),g=e=>{var n=NB(),r=P(n);D(n),L(()=>H(r,`#${R(t).pane.seq??``}`)),V(e,n)};U(h,e=>{R(t).pane.seq&&e(g)});var _=I(h,2),v=e=>{var n=PB(),r=P(n,!0);D(n),L(()=>{G(n,1,`provider-badge audit-pane-kind audit-pane-kind-${R(t).pane.kind??``}`,`svelte-1bc5vi5`),H(r,R(t).pane.kind)}),V(e,n)};U(_,e=>{R(t).pane.kind&&e(v)});var y=I(_,2);W(y,17,()=>R(t).pane.noChangeSteps||[],e=>e.id,(e,t)=>{var n=FB(),r=P(n,!0);D(n),L(()=>{K(n,`title`,R(t).title),H(r,R(t).label)}),V(e,n)});var b=I(y,2),x=e=>{var n=IB(),r=P(n,!0);D(n),L(()=>H(r,R(t).pane.savingsLabel)),V(e,n)};U(b,e=>{R(t).pane.savingsLabel&&e(x)});var S=I(b,2),C=e=>{var n=PB(),r=P(n,!0);D(n),L(e=>{G(n,1,`audit-status-badge ${e??``}`,`svelte-1bc5vi5`),H(r,R(t).pane.statusCode)},[()=>JL(R(t).pane.statusCode)]),V(e,n)};U(S,e=>{R(t).pane.statusCode&&e(C)}),D(n),L((e,r)=>{c=G(n,1,`audit-pane-tab svelte-1bc5vi5`,null,c,{"audit-pane-tab-active":R(i)===R(t).id}),K(n,`aria-selected`,R(i)===R(t).id),K(n,`id`,e),K(n,`aria-controls`,r),K(n,`tabindex`,R(i)===R(t).id?0:-1),G(l,1,Ni([`audit-pane-icon`,R(t).pane.direction&&`audit-pane-icon-${R(t).pane.direction}`]),`svelte-1bc5vi5`),H(m,R(t).pane.title)},[()=>a(R(t).id),()=>o(R(t).id)]),z(`keydown`,n,e=>s(e,R(t).id)),z(`click`,n,()=>M(r,R(t).id,!0)),V(e,n)}),D(l),W(I(l,2),17,n,e=>e.id,(e,t)=>{var n=RB();let r;MB(P(n),{get pane(){return R(t).pane}}),D(n),L((e,a)=>{K(n,`id`,e),K(n,`aria-labelledby`,a),r=Bi(n,``,r,{display:R(i)===R(t).id?null:`none`})},[()=>o(R(t).id),()=>a(R(t).id)]),V(e,n)}),D(c),V(e,c),k()}Br([`keydown`,`click`]);var VB=B(`
`),HB=B(`
`);function UB(e,t){O(t,!0);let n=q(t,`thread`,3,null),r=q(t,`hidePath`,3,!1),i=A(()=>jR.isAuditEntryExpanded(t.entry)),a=A(()=>pB.conversationOpen&&String(pB.conversationAnchorID||``)===String(t.entry.id||``)),o=A(()=>R(i)?TR(t.entry,oz):[]),s=A(()=>R(i)?bI(t.entry,hL.auditEntryWorkflow(t.entry),hL.workflowFeatureCaps()):null);function c(){jR.toggleAuditEntryExpanded(t.entry)}var l=HB();let u;var d=P(l);bB(d,{get entry(){return t.entry},get thread(){return n()},get expanded(){return R(i)},get hidePath(){return r()},onactivate:c});var f=I(d,2),p=e=>{var n=VB(),r=P(n),i=e=>{IF(e,{get chart(){return R(s)}})};U(r,e=>{R(s)&&e(i)});var a=I(r,2);BB(a,{get entry(){return t.entry},get panes(){return R(o)}}),VR(I(a,2),{get entry(){return t.entry}}),D(n),Di(3,n,()=>Ju,()=>({y:-6,duration:pL(150)})),V(e,n)};U(f,e=>{R(i)&&e(p)}),D(l),L(()=>u=G(l,1,`audit-entry svelte-cmjgwr`,null,u,{"audit-entry-interactions-open":R(a)})),V(e,l),k()}var WB=B(`
`),GB=B(`
`),KB=B(`

`),qB=B(`
`),JB=B(`
`);function YB(e,t){O(t,!0);let n=A(()=>jL(t.entry)),r=A(()=>jR.isThreadExpanded(R(n))),i=A(()=>jR.threadChildren(R(n))),a=A(()=>R(i)&&!R(i).loading&&Number(R(i).total||0)>R(i).entries.length+1);var o=Xr(),s=F(o),c=e=>{UB(e,{get entry(){return t.entry}})},l=A(()=>!NL(t.entry)),u=e=>{var n=JB(),o=P(n);{let e=A(()=>({count:ML(t.entry),expanded:R(r),ontoggle:()=>jR.toggleThread(t.entry)}));UB(o,{get entry(){return t.entry},get thread(){return R(e)}})}var s=I(o,2),c=e=>{var n=qB(),r=P(n),o=e=>{var t=WB();wT(P(t),{size:14,label:`Loading session requests`}),D(t),V(e,t)};U(r,e=>{R(i)&&R(i).loading&&e(o)});var s=I(r,2);W(s,17,()=>R(i)&&R(i).entries||[],e=>e.id,(e,n)=>{var r=GB(),i=P(r);{let e=A(()=>R(n).path===t.entry.path);UB(i,{get entry(){return R(n)},get hidePath(){return R(e)}})}D(r),V(e,r)});var c=I(s,2),l=e=>{var t=KB(),n=P(t);D(t),L(()=>H(n,`Showing the latest ${R(i).entries.length+1} of ${R(i).total??``} +`):``}function aB(e){let t=e&&e.arguments!==void 0?e.arguments:``;if(typeof t!=`string`)try{return JSON.stringify(t,null,2)}catch{return String(t)}try{return JSON.stringify(JSON.parse(t),null,2)}catch{return t}}var oB=600*1e3,sB=15*1e3,cB=250,lB=class{#e=j(!1);get conversationOpen(){return R(this.#e)}set conversationOpen(e){M(this.#e,e,!0)}#t=j(!1);get conversationLoading(){return R(this.#t)}set conversationLoading(e){M(this.#t,e,!0)}#n=j(``);get conversationError(){return R(this.#n)}set conversationError(e){M(this.#n,e,!0)}#r=j(``);get conversationAnchorID(){return R(this.#r)}set conversationAnchorID(e){M(this.#r,e,!0)}#i=j(N([]));get conversationEntryIDs(){return R(this.#i)}set conversationEntryIDs(e){M(this.#i,e,!0)}#a=j(``);get conversationSessionID(){return R(this.#a)}set conversationSessionID(e){M(this.#a,e,!0)}#o=j(!1);get conversationTruncated(){return R(this.#o)}set conversationTruncated(e){M(this.#o,e,!0)}#s=j(!1);get conversationFollowLatest(){return R(this.#s)}set conversationFollowLatest(e){M(this.#s,e,!0)}#c=j(``);get conversationOpenedFromID(){return R(this.#c)}set conversationOpenedFromID(e){M(this.#c,e,!0)}#l=j(``);get followUpText(){return R(this.#l)}set followUpText(e){M(this.#l,e,!0)}#u=j(!1);get followUpSending(){return R(this.#u)}set followUpSending(e){M(this.#u,e,!0)}#d=j(``);get followUpError(){return R(this.#d)}set followUpError(e){M(this.#d,e,!0)}followUpRequestID=``;followUpAbort=null;conversationRequestToken=0;conversationReturnFocusEl=null;bodyPointerStart=null;#f=j(null);get conversationDialogEl(){return R(this.#f)}set conversationDialogEl(e){M(this.#f,e,!0)}#p=j(null);get conversationCloseBtnEl(){return R(this.#p)}set conversationCloseBtnEl(e){M(this.#p,e,!0)}#m=j(null);get conversationThreadEl(){return R(this.#m)}set conversationThreadEl(e){M(this.#m,e,!0)}get conversationEntries(){return(this.conversationEntryIDs||[]).map(e=>PE.auditRecord(e)).filter(Boolean)}#h=A(()=>nB(this.conversationEntries,this.conversationAnchorID));get conversationView(){return R(this.#h)}set conversationView(e){M(this.#h,e)}get conversationMessages(){return this.conversationView.messages}get conversationBranchEntryIDs(){return this.conversationView.entryIDs}_setConversationEntryIDs(e){this.conversationEntryIDs=[...new Set((Array.isArray(e)?e:[]).filter(Boolean))],PE.pinAuditRecords(this.conversationEntryIDs)}canShowConversation(e){return Az(e)}startBodyInteraction(e){this.bodyPointerStart={x:e.clientX,y:e.clientY}}_isBodyDrag(e){if(!this.bodyPointerStart)return!1;let t=Math.abs(e.clientX-this.bodyPointerStart.x),n=Math.abs(e.clientY-this.bodyPointerStart.y);return t>4||n>4}_hasActiveSelection(){let e=window.getSelection?window.getSelection():null;return!e||e.isCollapsed?!1:String(e.toString()||``).trim().length>0}handleBodyConversationClick(e,t){let n=this._isBodyDrag(e);if(this.bodyPointerStart=null,n||this._hasActiveSelection()||!this.canShowConversation(t))return;let r=e.target&&e.target.closest?e.target.closest(`[data-conversation-trigger="1"]`):null;r&&(e.preventDefault(),e.stopPropagation(),this.openConversation(t,r))}handleErrorConversationClick(e,t){let n=this._isBodyDrag(e);this.bodyPointerStart=null,!n&&(this._hasActiveSelection()||this.canShowConversation(t)&&(e.preventDefault(),e.stopPropagation(),this.openConversation(t,e.currentTarget)))}formatJSON(e){return sd(e)}renderBodyWithConversationHighlights(e,t,n){return Wz(e,t,{formatJSON:e=>this.formatJSON(e),canShowConversation:e=>this.canShowConversation(e),promptCacheHighlight:n&&n.promptCacheHighlight})}async openConversation(e,t){if(!e||!e.id||!this.canShowConversation(e))return;let n=document.activeElement instanceof HTMLElement?document.activeElement:null;t instanceof HTMLElement?this.conversationReturnFocusEl=t:n&&n!==document.body&&(this.conversationReturnFocusEl=n);let r=++this.conversationRequestToken;if(this.conversationOpen=!0,this.conversationError=``,this.conversationAnchorID=e.id,this.conversationOpenedFromID=e.id,this.conversationSessionID=String(e.session_id||``).trim(),this._setConversationEntryIDs([]),this.conversationTruncated=!1,this.conversationFollowLatest=!1,this.followUpText=``,this.followUpError=``,this.followUpRequestID=``,requestAnimationFrame(()=>this._focusConversationDrawer()),this._conversationEntryLivePending(e)){this.conversationFollowLatest=!0,this.conversationLoading=!1,this._addConversationRecord(PE.upsertAuditRecord(e,`conversation.live`));return}this.conversationLoading=!0,await this.fetchConversation(e.id,r,!0,!0)}_conversationEntryLivePending(e){return typeof PE.auditEntryLiveDetailPending==`function`&&PE.auditEntryLiveDetailPending(e)}_applyConversationView(){let e=this.conversationEntries,t=nB(e,this.conversationAnchorID);if(this.conversationFollowLatest){let n=Tz(e,t.entryIDs);n&&n.id&&String(n.id)!==this.conversationAnchorID&&(this.conversationAnchorID=String(n.id))}}handleAuditRecordChange(e,t){if(!this.conversationOpen||!e)return;let n=String(e.id||``).trim(),r=xz(this.conversationEntries,this.conversationAnchorID,this.conversationSessionID,this.followUpRequestID,e);if(r.accepted&&(this.followUpRequestID=r.followUpRequestID,n&&r.submittedChild&&(this.conversationAnchorID=n,this.conversationFollowLatest=!0),this._addConversationRecord(e),Dz(String(t||e._live_state||``).trim(),n,this.conversationAnchorID))){this.conversationMessages.length===0&&(this.conversationLoading=!0);let e=++this.conversationRequestToken;this.fetchConversation(n,e,!1)}}_addConversationRecord(e){let t=DE(e);t&&!this.conversationEntryIDs.includes(t)&&this._setConversationEntryIDs([...this.conversationEntryIDs,t]),!this.conversationSessionID&&e.session_id&&(this.conversationSessionID=String(e.session_id).trim()),this._applyConversationView(),this.conversationFollowLatest&&this._scheduleLatestScroll()}conversationLiveWaiting(){if(!this.conversationOpen)return!1;let e=new Set(this.conversationBranchEntryIDs||[]);return(this.conversationEntries||[]).some(t=>e.has(String(t&&t.id||``))&&t._live&&(typeof PE.liveAuditStateSettled!=`function`||!PE.liveAuditStateSettled(t._live_state)))}conversationLiveStatusText(){return(this.conversationMessages||[]).length>0?`Model is responding…`:`Waiting for request data…`}closeConversation(){this.followUpAbort&&this.followUpAbort.abort(),this.conversationOpen=!1,this.conversationRequestToken++,this.conversationSessionID=``,this._setConversationEntryIDs([]),this.conversationFollowLatest=!1,this.conversationOpenedFromID=``,this.followUpRequestID=``,this.followUpSending=!1;let e=this.conversationReturnFocusEl;this.conversationReturnFocusEl=null,e&&typeof e.focus==`function`&&document.contains(e)&&requestAnimationFrame(()=>e.focus())}_focusConversationDrawer(){if(!this.conversationOpen)return;let e=this.conversationCloseBtnEl;if(e&&typeof e.focus==`function`){e.focus();return}let t=this.conversationDialogEl;t&&typeof t.focus==`function`&&t.focus()}async fetchConversation(e,t,n=!0,r=!1){try{let i=await hu(`/admin/audit/conversation?`+(`log_id=`+encodeURIComponent(e)+`&limit=120`),{label:`audit conversation`});if(t!==this.conversationRequestToken||i.stale)return;if(!i.ok){this.conversationError=`Unable to load interactions.`;return}let a=i.data||{},o=a.anchor_id||e,s=Array.isArray(a.entries)?a.entries:[],c=PE.upsertAuditRecords(s,`conversation.hydrated`),l=Oz(this.conversationEntryIDs,c);l.length>this.conversationEntryIDs.length&&this._setConversationEntryIDs(l),r&&(this.conversationFollowLatest=Ez(c,o)),this.conversationAnchorID=o;let u=this.conversationEntries.find(e=>e.id===this.conversationAnchorID);u&&u.session_id&&(this.conversationSessionID=String(u.session_id).trim()),this.conversationTruncated=!!a.truncated,this._applyConversationView(),this.conversationFollowLatest?this._scheduleLatestScroll():n&&this._scheduleAnchorScroll()}catch(e){if(t!==this.conversationRequestToken)return;console.error(`Failed to fetch audit conversation:`,e),this.conversationError=`Failed to load interactions.`}finally{t===this.conversationRequestToken&&(this.conversationLoading=!1)}}selectedConversationEntry(){return Cz(this.conversationEntries,this.conversationAnchorID)}followUpKind(){let e=this.selectedConversationEntry();return gz(e)?pz(e.path):``}canSendFollowUp(){return!!this.followUpKind()&&!!String(this.followUpText||``).trim()&&!this.followUpSending&&!this.conversationLiveWaiting()}async sendFollowUp(){if(!this.canSendFollowUp())return;let e=this.selectedConversationEntry(),t=_z(e,this.followUpText);if(!e||!t)return;let n=this.conversationAnchorID,r=dB(),i=new AbortController,a=!1,o=setTimeout(()=>{a=!0,i.abort()},oB);this.followUpSending=!0,this.followUpError=``,this.followUpRequestID=r,this.followUpAbort=i;try{let a=yz(e,n,r),o=await pu(e.path,{method:`POST`,headers:a,body:JSON.stringify(t),signal:i.signal}),s=String(o.headers.get(`X-Request-ID`)||``).trim();if(s&&this.followUpRequestID&&(this.followUpRequestID=s),!o.ok){let e=`Unable to send message.`;try{let t=await o.json();e=t&&t.error&&t.error.message||e}catch{}this.followUpError=e,(this.followUpRequestID===r||this.followUpRequestID===s)&&(this.followUpRequestID=``);return}if(this.followUpText=``,await uB(o),!PE.liveLogsStreaming&&this.conversationOpen){let e=++this.conversationRequestToken;await this._selectPersistedFollowUp(n,this.followUpRequestID,e,i.signal)}}catch(e){_u(e)||i.signal.aborted?a&&this.conversationOpen&&(this.followUpError=`The request timed out.`):(console.error(`Failed to send interaction follow-up:`,e),this.followUpError=`Failed to send message.`)}finally{clearTimeout(o),this.followUpAbort===i&&(this.followUpAbort=null,this.followUpSending=!1)}}async _selectPersistedFollowUp(e,t,n,r){let i=Date.now()+sB;for(;this.conversationOpen&&n===this.conversationRequestToken&&Date.now(){let e=this.conversationThreadEl;if(!e)return;let t=e.querySelectorAll(`[data-conversation-anchor="true"]`),n=t[t.length-1];n&&typeof n.scrollIntoView==`function`&&n.scrollIntoView({block:`center`})})}_scheduleLatestScroll(){requestAnimationFrame(()=>{let e=this.conversationThreadEl;if(!e)return;let t=e.lastElementChild;t&&typeof t.scrollIntoView==`function`&&t.scrollIntoView({block:`end`})})}};async function uB(e){let t=e&&e.body&&typeof e.body.getReader==`function`?e.body.getReader():null;if(!t){await e.text();return}for(;!(await t.read()).done;);}function dB(){return globalThis.crypto&&typeof globalThis.crypto.randomUUID==`function`?globalThis.crypto.randomUUID():`dashboard-`+Date.now().toString(36)+`-`+Math.random().toString(36).slice(2)}function fB(e,t){return new Promise((n,r)=>{let i,a=()=>{clearTimeout(i),r(new DOMException(`Aborted`,`AbortError`))};if(i=setTimeout(()=>{t&&t.removeEventListener(`abort`,a),n()},e),t){if(t.aborted){a();return}t.addEventListener(`abort`,a,{once:!0})}})}var pB=new lB,mB=0;An(()=>{On(()=>{let e=kE(PE.auditRecordChanges,mB);e.length!==0&&(mB=Number(e[e.length-1].version||0),wr(()=>{e.forEach(e=>{if(!AE(e))return;let t=PE.auditRecord(e.key);pB.handleAuditRecordChange(t,e.eventType)})}))})});var hB=B(``),gB=B(` `),_B=B(` `),vB=B(``),yB=B(`
`);function bB(e,t){O(t,!0);let n=q(t,`thread`,3,null),r=q(t,`expanded`,3,!1),i=q(t,`onactivate`,3,null),a=q(t,`hidePath`,3,!1),o=A(()=>lu.formatTimestamp(t.entry.timestamp)),s=A(()=>R(o)===`-`?R(o):R(o).slice(R(o).lastIndexOf(` `)+1)),c=A(()=>pB.conversationOpen&&String(pB.conversationAnchorID||``)===String(t.entry.id||``));function l(e){e.preventDefault(),i()&&i()()}function u(e){e.stopPropagation(),e.preventDefault(),n().ontoggle()}function d(){return`Session with `+Number(n().count||1)+` requests`}function f(e){if(e.stopPropagation(),e.preventDefault(),R(c)){pB.closeConversation();return}pB.openConversation(t.entry,e.currentTarget)}var p=yB();let m;var h=P(p),g=P(h),_=e=>{var t=hB(),r=P(t);{let e=A(()=>n().expanded?Nc:Fc);J(r,{get icon(){return R(e)},class:`audit-thread-expander-svg`})}var i=I(r,2),a=P(i,!0);D(i),D(t),L((e,r)=>{K(t,`aria-expanded`,n().expanded),K(t,`title`,e),K(t,`aria-label`,r),H(a,n().count)},[()=>d(),()=>d()+`, `+(n().expanded?`collapse`:`expand`)]),z(`click`,t,u),V(e,t)};U(g,e=>{n()&&e(_)});var v=I(g,2),y=P(v),b=P(y,!0);D(y);var x=I(y,2),S=P(x,!0);D(x),D(v);var C=I(v,2),w=e=>{var n=gB(),r=P(n,!0);D(n),L(e=>H(r,e),[()=>Sd(t.entry)]),V(e,n)};U(C,e=>{(t.entry.requested_model||t.entry.model)&&e(w)});var T=I(C,2),E=e=>{var n=_B(),r=P(n,!0);D(n),L(()=>H(r,t.entry.path||`-`)),V(e,n)};U(T,e=>{a()||e(E)}),D(h);var ee=I(h,2),te=P(ee);WR(te,{get entry(){return t.entry}});var ne=I(te,2),re=P(ne),ie=P(re,!0);D(re);var ae=I(re,2),oe=P(ae,!0);D(ae),D(ne);var se=I(ne,2),ce=P(se,!0);D(se);var le=I(se,2),ue=e=>{var t=vB();let n;var r=P(t);{let e=A(()=>R(c)?Pc:Fc);J(r,{get icon(){return R(e)},class:`audit-conversation-trigger-svg`})}D(t),L(()=>{n=G(t,1,`audit-conversation-trigger svelte-17mysgz`,null,n,{"audit-conversation-trigger-active":R(c)}),K(t,`title`,R(c)?`Close interactions`:`Open interactions`),K(t,`aria-label`,R(c)?`Close interactions`:`Open interactions`),K(t,`aria-pressed`,R(c))}),z(`click`,t,f),V(e,t)},de=A(()=>pB.canShowConversation(t.entry));U(le,e=>{R(de)&&e(ue)}),D(ee),D(p),L((e,n,i,a)=>{m=G(p,1,`audit-entry-summary svelte-17mysgz`,null,m,e),K(p,`aria-expanded`,r()),G(v,1,`audit-status-badge audit-request-badge ${n??``}`,`svelte-17mysgz`),K(v,`title`,`Status `+(t.entry.status_code||`-`)+` · `+(t.entry.method||`-`)),K(v,`aria-label`,(t.entry.status_code||`-`)+` `+(t.entry.method||`-`)),H(b,t.entry.status_code||`-`),H(S,t.entry.method||`-`),K(ne,`title`,i),K(ne,`aria-label`,R(o)),H(ie,R(o)),H(oe,R(s)),H(ce,a)},[()=>({"audit-entry-summary-live-in-progress":YL(t.entry),"audit-entry-summary-has-interactions":pB.canShowConversation(t.entry)}),()=>JL(t.entry.status_code),()=>gd(t.entry.timestamp),()=>qL(t.entry.duration_ns)]),z(`click`,p,l),V(e,p),k()}Br([`click`]);var xB=B(``);function SB(e,t){O(t,!0);let n=q(t,`label`,3,`Copy`),r=q(t,`copiedLabel`,3,`Copied`),i=q(t,`errorLabel`,3,``),a=q(t,`class`,3,`btn`),o=A(()=>t.state.error&&i()?i():t.state.copied?r():n());var s=xB();let c;var l=P(s),u=e=>{J(e,{get icon(){return Lc},width:`14`,height:`14`,"stroke-width":`2.5`})},d=e=>{J(e,{get icon(){return Bc},width:`14`,height:`14`})};U(l,e=>{t.state.copied?e(u):e(d,-1)});var f=I(l,2),p=P(f,!0);D(f),D(s),L(()=>{c=G(s,1,Ni([`copy-feedback-btn`,a()]),null,c,{"copy-feedback-btn-copied":t.state.copied}),H(p,R(o))}),z(`click`,s,e=>{e.preventDefault(),t.onclick?.(e)}),V(e,s),k()}Br([`click`]);var CB=B(`
Error Message
 
`),wB=B(`
 
`),TB=B(` `),EB=B(` streaming`),DB=B(`
Body
`),OB=B(`

`),kB=B(`

`),AB=B(`

`),jB=B(`
`);function MB(e,t){O(t,!0);let n=CF({logPrefix:`Failed to copy audit payload:`}),r=CF({logPrefix:`Failed to copy audit payload:`}),i=A(()=>t.pane&&t.pane.showHeaders?sd(t.pane.headers):``),a=A(()=>!t.pane||!t.pane.showBody?``:Fz(t.pane.body)?Bz(t.pane.body):pB.renderBodyWithConversationHighlights(t.pane.entry,t.pane.body,{promptCacheHighlight:t.pane.promptCacheHighlight})),o=A(()=>!!(t.pane&&pB.canShowConversation(t.pane.entry)));function s(e){e.key!==`Enter`&&e.key!==` `||(e.preventDefault(),pB.handleErrorConversationClick(e,t.pane.entry))}var c=jB();let l;var u=P(c),d=e=>{var n=CB(),r=I(P(n),2);let i;var a=P(r,!0);D(r),D(n),L(()=>{i=G(r,1,`audit-json audit-pane-error-message svelte-1h5puht`,null,i,{"audit-pane-clickable-preview":R(o)}),K(r,`role`,R(o)?`button`:null),K(r,`tabindex`,R(o)?0:null),H(a,t.pane.errorMessage)}),z(`mousedown`,r,e=>pB.startBodyInteraction(e)),z(`keydown`,r,s),z(`click`,r,e=>pB.handleErrorConversationClick(e,t.pane.entry)),V(e,n)};U(u,e=>{t.pane.showErrorMessage&&e(d)});var f=I(u,2),p=e=>{var n=wB(),a=P(n),o=P(a),s=P(o,!0);D(o),SB(I(o,2),{get state(){return r},label:`Copy Headers`,errorLabel:`Copy failed`,class:`audit-copy-btn`,onclick:()=>r.copy(t.pane.copyHeaders,sd)}),D(a);var c=I(a,2),l=P(c,!0);D(c),D(n),L(()=>{H(s,t.pane.headersTitle||`Headers`),H(l,R(i))}),V(e,n)};U(f,e=>{t.pane.showHeaders&&e(p)});var m=I(f,2),h=e=>{var r=DB(),i=P(r),o=P(i),s=I(P(o),2),c=e=>{var n=TB(),r=P(n,!0);D(n),L(()=>H(r,t.pane.bodyCacheRatioLabel)),V(e,n)};U(s,e=>{t.pane.bodyCacheRatioLabel&&e(c)});var l=I(s,2),u=e=>{V(e,EB())};U(l,e=>{t.pane.streaming&&e(u)}),D(o),SB(I(o,2),{get state(){return n},label:`Copy Body`,errorLabel:`Copy failed`,class:`audit-copy-btn`,onclick:()=>n.copy(t.pane.copyBody,sd)}),D(i);var d=I(i,2);pi(d,()=>R(a),!0),D(d),D(r),z(`mousedown`,d,e=>pB.startBodyInteraction(e)),z(`click`,d,e=>pB.handleBodyConversationClick(e,t.pane.entry)),V(e,r)};U(m,e=>{t.pane.showBody&&e(h)});var g=I(m,2),_=e=>{var n=OB(),r=P(n,!0);D(n),L(()=>H(r,t.pane.emptyMessage)),V(e,n)};U(g,e=>{t.pane.showEmpty&&e(_)});var v=I(g,2),y=e=>{var n=kB(),r=I(P(n),2),i=P(r,!0);D(r),D(n),L(()=>H(i,t.pane.pendingMessage)),V(e,n)};U(v,e=>{t.pane.showPending&&e(y)});var b=I(v,2),x=e=>{var n=AB(),r=P(n,!0);D(n),L(()=>H(r,t.pane.tooLargeMessage)),V(e,n)};U(b,e=>{t.pane.showTooLarge&&e(x)}),D(c),L(()=>l=G(c,1,`audit-pane svelte-1h5puht`,null,l,{"audit-pane-split":t.pane&&t.pane.layout===`split`,"audit-pane-split-single":t.pane&&t.pane.layout===`split`&&!(t.pane.showHeaders&&t.pane.showBody)})),V(e,c),k()}Br([`mousedown`,`keydown`,`click`]);var NB=B(` `),PB=B(` `),FB=B(` `),IB=B(` `),LB=B(``),RB=B(`
`),zB=B(`
`);function BB(e,t){O(t,!0);let n=q(t,`panes`,19,()=>[]),r=j(null),i=A(()=>DR(R(r),t.entry,n())),a=e=>`audit-tab-`+t.entry.id+`-`+e,o=e=>`audit-tabpanel-`+t.entry.id+`-`+e;function s(e,t){let i=n().map(e=>e.id),a=OR(e.key,i,t);a!=null&&(e.preventDefault(),((e.currentTarget?.closest?.(`.audit-pane-tablist`))?.querySelectorAll(`.audit-pane-tab`)[i.indexOf(a)])?.focus?.(),M(r,a,!0))}var c=zB(),l=P(c);W(l,21,n,e=>e.id,(e,t)=>{var n=LB();let c;var l=P(n),u=P(l),d=e=>{J(e,{get icon(){return wc}})},f=e=>{J(e,{get icon(){return Cc}})};U(u,e=>{R(t).pane.direction===`request`?e(d):R(t).pane.direction===`response`&&e(f,1)}),D(l);var p=I(l,2),m=P(p,!0);D(p);var h=I(p,2),g=e=>{var n=NB(),r=P(n);D(n),L(()=>H(r,`#${R(t).pane.seq??``}`)),V(e,n)};U(h,e=>{R(t).pane.seq&&e(g)});var _=I(h,2),v=e=>{var n=PB(),r=P(n,!0);D(n),L(()=>{G(n,1,`provider-badge audit-pane-kind audit-pane-kind-${R(t).pane.kind??``}`,`svelte-1bc5vi5`),H(r,R(t).pane.kind)}),V(e,n)};U(_,e=>{R(t).pane.kind&&e(v)});var y=I(_,2);W(y,17,()=>R(t).pane.noChangeSteps||[],e=>e.id,(e,t)=>{var n=FB(),r=P(n,!0);D(n),L(()=>{K(n,`title`,R(t).title),H(r,R(t).label)}),V(e,n)});var b=I(y,2),x=e=>{var n=IB(),r=P(n,!0);D(n),L(()=>H(r,R(t).pane.savingsLabel)),V(e,n)};U(b,e=>{R(t).pane.savingsLabel&&e(x)});var S=I(b,2),C=e=>{var n=PB(),r=P(n,!0);D(n),L(e=>{G(n,1,`audit-status-badge ${e??``}`,`svelte-1bc5vi5`),H(r,R(t).pane.statusCode)},[()=>JL(R(t).pane.statusCode)]),V(e,n)};U(S,e=>{R(t).pane.statusCode&&e(C)}),D(n),L((e,r)=>{c=G(n,1,`audit-pane-tab svelte-1bc5vi5`,null,c,{"audit-pane-tab-active":R(i)===R(t).id}),K(n,`aria-selected`,R(i)===R(t).id),K(n,`id`,e),K(n,`aria-controls`,r),K(n,`tabindex`,R(i)===R(t).id?0:-1),G(l,1,Ni([`audit-pane-icon`,R(t).pane.direction&&`audit-pane-icon-${R(t).pane.direction}`]),`svelte-1bc5vi5`),H(m,R(t).pane.title)},[()=>a(R(t).id),()=>o(R(t).id)]),z(`keydown`,n,e=>s(e,R(t).id)),z(`click`,n,()=>M(r,R(t).id,!0)),V(e,n)}),D(l),W(I(l,2),17,n,e=>e.id,(e,t)=>{var n=RB();let r;MB(P(n),{get pane(){return R(t).pane}}),D(n),L((e,a)=>{K(n,`id`,e),K(n,`aria-labelledby`,a),r=Bi(n,``,r,{display:R(i)===R(t).id?null:`none`})},[()=>o(R(t).id),()=>a(R(t).id)]),V(e,n)}),D(c),V(e,c),k()}Br([`keydown`,`click`]);var VB=B(`
`),HB=B(`
`);function UB(e,t){O(t,!0);let n=q(t,`thread`,3,null),r=q(t,`hidePath`,3,!1),i=A(()=>jR.isAuditEntryExpanded(t.entry)),a=A(()=>pB.conversationOpen&&String(pB.conversationAnchorID||``)===String(t.entry.id||``)),o=A(()=>R(i)?TR(t.entry,oz):[]),s=A(()=>R(i)?bI(t.entry,hL.auditEntryWorkflow(t.entry),hL.workflowFeatureCaps()):null);function c(){jR.toggleAuditEntryExpanded(t.entry)}var l=HB();let u;var d=P(l);bB(d,{get entry(){return t.entry},get thread(){return n()},get expanded(){return R(i)},get hidePath(){return r()},onactivate:c});var f=I(d,2),p=e=>{var n=VB(),r=P(n),i=e=>{IF(e,{get chart(){return R(s)}})};U(r,e=>{R(s)&&e(i)});var a=I(r,2);BB(a,{get entry(){return t.entry},get panes(){return R(o)}}),VR(I(a,2),{get entry(){return t.entry}}),D(n),Di(3,n,()=>Ju,()=>({y:-6,duration:pL(150)})),V(e,n)};U(f,e=>{R(i)&&e(p)}),D(l),L(()=>u=G(l,1,`audit-entry svelte-cmjgwr`,null,u,{"audit-entry-interactions-open":R(a)})),V(e,l),k()}var WB=B(`
`),GB=B(`
`),KB=B(`

`),qB=B(`
`),JB=B(`
`);function YB(e,t){O(t,!0);let n=A(()=>jL(t.entry)),r=A(()=>jR.isThreadExpanded(R(n))),i=A(()=>jR.threadChildren(R(n))),a=A(()=>R(i)&&!R(i).loading&&Number(R(i).total||0)>R(i).entries.length+1);var o=Xr(),s=F(o),c=e=>{UB(e,{get entry(){return t.entry}})},l=A(()=>!NL(t.entry)),u=e=>{var n=JB(),o=P(n);{let e=A(()=>({count:ML(t.entry),expanded:R(r),ontoggle:()=>jR.toggleThread(t.entry)}));UB(o,{get entry(){return t.entry},get thread(){return R(e)}})}var s=I(o,2),c=e=>{var n=qB(),r=P(n),o=e=>{var t=WB();wT(P(t),{size:14,label:`Loading session requests`}),D(t),V(e,t)};U(r,e=>{R(i)&&R(i).loading&&e(o)});var s=I(r,2);W(s,17,()=>R(i)&&R(i).entries||[],e=>e.id,(e,n)=>{var r=GB(),i=P(r);{let e=A(()=>R(n).path===t.entry.path);UB(i,{get entry(){return R(n)},get hidePath(){return R(e)}})}D(r),V(e,r)});var c=I(s,2),l=e=>{var t=KB(),n=P(t);D(t),L(()=>H(n,`Showing the latest ${R(i).entries.length+1} of ${R(i).total??``} requests in this session.`)),V(e,t)};U(c,e=>{R(a)&&e(l)}),D(n),Di(3,n,()=>Yu,()=>({duration:pL(150)})),V(e,n)};U(s,e=>{R(r)&&e(c)}),D(n),V(e,n)};U(s,e=>{R(l)?e(c):e(u,-1)}),V(e,o),k()}var XB=B(`

.

`),ZB=B(`
Audit logging is off. Live entries are temporary and disappear after refresh. Set LOGGING_ENABLED=true to persist them.
`),QB=B(`

`),$B=B(`
`),eV=B(`
`),tV=B(`
`),nV=B(`
`),rV=B(`
`);function iV(e,t){O(t,!0);let n=A(()=>bu.config&&bu.config.LOGGING_RETENTION_DAYS);On(()=>{if(Y.refreshTick,Bl.page===`audit-logs`)return wr(()=>r())});function r(){let e=!1;return(async()=>{try{await bu.ensureLoaded()}finally{await jR.fetchAuditLog(!0),!e&&bu.liveLogsVisible()&&PE.ensureLiveLogs()}})(),()=>{e=!0,PE.stopLiveLogs()}}var i=rV(),a=P(i),o=P(a),s=I(P(o),2),c=e=>{YT(e,{copyId:`audit-retention-help-copy`,label:`retention help`,text:`If you want to change the retention period, set LOGGING_RETENTION_DAYS (env var) or logging.retention_days (config.yaml) and restart the gateway. Default is 30 days; 0 keeps audit logs forever.`,title:e=>{var t=XB(),r=P(t,!0),i=I(r),a=P(i,!0);D(i),Ve(),D(t),L((e,t)=>{H(r,e),H(a,t)},[()=>DL(R(n)),()=>OL(R(n))]),V(e,t)},$$slots:{title:!0}})},l=A(()=>EL(R(n)));U(s,e=>{R(l)&&e(c)}),D(o),D(a);var u=I(a,2);rf(P(u),{onchange:()=>jR.fetchAuditLog(!0)}),D(u);var d=I(u,2);Rd(d,{});var f=I(d,2),p=e=>{V(e,ZB())},m=A(()=>bu.loaded&&!bu.auditVisible()&&!Y.needsAuth);U(f,e=>{R(m)&&e(p)});var h=I(f,2),g=P(h);NR(g,{});var _=I(g,2),v=P(_),y=P(v),b=e=>{var t=QB(),n=P(t);D(t),L(e=>H(n,`Showing ${jR.auditLog.offset+1}-${e??``} of ${jR.auditLog.total??``} ${jR.auditGroupSessions?`sessions`:`logs`}`),[()=>Math.min(jR.auditLog.offset+jR.auditLog.limit,jR.auditLog.total)]),V(e,t)};U(y,e=>{jR.auditLog.total>0&&e(b)});var x=I(y,2),S=P(x);ea(S),Ve(2),D(x),D(v),RR(I(v,2),{}),D(_);var C=I(_,2),w=e=>{var t=$B();wT(P(t),{size:18,label:`Loading audit logs`}),D(t),V(e,t)},T=e=>{var t=tV();W(t,29,()=>jR.auditLog.entries,e=>e.id,(e,t)=>{var n=eV(),r=P(n),i=e=>{YB(e,{get entry(){return R(t)}})},a=e=>{UB(e,{get entry(){return R(t)}})};U(r,e=>{jR.auditGroupSessions?e(i):e(a,-1)}),D(n),Ei(n,()=>lL,()=>({duration:pL(150)})),Di(1,n,()=>mL,()=>({live:R(t)._live})),V(e,n)}),D(t),V(e,t)};U(C,e=>{jR.loading&&jR.auditLog.entries.length===0?e(w):jR.auditLog.entries.length>0&&e(T,1)});var E=I(C,2),ee=e=>{var t=nV();DT(P(t),{}),D(t),V(e,t)};U(E,e=>{jR.auditLog.entries.length===0&&!jR.loading&&!Y.needsAuth&&e(ee)}),ZD(I(E,2),{get total(){return jR.auditLog.total},get offset(){return jR.auditLog.offset},get limit(){return jR.auditLog.limit},onprev:()=>jR.auditLogPrevPage(),onnext:()=>jR.auditLogNextPage()}),D(h),D(i),L(()=>na(S,jR.auditGroupSessions)),z(`change`,S,()=>jR.toggleAuditGroupSessions()),V(e,i),k()}Br([`change`]);function aV(e){try{let t=JSON.parse(JSON.stringify(e||{}));return t&&typeof t==`object`&&!Array.isArray(t)?t:{}}catch{return{}}}function oV(e){return Array.isArray(e)?e.map(e=>String(e||``).trim()).filter(e=>e):e==null?[]:String(e).split(`,`).map(e=>e.trim()).filter(e=>e)}function sV(e,t){let n=String(t||``).trim();return(e||[]).find(e=>String(e&&e.type||``).trim()===n)||null}function cV(e){return Array.isArray(e)&&e.length>0&&String(e[0].type||``).trim()||`system_prompt`}function lV(e,t){let n=String(t||``).trim();return n&&sV(e,n)?n:cV(e)}function uV(e,t){let n=sV(e,t);return!n||!n.defaults?{}:aV(n.defaults)}function dV(e,t,n){return{...uV(e,n),...aV(t)}}function fV(e,t){let n=lV(e,t);return{name:``,type:n,description:``,user_path:``,config:uV(e,n)}}function pV(e,t){if(!t)return e||[];let n=String(t).toLowerCase();return(e||[]).filter(e=>[e.name,e.type,e.user_path,e.description,e.summary].some(e=>String(e||``).toLowerCase().includes(n)))}function mV(e,t){let n=sV(e,t);return n&&n.label?n.label:t||`Unknown`}function hV(e,t){let n=sV(e,t);return Array.isArray(n&&n.fields)?n.fields:[]}function gV(e,t){if(!t||!e)return t&&t.input===`checkboxes`?[]:``;let n=e[t.key];return n==null?t.input===`checkboxes`?[]:``:t.input===`checkboxes`?oV(n):n}function _V(e,t,n){if(!t)return e;let r=aV(e);if(t.input===`number`){let e=String(n||``).trim();if(e===``)delete r[t.key];else{let n=Number(e);r[t.key]=Number.isFinite(n)?n:e}}else t.input===`checkboxes`?r[t.key]=oV(n):r[t.key]=n;return r}function vV(e,t,n){return gV(e,t).includes(String(n||``).trim())}function yV(e,t,n,r){let i=oV(gV(e,t)),a=String(n||``).trim();return a?_V(e,t,r?Array.from(new Set([...i,a])):i.filter(e=>e!==a)):e}function bV(e){return{name:String(e&&e.name||``).trim(),type:String(e&&e.type||``).trim(),description:String(e&&e.description||``).trim()||void 0,user_path:String(e&&e.user_path||``).trim()||void 0,config:aV(e&&e.config)}}var xV=new class{#e=j(N([]));get guardrails(){return R(this.#e)}set guardrails(e){M(this.#e,e,!0)}#t=j(N([]));get types(){return R(this.#t)}set types(e){M(this.#t,e,!0)}#n=j(!0);get available(){return R(this.#n)}set available(e){M(this.#n,e,!0)}#r=j(!1);get loading(){return R(this.#r)}set loading(e){M(this.#r,e,!0)}#i=j(!1);get typesLoading(){return R(this.#i)}set typesLoading(e){M(this.#i,e,!0)}#a=j(``);get error(){return R(this.#a)}set error(e){M(this.#a,e,!0)}#o=j(``);get filter(){return R(this.#o)}set filter(e){M(this.#o,e,!0)}#s=j(!1);get formOpen(){return R(this.#s)}set formOpen(e){M(this.#s,e,!0)}#c=j(!1);get formSubmitting(){return R(this.#c)}set formSubmitting(e){M(this.#c,e,!0)}#l=j(``);get deletingName(){return R(this.#l)}set deletingName(e){M(this.#l,e,!0)}#u=j(`create`);get formMode(){return R(this.#u)}set formMode(e){M(this.#u,e,!0)}#d=j(``);get formOriginalName(){return R(this.#d)}set formOriginalName(e){M(this.#d,e,!0)}#f=j(N({name:``,type:``,description:``,user_path:``,config:{}}));get form(){return R(this.#f)}set form(e){M(this.#f,e,!0)}get filtered(){return pV(this.guardrails,this.filter)}typeLabel(e){return mV(this.types,e)}typeFields(e){return hV(this.types,e)}fieldValue(e){return gV(this.form&&this.form.config,e)}setFieldValue(e,t){this.form={...this.form,config:_V(this.form.config,e,t)}}arrayFieldSelected(e,t){return vV(this.form&&this.form.config,e,t)}toggleArrayFieldValue(e,t,n){this.form={...this.form,config:yV(this.form.config,e,t,n)}}openCreate(){this.formMode=`create`,this.formOriginalName=``,this.error=``,this.form=fV(this.types,cV(this.types)),this.formOpen=!0}openEdit(e){let t=lV(this.types,e&&e.type);this.formMode=`edit`,this.formOriginalName=String(e&&e.name||``).trim(),this.error=``,this.form={name:this.formOriginalName,type:t,description:String(e&&e.description||``).trim(),user_path:String(e&&e.user_path||``).trim(),config:dV(this.types,e&&e.config,t)},this.formOpen=!0}closeForm(){this.formOpen=!1,this.formMode=`create`,this.formOriginalName=``,this.error=``,this.form=fV(this.types,cV(this.types))}changeType(e){let t=lV(this.types,e);this.form={...this.form,type:t,config:uV(this.types,t)}}async fetchTypes(){this.typesLoading=!0;try{let e=await bO(`/admin/guardrails/types`,{label:`guardrail types`});if(e.status===`stale`)return;if(e.status===`unavailable`){this.available=!1,this.types=[];return}if(e.result&&(this.available=!0),this.types=e.items,e.status===`error`){this.error=e.error;return}let t=lV(this.types,this.form.type);this.form={...this.form,type:t,config:dV(this.types,this.form.config,t)}}finally{this.typesLoading=!1}}async fetchGuardrails(){this.loading=!0,this.error=``;try{let e=await bO(`/admin/guardrails`,{label:`guardrails`});if(e.status===`stale`)return;if(e.status===`unavailable`){this.available=!1,this.guardrails=[];return}e.result&&(this.available=!0),this.guardrails=e.items,this.error=e.error}finally{this.loading=!1}}async fetchPage(){await Promise.all([this.fetchTypes(),this.fetchGuardrails()])}async submitForm(){let e=String(this.form.name||``).trim(),t=String(this.form.type||``).trim();if(!e){this.error=`Name is required.`;return}if(!t){this.error=`Type is required.`;return}this.error=``,this.formSubmitting=!0;let n=bV(this.form);try{let t=await xO(`/admin/guardrails`,`PUT`,n,{label:`save guardrail`,errorFallback:`Failed to save guardrail.`,unavailableMessage:`Guardrails feature is unavailable.`});if(t.status===`stale`)return;if(t.status===`unavailable`){this.available=!1,this.error=t.error;return}if(t.status===`error`){this.error=t.error;return}ed.success(`Guardrail "`+e+`" saved.`),this.closeForm(),this.fetchGuardrails()}finally{this.formSubmitting=!1}}async deleteGuardrail(e){let t=String(e&&e.name||``).trim();if(!(!t||this.deletingName)&&window.confirm(`Delete guardrail "`+t+`"? Workflows that still reference it must be updated first.`)){this.deletingName=t;try{let e=await xO(`/admin/guardrails`,`DELETE`,{name:t},{label:`delete guardrail`,errorFallback:`Failed to delete guardrail.`,unavailableMessage:`Guardrails feature is unavailable.`});if(e.status===`stale`)return;if(e.status===`unavailable`){this.available=!1,ed.error(e.error);return}if(e.status===`error`){ed.error(e.error);return}ed.success(`Guardrail "`+t+`" deleted.`),this.formOpen&&this.formOriginalName===t&&this.closeForm(),this.fetchGuardrails()}finally{this.deletingName=``}}}},SV=B(`
`),CV=B(`

Loading guardrails...

`),wV=B(`
`),TV=B(`
`),EV=B(`
NameTypeUser PathSummaryActions
`),DV=B(`

No guardrails defined yet.

`),OV=B(`

Instances

Each instance has a reusable name, a type, an optional user path for diff --git a/internal/admin/dashboard/static/dist/index.html b/internal/admin/dashboard/static/dist/index.html index 1f61467d4..8b71f851d 100644 --- a/internal/admin/dashboard/static/dist/index.html +++ b/internal/admin/dashboard/static/dist/index.html @@ -7,7 +7,7 @@ GoModel Dashboard - + diff --git a/internal/admin/handler.go b/internal/admin/handler.go index 1bf85443c..7d80b4534 100644 --- a/internal/admin/handler.go +++ b/internal/admin/handler.go @@ -169,11 +169,8 @@ type auditConversationResponse struct { } type auditSessionResponse struct { - SessionID string `json:"session_id,omitempty"` - Count int `json:"count"` - FirstTimestamp time.Time `json:"first_timestamp"` - LastTimestamp time.Time `json:"last_timestamp"` - Latest auditLogEntryResponse `json:"latest"` + RequestCount int `json:"request_count"` + Latest auditLogEntryResponse `json:"latest"` } type auditSessionsListResponse struct { diff --git a/internal/admin/handler_audit.go b/internal/admin/handler_audit.go index 66225135e..4fa28b16d 100644 --- a/internal/admin/handler_audit.go +++ b/internal/admin/handler_audit.go @@ -192,8 +192,8 @@ func parseAuditLogQueryParams(c *echo.Context) (auditlog.LogQueryParams, error) // // @Summary Get paginated audit sessions (threads) // @Description Groups audit log entries by session id into threads and returns -// @Description one summary per thread — its latest entry, entry count, and time -// @Description span — ordered by latest activity. Entries without a session id +// @Description one summary per thread — its latest matching entry and complete +// @Description request count — ordered by latest activity. Entries without a session id // @Description appear as single-entry threads. Filters apply to entries before // @Description grouping. // @Tags admin @@ -264,11 +264,8 @@ func (h *Handler) AuditSessions(c *echo.Context) error { // same slim payload contract as /admin/audit/log. slimAuditListEntry(&enriched.Entries[i]) response.Sessions[i] = auditSessionResponse{ - SessionID: session.SessionID, - Count: session.Count, - FirstTimestamp: session.FirstTimestamp, - LastTimestamp: session.LastTimestamp, - Latest: enriched.Entries[i], + RequestCount: session.RequestCount, + Latest: enriched.Entries[i], } } return c.JSON(http.StatusOK, response) diff --git a/internal/admin/handler_audit_sessions_test.go b/internal/admin/handler_audit_sessions_test.go index 3de2dd675..c7e5451a2 100644 --- a/internal/admin/handler_audit_sessions_test.go +++ b/internal/admin/handler_audit_sessions_test.go @@ -38,10 +38,8 @@ func TestAuditSessions_Success(t *testing.T) { sessionsResult: &auditlog.SessionListResult{ Sessions: []auditlog.SessionSummary{ { - SessionID: "sess-a", - Count: 3, - FirstTimestamp: now.Add(-time.Minute), - LastTimestamp: now, + SessionID: "sess-a", + RequestCount: 6, Latest: auditlog.LogEntry{ ID: "log-3", Timestamp: now, @@ -51,9 +49,7 @@ func TestAuditSessions_Success(t *testing.T) { }, }, { - Count: 1, - FirstTimestamp: now.Add(-time.Hour), - LastTimestamp: now.Add(-time.Hour), + RequestCount: 1, Latest: auditlog.LogEntry{ ID: "log-1", Timestamp: now.Add(-time.Hour), @@ -83,9 +79,8 @@ func TestAuditSessions_Success(t *testing.T) { var result struct { Sessions []struct { - SessionID string `json:"session_id"` - Count int `json:"count"` - Latest *auditlog.LogEntry `json:"latest"` + RequestCount int `json:"request_count"` + Latest *auditlog.LogEntry `json:"latest"` } `json:"sessions"` Total int `json:"total"` } @@ -95,13 +90,13 @@ func TestAuditSessions_Success(t *testing.T) { if result.Total != 2 || len(result.Sessions) != 2 { t.Fatalf("total=%d sessions=%d, want 2/2", result.Total, len(result.Sessions)) } - if result.Sessions[0].SessionID != "sess-a" || result.Sessions[0].Count != 3 { + if result.Sessions[0].RequestCount != 6 { t.Errorf("first session = %+v", result.Sessions[0]) } if result.Sessions[0].Latest == nil || result.Sessions[0].Latest.ID != "log-3" { t.Errorf("latest entry not embedded: %+v", result.Sessions[0].Latest) } - if result.Sessions[1].SessionID != "" || result.Sessions[1].Count != 1 { + if result.Sessions[1].RequestCount != 1 { t.Errorf("singleton thread = %+v", result.Sessions[1]) } } @@ -112,11 +107,9 @@ func TestAuditSessions_SlimsLatestEntries(t *testing.T) { reader := &mockAuditReader{ sessionsResult: &auditlog.SessionListResult{ Sessions: []auditlog.SessionSummary{{ - SessionID: "sess-a", - Count: 2, - FirstTimestamp: entry.Timestamp.Add(-time.Minute), - LastTimestamp: entry.Timestamp, - Latest: entry, + SessionID: "sess-a", + RequestCount: 2, + Latest: entry, }}, Total: 1, Limit: 25, diff --git a/internal/auditlog/reader.go b/internal/auditlog/reader.go index 1dd06516e..1a0f65175 100644 --- a/internal/auditlog/reader.go +++ b/internal/auditlog/reader.go @@ -44,15 +44,13 @@ type LogListResult struct { Offset int `json:"offset"` } -// SessionSummary describes one session (thread) of audit log entries: its -// latest entry plus aggregate span and count. Entries without a session id -// form singleton threads whose SessionID is empty. +// SessionSummary describes one session (thread) of audit log entries. Filters +// choose the latest matching entry; RequestCount covers the complete session. +// Entries without a session id form singleton threads. type SessionSummary struct { - SessionID string `json:"session_id,omitempty"` - Count int `json:"count"` - FirstTimestamp time.Time `json:"first_timestamp"` - LastTimestamp time.Time `json:"last_timestamp"` - Latest LogEntry `json:"latest"` + SessionID string `json:"session_id,omitempty"` + RequestCount int `json:"request_count"` + Latest LogEntry `json:"latest"` } // SessionListResult holds a paginated list of session summaries ordered by @@ -89,7 +87,7 @@ type Reader interface { // GetSessions returns a paginated list of audit sessions (threads): one // summary per distinct session id, plus singleton threads for entries // without one, ordered by latest activity. Filters apply to entries before - // grouping, so a thread's Latest and Count reflect the matching entries. + // grouping. RequestCount reflects the complete session. GetSessions(ctx context.Context, params LogQueryParams) (*SessionListResult, error) // GetLogByID returns a single audit log entry by ID. diff --git a/internal/auditlog/reader_sessions_mongodb.go b/internal/auditlog/reader_sessions_mongodb.go index 8f235dc97..1da3495dd 100644 --- a/internal/auditlog/reader_sessions_mongodb.go +++ b/internal/auditlog/reader_sessions_mongodb.go @@ -3,7 +3,6 @@ package auditlog import ( "context" "fmt" - "time" "go.mongodb.org/mongo-driver/v2/bson" ) @@ -54,9 +53,7 @@ func (r *MongoDBReader) GetSessions(ctx context.Context, params LogQueryParams) bson.D{{Key: "$group", Value: bson.D{ {Key: "_id", Value: mongoThreadKeyExpr}, {Key: "latest_id", Value: bson.D{{Key: "$first", Value: "$_id"}}}, - {Key: "count", Value: bson.D{{Key: "$sum", Value: 1}}}, - {Key: "first_ts", Value: bson.D{{Key: "$min", Value: "$timestamp"}}}, - {Key: "last_ts", Value: bson.D{{Key: "$max", Value: "$timestamp"}}}, + {Key: "last_ts", Value: bson.D{{Key: "$first", Value: "$timestamp"}}}, }}}, bson.D{{Key: "$sort", Value: bson.D{{Key: "last_ts", Value: -1}, {Key: "_id", Value: -1}}}}, bson.D{{Key: "$facet", Value: bson.D{ @@ -70,6 +67,11 @@ func (r *MongoDBReader) GetSessions(ctx context.Context, params LogQueryParams) {Key: "as", Value: "latest"}, }}}, bson.D{{Key: "$unwind", Value: "$latest"}}, + // Count the complete session after the filtered page winners are + // known. Deliberately omit the active filters to mirror the + // dashboard's unfiltered session_id expansion. Sessionless rows + // remain singletons and skip this match via the non-empty sid guard. + mongoRequestCountLookup(r.collection.Name()), }}, {Key: "total", Value: bson.A{ bson.D{{Key: "$count", Value: "count"}}, @@ -85,10 +87,10 @@ func (r *MongoDBReader) GetSessions(ctx context.Context, params LogQueryParams) var facetResult struct { Data []struct { - Latest mongoLogRow `bson:"latest"` - Count int `bson:"count"` - FirstTS time.Time `bson:"first_ts"` - LastTS time.Time `bson:"last_ts"` + Latest mongoLogRow `bson:"latest"` + RequestCount []struct { + Count int `bson:"count"` + } `bson:"request_count"` } `bson:"data"` Total []struct { Count int `bson:"count"` @@ -114,13 +116,33 @@ func (r *MongoDBReader) GetSessions(ctx context.Context, params LogQueryParams) if entry == nil { continue } + requestCount := 1 + if entry.SessionID != "" && len(row.RequestCount) > 0 { + requestCount = max(1, row.RequestCount[0].Count) + } sessions = append(sessions, SessionSummary{ - SessionID: entry.SessionID, - Count: row.Count, - FirstTimestamp: row.FirstTS, - LastTimestamp: row.LastTS, - Latest: *entry, + SessionID: entry.SessionID, + RequestCount: requestCount, + Latest: *entry, }) } return &SessionListResult{Sessions: sessions, Total: total, Limit: limit, Offset: offset}, nil } + +// mongoRequestCountLookup builds the filter-independent count used by session +// summaries. Keeping it separate makes the aggregation contract testable +// without a running MongoDB service. +func mongoRequestCountLookup(collectionName string) bson.D { + return bson.D{{Key: "$lookup", Value: bson.D{ + {Key: "from", Value: collectionName}, + {Key: "let", Value: bson.D{{Key: "sid", Value: bson.D{{Key: "$ifNull", Value: bson.A{"$latest.session_id", ""}}}}}}, + {Key: "pipeline", Value: bson.A{ + bson.D{{Key: "$match", Value: bson.D{{Key: "$expr", Value: bson.D{{Key: "$and", Value: bson.A{ + bson.D{{Key: "$ne", Value: bson.A{"$$sid", ""}}}, + bson.D{{Key: "$eq", Value: bson.A{"$session_id", "$$sid"}}}, + }}}}}}}, + bson.D{{Key: "$count", Value: "count"}}, + }}, + {Key: "as", Value: "request_count"}, + }}} +} diff --git a/internal/auditlog/reader_sessions_mongodb_test.go b/internal/auditlog/reader_sessions_mongodb_test.go index 0d1508726..c9e66c8f3 100644 --- a/internal/auditlog/reader_sessions_mongodb_test.go +++ b/internal/auditlog/reader_sessions_mongodb_test.go @@ -2,14 +2,36 @@ package auditlog import ( "context" + "strings" "testing" "time" + "go.mongodb.org/mongo-driver/v2/bson" "go.mongodb.org/mongo-driver/v2/mongo" "github.com/enterpilot/gomodel/internal/storage/mongotest" ) +func TestMongoRequestCountLookup(t *testing.T) { + stage, err := bson.MarshalExtJSON(mongoRequestCountLookup("custom_audit_logs"), false, false) + if err != nil { + t.Fatalf("marshal request count lookup: %v", err) + } + encoded := string(stage) + for _, want := range []string{ + `"from":"custom_audit_logs"`, + `"$ifNull":["$latest.session_id",""]`, + `"$ne":["$$sid",""]`, + `"$eq":["$session_id","$$sid"]`, + `"$count":"count"`, + `"as":"request_count"`, + } { + if !strings.Contains(encoded, want) { + t.Fatalf("request count lookup = %s, want fragment %s", encoded, want) + } + } +} + // Mirrors TestSQLReader_GetSessions so the hand-written MongoDB aggregation // cannot drift from the SQL behaviour. Skips without MONGO_TEST_DSN. func TestMongoDBReader_GetSessions(t *testing.T) { @@ -43,12 +65,9 @@ func TestMongoDBReader_GetSessions(t *testing.T) { t.Fatalf("sessions[0].Latest.ID = %q, want solo", got) } threadA := result.Sessions[1] - if threadA.SessionID != "sess-a" || threadA.Count != 2 || threadA.Latest.ID != "a-2" { + if threadA.SessionID != "sess-a" || threadA.RequestCount != 2 || threadA.Latest.ID != "a-2" { t.Fatalf("sess-a summary = %+v", threadA) } - if !threadA.FirstTimestamp.Equal(base) || !threadA.LastTimestamp.Equal(base.Add(2*time.Minute)) { - t.Fatalf("sess-a span = %v..%v", threadA.FirstTimestamp, threadA.LastTimestamp) - } if result.Sessions[2].SessionID != "sess-b" { t.Fatalf("sessions[2] = %+v", result.Sessions[2]) } diff --git a/internal/auditlog/reader_sessions_sql.go b/internal/auditlog/reader_sessions_sql.go index 3f9cec4bf..754c000f3 100644 --- a/internal/auditlog/reader_sessions_sql.go +++ b/internal/auditlog/reader_sessions_sql.go @@ -18,19 +18,11 @@ const auditThreadKey = `COALESCE(NULLIF(session_id, ''), CAST(id AS TEXT))` // GetSessions returns a paginated list of audit sessions ordered by latest // activity. Works identically on SQLite and PostgreSQL. // -// The window pass ranks and aggregates threads over ID AND TIMESTAMP ONLY — +// The window pass ranks threads over ID AND TIMESTAMP ONLY — // carrying the full entry (its `data` blob above all) through the partition // sort meant every audit body in the window got materialized and sorted just // to discard all but one row per thread. The outer join re-reads the complete // rows for the page's 25 winners, by primary key. -// -// All four window functions share one named window so the partition is sorted -// once rather than per aggregate. The explicit full frame is what lets the -// aggregates share the ranking window's ORDER BY: without it they would be -// running totals over the frame ending at the current row. ROW_NUMBER ignores -// the frame, as specified. And since the partition is ordered by timestamp -// DESC, the ranked row IS its thread's newest entry, so its own timestamp is -// the thread's last_ts and no MAX() window is needed. func (r *SQLReader) GetSessions(ctx context.Context, params LogQueryParams) (*SessionListResult, error) { limit, offset := clampLimitOffset(params.Limit, params.Offset) @@ -47,23 +39,26 @@ func (r *SQLReader) GetSessions(ctx context.Context, params LogQueryParams) (*Se return nil, fmt.Errorf("failed to count audit sessions: %w", err) } + // The correlated count deliberately applies no active list filters: the + // dashboard expands a head with an unfiltered session_id query, so both + // operations describe the same complete session. query := `WITH ranked AS ( SELECT id, timestamp AS last_ts, - ROW_NUMBER() OVER thread AS rn, - COUNT(*) OVER thread AS entry_count, - MIN(timestamp) OVER thread AS first_ts + ROW_NUMBER() OVER ( + PARTITION BY ` + auditThreadKey + ` + ORDER BY timestamp DESC, id DESC + ) AS rn FROM audit_logs` + where + ` - WINDOW thread AS ( - PARTITION BY ` + auditThreadKey + ` - ORDER BY timestamp DESC, id DESC - ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) ), heads AS ( - SELECT id, entry_count, first_ts, last_ts + SELECT id, last_ts FROM ranked WHERE rn = 1 ORDER BY last_ts DESC, id DESC LIMIT ? OFFSET ? ) - SELECT ` + qualifiedLogColumns("l") + `, h.entry_count, h.first_ts, h.last_ts + SELECT ` + qualifiedLogColumns("l") + `, + CASE WHEN NULLIF(l.session_id, '') IS NULL THEN 1 ELSE ( + SELECT COUNT(*) FROM audit_logs session_entries + WHERE session_entries.session_id = l.session_id + ) END AS request_count FROM heads h JOIN audit_logs l ON l.id = h.id ORDER BY h.last_ts DESC, h.id DESC` @@ -88,33 +83,26 @@ func (r *SQLReader) GetSessions(ctx context.Context, params LogQueryParams) (*Se } // sessionSummaryScanner adapts a session row to the log-entry scanner: the -// leading columns are exactly a log entry, followed by the three aggregates. +// leading columns are exactly a log entry, followed by the request count. type sessionSummaryScanner struct { - row sqlx.Row - count *int - firstTS *sqlx.Timestamp - lastTS *sqlx.Timestamp + row sqlx.Row + requestCount *int } func (s sessionSummaryScanner) Scan(dest ...any) error { - return s.row.Scan(append(dest, s.count, s.firstTS, s.lastTS)...) + return s.row.Scan(append(dest, s.requestCount)...) } func scanSQLSessionSummary(row sqlx.Row) (*SessionSummary, error) { var summary SessionSummary - var firstTS, lastTS sqlx.Timestamp entry, err := scanSQLLogEntry(sessionSummaryScanner{ - row: row, - count: &summary.Count, - firstTS: &firstTS, - lastTS: &lastTS, + row: row, + requestCount: &summary.RequestCount, }) if err != nil { return nil, fmt.Errorf("failed to scan audit session row: %w", err) } summary.SessionID = entry.SessionID - summary.FirstTimestamp = firstTS.Time - summary.LastTimestamp = lastTS.Time summary.Latest = *entry return &summary, nil } diff --git a/internal/auditlog/session_id_test.go b/internal/auditlog/session_id_test.go index 99f030b99..ca31cb9ee 100644 --- a/internal/auditlog/session_id_test.go +++ b/internal/auditlog/session_id_test.go @@ -271,21 +271,17 @@ func TestSQLReader_GetSessions(t *testing.T) { if got := result.Sessions[0].Latest.ID; got != "solo" { t.Fatalf("sessions[0].Latest.ID = %q, want solo", got) } - if result.Sessions[0].SessionID != "" || result.Sessions[0].Count != 1 { + if result.Sessions[0].SessionID != "" || result.Sessions[0].RequestCount != 1 { t.Fatalf("singleton thread = %+v", result.Sessions[0]) } threadA := result.Sessions[1] - if threadA.SessionID != "sess-a" || threadA.Count != 2 { + if threadA.SessionID != "sess-a" || threadA.RequestCount != 2 { t.Fatalf("sess-a summary = %+v", threadA) } if threadA.Latest.ID != "a-2" { t.Fatalf("sess-a latest = %q, want a-2", threadA.Latest.ID) } - if !threadA.FirstTimestamp.Equal(base) || !threadA.LastTimestamp.Equal(base.Add(2*time.Minute)) { - t.Fatalf("sess-a span = %v..%v", threadA.FirstTimestamp, threadA.LastTimestamp) - } - if result.Sessions[2].SessionID != "sess-b" { t.Fatalf("sessions[2] = %+v", result.Sessions[2]) } @@ -388,32 +384,33 @@ func TestSQLReader_GetSessionsOnLegacyUUIDSchema(t *testing.T) { t.Fatalf("total=%d sessions=%d, want 2/2", result.Total, len(result.Sessions)) } want := []struct { - latestID string - sessionID string - count int + latestID string + sessionID string + requestCount int }{ {"b32d7a52-0000-4000-8000-000000000003", "", 1}, {"b32d7a52-0000-4000-8000-000000000002", "sess-a", 2}, } for i, tt := range want { got := result.Sessions[i] - if got.Latest.ID != tt.latestID || got.SessionID != tt.sessionID || got.Count != tt.count { + if got.Latest.ID != tt.latestID || got.SessionID != tt.sessionID || got.RequestCount != tt.requestCount { t.Fatalf("sessions[%d] = %+v, want latest %q session %q count %d", - i, got, tt.latestID, tt.sessionID, tt.count) + i, got, tt.latestID, tt.sessionID, tt.requestCount) } } }) } -// sessionThreadFixture is the shared grouped-view corpus: a two-entry session, -// a one-entry session and a sessionless request. The thread head (a-2) carries -// list columns and a data payload so the readers' head re-read is checked. +// sessionThreadFixture is the shared grouped-view corpus: a two-entry session +// crossing a UTC day boundary, a one-entry session and a sessionless request. +// The thread head (a-2) carries list columns and a data payload so the readers' +// head re-read is checked. func sessionThreadFixture(base time.Time) []*LogEntry { return []*LogEntry{ - {ID: "a-1", Timestamp: base, Provider: "openai", SessionID: "sess-a", StatusCode: 200}, + {ID: "a-1", Timestamp: base.Add(-24 * time.Hour), Provider: "openai", SessionID: "sess-a", UserPath: "/tenants/a", StatusCode: 200}, { ID: "a-2", Timestamp: base.Add(2 * time.Minute), Provider: "openai", - SessionID: "sess-a", StatusCode: 200, Path: "/v1/chat/completions", + SessionID: "sess-a", UserPath: "/tenants/b", StatusCode: 200, Path: "/v1/chat/completions", Data: &LogData{UserAgent: "probe/1.0"}, }, {ID: "b-1", Timestamp: base.Add(time.Minute), Provider: "anthropic", SessionID: "sess-b", StatusCode: 500}, @@ -473,25 +470,45 @@ func assertGetSessionsFilters(t *testing.T, reader Reader) { t.Helper() status := 500 tests := []struct { - name string - params LogQueryParams - wantSessionID string - wantCount int - wantLatestID string + name string + params LogQueryParams + wantSessionID string + wantRequestCount int + wantLatestID string }{ { - name: "status filter keeps only the thread with a 500", - params: LogQueryParams{StatusCode: &status, Limit: 10}, - wantSessionID: "sess-b", - wantCount: 1, - wantLatestID: "b-1", + name: "status filter keeps only the thread with a 500", + params: LogQueryParams{StatusCode: &status, Limit: 10}, + wantSessionID: "sess-b", + wantRequestCount: 1, + wantLatestID: "b-1", + }, + { + name: "session filter narrows the grouped view to one thread", + params: LogQueryParams{SessionID: "sess-a", Limit: 10}, + wantSessionID: "sess-a", + wantRequestCount: 2, + wantLatestID: "a-2", }, { - name: "session filter narrows the grouped view to one thread", - params: LogQueryParams{SessionID: "sess-a", Limit: 10}, - wantSessionID: "sess-a", - wantCount: 2, - wantLatestID: "a-2", + name: "user path filter keeps the complete session count", + params: LogQueryParams{ + UserPath: "/tenants/b", ExactUserPath: true, SessionID: "sess-a", Limit: 10, + }, + wantSessionID: "sess-a", + wantRequestCount: 2, + wantLatestID: "a-2", + }, + { + name: "date filter keeps the complete session count", + params: LogQueryParams{ + QueryParams: QueryParams{StartDate: time.Date(2026, 7, 27, 0, 0, 0, 0, time.UTC), EndDate: time.Date(2026, 7, 27, 0, 0, 0, 0, time.UTC)}, + SessionID: "sess-a", + Limit: 10, + }, + wantSessionID: "sess-a", + wantRequestCount: 2, + wantLatestID: "a-2", }, } for _, tt := range tests { @@ -504,9 +521,9 @@ func assertGetSessionsFilters(t *testing.T, reader Reader) { t.Fatalf("result = %+v, want exactly one thread", result) } got := result.Sessions[0] - if got.SessionID != tt.wantSessionID || got.Count != tt.wantCount || got.Latest.ID != tt.wantLatestID { - t.Fatalf("thread = %+v, want session %q count %d latest %q", - got, tt.wantSessionID, tt.wantCount, tt.wantLatestID) + if got.SessionID != tt.wantSessionID || got.RequestCount != tt.wantRequestCount || got.Latest.ID != tt.wantLatestID { + t.Fatalf("thread = %+v, want session %q request count %d latest %q", + got, tt.wantSessionID, tt.wantRequestCount, tt.wantLatestID) } }) } diff --git a/tools/seed-demo-data.sh b/tools/seed-demo-data.sh index afe1598c8..0eef12637 100755 --- a/tools/seed-demo-data.sh +++ b/tools/seed-demo-data.sh @@ -13,6 +13,8 @@ semantic_cache_pct="${DEMO_SEMANTIC_CACHE_PCT:-7}" prompt_cache_pct="${DEMO_PROMPT_CACHE_PCT:-28}" rewrite_pct="${DEMO_REWRITE_PCT:-18}" prefix="${DEMO_SEED_PREFIX:-demo-generated}" +seed_utc_epoch="$(date -u +%s)" +current_utc_second=$((seed_utc_epoch % 86400)) usage() { cat <= 994; +WHERE abs(token_noise / 131) % 1000 >= 994 + AND (day != date(${seed_utc_epoch}, 'unixepoch') OR second_of_day < ${current_utc_second}); INSERT INTO audit_log_attempts ( audit_log_id, seq, kind, provider_type, provider_name, model, @@ -989,7 +1004,10 @@ SELECT strftime('%Y-%m-%dT%H:%M:%fZ', day || ' 00:00:00', '+' || (second_of_day + 1) || ' seconds'), 90000000 + (token_noise % 200000000) FROM demo_generated -WHERE abs(token_noise / 131) % 1000 < 985 AND cache_type IS NULL AND token_noise % 37 = 0; +WHERE abs(token_noise / 131) % 1000 < 985 + AND cache_type IS NULL + AND token_noise % 37 = 0 + AND (day != date(${seed_utc_epoch}, 'unixepoch') OR second_of_day < ${current_utc_second}); DROP TABLE IF EXISTS temp.demo_budget_paths; CREATE TEMP TABLE demo_budget_paths(user_path TEXT, daily_amount REAL, weekly_amount REAL, monthly_amount REAL); @@ -1022,9 +1040,12 @@ SELECT period_seconds, amount, '${prefix}', - strftime('%s', date(CASE WHEN '${end_date}' = '' THEN 'now' ELSE '${end_date}' END)), - strftime('%s', 'now'), - strftime('%s', 'now') + strftime('%s', CASE + WHEN '${end_date}' = '' THEN date(${seed_utc_epoch}, 'unixepoch') + ELSE date('${end_date}') + END), + ${seed_utc_epoch}, + ${seed_utc_epoch} FROM budget_rows WHERE true ON CONFLICT(user_path, period_seconds) DO UPDATE SET diff --git a/web/dashboard/src/pages/audit-logs/AuditEntrySummary.svelte b/web/dashboard/src/pages/audit-logs/AuditEntrySummary.svelte index 214475584..b8c1d2cb0 100644 --- a/web/dashboard/src/pages/audit-logs/AuditEntrySummary.svelte +++ b/web/dashboard/src/pages/audit-logs/AuditEntrySummary.svelte @@ -49,6 +49,10 @@ thread.ontoggle(); } + function threadDescription() { + return "Session with " + Number(thread.count || 1) + " requests"; + } + function openConversation(event) { event.stopPropagation(); event.preventDefault(); @@ -75,10 +79,9 @@ type="button" class="audit-thread-expander" aria-expanded={thread.expanded} - title={"Session with " + thread.count + " requests"} - aria-label={"Session with " + - thread.count + - " requests, " + + title={threadDescription()} + aria-label={threadDescription() + + ", " + (thread.expanded ? "collapse" : "expand")} onclick={toggleThread} > diff --git a/web/dashboard/src/pages/audit-logs/audit-logic.js b/web/dashboard/src/pages/audit-logs/audit-logic.js index 35fdeebdc..66bb283c8 100644 --- a/web/dashboard/src/pages/audit-logs/audit-logic.js +++ b/web/dashboard/src/pages/audit-logs/audit-logic.js @@ -135,9 +135,9 @@ export function buildAuditLogQuery({ } // buildAuditSessionQuery renders the thread-children fetch for one session: -// GET /admin/audit/log?session_id=… Deliberately no date window, so an -// expanded thread shows the whole session even when older requests fall -// outside the date picker's range. +// GET /admin/audit/log?session_id=… Deliberately no active list filters, so +// an expanded thread shows the whole session even when requests fall outside +// the date, user-path, or other filters used to find the thread. export function buildAuditSessionQuery({ sessionId, limit }) { return ( "session_id=" + @@ -178,8 +178,7 @@ export function auditLogFromSessions(payload) { .filter((session) => session && session.latest) .map((session) => ({ ...session.latest, - session_id: auditSessionId(session.latest) || String(session.session_id || "").trim(), - session_count: Number(session.count || 1), + session_count: Math.max(1, Number(session.request_count) || 1), })), total: Number((payload && payload.total) || 0), limit: Number((payload && payload.limit) || 25), @@ -343,9 +342,9 @@ export function auditLogWithLiveEntries(payload, currentEntries, filters) { } // auditGroupedLogWithLiveEntries is auditLogWithLiveEntries for grouped mode: -// a still-pending live preview folds into its session's fetched head (keeping -// the larger count) instead of duplicating the thread; previews without an -// on-screen thread prepend as singleton heads. +// a still-pending live preview folds into its session's fetched head instead +// of duplicating the thread; previews without an on-screen thread prepend as +// singleton heads. export function auditGroupedLogWithLiveEntries(payload, currentEntries, filters) { const next = payload && typeof payload === "object" @@ -379,15 +378,23 @@ export function auditGroupedLogWithLiveEntries(payload, currentEntries, filters) const sid = auditSessionId(entry); if (sid && headBySession.has(sid)) { // Fold into the fetched thread: the pending preview is newer than the - // persisted head, so it becomes the head and keeps the thread's count. + // persisted head, so it becomes the head. Counts already accumulated by + // the live grouping path are authoritative; otherwise this distinct + // request increments the fetched count. const index = headBySession.get(sid); if (merged === entries) merged = [...entries]; + const previousCount = auditSessionCount(merged[index]); + const incomingValue = Number(entry && entry.session_count); + const incomingCount = + Number.isFinite(incomingValue) && incomingValue > 1 + ? incomingValue + : null; merged[index] = { ...entry, - session_count: Math.max( - auditSessionCount(merged[index]), - auditSessionCount(entry), - ), + session_count: + incomingCount === null + ? previousCount + 1 + : Math.max(previousCount, incomingCount), }; keys.forEach((key) => persistedKeys.add(key)); return; diff --git a/web/dashboard/src/pages/audit-logs/live-logs-logic.js b/web/dashboard/src/pages/audit-logs/live-logs-logic.js index 3a3845eb0..e14fa5d78 100644 --- a/web/dashboard/src/pages/audit-logs/live-logs-logic.js +++ b/web/dashboard/src/pages/audit-logs/live-logs-logic.js @@ -340,7 +340,10 @@ export function liveLogsMethods() { if (index < 0) return; const head = entries[index]; const next = [...entries]; - next.splice(index, 1, { ...head, session_count: Math.max(1, Number(head.session_count || 1) - count) }); + next.splice(index, 1, { + ...head, + session_count: Math.max(1, Number(head.session_count || 1) - count) + }); this.auditLog.entries = next; }, @@ -459,7 +462,11 @@ export function liveLogsMethods() { reloadGroupedList = true; return; } - const promoted = { ...children[0], session_id: sessionId, session_count: sessionCount - 1 }; + const promoted = { + ...children[0], + session_id: sessionId, + session_count: sessionCount - 1 + }; next.push(promoted); this.auditThreadChildren = { ...this.auditThreadChildren, diff --git a/web/dashboard/tests/audit-list.test.js b/web/dashboard/tests/audit-list.test.js index 550739e18..7b90193e9 100644 --- a/web/dashboard/tests/audit-list.test.js +++ b/web/dashboard/tests/audit-list.test.js @@ -706,7 +706,7 @@ test("formatJSON pretty-prints JSON strings and objects, passing other text thro // --- Session grouping helpers ------------------------------------------------ -test("buildAuditSessionQuery encodes the session id and omits the date window", () => { +test("buildAuditSessionQuery encodes the session id and omits active list filters", () => { const qs = buildAuditSessionQuery({ sessionId: "team/app|s 1", limit: 100 }); assert.equal(qs, "session_id=team%2Fapp%7Cs%201&limit=100&offset=0"); }); @@ -726,12 +726,11 @@ test("auditLogFromSessions maps thread summaries into head entries", () => { const payload = { sessions: [ { - session_id: "s-1", - count: 3, + request_count: 6, latest: { id: "log-3", session_id: "s-1", status_code: 200 }, }, - { count: 1, latest: { id: "solo", status_code: 200 } }, - { count: 2 }, // no latest: dropped + { request_count: 1, latest: { id: "solo", status_code: 200 } }, + { request_count: 2 }, // no latest: dropped ], total: 12, limit: 25, @@ -740,7 +739,7 @@ test("auditLogFromSessions maps thread summaries into head entries", () => { const mapped = auditLogFromSessions(payload); assert.equal(mapped.entries.length, 2); assert.equal(mapped.entries[0].id, "log-3"); - assert.equal(mapped.entries[0].session_count, 3); + assert.equal(mapped.entries[0].session_count, 6); assert.equal(mapped.entries[1].id, "solo"); assert.equal(mapped.entries[1].session_count, 1); assert.equal(mapped.total, 12); @@ -875,6 +874,34 @@ test("auditGroupedLogWithLiveEntries folds pending previews into fetched heads", assert.equal(next.total, 3); }); +test("auditGroupedLogWithLiveEntries increments counts for a new singleton preview", () => { + const payload = { + entries: [ + { + id: "head-a", + session_id: "s-a", + session_count: 6, + }, + ], + total: 1, + limit: 25, + offset: 0, + }; + const pending = { + id: "live-1", + session_id: "s-a", + session_count: 1, + _live: true, + _live_pending: true, + }; + + const next = auditGroupedLogWithLiveEntries(payload, [pending], {}); + + assert.deepEqual(next.entries.map((entry) => entry.id), ["live-1"]); + assert.equal(next.entries[0].session_count, 7); + assert.equal(next.total, 1); +}); + test("auditGroupedLogWithLiveEntries keeps persisted rows over matching previews", () => { const payload = { entries: [{ id: "head-a", request_id: "req-1", session_id: "s-a", session_count: 2 }],