@specship/specship-win32-arm64 0.11.6 → 0.11.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/dist/server/routes/chat.js +2 -3
- package/lib/dist/server/routes/claude.js +2 -3
- package/lib/dist/server/routes/events.js +2 -3
- package/lib/dist/server/routes/projects.js +2 -3
- package/lib/dist/server/routes/sse.js +23 -0
- package/lib/dist/server/routes/workflow.js +2 -3
- package/lib/dist/web/{chunk-H2TR6BKW.js → chunk-7KWBINA7.js} +1 -1
- package/lib/dist/web/{chunk-BZ5SMVXG.js → chunk-7MUNFW56.js} +1 -1
- package/lib/dist/web/{chunk-Z23KACD6.js → chunk-AZUUBUEJ.js} +1 -1
- package/lib/dist/web/{chunk-BDF4LLKR.js → chunk-CYXQILZI.js} +1 -1
- package/lib/dist/web/{chunk-PAO2624Y.js → chunk-DTWIJ3GJ.js} +1 -1
- package/lib/dist/web/{chunk-G2FTQVMJ.js → chunk-E27QAKAB.js} +1 -1
- package/lib/dist/web/{chunk-YPWBUJH7.js → chunk-EXBUKHH2.js} +1 -1
- package/lib/dist/web/{chunk-YVAUYHOB.js → chunk-F5TBUYDH.js} +1 -1
- package/lib/dist/web/{chunk-C6I5R6UZ.js → chunk-FC3R7YHR.js} +1 -1
- package/lib/dist/web/{chunk-IXQIWN6Z.js → chunk-G7RXFHYO.js} +1 -1
- package/lib/dist/web/{chunk-NY5CBIVU.js → chunk-HPKNOV45.js} +1 -1
- package/lib/dist/web/{chunk-PBRCKHEQ.js → chunk-JGDK6YKG.js} +1 -1
- package/lib/dist/web/{chunk-5CR7TMVN.js → chunk-JPSYO24K.js} +1 -1
- package/lib/dist/web/{chunk-FYXVIWM2.js → chunk-K7UD24Z4.js} +1 -1
- package/lib/dist/web/{chunk-QJSQ3ORB.js → chunk-LIFS4XH2.js} +1 -1
- package/lib/dist/web/{chunk-6FZTSHJS.js → chunk-MADMRWIK.js} +1 -1
- package/lib/dist/web/{chunk-7ALHQYYG.js → chunk-MNFTHCSJ.js} +1 -1
- package/lib/dist/web/{chunk-7ULUC3DC.js → chunk-N5WSFE4J.js} +1 -1
- package/lib/dist/web/{chunk-G2MHCJUR.js → chunk-PCW6R7OP.js} +1 -1
- package/lib/dist/web/{chunk-EAWW6PQJ.js → chunk-POCVU4VK.js} +1 -1
- package/lib/dist/web/chunk-TWVVIWKO.js +1 -0
- package/lib/dist/web/{chunk-HZYJAXHL.js → chunk-U67LRNER.js} +1 -1
- package/lib/dist/web/{chunk-KXMWAQNB.js → chunk-USVLLFVR.js} +1 -1
- package/lib/dist/web/{chunk-U6CWVOZO.js → chunk-UYOKO7C5.js} +1 -1
- package/lib/dist/web/{chunk-7V4MGZCG.js → chunk-XAUQEKZX.js} +1 -1
- package/lib/dist/web/{chunk-D7HQMX7C.js → chunk-YXYPTZ6E.js} +1 -1
- package/lib/dist/web/index.html +1 -1
- package/lib/dist/web/{main-A6QZ3DLK.js → main-5B4RR3BC.js} +1 -1
- package/lib/node_modules/.package-lock.json +1 -1
- package/lib/package.json +1 -1
- package/package.json +1 -1
- package/lib/dist/web/chunk-3H2EZLZN.js +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as X}from"./chunk-V74ZPP4B.js";import{a as L,b as J,c as Q}from"./chunk-7656MA24.js";import{a as G}from"./chunk-P62EJGSF.js";import{a as W}from"./chunk-5NTGUSXJ.js";import{a as q}from"./chunk-IOB4JJT4.js";import{c as T}from"./chunk-
|
|
1
|
+
import{a as X}from"./chunk-V74ZPP4B.js";import{a as L,b as J,c as Q}from"./chunk-7656MA24.js";import{a as G}from"./chunk-P62EJGSF.js";import{a as W}from"./chunk-5NTGUSXJ.js";import{a as q}from"./chunk-IOB4JJT4.js";import{c as T}from"./chunk-DTWIJ3GJ.js";import"./chunk-JGDK6YKG.js";import{a as K}from"./chunk-TWVVIWKO.js";import{Aa as p,Ea as P,Fa as N,Ga as E,I as H,Ia as w,Ka as c,M as C,N as S,Ta as k,Ua as R,Va as o,W as M,Wa as u,Xa as v,Ya as z,bb as f,db as O,ea as a,fb as $,gb as V,hb as j,ka as F,lb as x,ra as _,sa as h,ta as I,va as b,vb as A,wa as y,xa as m,ya as i,za as n,zb as U}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var te=()=>({value:"today",label:"Today"}),ne=()=>({value:"week",label:"This week"}),ie=()=>({value:"month",label:"This month"}),ae=()=>({value:"all",label:"All time"}),oe=(r,e,t,l)=>[r,e,t,l],le=()=>({value:"calls",label:"Calls"}),re=()=>({value:"tokens",label:"Tokens"}),de=(r,e)=>[r,e],se=()=>[],Z=(r,e)=>e.name,ee=(r,e)=>e.session_id;function pe(r,e){r&1&&(i(0,"div",23),o(1,"No file-targeted tool calls in this window."),n())}function me(r,e){if(r&1){let t=E();i(0,"app-treemap",45),w("pick",function(s){C(t);let d=c();return S(d.openFile(s))}),n(),i(1,"div",46)(2,"span",47),o(3,"tokens / call"),n(),p(4,"div",48),i(5,"span",49),o(6,"efficient \u2192 wasteful"),n(),p(7,"div",22),i(8,"span",47),o(9,"click a tile to drill in"),n()()}if(r&2){let t,l=c();m("items",l.treemapItems())("height",268)("selKey",((t=l.drill())==null?null:t.kind)==="file"?l.drill().key:null)}}function ce(r,e){if(r&1){let t=E();i(0,"button",50),w("click",function(){let s=C(t).$implicit,d=c();return S(d.openToolByName(s.name))}),i(1,"span",51),o(2),n(),i(3,"div",52),p(4,"div",53),n(),i(5,"span",54),o(6),n(),i(7,"span",55),o(8),n(),i(9,"span",56),o(10),n(),p(11,"app-icon",57),n()}if(r&2){let t,l,s=e.$implicit,d=c();R("sel",((t=d.drill())==null?null:t.kind)==="tool"&&d.drill().key===s.name),a(),k("color",((l=d.drill())==null?null:l.kind)==="tool"&&d.drill().key===s.name?"var(--accent)":"var(--text-secondary)"),a(),u(s.name),a(2),k("width",s.resultBytes/d.maxToolTokens()*100,"%")("background",d.effColor(s.resultBytes/d.Math.max(1,s.calls))),a(2),v("\xD7",s.calls),a(),k("color",d.effColor(s.resultBytes/d.Math.max(1,s.calls))),a(),v("",d.fmtTokens(d.Math.round(s.resultBytes/d.Math.max(1,s.calls))),"/call"),a(2),u(d.fmtTokens(s.resultBytes)),a(),m("size",12)}}function ue(r,e){r&1&&(i(0,"div",23),o(1,"No Task tool calls \u2014 no subagents dispatched."),n())}function xe(r,e){if(r&1){let t=E();i(0,"app-h-bars",58),w("itemClick",function(s){C(t);let d=c();return S(d.openSubagent(s.name))}),n()}if(r&2){let t,l=c();m("items",l.subagentByName())("fmt",l.fmtTokens)("selectedKey",((t=l.drill())==null?null:t.kind)==="subagent"?l.drill().key:null)}}function ge(r,e){r&1&&(i(0,"div",65),o(1,"Loading\u2026"),n())}function ve(r,e){if(r&1&&(i(0,"div",73)(1,"span",78),o(2),n(),i(3,"div",22),p(4,"app-bar",79),n(),i(5,"span",80),o(6),n(),i(7,"span",81),o(8),n()()),r&2){let t=e.$implicit,l=c(),s=c(2);a(2),u(t.name),a(2),m("frac",t.bytes/s.Math.max(1,l.byTool[0].bytes))("color",t.bytes>4e4?"var(--error)":t.bytes>12e3?"var(--warn)":"var(--node-code)"),a(2),v("\xD7",t.calls),a(2),u(s.fmtTokens(t.bytes))}}function _e(r,e){if(r&1&&(i(0,"div",75)(1,"span",82),o(2),n(),i(3,"span",83),o(4),n(),p(5,"app-icon",84),n()),r&2){let t,l=e.$implicit,s=c(3);a(2),u(s.shortId(l.session_id)),a(2),z(" ",(l.project_path==null||(t=l.project_path.split("/"))==null?null:t.pop())||""," \xB7 ",s.timeAgo(l.lastTs)," "),a(),m("size",12)}}function he(r,e){if(r&1&&(i(0,"div",66)(1,"div",67)(2,"div")(3,"div",47),o(4,"Tool calls"),n(),i(5,"div",68),o(6),n()(),i(7,"div",22)(8,"div",69),o(9,"7-day trend"),n(),p(10,"app-sparkline",70),n()(),i(11,"div",71),o(12,"Tool breakdown"),n(),i(13,"div",72),b(14,ve,9,5,"div",73,Z),n(),i(16,"div",71),o(17),n(),i(18,"div",74),b(19,_e,6,4,"div",75,ee),n(),i(21,"button",76),p(22,"app-icon",77),o(23,"Reveal in editor "),n()()),r&2){let t=e,l=c(),s=c();a(6),u(s.fileTotalCalls(t.sessions)),a(4),m("data",s.fileTrendFor(l.key))("fill",!0)("width",150)("height",30),a(4),y(t.byTool),a(3),z("Touched in ",t.sessions.length," session",t.sessions.length!==1?"s":""),a(2),y(t.sessions),a(3),m("size",13)}}function fe(r,e){if(r&1&&(i(0,"div",60)(1,"span",93),o(2),n(),i(3,"span",94),o(4),n(),i(5,"span",95),o(6),n()()),r&2){let t=e.$implicit,l=c(3);a(2),u(l.truncate(t.input,140)),a(2),v("\xD7",t.calls),a(2),u(l.fmtTokens(t.bytes))}}function be(r,e){r&1&&(i(0,"div",91),o(1,"No inputs captured."),n())}function ye(r,e){if(r&1&&(i(0,"div",75)(1,"span",82),o(2),n(),i(3,"span",83),o(4),n(),p(5,"app-icon",84),n()),r&2){let t,l=e.$implicit,s=c(3);a(2),u(s.shortId(l.session_id)),a(2),z(" ",(l.project_path==null||(t=l.project_path.split("/"))==null?null:t.pop())||""," \xB7 ",s.timeAgo(l.lastTs)," "),a(),m("size",12)}}function we(r,e){if(r&1&&(i(0,"div",66)(1,"div",85)(2,"div")(3,"div",47),o(4,"Calls"),n(),i(5,"div",86),o(6),n()(),i(7,"div")(8,"div",47),o(9,"Result tokens"),n(),i(10,"div",86),o(11),n()(),i(12,"div",22)(13,"div",69),o(14,"7-day"),n(),p(15,"app-sparkline",87),n()(),i(16,"div",88)(17,"span",21),o(18,"avg per call"),n(),i(19,"span",89),o(20),n()(),i(21,"div",71),o(22,"Top inputs"),n(),i(23,"div",90),b(24,fe,7,3,"div",60,I,!1,be,2,0,"div",91),n(),i(27,"div",71),o(28),n(),i(29,"div",92),b(30,ye,6,4,"div",75,ee),n()()),r&2){let t=e,l=c(2);a(6),u(t.totals.calls),a(4),k("color",t.totals.bytes>1e6?"var(--error)":"var(--text-primary)"),a(),u(l.fmtTokens(t.totals.bytes)),a(4),m("data",f(13,se))("fill",!0)("width",110)("height",28),a(4),k("color",t.totals.calls>0&&t.totals.bytes/t.totals.calls>3e4?"var(--error)":t.totals.calls>0&&t.totals.bytes/t.totals.calls>8e3?"var(--warn)":"var(--text-secondary)"),a(),v(" ",l.fmtTokens(t.totals.calls>0?l.Math.round(t.totals.bytes/t.totals.calls):0)," tokens "),a(4),y(t.inputs),a(4),v("Used in ",t.totals.sessions," sessions"),a(2),y(t.recentSessions)}}function ke(r,e){if(r&1&&(i(0,"div",104),o(1),n()),r&2){let t=c().$implicit,l=c(3);a(),u(l.truncate(t.description,160))}}function Ce(r,e){if(r&1&&(i(0,"div",105),o(1),n()),r&2){let t=c().$implicit,l=c(3);a(),u(l.truncate(t.prompt,200))}}function Se(r,e){if(r&1&&(i(0,"div",98)(1,"div",101)(2,"span",102),o(3),n(),i(4,"span",103),o(5),n()(),_(6,ke,2,1,"div",104),_(7,Ce,2,1,"div",105),n()),r&2){let t=e.$implicit,l=c(3);a(3),u(l.shortId(t.session_id)),a(2),u(l.timeAgo(t.ts)),a(),h(t.description?6:-1),a(),h(t.prompt?7:-1)}}function Ee(r,e){r&1&&(i(0,"div",99),o(1,"No invocations in window."),n())}function Te(r,e){if(r&1&&(i(0,"div",66)(1,"div",85)(2,"div")(3,"div",47),o(4,"Invocations"),n(),i(5,"div",96),o(6),n()(),i(7,"div")(8,"div",47),o(9,"Sessions"),n(),i(10,"div",96),o(11),n()()(),i(12,"div",71),o(13,"Invocations"),n(),i(14,"div",97),b(15,Se,8,4,"div",98,I,!1,Ee,2,0,"div",99),n(),i(18,"button",76),p(19,"app-icon",100),o(20,"See related tips "),n()()),r&2){let t=e;a(6),u(t.totals.calls),a(5),u(t.totals.sessions),a(4),y(t.invocations),a(4),m("size",13)}}function Me(r,e){if(r&1){let t=E();i(0,"aside",44)(1,"header",59)(2,"div",60),p(3,"app-icon",61),i(4,"span",62),o(5),n()(),i(6,"button",63),w("click",function(){C(t);let s=c();return S(s.closeDrill())}),p(7,"app-icon",64),n()(),_(8,ge,2,0,"div",65),_(9,he,24,8,"div",66),_(10,we,32,14,"div",66),_(11,Te,21,4,"div",66),n()}if(r&2){let t,l,s,d=e,g=c();a(3),k("color",d.kind==="file"?"var(--warn)":d.kind==="tool"?"var(--node-code)":"var(--node-route)"),m("name",d.kind==="file"?"box":d.kind==="tool"?"wrench":"bot")("size",14),a(2),u(g.drillTitle()),a(2),m("size",14),a(),h(g.drillLoading()?8:-1),a(),h((t=d.kind==="file"&&g.fileDrill.state().data)?9:-1,t),a(),h((l=d.kind==="tool"&&g.toolDrill.state().data)?10:-1,l),a(),h((s=d.kind==="subagent"&&g.subagentDrill.state().data)?11:-1,s)}}var Y=class r{Math=Math;api=H(K);range=M("week");metric=M("calls");resource=T(this.api,()=>`/api/claude/heatmap?range=${this.range()}`);files=x(()=>this.resource.state().data?.files??[]);tools=x(()=>this.resource.state().data?.tools??[]);subagents=x(()=>this.resource.state().data?.subagents??[]);subagentByName=x(()=>this.resource.state().data?.subagentByName??[]);totalCalls=x(()=>this.tools().reduce((e,t)=>e+t.calls,0));totalResultTokens=x(()=>this.tools().reduce((e,t)=>e+(t.resultBytes||0),0));busiestFile=x(()=>[...this.files()].sort((e,t)=>t.calls-e.calls)[0]??null);heaviestTool=x(()=>[...this.tools()].sort((e,t)=>(t.resultBytes||0)-(e.resultBytes||0))[0]??null);toolsByTokens=x(()=>[...this.tools()].sort((e,t)=>(t.resultBytes||0)-(e.resultBytes||0)));maxToolTokens=x(()=>Math.max(1,...this.toolsByTokens().map(e=>e.resultBytes||0)));treemapItems=x(()=>{let e=this.metric(),t=d=>e==="tokens"?d.resultBytes||0:d.calls,l=[...this.files()].sort((d,g)=>t(g)-t(d)).slice(0,48);if(!l.length)return[];let s=Math.max(1,...l.map(d=>(d.resultBytes||0)/Math.max(1,d.calls)));return l.map(d=>{let g=(d.resultBytes||0)/Math.max(1,d.calls);return{key:d.path,label:L(d.path),value:t(d),intensity:g/s,sub:e==="tokens"?this.fmtTokens(d.resultBytes||0):d.calls+" calls",title:`${d.path}
|
|
2
2
|
${d.calls} calls \xB7 ${this.fmtTokens(d.resultBytes||0)} result tokens \xB7 ${this.fmtTokens(Math.round(g))}/call`}})});drill=M(null);fileDrill=T(this.api,()=>{let e=this.drill();return e?.kind==="file"?`/api/claude/heatmap/file?path=${encodeURIComponent(e.key)}&range=${this.range()}`:null});toolDrill=T(this.api,()=>{let e=this.drill();return e?.kind==="tool"?`/api/claude/heatmap/tool?name=${encodeURIComponent(e.key)}&range=${this.range()}`:null});subagentDrill=T(this.api,()=>{let e=this.drill();return e?.kind==="subagent"?`/api/claude/heatmap/subagent?type=${encodeURIComponent(e.key)}&range=${this.range()}`:null});drillTitle=x(()=>{let e=this.drill();return e?e.key:""});drillLoading=x(()=>{let e=this.drill();return e?e.kind==="file"?this.fileDrill.state().loading:e.kind==="tool"?this.toolDrill.state().loading:this.subagentDrill.state().loading:!1});setRange(e){this.range.set(e)}setMetric(e){this.metric.set(e)}openFile(e){this.drill.set({kind:"file",key:e})}openToolByName(e){this.drill.set({kind:"tool",key:e})}openSubagent(e){this.drill.set({kind:"subagent",key:e})}closeDrill(){this.drill.set(null)}fileTrendFor(e){return this.files().find(t=>t.path===e)?.trend??[]}fileTotalCalls(e){return e.reduce((t,l)=>t+l.calls,0)}effColor(e){return e>2e4?"var(--error)":e>8e3?"var(--warn)":"var(--success)"}fmtTokens=e=>e>=1e6?(e/1e6).toFixed(1)+"M":e>=1e3?(e/1e3).toFixed(0)+"k":String(e);fmtBytes(e){return e>=1e6?(e/1e6).toFixed(1)+"MB":e>=1e3?(e/1e3).toFixed(0)+"kB":e+"B"}timeAgo(e){let t=Date.now()-e;return t<6e4?"just now":t<36e5?Math.round(t/6e4)+"m ago":t<864e5?Math.round(t/36e5)+"h ago":Math.round(t/864e5)+"d ago"}shortId(e){return e.slice(0,8)}shortFile(e){return e?e.split("/").filter(Boolean).slice(-2).join("/")||e:"\u2014"}truncate(e,t=120){return e.length>t?e.slice(0,t)+"\u2026":e}static \u0275fac=function(t){return new(t||r)};static \u0275cmp=F({type:r,selectors:[["app-heatmap"]],decls:98,vars:38,consts:[[1,"hm-root"],[1,"page","scroll-y"],[2,"margin-bottom","18px"],["icon","heatmap","title","Heatmap","sub","Where tool calls land \u2014 files, tools, subagents"],["actions",""],["size","sm",3,"change","value","options"],[1,"sum-grid",2,"margin-bottom","14px"],[1,"card","sum-card"],[1,"row","gap-6",2,"color","var(--text-muted)","white-space","nowrap","margin-bottom","3px"],["name","wrench",2,"color","var(--node-spec)","flex-shrink","0",3,"size"],[1,"eyebrow"],[1,"mono","tabular",2,"font-size","18px","font-weight","650","letter-spacing","-0.01em"],[1,"mono","muted",2,"font-size","10px"],["name","database",2,"color","var(--node-route)","flex-shrink","0",3,"size"],["name","box",2,"color","var(--warn)","flex-shrink","0",3,"size"],[1,"mono","tabular",2,"font-size","18px","font-weight","650","letter-spacing","-0.01em","overflow","hidden","text-overflow","ellipsis","white-space","nowrap"],["name","flame",2,"color","var(--error)","flex-shrink","0",3,"size"],[1,"card","card-pad",2,"margin-bottom","14px"],[1,"row","gap-8",2,"margin-bottom","12px"],["name","box",2,"color","var(--warn)",3,"size"],[2,"font-weight","600","font-size","12.5px"],[1,"muted",2,"font-size","11px"],[1,"grow"],[1,"empty"],[1,"bottom-grid"],[1,"card","card-pad"],[1,"row","gap-8",2,"margin-bottom","4px"],["name","wrench",2,"color","var(--node-code)",3,"size"],[1,"row",2,"padding","8px 0 4px","font-size","9.5px","color","var(--text-muted)","text-transform","uppercase","letter-spacing","0.05em","font-weight","600"],[2,"width","116px"],[2,"width","36px","text-align","right"],[2,"width","64px","text-align","right"],[2,"width","48px","text-align","right"],[2,"width","14px"],[1,"col","gap-2"],["type","button",1,"tool-eff-row","row","gap-8",3,"sel"],[1,"muted","row","gap-12",2,"font-size","10.5px","margin-top","10px"],[1,"row","gap-4"],[2,"width","8px","height","8px","border-radius","2px","background","var(--error)"],[2,"width","8px","height","8px","border-radius","2px","background","var(--warn)"],[2,"width","8px","height","8px","border-radius","2px","background","var(--success)"],[1,"row","gap-8",2,"margin-bottom","14px"],["name","bot",2,"color","var(--node-route)",3,"size"],["valueKey","calls","color","var(--node-route)",3,"items","fmt","selectedKey"],[1,"hm-drawer"],["variant","detailed",3,"pick","items","height","selKey"],[1,"row","gap-12",2,"margin-top","10px","align-items","center"],[1,"muted",2,"font-size","10.5px"],[1,"row",2,"width","120px","height","7px","border-radius","999px","overflow","hidden","background","linear-gradient(90deg, var(--node-route), var(--warn), var(--error))"],[1,"muted",2,"font-size","10px"],["type","button",1,"tool-eff-row","row","gap-8",3,"click"],[1,"mono",2,"width","116px","flex-shrink","0","font-size","11.5px","overflow","hidden","text-overflow","ellipsis","white-space","nowrap"],[1,"grow",2,"height","16px","background","var(--bg-hover)","border-radius","4px","overflow","hidden"],[2,"height","100%","border-radius","4px"],[1,"mono","tabular","muted",2,"width","36px","text-align","right","font-size","10.5px","flex-shrink","0"],[1,"mono","tabular",2,"width","64px","text-align","right","font-size","10.5px","flex-shrink","0"],[1,"mono","tabular",2,"width","48px","text-align","right","font-size","11.5px","font-weight","600","flex-shrink","0"],["name","chevronRight",2,"color","var(--text-faint)","flex-shrink","0",3,"size"],["valueKey","calls","color","var(--node-route)",3,"itemClick","items","fmt","selectedKey"],[1,"hm-drawer-head"],[1,"row","gap-8"],[3,"name","size"],[1,"mono","grow",2,"font-size","13px","font-weight","600","overflow","hidden","text-overflow","ellipsis","white-space","nowrap"],["type","button","aria-label","Close",1,"btn","btn-ghost","btn-xs",3,"click"],["name","x",3,"size"],[1,"muted","hm-pad"],[1,"scroll-y",2,"flex","1","padding","14px"],[1,"row",2,"gap","20px","margin-bottom","16px"],[1,"tabular",2,"font-size","26px","font-weight","700","line-height","1"],[1,"muted",2,"font-size","10.5px","margin-bottom","4px"],["color","var(--warn)",3,"data","fill","width","height"],[1,"eyebrow",2,"margin-bottom","8px"],[1,"col","gap-8",2,"margin-bottom","18px"],[1,"row","gap-10"],[1,"col","gap-6",2,"margin-bottom","18px"],[1,"session-link","row","gap-8"],[1,"btn","btn-secondary","btn-sm",2,"width","100%","justify-content","center"],["name","reveal",3,"size"],[1,"mono",2,"font-size","11.5px","width","92px","flex-shrink","0","overflow","hidden","text-overflow","ellipsis","white-space","nowrap"],[3,"frac","color"],[1,"mono","tabular","muted",2,"font-size","10.5px","width","22px","text-align","right"],[1,"mono","tabular",2,"font-size","10.5px","width","44px","text-align","right"],[1,"mono",2,"font-size","11.5px","flex-shrink","0"],[1,"muted","grow",2,"font-size","10.5px","overflow","hidden","text-overflow","ellipsis","white-space","nowrap"],["name","chevronRight",2,"color","var(--text-muted)","flex-shrink","0",3,"size"],[1,"row",2,"gap","16px","margin-bottom","16px"],[1,"tabular",2,"font-size","24px","font-weight","700","line-height","1"],["color","var(--node-code)",3,"data","fill","width","height"],[1,"row","gap-8",2,"margin-bottom","16px"],[1,"mono","tabular",2,"font-size","12px"],[1,"col","gap-7",2,"margin-bottom","18px"],[1,"muted",2,"padding","8px 0","font-size","11.5px"],[1,"col","gap-6"],[1,"mono",2,"font-size","11px","flex","1","min-width","0","overflow","hidden","text-overflow","ellipsis","white-space","nowrap","color","var(--text-secondary)"],[1,"mono","tabular","muted",2,"font-size","10px","width","20px","text-align","right"],[1,"mono","tabular",2,"font-size","10px","width","40px","text-align","right"],[1,"tabular",2,"font-size","22px","font-weight","700","line-height","1"],[1,"col","gap-6",2,"margin-bottom","16px"],[1,"inv-card"],[1,"muted",2,"font-size","11.5px","padding","8px 0"],["name","tips",3,"size"],[1,"row","gap-8",2,"margin-bottom","4px","font-size","11px"],[1,"mono"],[1,"muted"],[2,"font-size","12px","line-height","1.45"],[1,"muted","mono",2,"font-size","11px","line-height","1.45","margin-top","4px","overflow-wrap","anywhere"]],template:function(t,l){if(t&1&&(i(0,"div",0)(1,"div",1)(2,"div",2)(3,"app-page-head",3),P(4,4),i(5,"app-segmented",5),w("change",function(d){return l.setRange(d)}),n(),N(),n()(),i(6,"div",6)(7,"div",7)(8,"div",8),p(9,"app-icon",9),i(10,"span",10),o(11,"Tool calls"),n()(),i(12,"div",11),o(13),V(14,"number"),n(),i(15,"div",12),o(16),n()(),i(17,"div",7)(18,"div",8),p(19,"app-icon",13),i(20,"span",10),o(21,"Result tokens"),n()(),i(22,"div",11),o(23),n(),i(24,"div",12),o(25,"returned to context"),n()(),i(26,"div",7)(27,"div",8),p(28,"app-icon",14),i(29,"span",10),o(30,"Busiest file"),n()(),i(31,"div",15),o(32),n(),i(33,"div",12),o(34),n()(),i(35,"div",7)(36,"div",8),p(37,"app-icon",16),i(38,"span",10),o(39,"Heaviest tool"),n()(),i(40,"div",11),o(41),n(),i(42,"div",12),o(43),n()()(),i(44,"div",17)(45,"div",18),p(46,"app-icon",19),i(47,"span",20),o(48,"Files"),n(),i(49,"span",21),o(50),n(),p(51,"div",22),i(52,"app-segmented",5),w("change",function(d){return l.setMetric(d)}),n()(),_(53,pe,2,0,"div",23)(54,me,10,3),n(),i(55,"div",24)(56,"div",25)(57,"div",26),p(58,"app-icon",27),i(59,"span",20),o(60,"Tools"),n(),i(61,"span",21),o(62,"\xB7 by result tokens, ranked"),n()(),i(63,"div",28)(64,"span",29),o(65,"Tool"),n(),i(66,"span",22),o(67,"Result tokens"),n(),i(68,"span",30),o(69,"Calls"),n(),i(70,"span",31),o(71,"Per call"),n(),i(72,"span",32),o(73,"Total"),n(),p(74,"span",33),n(),i(75,"div",34),b(76,ce,12,15,"button",35,Z),n(),i(78,"div",36)(79,"span",37),p(80,"span",38),o(81,">20k / call"),n(),i(82,"span",37),p(83,"span",39),o(84,">8k"),n(),i(85,"span",37),p(86,"span",40),o(87,"lean"),n()()(),i(88,"div",25)(89,"div",41),p(90,"app-icon",42),i(91,"span",20),o(92,"Subagents"),n(),i(93,"span",21),o(94,"\xB7 by sidechain attribution"),n()(),_(95,ue,2,0,"div",23)(96,xe,1,3,"app-h-bars",43),n()()(),_(97,Me,12,10,"aside",44),n()),t&2){let s,d,g,B,D;a(5),m("value",l.range())("options",$(28,oe,f(24,te),f(25,ne),f(26,ie),f(27,ae))),a(4),m("size",12),a(4),u(j(14,22,l.totalCalls())),a(3),v("this ",l.range()),a(3),m("size",12),a(4),u(l.fmtTokens(l.totalResultTokens())),a(5),m("size",12),a(4),v(" ",l.shortFile((s=l.busiestFile())==null?null:s.path)," "),a(2),v("",((d=l.busiestFile())==null?null:d.calls)||0," calls"),a(3),m("size",12),a(4),u(((g=l.heaviestTool())==null?null:g.name)||"\u2014"),a(2),v("",l.fmtTokens(((B=l.heaviestTool())==null?null:B.resultBytes)||0)," tokens"),a(3),m("size",14),a(4),v("\xB7 area = ",l.metric()==="tokens"?"result tokens":"tool calls",", color = tokens / call"),a(2),m("value",l.metric())("options",O(35,de,f(33,le),f(34,re))),a(),h(l.files().length===0?53:54),a(5),m("size",14),a(18),y(l.toolsByTokens()),a(14),m("size",14),a(5),h(l.subagentByName().length===0?95:96),a(2),h((D=l.drill())?97:-1,D)}},dependencies:[W,q,G,X,Q,J,U,A],styles:["[_nghost-%COMP%]{display:contents}.hm-root[_ngcontent-%COMP%]{flex:1;display:flex;min-height:0;min-width:0}.page[_ngcontent-%COMP%]{flex:1;min-width:0;padding:18px}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono)}.tabular[_ngcontent-%COMP%]{font-variant-numeric:tabular-nums}.empty[_ngcontent-%COMP%]{color:var(--text-muted);padding:18px;text-align:center;font-size:12.5px}.card[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:var(--r-lg)}.card-pad[_ngcontent-%COMP%]{padding:14px}.sum-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.sum-card[_ngcontent-%COMP%]{padding:10px 13px;display:flex;flex-direction:column;gap:3px;min-width:0}.bottom-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:14px}@media(max-width:1100px){.bottom-grid[_ngcontent-%COMP%]{grid-template-columns:1fr}}.tool-eff-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:6px 8px;margin:0 -8px;border-radius:6px;cursor:pointer;background:transparent;border:none;color:inherit;font-family:inherit;text-align:left}.tool-eff-row[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.tool-eff-row.sel[_ngcontent-%COMP%]{background:var(--accent-soft)}.hm-drawer[_ngcontent-%COMP%]{width:360px;flex-shrink:0;border-left:1px solid var(--border-subtle);background:var(--bg-panel);display:flex;flex-direction:column;height:100%;overflow:hidden;animation:_ngcontent-%COMP%_hm-slide-in .16s ease-out}@keyframes _ngcontent-%COMP%_hm-slide-in{0%{transform:translate(20px);opacity:0}to{transform:translate(0);opacity:1}}.hm-drawer-head[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:12px 14px;border-bottom:1px solid var(--border-subtle);flex-shrink:0;position:sticky;top:0;background:var(--bg-panel);z-index:1}.hm-pad[_ngcontent-%COMP%]{padding:16px}.session-link[_ngcontent-%COMP%]{padding:7px 9px;border-radius:7px;border:1px solid var(--border-subtle);cursor:pointer}.session-link[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.inv-card[_ngcontent-%COMP%]{background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:6px;padding:8px 10px;margin-bottom:8px}.inv-card[_ngcontent-%COMP%]:last-child{margin-bottom:0}"],changeDetection:0})};export{Y as Heatmap};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{E as f}from"./chunk-SYGIPC2P.js";var g="specship.api",w=class i{base;constructor(){this.base=this.resolveBase()}resolveBase(){if(typeof window>"u")return null;try{let e=new URLSearchParams(window.location.search).get("api");if(e){try{window.localStorage.setItem(g,e)}catch{}return e.replace(/\/$/,"")}}catch{}try{let e=window.localStorage.getItem(g);if(e)return e.replace(/\/$/,"")}catch{}let t=window.SPECSHIP_API_URL;if(typeof t=="string")return t.replace(/\/$/,"");let n=window.location.hostname;if(n==="localhost"||n==="127.0.0.1"){let e=window.location.port;return e==="4200"||e==="4201"?"http://localhost:4242":window.location.origin.replace(/\/$/,"")}return null}get apiBase(){return this.base}get isConfigured(){return this.base!==null}async get(t,n){if(!this.base)throw new Error("no API base configured");let e=this.base+(t.startsWith("/")?t:"/"+t),r=await fetch(e,{method:"GET",headers:{Accept:"application/json"},signal:n});if(!r.ok)throw await l("GET",t,r);return r.json()}async post(t,n,e){if(!this.base)throw new Error("no API base configured");let r=this.base+(t.startsWith("/")?t:"/"+t),s=await fetch(r,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:n==null?void 0:JSON.stringify(n),signal:e});if(!s.ok)throw await l("POST",t,s);return s.json()}async put(t,n,e){if(!this.base)throw new Error("no API base configured");let r=this.base+(t.startsWith("/")?t:"/"+t),s=await fetch(r,{method:"PUT",headers:{Accept:"application/json","Content-Type":"application/json"},body:n==null?void 0:JSON.stringify(n),signal:e});if(!s.ok)throw await l("PUT",t,s);return s.json()}openEventStream(t,n,e,r){if(!this.base)return e?.(new Error("no API base configured")),()=>{};let s=this.base+(t.startsWith("/")?t:"/"+t),a=new EventSource(s),h=r??b,d=o=>{try{return JSON.parse(o.data)}catch{return o.data}},p=[];for(let o of h){let c=y=>n(o,d(y));a.addEventListener(o,c),p.push([o,c])}return a.onmessage=o=>n("message",d(o)),a.onerror=o=>{e?.(o)},()=>{for(let[o,c]of p)a.removeEventListener(o,c);a.close()}}static \u0275fac=function(n){return new(n||i)};static \u0275prov=f({token:i,factory:i.\u0275fac,providedIn:"root"})},u=class extends Error{constructor(n,e,r,s,a){super(a);this.status=n;this.code=e;this.path=r;this.payload=s}status;code;path;payload;name="ApiError"};async function l(i,t,n){let e=await n.text().catch(()=>""),r=null,s=null;if(e)try{if(r=JSON.parse(e),r&&typeof r=="object"&&"code"in r){let a=r.code;typeof a=="string"&&(s=a)}}catch{r=e}return new u(n.status,s,t,r,`${i} ${t} \u2192 ${n.status} ${e.slice(0,200)}`)}var b=["run_started","run_completed","run_failed","run_cancelled","run_paused","step_started","step_completed","step_failed","step_skipped","tool_called","artifact_created","approval_requested","approval_granted","approval_rejected","done"];export{w as a,u as b};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as Q}from"./chunk-G7VZT5KB.js";import{a as q}from"./chunk-PZSU53SS.js";import{b as G}from"./chunk-WBJ5VEB5.js";import{a as B,c as V}from"./chunk-DOKZOFKM.js";import{a as L}from"./chunk-PBRCKHEQ.js";import{a as W}from"./chunk-3H2EZLZN.js";import{Aa as p,Ga as M,I as w,Ia as y,Ka as c,M as h,N as C,O,P as N,R as z,Ta as T,Ua as R,Va as s,W as g,Wa as v,X as A,Xa as E,aa as $,ea as r,ka as F,lb as b,qa as P,ra as u,sa as m,va as k,wa as D,xa as f,ya as d,yb as j,za as o,zb as H}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var K=(i,t)=>t.from+t.to,I=(i,t)=>t.id,X=(i,t)=>t.nodeId;function Y(i,t){if(i&1){let e=M();d(0,"button",23),y("click",function(){h(e);let a=c(2);return C(a.cancel())}),p(1,"app-icon",24),s(2," Cancel "),o()}if(i&2){let e=c(2);f("disabled",e.actionPending()!==null),r(),f("size",12)}}function Z(i,t){if(i&1&&(d(0,"span",16),s(1),o(),d(2,"span",17),s(3),o(),p(4,"app-state-pill",18)(5,"span",19),d(6,"span",20),p(7,"app-icon",21),s(8),o(),u(9,Y,3,2,"button",22)),i&2){let e=t,n=c();r(),v(e.workflowName),r(2),v(e.id.slice(0,8)),r(),f("state",e.status)("pulse",e.status==="running"),r(3),f("size",11),r(),E(" ",n.fmtDuration(e.startedAt,e.completedAt)," "),r(),m(e.status==="running"||e.status==="paused"?9:-1)}}function ee(i,t){i&1&&(d(0,"span",25),s(1,"Loading\u2026"),o(),p(2,"span",19))}function te(i,t){if(i&1&&(d(0,"span",26),s(1),o(),p(2,"span",19)),i&2){let e=c();r(),v(e.error())}}function ne(i,t){if(i&1&&(d(0,"div",4),s(1),o()),i&2){let e=c();r(),E("Action failed: ",e.actionError())}}function ie(i,t){i&1&&(d(0,"div",4),s(1),o()),i&2&&(r(),v(t))}function re(i,t){if(i&1){let e=M();d(0,"div",5)(1,"span",27),p(2,"app-icon",28),o(),d(3,"div",19)(4,"div",29),s(5,"Approval required \u2014 review diff before merge"),o(),d(6,"div",30),s(7," Review the artifacts carefully before approving. "),o()(),d(8,"button",31),y("click",function(){h(e);let a=c();return C(a.activeTab.set("artifacts"))}),s(9," Inspect artifacts "),o(),d(10,"button",23),y("click",function(){h(e);let a=c();return C(a.reject())}),s(11," Reject "),o(),d(12,"button",32),y("click",function(){h(e);let a=c();return C(a.approve())}),p(13,"app-icon",33),s(14," Approve "),o()()}if(i&2){let e=c();r(2),f("size",18),r(8),f("disabled",e.actionPending()!==null),r(2),f("disabled",e.actionPending()!==null),r(),f("size",13)}}function ae(i,t){if(i&1&&(O(),p(0,"path",34)),i&2){let e=c(),n=c(2);P("d",n.edgePath(e,t))("stroke",e.status==="completed"?"var(--success)":"rgba(150,160,180,0.4)")("opacity",e.status==="completed"?"0.7":"0.5")}}function oe(i,t){if(i&1&&u(0,ae,1,3,":svg:path",34),i&2){let e,n=c().$implicit,a=c();m((e=a.nodeMap()[n.to])?0:-1,e)}}function de(i,t){if(i&1&&u(0,oe,1,1),i&2){let e,n=t.$implicit,a=c();m((e=a.nodeMap()[n.from])?0:-1,e)}}function se(i,t){i&1&&p(0,"app-icon",37),i&2&&f("size",11)}function le(i,t){i&1&&p(0,"app-icon",38),i&2&&f("size",11)}function ce(i,t){i&1&&p(0,"app-icon",39),i&2&&f("size",10)}function pe(i,t){if(i&1){let e=M();d(0,"div",35),y("click",function(){let a=h(e).$implicit,l=c();return C(l.selectedNode.set(a.id))}),d(1,"span",36),u(2,se,1,1,"app-icon",37)(3,le,1,1,"app-icon",38)(4,ce,1,1,"app-icon",39),o(),d(5,"div",40)(6,"div",41),s(7),o(),d(8,"div",42),s(9),o()()()}if(i&2){let e=t.$implicit,n=c();T("left",e.x/n.DAG_W*100,"%")("top",e.y,"px")("border-color",n.nodeBorderColor(e))("box-shadow",n.nodeBoxShadow(e)),R("rd-node-running",e.status==="running")("rd-node-selected",n.selectedNode()===e.id)("rd-node-pending",e.status==="pending")("rd-node-skipped",e.status==="skipped"),P("aria-label",e.id),r(),T("background",n.nodeDotBg(e))("border",n.nodeDotBorder(e)),R("rd-dot-spin",e.status==="running"),r(),m(e.status==="completed"?2:e.status==="failed"?3:e.status==="paused"?4:-1),r(5),v(e.label),r(2),v(e.kind)}}function ue(i,t){i&1&&(d(0,"span",44),s(1,"live"),o())}function me(i,t){if(i&1){let e=M();d(0,"button",43),y("click",function(){let a=h(e).$implicit,l=c();return C(l.activeTab.set(a.id))}),s(1),u(2,ue,2,0,"span",44),o()}if(i&2){let e=t.$implicit,n=c();R("rd-tab-active",n.activeTab()===e.id),r(),E(" ",e.label," "),r(),m(e.id==="events"&&n.streamStatus()==="live"?2:-1)}}function fe(i,t){if(i&1&&(d(0,"div",45)(1,"span",47),s(2),o(),d(3,"span",48),s(4),o(),d(5,"span",49),s(6),o(),d(7,"span",50),s(8),o()()),i&2){let e=t.$implicit,n=c(2);P("data-event-type",e.eventType),r(2),v(n.fmtTime(e.createdAt)),r(),T("color",n.evColor(e.eventType)),r(),v(e.eventType),r(2),v(n.stepIdOf(e)),r(2),v(n.eventDetail(e))}}function ge(i,t){i&1&&(d(0,"div",46),p(1,"span",51),s(2," streaming\u2026 "),o())}function ve(i,t){if(i&1&&(d(0,"div",14),k(1,fe,9,7,"div",45,I),u(3,ge,3,0,"div",46),o()),i&2){let e=c();r(),D(e.events()),r(2),m(e.streamStatus()==="live"||e.streamStatus()==="connecting"?3:-1)}}function _e(i,t){i&1&&(d(0,"div",52)(1,"div",53),s(2,"Loading artifacts\u2026"),o()())}function xe(i,t){if(i&1&&(d(0,"div",52)(1,"div",53),s(2),o()()),i&2){let e=c(2);r(2),E("Couldn\u2019t load artifacts: ",e.artifactsError())}}function be(i,t){i&1&&(d(0,"div",52)(1,"div",53),s(2,"No artifacts yet \u2014 nodes write their output here as they complete."),o()())}function ye(i,t){if(i&1){let e=M();d(0,"button",57),y("click",function(){let a=h(e).$implicit,l=c(3);return C(l.selectArtifact(a.nodeId))}),p(1,"app-icon",58),d(2,"span",59)(3,"span",60),s(4),o(),d(5,"span",61),s(6),o()()()}if(i&2){let e,n=t.$implicit,a=c(3);R("active",((e=a.selectedArtifact())==null?null:e.nodeId)===n.nodeId),r(),f("size",13),r(3),v(n.name),r(2),v(n.nodeId)}}function he(i,t){if(i&1&&(d(0,"span",64),s(1),o()),i&2){let e=c();r(),v(e.kind)}}function Ce(i,t){if(i&1&&(d(0,"div",62)(1,"span",63),s(2),o(),u(3,he,2,1,"span",64),p(4,"span",19),d(5,"span",65),s(6),o(),p(7,"app-copy-btn",66),o(),p(8,"div",67)),i&2){let e=t,n=c(3);r(2),v(e.name),r(),m(e.kind?3:-1),r(3),v(n.fmtArtifactBytes(e.length)),r(),f("text",e.body),r(),f("innerHTML",n.artifactBodyHtml(),$)}}function we(i,t){if(i&1&&(d(0,"div",52)(1,"div",54),k(2,ye,7,5,"button",55,X),o(),d(4,"div",56),u(5,Ce,9,5),o()()),i&2){let e,n=c(2);r(2),D(n.artifacts()),r(3),m((e=n.selectedArtifact())?5:-1,e)}}function ke(i,t){if(i&1&&u(0,_e,3,0,"div",52)(1,xe,3,1,"div",52)(2,be,3,0,"div",52)(3,we,6,1,"div",52),i&2){let e=c();m(e.artifactsLoading()&&e.artifacts().length===0?0:e.artifactsError()?1:e.artifacts().length===0?2:3)}}function De(i,t){i&1&&(d(0,"div",15)(1,"div",68),p(2,"app-icon",69),d(3,"div",70),s(4,"Cost isn\u2019t tracked for workflow runs yet"),o(),d(5,"div",71),s(6," Per-node and per-run cost require capturing model token-usage as each node executes \u2014 that instrumentation isn\u2019t wired into the workflow engine. The Claude-analytics pages (Sessions, Costs) track cost for interactive sessions today. "),o()()()),i&2&&(r(2),f("size",18))}var Me={step_started:"var(--info)",step_completed:"var(--success)",tool_called:"var(--node-code)",agent_message:"var(--node-spec)",artifact_created:"var(--node-route)",approval_requested:"var(--warn)",run_started:"var(--info)",run_completed:"var(--success)",run_failed:"var(--error)",run_cancelled:"var(--text-muted)",run_paused:"var(--warn)"},U=class i{api=w(W);projects=w(L);route=w(B);router=w(V);destroyRef=w(z);sanitizer=w(j);constructor(){A(()=>{let t=this.events().filter(e=>e.eventType==="step_completed").length;this.activeTab()==="artifacts"&&this.runId()&&t!==this.artifactsFor()&&this.loadArtifacts(t)})}runId=g("");run=g(null);events=g([]);loading=g(!0);error=g(null);streamStatus=g("connecting");actionPending=g(null);actionError=g(null);closeStream=null;status=b(()=>this.run()?.status??null);isTerminal=b(()=>{let t=this.status();return t==="completed"||t==="failed"||t==="cancelled"});approvalPending=b(()=>[...this.events()].reverse().find(e=>e.eventType==="approval_requested"||e.eventType==="approval_granted"||e.eventType==="approval_rejected")?.eventType==="approval_requested");TABS=[{id:"events",label:"Events"},{id:"artifacts",label:"Artifacts"},{id:"cost",label:"Cost"}];activeTab=g("events");artifacts=g([]);artifactsLoading=g(!1);artifactsError=g(null);artifactsFor=g(-1);selectedArtifactId=g("");selectedArtifact=b(()=>{let t=this.artifacts();return t.length?t.find(e=>e.nodeId===this.selectedArtifactId())??t[0]:null});artifactBodyHtml=b(()=>{let t=this.selectedArtifact();return this.sanitizer.bypassSecurityTrustHtml(Q(t?.body??""))});async loadArtifacts(t){let e=this.runId();if(e){this.artifactsFor.set(t),this.artifactsLoading.set(!0),this.artifactsError.set(null);try{let n=await this.api.get(`/api/workflows/runs/${encodeURIComponent(e)}/artifacts${this.projects.projectQuery()}`);this.artifacts.set(n.artifacts??[]),!this.selectedArtifactId()&&n.artifacts?.length&&this.selectedArtifactId.set(n.artifacts[0].nodeId)}catch(n){this.artifactsError.set(n instanceof Error?n.message:String(n)),this.artifactsFor.set(-1)}finally{this.artifactsLoading.set(!1)}}}selectArtifact(t){this.selectedArtifactId.set(t)}fmtArtifactBytes(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} kB`:`${(t/(1024*1024)).toFixed(1)} MB`}DAG_W=920;DAG_H=180;dagNodes=b(()=>{let t=this.run(),e=this.stepStatusMap(),n=t?.metadata?.nodes;if(n?.length){let _=this.layoutCols(n.map(x=>x.id));return n.map((x,S)=>{let J=_[S]??S;return{id:x.id,label:x.id,kind:x.kind??"agent",status:e[x.id]??"pending",x:J*160+20,y:72}})}let a=[...new Set(this.events().map(_=>_.data?.stepId??_.stepId??"").filter(Boolean))];if(!a.length)return[];let l=Math.min(160,(this.DAG_W-40)/Math.max(a.length,1));return a.map((_,x)=>({id:_,label:_,kind:this.events().find(S=>(S.data?.stepId??S.stepId)===_)?.stepKind??"step",status:e[_]??"pending",x:x*l+20,y:72}))});dagEdges=b(()=>{let e=this.run()?.metadata?.edges;if(e?.length)return e;let n=this.dagNodes();return n.slice(0,-1).map((a,l)=>({from:a.id,to:n[l+1].id}))});nodeMap=b(()=>{let t={};for(let e of this.dagNodes())t[e.id]=e;return t});selectedNode=g("");stepStatusMap=b(()=>{let t={};for(let e of this.events()){let n=e.data?.stepId??e.stepId??"";if(n)switch(e.eventType){case"step_started":t[n]="running";break;case"step_completed":t[n]="completed";break;case"step_failed":t[n]="failed";break;case"step_skipped":t[n]="skipped";break}}if(this.status()==="paused")for(let e of Object.keys(t))t[e]==="running"&&(t[e]="paused");return t});ngOnInit(){let t=this.route.snapshot.paramMap.get("id")??"";if(!t){this.error.set("No run id"),this.loading.set(!1);return}this.runId.set(t),this.bootstrap(t)}ngOnDestroy(){this.closeStream?.(),this.closeStream=null}async bootstrap(t){try{let e=await this.api.get(`/api/workflows/runs/${encodeURIComponent(t)}${this.projects.projectQuery()}`);this.run.set(e.run),this.events.set(e.events??[]),this.loading.set(!1),this.isTerminal()?this.streamStatus.set("closed"):this.openStream(t)}catch(e){this.error.set(e instanceof Error?e.message:String(e)),this.loading.set(!1)}}openStream(t){this.streamStatus.set("connecting");let e=this.api.openEventStream(`/api/workflows/runs/${encodeURIComponent(t)}/events${this.projects.projectQuery()}`,(n,a)=>{if(n==="done"){this.streamStatus.set("closed"),this.refreshRun();return}let l=a;!l||typeof l!="object"||l.id==null||(this.streamStatus.set("live"),this.appendEvent(l),n.startsWith("run_")&&this.refreshRun())},()=>{this.streamStatus.set("error")});this.closeStream=e,this.destroyRef.onDestroy(()=>e())}appendEvent(t){this.events.update(e=>{if(e.some(a=>a.id===t.id))return e;let n=[...e,t];return n.sort((a,l)=>a.id-l.id),n})}async refreshRun(){try{let t=this.runId();if(!t)return;let e=await this.api.get(`/api/workflows/runs/${encodeURIComponent(t)}${this.projects.projectQuery()}`);this.run.set(e.run)}catch{}}async approve(){await this.action("approve")}async reject(){let t=prompt("Reason for rejecting?")??void 0;await this.action("reject",t?{reason:t}:void 0)}async cancel(){confirm("Cancel this run?")&&await this.action("cancel")}async resume(){await this.action("resume")}async action(t,e){this.actionPending.set(t),this.actionError.set(null);try{await this.api.post(`/api/workflows/runs/${encodeURIComponent(this.runId())}/${t}${this.projects.projectQuery()}`,e??{}),await this.refreshRun(),(t==="resume"||t==="approve")&&!this.isTerminal()&&!this.closeStream&&this.openStream(this.runId())}catch(n){this.actionError.set(n instanceof Error?n.message:String(n))}finally{this.actionPending.set(null)}}fmtTime(t){return t?new Date(t).toLocaleTimeString():"\u2014"}fmtDuration(t,e){if(!t)return"\u2014";let a=(e??Date.now())-t;return a>=6e4?Math.round(a/6e4)+"m "+Math.round(a%6e4/1e3)+"s":a>=1e3?(a/1e3).toFixed(1)+"s":a+"ms"}eventDetail(t){let e=t.data;if(!e)return"";let n=l=>l.length>200?l.slice(0,200)+"\u2026":l;if(typeof e.error=="string")return e.error;if(typeof e.text=="string")return n(e.text);if(typeof e.name=="string"){let l=typeof e.input=="string"?e.input:"";return n(l?`${e.name} ${l}`:e.name)}let a=e.output;if(typeof a=="string")return n(a);if(a!=null)try{return n(JSON.stringify(a))}catch{return""}return""}stepIdOf(t){return t.data?.stepId??t.stepId??""}evColor(t){return Me[t]??"var(--text-secondary)"}back(){this.router.navigate(["/runs"])}edgePath(t,e){let n=t.x+150,a=t.y+18,l=e.x,_=e.y+18,x=(n+l)/2;return`M ${n} ${a} C ${x} ${a}, ${x} ${_}, ${l} ${_}`}nodeBorderColor(t){return this.selectedNode()===t.id?"var(--accent)":t.status==="pending"||t.status==="skipped"?"var(--border-subtle)":{running:"var(--info)",completed:"var(--success)",failed:"var(--error)",paused:"var(--warn)"}[t.status]??"var(--border-subtle)"}nodeBoxShadow(t){return t.status==="running"?"0 0 0 3px var(--info-soft)":this.selectedNode()===t.id?"0 4px 14px rgba(0,0,0,0.4)":"none"}nodeDotBg(t){return t.status==="completed"?"var(--success)":t.status==="failed"?"var(--error)":t.status==="paused"?"var(--warn)":"transparent"}nodeDotBorder(t){return t.status==="pending"||t.status==="running"||t.status==="skipped"?`1.5px solid ${{pending:"var(--text-muted)",running:"var(--info)",skipped:"var(--text-muted)"}[t.status]}`:"none"}layoutCols(t){return t.map((e,n)=>n)}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=F({type:i,selectors:[["app-run-detail"]],decls:27,vars:10,consts:[[1,"col","rd-root"],[1,"row","gap-10","rd-head"],["type","button",1,"btn","btn-ghost","btn-sm",3,"click"],["name","chevronLeft",3,"size"],[1,"rd-banner","rd-banner-error"],[1,"row","gap-12","rd-approval"],[1,"rd-dag"],["width","100%",1,"rd-dag-svg"],["id","rarrow","viewBox","0 0 10 10","refX","8","refY","5","markerWidth","6","markerHeight","6","orient","auto-start-reverse"],["d","M0 0 L10 5 L0 10 z","fill","rgba(160,170,190,0.6)"],["role","button",1,"rd-node",3,"rd-node-running","rd-node-selected","rd-node-pending","rd-node-skipped","left","top","border-color","box-shadow"],[1,"col","rd-panel"],[1,"row","gap-2","rd-tabs"],["type","button",1,"rd-tab",3,"rd-tab-active"],["aria-live","polite",1,"scroll-y","rd-events"],[1,"rd-cost-wrap"],[1,"mono","rd-wf-name"],[1,"mono","muted",2,"font-size","11.5px"],[3,"state","pulse"],[1,"grow"],[1,"mono","muted","row","gap-4",2,"font-size","11.5px"],["name","clock",3,"size"],["type","button",1,"btn","btn-destructive","btn-sm",3,"disabled"],["type","button",1,"btn","btn-destructive","btn-sm",3,"click","disabled"],["name","cancel",3,"size"],[1,"muted",2,"font-size","12px"],[1,"rd-error"],[2,"color","var(--warn)","flex-shrink","0"],["name","pause",3,"size"],[2,"font-weight","600","font-size","13px"],[1,"secondary",2,"font-size","12px","margin-top","1px"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["type","button",1,"btn","btn-primary","btn-sm",3,"click","disabled"],["name","check",3,"size"],["fill","none","stroke-width","1.6","marker-end","url(#rarrow)"],["role","button",1,"rd-node",3,"click"],[1,"rd-node-dot"],["name","check",2,"color","#fff",3,"size"],["name","x",2,"color","#fff",3,"size"],["name","pause",2,"color","#fff",3,"size"],[1,"grow",2,"min-width","0"],[1,"rd-node-label"],[1,"mono","muted","rd-node-type"],["type","button",1,"rd-tab",3,"click"],[1,"pill","rd-live-pill"],[1,"row","gap-10","rd-event-row"],[1,"row","gap-6","muted",2,"padding","6px 0"],[1,"muted","tabular","rd-event-time"],[1,"rd-event-kind"],[1,"muted","rd-event-node"],[1,"secondary","rd-event-text"],[1,"rd-stream-dot"],[1,"rd-artifacts"],[1,"muted","rd-art-empty"],[1,"rd-art-list"],["type","button",1,"rd-art-item",3,"active"],[1,"rd-art-body","scroll-y"],["type","button",1,"rd-art-item",3,"click"],["name","box",2,"color","var(--node-route)","flex-shrink","0",3,"size"],[1,"rd-art-meta"],[1,"mono","rd-art-name"],[1,"muted","rd-art-node"],[1,"row","gap-8","rd-art-bodyhead"],[1,"mono","rd-art-bodyname"],[1,"pill","rd-art-kind"],[1,"mono","muted","rd-art-bytes"],[3,"text"],[1,"md-content","rd-art-md",3,"innerHTML"],[1,"rd-cost-empty"],["name","dollar",2,"color","var(--text-muted)",3,"size"],[1,"rd-cost-empty-title"],[1,"muted","rd-cost-empty-body"]],template:function(e,n){if(e&1&&(d(0,"div",0)(1,"div",1)(2,"button",2),y("click",function(){return n.back()}),p(3,"app-icon",3),s(4," Runs "),o(),u(5,Z,10,7)(6,ee,3,0)(7,te,3,1),o(),u(8,ne,2,1,"div",4),u(9,ie,2,1,"div",4),u(10,re,15,4,"div",5),d(11,"div",6),O(),d(12,"svg",7)(13,"defs")(14,"marker",8),p(15,"path",9),o()(),k(16,de,1,1,null,null,K),o(),k(18,pe,10,26,"div",10,I),o(),N(),d(20,"div",11)(21,"div",12),k(22,me,3,4,"button",13,I),o(),u(24,ve,4,1,"div",14),u(25,ke,4,1),u(26,De,7,1,"div",15),o()()),e&2){let a,l;r(3),f("size",14),r(2),m((a=n.run())?5:n.loading()?6:n.error()?7:-1,a),r(3),m(n.actionError()?8:-1),r(),m((l=(l=n.run())==null?null:l.errorMessage)?9:-1,l),r(),m(n.approvalPending()?10:-1),r(2),P("height",n.DAG_H)("viewBox","0 0 "+n.DAG_W+" "+n.DAG_H),r(4),D(n.dagEdges()),r(2),D(n.dagNodes()),r(4),D(n.TABS),r(2),m(n.activeTab()==="events"?24:-1),r(),m(n.activeTab()==="artifacts"?25:-1),r(),m(n.activeTab()==="cost"?26:-1)}},dependencies:[G,q,H],styles:["[_nghost-%COMP%]{display:contents}.rd-root[_ngcontent-%COMP%]{flex:1;min-height:0}.rd-head[_ngcontent-%COMP%]{padding:12px 16px;border-bottom:1px solid var(--border-subtle);flex-shrink:0}.rd-wf-name[_ngcontent-%COMP%]{font-weight:600;font-size:14px}.rd-error[_ngcontent-%COMP%]{color:var(--error);font-size:12px}.rd-banner[_ngcontent-%COMP%]{padding:10px 16px;font-size:12.5px;flex-shrink:0}.rd-banner-error[_ngcontent-%COMP%]{background:var(--error-soft);color:var(--error);border-bottom:1px solid color-mix(in srgb,var(--error) 30%,transparent)}.rd-approval[_ngcontent-%COMP%]{padding:12px 16px;background:var(--warn-soft);border-bottom:1px solid rgba(229,165,10,.3);flex-shrink:0}.rd-dag[_ngcontent-%COMP%]{position:relative;height:180px;background:var(--bg-canvas-2, var(--bg-canvas));background-image:radial-gradient(circle,var(--dot-grid, rgba(255, 255, 255, .07)) 1px,transparent 1px);background-size:20px 20px;border-bottom:1px solid var(--border-subtle);overflow:hidden;flex-shrink:0}.rd-dag-svg[_ngcontent-%COMP%]{position:absolute;inset:0;pointer-events:none}.rd-node[_ngcontent-%COMP%]{position:absolute;width:150px;height:36px;display:flex;align-items:center;gap:8px;padding:0 11px;border-radius:8px;background:var(--bg-panel);border:1.5px solid var(--border-subtle);cursor:pointer;transition:border-color .12s,box-shadow .12s}.rd-node[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.rd-node-running[_ngcontent-%COMP%]{background:var(--info-soft)}.rd-node-pending[_ngcontent-%COMP%]{opacity:.6}.rd-node-skipped[_ngcontent-%COMP%]{border-style:dotted}.rd-node-dot[_ngcontent-%COMP%]{width:18px;height:18px;border-radius:50%;display:grid;place-items:center;flex-shrink:0}.rd-dot-spin[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_rd-spin 1.4s linear infinite;border-top-color:transparent!important}@keyframes _ngcontent-%COMP%_rd-spin{to{transform:rotate(360deg)}}.rd-node-label[_ngcontent-%COMP%]{font-size:12px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rd-node-type[_ngcontent-%COMP%]{font-size:9px}.rd-panel[_ngcontent-%COMP%]{flex:1;min-height:0}.rd-tabs[_ngcontent-%COMP%]{padding:8px 14px 0;border-bottom:1px solid var(--border-subtle);flex-shrink:0}.rd-tab[_ngcontent-%COMP%]{padding:7px 13px;border:none;background:transparent;cursor:pointer;font-size:12.5px;font-weight:500;font-family:var(--font-ui);text-transform:capitalize;color:var(--text-muted);border-bottom:2px solid transparent;margin-bottom:-1px;display:inline-flex;align-items:center;gap:6px;transition:color .1s}.rd-tab[_ngcontent-%COMP%]:hover{color:var(--text-secondary)}.rd-tab-active[_ngcontent-%COMP%]{color:var(--text-primary);border-bottom-color:var(--accent)}.rd-live-pill[_ngcontent-%COMP%]{font-size:9px;background:var(--info-soft);color:var(--info)}.rd-events[_ngcontent-%COMP%]{flex:1;padding:8px 14px;font-family:var(--font-mono);font-size:11.5px;min-height:0}.rd-event-row[_ngcontent-%COMP%]{padding:4px 0;border-bottom:1px solid rgba(255,255,255,.03)}.rd-event-time[_ngcontent-%COMP%]{flex-shrink:0;width:80px;font-size:11px}.rd-event-kind[_ngcontent-%COMP%]{width:132px;flex-shrink:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rd-event-node[_ngcontent-%COMP%]{flex-shrink:0;width:80px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px}.rd-event-text[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.rd-stream-dot[_ngcontent-%COMP%]{width:6px;height:6px;border-radius:50%;background:var(--info);animation:_ngcontent-%COMP%_rd-pulse 1s infinite}@keyframes _ngcontent-%COMP%_rd-pulse{0%,to{opacity:1}50%{opacity:.3}}.rd-artifacts[_ngcontent-%COMP%]{flex:1;min-height:0;display:flex}.rd-art-empty[_ngcontent-%COMP%]{margin:auto;padding:40px;text-align:center;font-size:12.5px}.rd-art-list[_ngcontent-%COMP%]{width:180px;flex-shrink:0;border-right:1px solid var(--border-subtle);padding:8px;overflow-y:auto;display:flex;flex-direction:column;gap:2px}.rd-art-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;width:100%;padding:7px 9px;border-radius:6px;background:transparent;border:0;cursor:pointer;text-align:left;color:inherit}.rd-art-item[_ngcontent-%COMP%]:hover, .rd-art-item.active[_ngcontent-%COMP%]{background:var(--bg-hover)}.rd-art-item[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.rd-art-meta[_ngcontent-%COMP%]{min-width:0;display:flex;flex-direction:column}.rd-art-name[_ngcontent-%COMP%]{font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rd-art-node[_ngcontent-%COMP%]{font-size:9.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rd-art-body[_ngcontent-%COMP%]{flex:1;min-width:0;padding:14px 16px}.rd-art-bodyhead[_ngcontent-%COMP%]{align-items:center;margin-bottom:10px}.rd-art-bodyname[_ngcontent-%COMP%]{font-size:12.5px;font-weight:600}.rd-art-kind[_ngcontent-%COMP%]{font-size:10px;color:var(--text-secondary);background:var(--bg-canvas);border:1px solid var(--border-subtle)}.rd-art-bytes[_ngcontent-%COMP%]{font-size:10.5px}.rd-art-md[_ngcontent-%COMP%]{font-size:12.5px;line-height:1.65}.rd-cost-wrap[_ngcontent-%COMP%]{flex:1;min-height:0;display:flex;padding:16px}.rd-cost-empty[_ngcontent-%COMP%]{margin:auto;max-width:420px;text-align:center;display:flex;flex-direction:column;align-items:center;gap:8px}.rd-cost-empty-title[_ngcontent-%COMP%]{font-size:13px;font-weight:600}.rd-cost-empty-body[_ngcontent-%COMP%]{font-size:12px;line-height:1.55}"],changeDetection:0})};export{U as RunDetail};
|
|
1
|
+
import{a as Q}from"./chunk-G7VZT5KB.js";import{a as q}from"./chunk-PZSU53SS.js";import{b as G}from"./chunk-WBJ5VEB5.js";import{a as B,c as V}from"./chunk-DOKZOFKM.js";import{a as L}from"./chunk-JGDK6YKG.js";import{a as W}from"./chunk-TWVVIWKO.js";import{Aa as p,Ga as M,I as w,Ia as y,Ka as c,M as h,N as C,O,P as N,R as z,Ta as T,Ua as R,Va as s,W as g,Wa as v,X as A,Xa as E,aa as $,ea as r,ka as F,lb as b,qa as P,ra as u,sa as m,va as k,wa as D,xa as f,ya as d,yb as j,za as o,zb as H}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var K=(i,t)=>t.from+t.to,I=(i,t)=>t.id,X=(i,t)=>t.nodeId;function Y(i,t){if(i&1){let e=M();d(0,"button",23),y("click",function(){h(e);let a=c(2);return C(a.cancel())}),p(1,"app-icon",24),s(2," Cancel "),o()}if(i&2){let e=c(2);f("disabled",e.actionPending()!==null),r(),f("size",12)}}function Z(i,t){if(i&1&&(d(0,"span",16),s(1),o(),d(2,"span",17),s(3),o(),p(4,"app-state-pill",18)(5,"span",19),d(6,"span",20),p(7,"app-icon",21),s(8),o(),u(9,Y,3,2,"button",22)),i&2){let e=t,n=c();r(),v(e.workflowName),r(2),v(e.id.slice(0,8)),r(),f("state",e.status)("pulse",e.status==="running"),r(3),f("size",11),r(),E(" ",n.fmtDuration(e.startedAt,e.completedAt)," "),r(),m(e.status==="running"||e.status==="paused"?9:-1)}}function ee(i,t){i&1&&(d(0,"span",25),s(1,"Loading\u2026"),o(),p(2,"span",19))}function te(i,t){if(i&1&&(d(0,"span",26),s(1),o(),p(2,"span",19)),i&2){let e=c();r(),v(e.error())}}function ne(i,t){if(i&1&&(d(0,"div",4),s(1),o()),i&2){let e=c();r(),E("Action failed: ",e.actionError())}}function ie(i,t){i&1&&(d(0,"div",4),s(1),o()),i&2&&(r(),v(t))}function re(i,t){if(i&1){let e=M();d(0,"div",5)(1,"span",27),p(2,"app-icon",28),o(),d(3,"div",19)(4,"div",29),s(5,"Approval required \u2014 review diff before merge"),o(),d(6,"div",30),s(7," Review the artifacts carefully before approving. "),o()(),d(8,"button",31),y("click",function(){h(e);let a=c();return C(a.activeTab.set("artifacts"))}),s(9," Inspect artifacts "),o(),d(10,"button",23),y("click",function(){h(e);let a=c();return C(a.reject())}),s(11," Reject "),o(),d(12,"button",32),y("click",function(){h(e);let a=c();return C(a.approve())}),p(13,"app-icon",33),s(14," Approve "),o()()}if(i&2){let e=c();r(2),f("size",18),r(8),f("disabled",e.actionPending()!==null),r(2),f("disabled",e.actionPending()!==null),r(),f("size",13)}}function ae(i,t){if(i&1&&(O(),p(0,"path",34)),i&2){let e=c(),n=c(2);P("d",n.edgePath(e,t))("stroke",e.status==="completed"?"var(--success)":"rgba(150,160,180,0.4)")("opacity",e.status==="completed"?"0.7":"0.5")}}function oe(i,t){if(i&1&&u(0,ae,1,3,":svg:path",34),i&2){let e,n=c().$implicit,a=c();m((e=a.nodeMap()[n.to])?0:-1,e)}}function de(i,t){if(i&1&&u(0,oe,1,1),i&2){let e,n=t.$implicit,a=c();m((e=a.nodeMap()[n.from])?0:-1,e)}}function se(i,t){i&1&&p(0,"app-icon",37),i&2&&f("size",11)}function le(i,t){i&1&&p(0,"app-icon",38),i&2&&f("size",11)}function ce(i,t){i&1&&p(0,"app-icon",39),i&2&&f("size",10)}function pe(i,t){if(i&1){let e=M();d(0,"div",35),y("click",function(){let a=h(e).$implicit,l=c();return C(l.selectedNode.set(a.id))}),d(1,"span",36),u(2,se,1,1,"app-icon",37)(3,le,1,1,"app-icon",38)(4,ce,1,1,"app-icon",39),o(),d(5,"div",40)(6,"div",41),s(7),o(),d(8,"div",42),s(9),o()()()}if(i&2){let e=t.$implicit,n=c();T("left",e.x/n.DAG_W*100,"%")("top",e.y,"px")("border-color",n.nodeBorderColor(e))("box-shadow",n.nodeBoxShadow(e)),R("rd-node-running",e.status==="running")("rd-node-selected",n.selectedNode()===e.id)("rd-node-pending",e.status==="pending")("rd-node-skipped",e.status==="skipped"),P("aria-label",e.id),r(),T("background",n.nodeDotBg(e))("border",n.nodeDotBorder(e)),R("rd-dot-spin",e.status==="running"),r(),m(e.status==="completed"?2:e.status==="failed"?3:e.status==="paused"?4:-1),r(5),v(e.label),r(2),v(e.kind)}}function ue(i,t){i&1&&(d(0,"span",44),s(1,"live"),o())}function me(i,t){if(i&1){let e=M();d(0,"button",43),y("click",function(){let a=h(e).$implicit,l=c();return C(l.activeTab.set(a.id))}),s(1),u(2,ue,2,0,"span",44),o()}if(i&2){let e=t.$implicit,n=c();R("rd-tab-active",n.activeTab()===e.id),r(),E(" ",e.label," "),r(),m(e.id==="events"&&n.streamStatus()==="live"?2:-1)}}function fe(i,t){if(i&1&&(d(0,"div",45)(1,"span",47),s(2),o(),d(3,"span",48),s(4),o(),d(5,"span",49),s(6),o(),d(7,"span",50),s(8),o()()),i&2){let e=t.$implicit,n=c(2);P("data-event-type",e.eventType),r(2),v(n.fmtTime(e.createdAt)),r(),T("color",n.evColor(e.eventType)),r(),v(e.eventType),r(2),v(n.stepIdOf(e)),r(2),v(n.eventDetail(e))}}function ge(i,t){i&1&&(d(0,"div",46),p(1,"span",51),s(2," streaming\u2026 "),o())}function ve(i,t){if(i&1&&(d(0,"div",14),k(1,fe,9,7,"div",45,I),u(3,ge,3,0,"div",46),o()),i&2){let e=c();r(),D(e.events()),r(2),m(e.streamStatus()==="live"||e.streamStatus()==="connecting"?3:-1)}}function _e(i,t){i&1&&(d(0,"div",52)(1,"div",53),s(2,"Loading artifacts\u2026"),o()())}function xe(i,t){if(i&1&&(d(0,"div",52)(1,"div",53),s(2),o()()),i&2){let e=c(2);r(2),E("Couldn\u2019t load artifacts: ",e.artifactsError())}}function be(i,t){i&1&&(d(0,"div",52)(1,"div",53),s(2,"No artifacts yet \u2014 nodes write their output here as they complete."),o()())}function ye(i,t){if(i&1){let e=M();d(0,"button",57),y("click",function(){let a=h(e).$implicit,l=c(3);return C(l.selectArtifact(a.nodeId))}),p(1,"app-icon",58),d(2,"span",59)(3,"span",60),s(4),o(),d(5,"span",61),s(6),o()()()}if(i&2){let e,n=t.$implicit,a=c(3);R("active",((e=a.selectedArtifact())==null?null:e.nodeId)===n.nodeId),r(),f("size",13),r(3),v(n.name),r(2),v(n.nodeId)}}function he(i,t){if(i&1&&(d(0,"span",64),s(1),o()),i&2){let e=c();r(),v(e.kind)}}function Ce(i,t){if(i&1&&(d(0,"div",62)(1,"span",63),s(2),o(),u(3,he,2,1,"span",64),p(4,"span",19),d(5,"span",65),s(6),o(),p(7,"app-copy-btn",66),o(),p(8,"div",67)),i&2){let e=t,n=c(3);r(2),v(e.name),r(),m(e.kind?3:-1),r(3),v(n.fmtArtifactBytes(e.length)),r(),f("text",e.body),r(),f("innerHTML",n.artifactBodyHtml(),$)}}function we(i,t){if(i&1&&(d(0,"div",52)(1,"div",54),k(2,ye,7,5,"button",55,X),o(),d(4,"div",56),u(5,Ce,9,5),o()()),i&2){let e,n=c(2);r(2),D(n.artifacts()),r(3),m((e=n.selectedArtifact())?5:-1,e)}}function ke(i,t){if(i&1&&u(0,_e,3,0,"div",52)(1,xe,3,1,"div",52)(2,be,3,0,"div",52)(3,we,6,1,"div",52),i&2){let e=c();m(e.artifactsLoading()&&e.artifacts().length===0?0:e.artifactsError()?1:e.artifacts().length===0?2:3)}}function De(i,t){i&1&&(d(0,"div",15)(1,"div",68),p(2,"app-icon",69),d(3,"div",70),s(4,"Cost isn\u2019t tracked for workflow runs yet"),o(),d(5,"div",71),s(6," Per-node and per-run cost require capturing model token-usage as each node executes \u2014 that instrumentation isn\u2019t wired into the workflow engine. The Claude-analytics pages (Sessions, Costs) track cost for interactive sessions today. "),o()()()),i&2&&(r(2),f("size",18))}var Me={step_started:"var(--info)",step_completed:"var(--success)",tool_called:"var(--node-code)",agent_message:"var(--node-spec)",artifact_created:"var(--node-route)",approval_requested:"var(--warn)",run_started:"var(--info)",run_completed:"var(--success)",run_failed:"var(--error)",run_cancelled:"var(--text-muted)",run_paused:"var(--warn)"},U=class i{api=w(W);projects=w(L);route=w(B);router=w(V);destroyRef=w(z);sanitizer=w(j);constructor(){A(()=>{let t=this.events().filter(e=>e.eventType==="step_completed").length;this.activeTab()==="artifacts"&&this.runId()&&t!==this.artifactsFor()&&this.loadArtifacts(t)})}runId=g("");run=g(null);events=g([]);loading=g(!0);error=g(null);streamStatus=g("connecting");actionPending=g(null);actionError=g(null);closeStream=null;status=b(()=>this.run()?.status??null);isTerminal=b(()=>{let t=this.status();return t==="completed"||t==="failed"||t==="cancelled"});approvalPending=b(()=>[...this.events()].reverse().find(e=>e.eventType==="approval_requested"||e.eventType==="approval_granted"||e.eventType==="approval_rejected")?.eventType==="approval_requested");TABS=[{id:"events",label:"Events"},{id:"artifacts",label:"Artifacts"},{id:"cost",label:"Cost"}];activeTab=g("events");artifacts=g([]);artifactsLoading=g(!1);artifactsError=g(null);artifactsFor=g(-1);selectedArtifactId=g("");selectedArtifact=b(()=>{let t=this.artifacts();return t.length?t.find(e=>e.nodeId===this.selectedArtifactId())??t[0]:null});artifactBodyHtml=b(()=>{let t=this.selectedArtifact();return this.sanitizer.bypassSecurityTrustHtml(Q(t?.body??""))});async loadArtifacts(t){let e=this.runId();if(e){this.artifactsFor.set(t),this.artifactsLoading.set(!0),this.artifactsError.set(null);try{let n=await this.api.get(`/api/workflows/runs/${encodeURIComponent(e)}/artifacts${this.projects.projectQuery()}`);this.artifacts.set(n.artifacts??[]),!this.selectedArtifactId()&&n.artifacts?.length&&this.selectedArtifactId.set(n.artifacts[0].nodeId)}catch(n){this.artifactsError.set(n instanceof Error?n.message:String(n)),this.artifactsFor.set(-1)}finally{this.artifactsLoading.set(!1)}}}selectArtifact(t){this.selectedArtifactId.set(t)}fmtArtifactBytes(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} kB`:`${(t/(1024*1024)).toFixed(1)} MB`}DAG_W=920;DAG_H=180;dagNodes=b(()=>{let t=this.run(),e=this.stepStatusMap(),n=t?.metadata?.nodes;if(n?.length){let _=this.layoutCols(n.map(x=>x.id));return n.map((x,S)=>{let J=_[S]??S;return{id:x.id,label:x.id,kind:x.kind??"agent",status:e[x.id]??"pending",x:J*160+20,y:72}})}let a=[...new Set(this.events().map(_=>_.data?.stepId??_.stepId??"").filter(Boolean))];if(!a.length)return[];let l=Math.min(160,(this.DAG_W-40)/Math.max(a.length,1));return a.map((_,x)=>({id:_,label:_,kind:this.events().find(S=>(S.data?.stepId??S.stepId)===_)?.stepKind??"step",status:e[_]??"pending",x:x*l+20,y:72}))});dagEdges=b(()=>{let e=this.run()?.metadata?.edges;if(e?.length)return e;let n=this.dagNodes();return n.slice(0,-1).map((a,l)=>({from:a.id,to:n[l+1].id}))});nodeMap=b(()=>{let t={};for(let e of this.dagNodes())t[e.id]=e;return t});selectedNode=g("");stepStatusMap=b(()=>{let t={};for(let e of this.events()){let n=e.data?.stepId??e.stepId??"";if(n)switch(e.eventType){case"step_started":t[n]="running";break;case"step_completed":t[n]="completed";break;case"step_failed":t[n]="failed";break;case"step_skipped":t[n]="skipped";break}}if(this.status()==="paused")for(let e of Object.keys(t))t[e]==="running"&&(t[e]="paused");return t});ngOnInit(){let t=this.route.snapshot.paramMap.get("id")??"";if(!t){this.error.set("No run id"),this.loading.set(!1);return}this.runId.set(t),this.bootstrap(t)}ngOnDestroy(){this.closeStream?.(),this.closeStream=null}async bootstrap(t){try{let e=await this.api.get(`/api/workflows/runs/${encodeURIComponent(t)}${this.projects.projectQuery()}`);this.run.set(e.run),this.events.set(e.events??[]),this.loading.set(!1),this.isTerminal()?this.streamStatus.set("closed"):this.openStream(t)}catch(e){this.error.set(e instanceof Error?e.message:String(e)),this.loading.set(!1)}}openStream(t){this.streamStatus.set("connecting");let e=this.api.openEventStream(`/api/workflows/runs/${encodeURIComponent(t)}/events${this.projects.projectQuery()}`,(n,a)=>{if(n==="done"){this.streamStatus.set("closed"),this.refreshRun();return}let l=a;!l||typeof l!="object"||l.id==null||(this.streamStatus.set("live"),this.appendEvent(l),n.startsWith("run_")&&this.refreshRun())},()=>{this.streamStatus.set("error")});this.closeStream=e,this.destroyRef.onDestroy(()=>e())}appendEvent(t){this.events.update(e=>{if(e.some(a=>a.id===t.id))return e;let n=[...e,t];return n.sort((a,l)=>a.id-l.id),n})}async refreshRun(){try{let t=this.runId();if(!t)return;let e=await this.api.get(`/api/workflows/runs/${encodeURIComponent(t)}${this.projects.projectQuery()}`);this.run.set(e.run)}catch{}}async approve(){await this.action("approve")}async reject(){let t=prompt("Reason for rejecting?")??void 0;await this.action("reject",t?{reason:t}:void 0)}async cancel(){confirm("Cancel this run?")&&await this.action("cancel")}async resume(){await this.action("resume")}async action(t,e){this.actionPending.set(t),this.actionError.set(null);try{await this.api.post(`/api/workflows/runs/${encodeURIComponent(this.runId())}/${t}${this.projects.projectQuery()}`,e??{}),await this.refreshRun(),(t==="resume"||t==="approve")&&!this.isTerminal()&&!this.closeStream&&this.openStream(this.runId())}catch(n){this.actionError.set(n instanceof Error?n.message:String(n))}finally{this.actionPending.set(null)}}fmtTime(t){return t?new Date(t).toLocaleTimeString():"\u2014"}fmtDuration(t,e){if(!t)return"\u2014";let a=(e??Date.now())-t;return a>=6e4?Math.round(a/6e4)+"m "+Math.round(a%6e4/1e3)+"s":a>=1e3?(a/1e3).toFixed(1)+"s":a+"ms"}eventDetail(t){let e=t.data;if(!e)return"";let n=l=>l.length>200?l.slice(0,200)+"\u2026":l;if(typeof e.error=="string")return e.error;if(typeof e.text=="string")return n(e.text);if(typeof e.name=="string"){let l=typeof e.input=="string"?e.input:"";return n(l?`${e.name} ${l}`:e.name)}let a=e.output;if(typeof a=="string")return n(a);if(a!=null)try{return n(JSON.stringify(a))}catch{return""}return""}stepIdOf(t){return t.data?.stepId??t.stepId??""}evColor(t){return Me[t]??"var(--text-secondary)"}back(){this.router.navigate(["/runs"])}edgePath(t,e){let n=t.x+150,a=t.y+18,l=e.x,_=e.y+18,x=(n+l)/2;return`M ${n} ${a} C ${x} ${a}, ${x} ${_}, ${l} ${_}`}nodeBorderColor(t){return this.selectedNode()===t.id?"var(--accent)":t.status==="pending"||t.status==="skipped"?"var(--border-subtle)":{running:"var(--info)",completed:"var(--success)",failed:"var(--error)",paused:"var(--warn)"}[t.status]??"var(--border-subtle)"}nodeBoxShadow(t){return t.status==="running"?"0 0 0 3px var(--info-soft)":this.selectedNode()===t.id?"0 4px 14px rgba(0,0,0,0.4)":"none"}nodeDotBg(t){return t.status==="completed"?"var(--success)":t.status==="failed"?"var(--error)":t.status==="paused"?"var(--warn)":"transparent"}nodeDotBorder(t){return t.status==="pending"||t.status==="running"||t.status==="skipped"?`1.5px solid ${{pending:"var(--text-muted)",running:"var(--info)",skipped:"var(--text-muted)"}[t.status]}`:"none"}layoutCols(t){return t.map((e,n)=>n)}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=F({type:i,selectors:[["app-run-detail"]],decls:27,vars:10,consts:[[1,"col","rd-root"],[1,"row","gap-10","rd-head"],["type","button",1,"btn","btn-ghost","btn-sm",3,"click"],["name","chevronLeft",3,"size"],[1,"rd-banner","rd-banner-error"],[1,"row","gap-12","rd-approval"],[1,"rd-dag"],["width","100%",1,"rd-dag-svg"],["id","rarrow","viewBox","0 0 10 10","refX","8","refY","5","markerWidth","6","markerHeight","6","orient","auto-start-reverse"],["d","M0 0 L10 5 L0 10 z","fill","rgba(160,170,190,0.6)"],["role","button",1,"rd-node",3,"rd-node-running","rd-node-selected","rd-node-pending","rd-node-skipped","left","top","border-color","box-shadow"],[1,"col","rd-panel"],[1,"row","gap-2","rd-tabs"],["type","button",1,"rd-tab",3,"rd-tab-active"],["aria-live","polite",1,"scroll-y","rd-events"],[1,"rd-cost-wrap"],[1,"mono","rd-wf-name"],[1,"mono","muted",2,"font-size","11.5px"],[3,"state","pulse"],[1,"grow"],[1,"mono","muted","row","gap-4",2,"font-size","11.5px"],["name","clock",3,"size"],["type","button",1,"btn","btn-destructive","btn-sm",3,"disabled"],["type","button",1,"btn","btn-destructive","btn-sm",3,"click","disabled"],["name","cancel",3,"size"],[1,"muted",2,"font-size","12px"],[1,"rd-error"],[2,"color","var(--warn)","flex-shrink","0"],["name","pause",3,"size"],[2,"font-weight","600","font-size","13px"],[1,"secondary",2,"font-size","12px","margin-top","1px"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["type","button",1,"btn","btn-primary","btn-sm",3,"click","disabled"],["name","check",3,"size"],["fill","none","stroke-width","1.6","marker-end","url(#rarrow)"],["role","button",1,"rd-node",3,"click"],[1,"rd-node-dot"],["name","check",2,"color","#fff",3,"size"],["name","x",2,"color","#fff",3,"size"],["name","pause",2,"color","#fff",3,"size"],[1,"grow",2,"min-width","0"],[1,"rd-node-label"],[1,"mono","muted","rd-node-type"],["type","button",1,"rd-tab",3,"click"],[1,"pill","rd-live-pill"],[1,"row","gap-10","rd-event-row"],[1,"row","gap-6","muted",2,"padding","6px 0"],[1,"muted","tabular","rd-event-time"],[1,"rd-event-kind"],[1,"muted","rd-event-node"],[1,"secondary","rd-event-text"],[1,"rd-stream-dot"],[1,"rd-artifacts"],[1,"muted","rd-art-empty"],[1,"rd-art-list"],["type","button",1,"rd-art-item",3,"active"],[1,"rd-art-body","scroll-y"],["type","button",1,"rd-art-item",3,"click"],["name","box",2,"color","var(--node-route)","flex-shrink","0",3,"size"],[1,"rd-art-meta"],[1,"mono","rd-art-name"],[1,"muted","rd-art-node"],[1,"row","gap-8","rd-art-bodyhead"],[1,"mono","rd-art-bodyname"],[1,"pill","rd-art-kind"],[1,"mono","muted","rd-art-bytes"],[3,"text"],[1,"md-content","rd-art-md",3,"innerHTML"],[1,"rd-cost-empty"],["name","dollar",2,"color","var(--text-muted)",3,"size"],[1,"rd-cost-empty-title"],[1,"muted","rd-cost-empty-body"]],template:function(e,n){if(e&1&&(d(0,"div",0)(1,"div",1)(2,"button",2),y("click",function(){return n.back()}),p(3,"app-icon",3),s(4," Runs "),o(),u(5,Z,10,7)(6,ee,3,0)(7,te,3,1),o(),u(8,ne,2,1,"div",4),u(9,ie,2,1,"div",4),u(10,re,15,4,"div",5),d(11,"div",6),O(),d(12,"svg",7)(13,"defs")(14,"marker",8),p(15,"path",9),o()(),k(16,de,1,1,null,null,K),o(),k(18,pe,10,26,"div",10,I),o(),N(),d(20,"div",11)(21,"div",12),k(22,me,3,4,"button",13,I),o(),u(24,ve,4,1,"div",14),u(25,ke,4,1),u(26,De,7,1,"div",15),o()()),e&2){let a,l;r(3),f("size",14),r(2),m((a=n.run())?5:n.loading()?6:n.error()?7:-1,a),r(3),m(n.actionError()?8:-1),r(),m((l=(l=n.run())==null?null:l.errorMessage)?9:-1,l),r(),m(n.approvalPending()?10:-1),r(2),P("height",n.DAG_H)("viewBox","0 0 "+n.DAG_W+" "+n.DAG_H),r(4),D(n.dagEdges()),r(2),D(n.dagNodes()),r(4),D(n.TABS),r(2),m(n.activeTab()==="events"?24:-1),r(),m(n.activeTab()==="artifacts"?25:-1),r(),m(n.activeTab()==="cost"?26:-1)}},dependencies:[G,q,H],styles:["[_nghost-%COMP%]{display:contents}.rd-root[_ngcontent-%COMP%]{flex:1;min-height:0}.rd-head[_ngcontent-%COMP%]{padding:12px 16px;border-bottom:1px solid var(--border-subtle);flex-shrink:0}.rd-wf-name[_ngcontent-%COMP%]{font-weight:600;font-size:14px}.rd-error[_ngcontent-%COMP%]{color:var(--error);font-size:12px}.rd-banner[_ngcontent-%COMP%]{padding:10px 16px;font-size:12.5px;flex-shrink:0}.rd-banner-error[_ngcontent-%COMP%]{background:var(--error-soft);color:var(--error);border-bottom:1px solid color-mix(in srgb,var(--error) 30%,transparent)}.rd-approval[_ngcontent-%COMP%]{padding:12px 16px;background:var(--warn-soft);border-bottom:1px solid rgba(229,165,10,.3);flex-shrink:0}.rd-dag[_ngcontent-%COMP%]{position:relative;height:180px;background:var(--bg-canvas-2, var(--bg-canvas));background-image:radial-gradient(circle,var(--dot-grid, rgba(255, 255, 255, .07)) 1px,transparent 1px);background-size:20px 20px;border-bottom:1px solid var(--border-subtle);overflow:hidden;flex-shrink:0}.rd-dag-svg[_ngcontent-%COMP%]{position:absolute;inset:0;pointer-events:none}.rd-node[_ngcontent-%COMP%]{position:absolute;width:150px;height:36px;display:flex;align-items:center;gap:8px;padding:0 11px;border-radius:8px;background:var(--bg-panel);border:1.5px solid var(--border-subtle);cursor:pointer;transition:border-color .12s,box-shadow .12s}.rd-node[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.rd-node-running[_ngcontent-%COMP%]{background:var(--info-soft)}.rd-node-pending[_ngcontent-%COMP%]{opacity:.6}.rd-node-skipped[_ngcontent-%COMP%]{border-style:dotted}.rd-node-dot[_ngcontent-%COMP%]{width:18px;height:18px;border-radius:50%;display:grid;place-items:center;flex-shrink:0}.rd-dot-spin[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_rd-spin 1.4s linear infinite;border-top-color:transparent!important}@keyframes _ngcontent-%COMP%_rd-spin{to{transform:rotate(360deg)}}.rd-node-label[_ngcontent-%COMP%]{font-size:12px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rd-node-type[_ngcontent-%COMP%]{font-size:9px}.rd-panel[_ngcontent-%COMP%]{flex:1;min-height:0}.rd-tabs[_ngcontent-%COMP%]{padding:8px 14px 0;border-bottom:1px solid var(--border-subtle);flex-shrink:0}.rd-tab[_ngcontent-%COMP%]{padding:7px 13px;border:none;background:transparent;cursor:pointer;font-size:12.5px;font-weight:500;font-family:var(--font-ui);text-transform:capitalize;color:var(--text-muted);border-bottom:2px solid transparent;margin-bottom:-1px;display:inline-flex;align-items:center;gap:6px;transition:color .1s}.rd-tab[_ngcontent-%COMP%]:hover{color:var(--text-secondary)}.rd-tab-active[_ngcontent-%COMP%]{color:var(--text-primary);border-bottom-color:var(--accent)}.rd-live-pill[_ngcontent-%COMP%]{font-size:9px;background:var(--info-soft);color:var(--info)}.rd-events[_ngcontent-%COMP%]{flex:1;padding:8px 14px;font-family:var(--font-mono);font-size:11.5px;min-height:0}.rd-event-row[_ngcontent-%COMP%]{padding:4px 0;border-bottom:1px solid rgba(255,255,255,.03)}.rd-event-time[_ngcontent-%COMP%]{flex-shrink:0;width:80px;font-size:11px}.rd-event-kind[_ngcontent-%COMP%]{width:132px;flex-shrink:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rd-event-node[_ngcontent-%COMP%]{flex-shrink:0;width:80px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px}.rd-event-text[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.rd-stream-dot[_ngcontent-%COMP%]{width:6px;height:6px;border-radius:50%;background:var(--info);animation:_ngcontent-%COMP%_rd-pulse 1s infinite}@keyframes _ngcontent-%COMP%_rd-pulse{0%,to{opacity:1}50%{opacity:.3}}.rd-artifacts[_ngcontent-%COMP%]{flex:1;min-height:0;display:flex}.rd-art-empty[_ngcontent-%COMP%]{margin:auto;padding:40px;text-align:center;font-size:12.5px}.rd-art-list[_ngcontent-%COMP%]{width:180px;flex-shrink:0;border-right:1px solid var(--border-subtle);padding:8px;overflow-y:auto;display:flex;flex-direction:column;gap:2px}.rd-art-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;width:100%;padding:7px 9px;border-radius:6px;background:transparent;border:0;cursor:pointer;text-align:left;color:inherit}.rd-art-item[_ngcontent-%COMP%]:hover, .rd-art-item.active[_ngcontent-%COMP%]{background:var(--bg-hover)}.rd-art-item[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.rd-art-meta[_ngcontent-%COMP%]{min-width:0;display:flex;flex-direction:column}.rd-art-name[_ngcontent-%COMP%]{font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rd-art-node[_ngcontent-%COMP%]{font-size:9.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rd-art-body[_ngcontent-%COMP%]{flex:1;min-width:0;padding:14px 16px}.rd-art-bodyhead[_ngcontent-%COMP%]{align-items:center;margin-bottom:10px}.rd-art-bodyname[_ngcontent-%COMP%]{font-size:12.5px;font-weight:600}.rd-art-kind[_ngcontent-%COMP%]{font-size:10px;color:var(--text-secondary);background:var(--bg-canvas);border:1px solid var(--border-subtle)}.rd-art-bytes[_ngcontent-%COMP%]{font-size:10.5px}.rd-art-md[_ngcontent-%COMP%]{font-size:12.5px;line-height:1.65}.rd-cost-wrap[_ngcontent-%COMP%]{flex:1;min-height:0;display:flex;padding:16px}.rd-cost-empty[_ngcontent-%COMP%]{margin:auto;max-width:420px;text-align:center;display:flex;flex-direction:column;align-items:center;gap:8px}.rd-cost-empty-title[_ngcontent-%COMP%]{font-size:13px;font-weight:600}.rd-cost-empty-body[_ngcontent-%COMP%]{font-size:12px;line-height:1.55}"],changeDetection:0})};export{U as RunDetail};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as W}from"./chunk-JLOJCDIY.js";import{a as H}from"./chunk-5NTGUSXJ.js";import{a as L}from"./chunk-SQPYSOV6.js";import{c as B}from"./chunk-DOKZOFKM.js";import{c as A}from"./chunk-PAO2624Y.js";import{a as O}from"./chunk-PBRCKHEQ.js";import{a as E}from"./chunk-3H2EZLZN.js";import{Aa as s,Ga as M,I as w,Ia as m,Ka as d,M as v,N as x,Va as l,W as k,Wa as g,Xa as C,bb as S,da as $,ea as o,ka as R,lb as P,ob as V,pb as N,qa as h,ra as u,sa as f,ua as T,va as b,wa as y,xa as p,ya as r,za as a,zb as D}from"./chunk-SYGIPC2P.js";import{a as j,b as q}from"./chunk-Q7L6LLAK.js";var Y=(t,n)=>n.name;function J(t,n){if(t&1&&(r(0,"div",8),l(1),a()),t&2){let e=d();o(),g(e.workflow().description)}}function K(t,n){t&1&&(r(0,"span",18),l(1,"*"),a())}function X(t,n){if(t&1){let e=M();r(0,"div",16)(1,"label",17),l(2),u(3,K,2,0,"span",18),a(),r(4,"input",19),m("input",function(c){let _=v(e).$implicit,F=d(2);return x(F.setVal(_.name,c.target.value))}),a()()}if(t&2){let e=n.$implicit,i=d(2);o(),h("for","rm-"+e.name),o(),C(" ",e.name),o(),f(e.required?3:-1),o(),p("id","rm-"+e.name)("placeholder",i.placeholderFor(e.name))("value",i.vals()[e.name]||"")}}function Z(t,n){if(t&1&&b(0,X,5,6,"div",16,Y),t&2){let e=d();y(e.inputs())}}function ee(t,n){t&1&&(r(0,"div",9),l(1,"No inputs required."),a())}function te(t,n){if(t&1&&(r(0,"app-pill"),s(1,"app-icon",20),l(2),a()),t&2){let e=n.$implicit;o(),p("size",10),o(),C(" ",e)}}function ne(t,n){if(t&1&&(r(0,"div",10),b(1,te,3,2,"app-pill",null,T),a()),t&2){let e=d();o(),y(e.requires())}}function oe(t,n){if(t&1&&(r(0,"div",11),s(1,"app-icon",21),r(2,"span"),l(3),a()()),t&2){let e=d();o(),p("size",13),o(2),g(e.error())}}var z=class t{workflow=N.required();close=V();api=w(E);projects=w(O);router=w(B);vals=k({});launching=k(!1);error=k(null);inputs=P(()=>this.workflow().inputs??[]);requires=P(()=>this.workflow().requires??[]);placeholderFor(n){return n==="SPEC_ID"?"REQ-AUTH-005":"value\u2026"}setVal(n,e){this.vals.update(i=>q(j({},i),{[n]:e}))}onEscape(){this.launching()||this.close.emit()}onBackdrop(){this.launching()||this.close.emit()}async launch(){if(!this.launching()){this.launching.set(!0),this.error.set(null);try{let n=await this.api.post(`/api/workflows/runs${this.projects.projectQuery()}`,{workflowName:this.workflow().name,inputs:this.vals()});if(n?.runId){this.close.emit(),this.router.navigate(["/runs",n.runId]);return}this.error.set("The server did not return a run id."),this.launching.set(!1)}catch(n){this.error.set(n instanceof Error?n.message:"Failed to launch run."),this.launching.set(!1)}}}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=R({type:t,selectors:[["app-run-modal"]],hostBindings:function(e,i){e&1&&m("keydown.escape",function(){return i.onEscape()},$)},inputs:{workflow:[1,"workflow"]},outputs:{close:"close"},decls:20,vars:11,consts:[[1,"rm-backdrop",3,"mousedown"],["role","dialog","aria-modal","true",1,"rm-panel",3,"mousedown"],[1,"row","gap-10","rm-head"],["name","workflow",2,"color","var(--accent)",3,"size"],[1,"mono","grow","rm-name"],["type","button","aria-label","Close",1,"btn","btn-ghost","btn-xs",3,"click"],["name","x",3,"size"],[1,"rm-body"],[1,"secondary","rm-desc"],[1,"muted","rm-noinputs"],[1,"row","gap-6","rm-requires"],[1,"row","gap-8","rm-error"],[1,"row","gap-8","rm-foot"],["type","button",1,"btn","btn-ghost","btn-sm",3,"click"],["type","button",1,"btn","btn-primary","btn-sm",3,"click","disabled"],["name","play",3,"size"],[1,"rm-field"],[1,"eyebrow","rm-label"],[1,"rm-req"],[1,"input","mono",3,"input","id","placeholder","value"],["name","check",3,"size"],["name","drift",2,"color","var(--error)","flex-shrink","0",3,"size"]],template:function(e,i){e&1&&(r(0,"div",0),m("mousedown",function(){return i.onBackdrop()}),r(1,"div",1),m("mousedown",function(_){return _.stopPropagation()}),r(2,"div",2),s(3,"app-icon",3),r(4,"span",4),l(5),a(),r(6,"button",5),m("click",function(){return i.close.emit()}),s(7,"app-icon",6),a()(),r(8,"div",7),u(9,J,2,1,"div",8),u(10,Z,2,0)(11,ee,2,0,"div",9),u(12,ne,3,0,"div",10),u(13,oe,4,2,"div",11),a(),r(14,"div",12)(15,"button",13),m("click",function(){return i.close.emit()}),l(16,"Cancel"),a(),r(17,"button",14),m("click",function(){return i.launch()}),s(18,"app-icon",15),l(19),a()()()()),e&2&&(o(),h("aria-label","Launch "+i.workflow().name),o(2),p("size",16),o(2),g(i.workflow().name),o(2),p("size",14),o(2),f(i.workflow().description?9:-1),o(),f(i.inputs().length?10:11),o(2),f(i.requires().length?12:-1),o(),f(i.error()?13:-1),o(4),p("disabled",i.launching()),o(),p("size",13),o(),C(" ",i.launching()?"Launching\u2026":"Launch run"," "))},dependencies:[W,D],styles:["[_nghost-%COMP%]{display:contents}.rm-backdrop[_ngcontent-%COMP%]{position:fixed;inset:0;background:#00000080;z-index:90;display:grid;place-items:center}.rm-panel[_ngcontent-%COMP%]{width:460px;max-width:calc(100vw - 32px);background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:12px;box-shadow:var(--shadow-pop)}.rm-head[_ngcontent-%COMP%]{padding:14px 16px;border-bottom:1px solid var(--border-subtle)}.rm-head[_ngcontent-%COMP%] .rm-name[_ngcontent-%COMP%]{font-weight:600}.rm-body[_ngcontent-%COMP%]{padding:16px}.rm-desc[_ngcontent-%COMP%]{font-size:12.5px;margin-bottom:16px;line-height:1.55}.rm-field[_ngcontent-%COMP%]{margin-bottom:12px}.rm-label[_ngcontent-%COMP%]{display:block;margin-bottom:5px}.rm-label[_ngcontent-%COMP%] .rm-req[_ngcontent-%COMP%]{color:var(--error)}.rm-field[_ngcontent-%COMP%] .input[_ngcontent-%COMP%]{width:100%}.rm-noinputs[_ngcontent-%COMP%]{font-size:12px;padding:8px 0}.rm-requires[_ngcontent-%COMP%]{margin-top:6px;margin-bottom:4px;flex-wrap:wrap}.rm-error[_ngcontent-%COMP%]{margin-top:12px;padding:8px 11px;background:var(--error-soft);border:1px solid rgba(242,85,90,.25);border-radius:7px;font-size:12px;color:var(--text-secondary);align-items:center}.rm-foot[_ngcontent-%COMP%]{padding:12px 16px;border-top:1px solid var(--border-subtle);justify-content:flex-end}"],changeDetection:0})};var I=()=>[],ie=(t,n)=>n.workflow.name,re=(t,n)=>n.name;function ae(t,n){t&1&&s(0,"app-pick-project-empty",0)}function le(t,n){if(t&1&&(r(0,"code",16),l(1),a()),t&2){let e=n.$implicit;o(),g(e)}}function ce(t,n){if(t&1&&(r(0,"code",18),l(1),a()),t&2){let e=n.$implicit;o(),C("$",e.name)}}function de(t,n){if(t&1&&(r(0,"span",17),l(1,"inputs"),a(),b(2,ce,2,1,"code",18,re)),t&2){let e=d().$implicit;o(2),y(e.workflow.inputs??S(0,I))}}function pe(t,n){if(t&1){let e=M();r(0,"div",6),m("click",function(){let c=v(e).$implicit,_=d(2);return x(_.openRun(c.workflow))})("keydown.enter",function(){let c=v(e).$implicit,_=d(2);return x(_.openRun(c.workflow))})("keydown.space",function(c){let _=v(e).$implicit,F=d(2);return c.preventDefault(),x(F.openRun(_.workflow))}),r(1,"div",7)(2,"span",8),l(3),a(),r(4,"app-pill",9),l(5),a(),s(6,"span",10),r(7,"span",11),s(8,"app-icon",12),l(9," Run"),a()(),r(10,"div",13),l(11),a(),r(12,"div",14)(13,"span",15),l(14,"requires"),a(),b(15,le,2,1,"code",16,T),u(17,de,4,1),a()()}if(t&2){let e=n.$implicit,i=d(2);h("aria-label","Launch workflow "+e.workflow.name),o(3),g(e.workflow.name),o(),p("color",i.scopeColor[e.scope])("bg",i.scopeBg[e.scope]),o(),g(e.scope),o(3),p("size",11),o(3),g(e.workflow.description||"\u2014"),o(4),y(e.workflow.requires??S(8,I)),o(2),f((e.workflow.inputs??S(9,I)).length>0?17:-1)}}function se(t,n){if(t&1){let e=M();r(0,"app-run-modal",19),m("close",function(){v(e);let c=d(2);return x(c.closeRun())}),a()}t&2&&p("workflow",n)}function me(t,n){if(t&1&&(r(0,"div",1),s(1,"app-page-head",2),r(2,"div",3),b(3,pe,18,10,"div",4,ie),a(),u(5,se,1,1,"app-run-modal",5),a()),t&2){let e,i=d();o(3),y(i.entries()),o(2),f((e=i.runTarget())?5:-1,e)}}var Q=class t{api=w(E);projects=w(O);resource=A(this.api,()=>`/api/workflows${this.projects.projectQuery()}`);entries=P(()=>this.resource.state().data?.workflows??[]);runTarget=k(null);openRun(n){this.runTarget.set(n)}closeRun(){this.runTarget.set(null)}scopeColor={bundled:"var(--node-spec)",global:"var(--node-code)",project:"var(--node-route)"};scopeBg={bundled:"color-mix(in srgb, var(--node-spec) 14%, transparent)",global:"color-mix(in srgb, var(--node-code) 14%, transparent)",project:"color-mix(in srgb, var(--node-route) 14%, transparent)"};static \u0275fac=function(e){return new(e||t)};static \u0275cmp=R({type:t,selectors:[["app-workflows"]],decls:2,vars:1,consts:[["surface","Workflows"],[1,"scroll-y","wf-page"],["icon","workflow","title","Workflows","sub","Run a YAML-defined DAG of agent, shell and approval steps"],[1,"wf-grid"],["role","button","tabindex","0",1,"card","card-pad","wf-card"],[3,"workflow"],["role","button","tabindex","0",1,"card","card-pad","wf-card",3,"click","keydown.enter","keydown.space"],[1,"row","gap-8"],[1,"mono","wf-name"],[3,"color","bg"],[1,"grow"],[1,"wf-run-hint","row","gap-4"],["name","play",3,"size"],[1,"secondary","wf-desc"],[1,"row","gap-6","wf-footer"],[1,"muted",2,"font-size","10.5px"],[1,"mono","wf-req-chip"],[1,"muted",2,"font-size","10.5px","margin-left","6px"],[1,"mono","wf-inp-chip"],[3,"close","workflow"]],template:function(e,i){e&1&&u(0,ae,1,0,"app-pick-project-empty",0)(1,me,6,1,"div",1),e&2&&f(i.resource.state().noProject?0:1)},dependencies:[L,H,W,D,z],styles:["[_nghost-%COMP%]{display:contents}.wf-page[_ngcontent-%COMP%]{flex:1;padding:18px}.wf-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:12px}.wf-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:10px;cursor:pointer;transition:background .1s,border-color .1s}.wf-card[_ngcontent-%COMP%]:hover{background:var(--bg-panel-2);border-color:var(--border-strong)}.wf-card[_ngcontent-%COMP%]:hover .wf-run-hint[_ngcontent-%COMP%]{opacity:1}.wf-card[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.wf-run-hint[_ngcontent-%COMP%]{align-items:center;font-size:11px;font-weight:500;color:var(--accent);opacity:0;transition:opacity .1s;flex-shrink:0}.wf-name[_ngcontent-%COMP%]{font-size:13.5px;font-weight:600}.wf-desc[_ngcontent-%COMP%]{font-size:12.5px;line-height:1.5;min-height:36px}.wf-footer[_ngcontent-%COMP%]{flex-wrap:wrap;border-top:1px solid var(--border-subtle);padding-top:10px}.wf-req-chip[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-secondary);background:var(--bg-canvas);padding:1px 6px;border-radius:4px;font-family:var(--font-mono)}.wf-inp-chip[_ngcontent-%COMP%]{font-size:10.5px;color:var(--node-spec);background:var(--node-spec-soft);padding:1px 6px;border-radius:4px;font-family:var(--font-mono)}"],changeDetection:0})};export{Q as Workflows};
|
|
1
|
+
import{a as W}from"./chunk-JLOJCDIY.js";import{a as H}from"./chunk-5NTGUSXJ.js";import{a as L}from"./chunk-SQPYSOV6.js";import{c as B}from"./chunk-DOKZOFKM.js";import{c as A}from"./chunk-DTWIJ3GJ.js";import{a as O}from"./chunk-JGDK6YKG.js";import{a as E}from"./chunk-TWVVIWKO.js";import{Aa as s,Ga as M,I as w,Ia as m,Ka as d,M as v,N as x,Va as l,W as k,Wa as g,Xa as C,bb as S,da as $,ea as o,ka as R,lb as P,ob as V,pb as N,qa as h,ra as u,sa as f,ua as T,va as b,wa as y,xa as p,ya as r,za as a,zb as D}from"./chunk-SYGIPC2P.js";import{a as j,b as q}from"./chunk-Q7L6LLAK.js";var Y=(t,n)=>n.name;function J(t,n){if(t&1&&(r(0,"div",8),l(1),a()),t&2){let e=d();o(),g(e.workflow().description)}}function K(t,n){t&1&&(r(0,"span",18),l(1,"*"),a())}function X(t,n){if(t&1){let e=M();r(0,"div",16)(1,"label",17),l(2),u(3,K,2,0,"span",18),a(),r(4,"input",19),m("input",function(c){let _=v(e).$implicit,F=d(2);return x(F.setVal(_.name,c.target.value))}),a()()}if(t&2){let e=n.$implicit,i=d(2);o(),h("for","rm-"+e.name),o(),C(" ",e.name),o(),f(e.required?3:-1),o(),p("id","rm-"+e.name)("placeholder",i.placeholderFor(e.name))("value",i.vals()[e.name]||"")}}function Z(t,n){if(t&1&&b(0,X,5,6,"div",16,Y),t&2){let e=d();y(e.inputs())}}function ee(t,n){t&1&&(r(0,"div",9),l(1,"No inputs required."),a())}function te(t,n){if(t&1&&(r(0,"app-pill"),s(1,"app-icon",20),l(2),a()),t&2){let e=n.$implicit;o(),p("size",10),o(),C(" ",e)}}function ne(t,n){if(t&1&&(r(0,"div",10),b(1,te,3,2,"app-pill",null,T),a()),t&2){let e=d();o(),y(e.requires())}}function oe(t,n){if(t&1&&(r(0,"div",11),s(1,"app-icon",21),r(2,"span"),l(3),a()()),t&2){let e=d();o(),p("size",13),o(2),g(e.error())}}var z=class t{workflow=N.required();close=V();api=w(E);projects=w(O);router=w(B);vals=k({});launching=k(!1);error=k(null);inputs=P(()=>this.workflow().inputs??[]);requires=P(()=>this.workflow().requires??[]);placeholderFor(n){return n==="SPEC_ID"?"REQ-AUTH-005":"value\u2026"}setVal(n,e){this.vals.update(i=>q(j({},i),{[n]:e}))}onEscape(){this.launching()||this.close.emit()}onBackdrop(){this.launching()||this.close.emit()}async launch(){if(!this.launching()){this.launching.set(!0),this.error.set(null);try{let n=await this.api.post(`/api/workflows/runs${this.projects.projectQuery()}`,{workflowName:this.workflow().name,inputs:this.vals()});if(n?.runId){this.close.emit(),this.router.navigate(["/runs",n.runId]);return}this.error.set("The server did not return a run id."),this.launching.set(!1)}catch(n){this.error.set(n instanceof Error?n.message:"Failed to launch run."),this.launching.set(!1)}}}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=R({type:t,selectors:[["app-run-modal"]],hostBindings:function(e,i){e&1&&m("keydown.escape",function(){return i.onEscape()},$)},inputs:{workflow:[1,"workflow"]},outputs:{close:"close"},decls:20,vars:11,consts:[[1,"rm-backdrop",3,"mousedown"],["role","dialog","aria-modal","true",1,"rm-panel",3,"mousedown"],[1,"row","gap-10","rm-head"],["name","workflow",2,"color","var(--accent)",3,"size"],[1,"mono","grow","rm-name"],["type","button","aria-label","Close",1,"btn","btn-ghost","btn-xs",3,"click"],["name","x",3,"size"],[1,"rm-body"],[1,"secondary","rm-desc"],[1,"muted","rm-noinputs"],[1,"row","gap-6","rm-requires"],[1,"row","gap-8","rm-error"],[1,"row","gap-8","rm-foot"],["type","button",1,"btn","btn-ghost","btn-sm",3,"click"],["type","button",1,"btn","btn-primary","btn-sm",3,"click","disabled"],["name","play",3,"size"],[1,"rm-field"],[1,"eyebrow","rm-label"],[1,"rm-req"],[1,"input","mono",3,"input","id","placeholder","value"],["name","check",3,"size"],["name","drift",2,"color","var(--error)","flex-shrink","0",3,"size"]],template:function(e,i){e&1&&(r(0,"div",0),m("mousedown",function(){return i.onBackdrop()}),r(1,"div",1),m("mousedown",function(_){return _.stopPropagation()}),r(2,"div",2),s(3,"app-icon",3),r(4,"span",4),l(5),a(),r(6,"button",5),m("click",function(){return i.close.emit()}),s(7,"app-icon",6),a()(),r(8,"div",7),u(9,J,2,1,"div",8),u(10,Z,2,0)(11,ee,2,0,"div",9),u(12,ne,3,0,"div",10),u(13,oe,4,2,"div",11),a(),r(14,"div",12)(15,"button",13),m("click",function(){return i.close.emit()}),l(16,"Cancel"),a(),r(17,"button",14),m("click",function(){return i.launch()}),s(18,"app-icon",15),l(19),a()()()()),e&2&&(o(),h("aria-label","Launch "+i.workflow().name),o(2),p("size",16),o(2),g(i.workflow().name),o(2),p("size",14),o(2),f(i.workflow().description?9:-1),o(),f(i.inputs().length?10:11),o(2),f(i.requires().length?12:-1),o(),f(i.error()?13:-1),o(4),p("disabled",i.launching()),o(),p("size",13),o(),C(" ",i.launching()?"Launching\u2026":"Launch run"," "))},dependencies:[W,D],styles:["[_nghost-%COMP%]{display:contents}.rm-backdrop[_ngcontent-%COMP%]{position:fixed;inset:0;background:#00000080;z-index:90;display:grid;place-items:center}.rm-panel[_ngcontent-%COMP%]{width:460px;max-width:calc(100vw - 32px);background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:12px;box-shadow:var(--shadow-pop)}.rm-head[_ngcontent-%COMP%]{padding:14px 16px;border-bottom:1px solid var(--border-subtle)}.rm-head[_ngcontent-%COMP%] .rm-name[_ngcontent-%COMP%]{font-weight:600}.rm-body[_ngcontent-%COMP%]{padding:16px}.rm-desc[_ngcontent-%COMP%]{font-size:12.5px;margin-bottom:16px;line-height:1.55}.rm-field[_ngcontent-%COMP%]{margin-bottom:12px}.rm-label[_ngcontent-%COMP%]{display:block;margin-bottom:5px}.rm-label[_ngcontent-%COMP%] .rm-req[_ngcontent-%COMP%]{color:var(--error)}.rm-field[_ngcontent-%COMP%] .input[_ngcontent-%COMP%]{width:100%}.rm-noinputs[_ngcontent-%COMP%]{font-size:12px;padding:8px 0}.rm-requires[_ngcontent-%COMP%]{margin-top:6px;margin-bottom:4px;flex-wrap:wrap}.rm-error[_ngcontent-%COMP%]{margin-top:12px;padding:8px 11px;background:var(--error-soft);border:1px solid rgba(242,85,90,.25);border-radius:7px;font-size:12px;color:var(--text-secondary);align-items:center}.rm-foot[_ngcontent-%COMP%]{padding:12px 16px;border-top:1px solid var(--border-subtle);justify-content:flex-end}"],changeDetection:0})};var I=()=>[],ie=(t,n)=>n.workflow.name,re=(t,n)=>n.name;function ae(t,n){t&1&&s(0,"app-pick-project-empty",0)}function le(t,n){if(t&1&&(r(0,"code",16),l(1),a()),t&2){let e=n.$implicit;o(),g(e)}}function ce(t,n){if(t&1&&(r(0,"code",18),l(1),a()),t&2){let e=n.$implicit;o(),C("$",e.name)}}function de(t,n){if(t&1&&(r(0,"span",17),l(1,"inputs"),a(),b(2,ce,2,1,"code",18,re)),t&2){let e=d().$implicit;o(2),y(e.workflow.inputs??S(0,I))}}function pe(t,n){if(t&1){let e=M();r(0,"div",6),m("click",function(){let c=v(e).$implicit,_=d(2);return x(_.openRun(c.workflow))})("keydown.enter",function(){let c=v(e).$implicit,_=d(2);return x(_.openRun(c.workflow))})("keydown.space",function(c){let _=v(e).$implicit,F=d(2);return c.preventDefault(),x(F.openRun(_.workflow))}),r(1,"div",7)(2,"span",8),l(3),a(),r(4,"app-pill",9),l(5),a(),s(6,"span",10),r(7,"span",11),s(8,"app-icon",12),l(9," Run"),a()(),r(10,"div",13),l(11),a(),r(12,"div",14)(13,"span",15),l(14,"requires"),a(),b(15,le,2,1,"code",16,T),u(17,de,4,1),a()()}if(t&2){let e=n.$implicit,i=d(2);h("aria-label","Launch workflow "+e.workflow.name),o(3),g(e.workflow.name),o(),p("color",i.scopeColor[e.scope])("bg",i.scopeBg[e.scope]),o(),g(e.scope),o(3),p("size",11),o(3),g(e.workflow.description||"\u2014"),o(4),y(e.workflow.requires??S(8,I)),o(2),f((e.workflow.inputs??S(9,I)).length>0?17:-1)}}function se(t,n){if(t&1){let e=M();r(0,"app-run-modal",19),m("close",function(){v(e);let c=d(2);return x(c.closeRun())}),a()}t&2&&p("workflow",n)}function me(t,n){if(t&1&&(r(0,"div",1),s(1,"app-page-head",2),r(2,"div",3),b(3,pe,18,10,"div",4,ie),a(),u(5,se,1,1,"app-run-modal",5),a()),t&2){let e,i=d();o(3),y(i.entries()),o(2),f((e=i.runTarget())?5:-1,e)}}var Q=class t{api=w(E);projects=w(O);resource=A(this.api,()=>`/api/workflows${this.projects.projectQuery()}`);entries=P(()=>this.resource.state().data?.workflows??[]);runTarget=k(null);openRun(n){this.runTarget.set(n)}closeRun(){this.runTarget.set(null)}scopeColor={bundled:"var(--node-spec)",global:"var(--node-code)",project:"var(--node-route)"};scopeBg={bundled:"color-mix(in srgb, var(--node-spec) 14%, transparent)",global:"color-mix(in srgb, var(--node-code) 14%, transparent)",project:"color-mix(in srgb, var(--node-route) 14%, transparent)"};static \u0275fac=function(e){return new(e||t)};static \u0275cmp=R({type:t,selectors:[["app-workflows"]],decls:2,vars:1,consts:[["surface","Workflows"],[1,"scroll-y","wf-page"],["icon","workflow","title","Workflows","sub","Run a YAML-defined DAG of agent, shell and approval steps"],[1,"wf-grid"],["role","button","tabindex","0",1,"card","card-pad","wf-card"],[3,"workflow"],["role","button","tabindex","0",1,"card","card-pad","wf-card",3,"click","keydown.enter","keydown.space"],[1,"row","gap-8"],[1,"mono","wf-name"],[3,"color","bg"],[1,"grow"],[1,"wf-run-hint","row","gap-4"],["name","play",3,"size"],[1,"secondary","wf-desc"],[1,"row","gap-6","wf-footer"],[1,"muted",2,"font-size","10.5px"],[1,"mono","wf-req-chip"],[1,"muted",2,"font-size","10.5px","margin-left","6px"],[1,"mono","wf-inp-chip"],[3,"close","workflow"]],template:function(e,i){e&1&&u(0,ae,1,0,"app-pick-project-empty",0)(1,me,6,1,"div",1),e&2&&f(i.resource.state().noProject?0:1)},dependencies:[L,H,W,D,z],styles:["[_nghost-%COMP%]{display:contents}.wf-page[_ngcontent-%COMP%]{flex:1;padding:18px}.wf-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:12px}.wf-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:10px;cursor:pointer;transition:background .1s,border-color .1s}.wf-card[_ngcontent-%COMP%]:hover{background:var(--bg-panel-2);border-color:var(--border-strong)}.wf-card[_ngcontent-%COMP%]:hover .wf-run-hint[_ngcontent-%COMP%]{opacity:1}.wf-card[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.wf-run-hint[_ngcontent-%COMP%]{align-items:center;font-size:11px;font-weight:500;color:var(--accent);opacity:0;transition:opacity .1s;flex-shrink:0}.wf-name[_ngcontent-%COMP%]{font-size:13.5px;font-weight:600}.wf-desc[_ngcontent-%COMP%]{font-size:12.5px;line-height:1.5;min-height:36px}.wf-footer[_ngcontent-%COMP%]{flex-wrap:wrap;border-top:1px solid var(--border-subtle);padding-top:10px}.wf-req-chip[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-secondary);background:var(--bg-canvas);padding:1px 6px;border-radius:4px;font-family:var(--font-mono)}.wf-inp-chip[_ngcontent-%COMP%]{font-size:10.5px;color:var(--node-spec);background:var(--node-spec-soft);padding:1px 6px;border-radius:4px;font-family:var(--font-mono)}"],changeDetection:0})};export{Q as Workflows};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as U}from"./chunk-NKPK3BR3.js";import{a as G}from"./chunk-G7VZT5KB.js";import{a as q}from"./chunk-YWIRU745.js";import{a as Q}from"./chunk-JLOJCDIY.js";import{a as B}from"./chunk-PZSU53SS.js";import{a as h,b as j}from"./chunk-WBJ5VEB5.js";import{a as N,c as $,d as V}from"./chunk-DOKZOFKM.js";import{c as A}from"./chunk-PAO2624Y.js";import{a as F}from"./chunk-PBRCKHEQ.js";import{a as R}from"./chunk-3H2EZLZN.js";import{Aa as s,Ga as P,I as v,Ia as C,Ka as c,M as f,N as b,Ta as M,Ua as w,Va as l,W as E,Wa as _,Xa as y,Ya as O,aa as T,ea as i,ka as z,lb as m,qa as I,ra as g,sa as u,va as k,wa as S,xa as p,ya as a,yb as L,za as r,zb as H}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var D=(n,e)=>e.id;function W(n,e){n&1&&(a(0,"div",1),s(1,"div",3)(2,"div",4)(3,"div",5)(4,"div",6)(5,"div",7),r())}function X(n,e){if(n&1&&(a(0,"app-empty",2)(1,"a",8),s(2,"app-icon",9),l(3," Back to Specs "),r()()),n&2){let t=c();p("body","No spec matches "+t.specId()+"."),i(2),p("size",12)}}function Y(n,e){if(n&1&&(a(0,"app-pill",20),l(1),r()),n&2){let t=c();p("color","var(--node-code)")("bg","var(--node-code-soft)"),i(),_(t.priority)}}function Z(n,e){if(n&1&&(a(0,"span",22),l(1,"owned by "),a(2,"span",37),l(3),r()()),n&2){let t=c();i(3),_(t.owner)}}function ee(n,e){if(n&1&&(a(0,"span",22),l(1),r()),n&2){let t=c(2);i(),y("verified ",t.relTime(e))}}function te(n,e){if(n&1&&s(0,"span",43),n&2){let t=e.$implicit,o=c(3);M("background",o.critColor(t.state)),w("pending",t.state==="pending"),p("title",t.id+" \xB7 "+o.stateLabel(t.state))}}function ne(n,e){n&1&&s(0,"app-icon",45),n&2&&p("name",e)("size",12)}function ie(n,e){if(n&1&&s(0,"span",49),n&2){let t=c().$implicit,o=c(3);M("border-color",o.critColor(t.state))}}function oe(n,e){if(n&1&&(a(0,"div",42)(1,"span",44),g(2,ne,1,2,"app-icon",45)(3,ie,1,2,"span",46),r(),a(4,"span",47),l(5),r(),a(6,"span",48),l(7),r()()),n&2){let t,o=e.$implicit,d=e.$index,x=c(3);i(),M("background",x.critBg(o.state))("color",x.critColor(o.state)),p("title",x.stateLabel(o.state)),i(),u((t=x.critIcon(o.state))?2:3,t),i(3),y("A",d+1),i(2),_(o.title)}}function re(n,e){if(n&1&&(a(0,"section",23)(1,"div",26)(2,"div",24),l(3,"Acceptance criteria"),r(),a(4,"div",38),l(5),r()(),a(6,"div",39),k(7,te,1,5,"span",40,D),r(),a(9,"div",41),k(10,oe,8,8,"div",42,D),r()()),n&2){let t=c(2);i(4),w("all-met",t.metCount()===t.criteria().length),i(),O(" ",t.metCount()," / ",t.criteria().length," met "),i(2),S(t.criteria()),i(3),S(t.criteria())}}function ae(n,e){if(n&1&&(a(0,"div",27),l(1),r()),n&2){let t=c(2);i(),O("",t.links().length," ",t.links().length===1?"symbol":"symbols")}}function de(n,e){if(n&1&&(a(0,"div",28),l(1,"No linked code yet \u2014 run "),a(2,"span",50),l(3),r(),l(4," to link it."),r()),n&2){let t,o=c(2);i(3),y("/ss-spec implement ",(t=o.spec())==null?null:t.id)}}function le(n,e){if(n&1&&(a(0,"app-pill"),l(1),r()),n&2){let t=c().$implicit;i(),_(t.provenance)}}function ce(n,e){if(n&1){let t=P();a(0,"div",51),s(1,"app-state-pill",52),a(2,"span",53),l(3),r(),s(4,"span",54),g(5,le,2,1,"app-pill"),a(6,"button",55),C("click",function(){let d=f(t).$implicit,x=c(3);return b(x.revealLink(d))}),s(7,"app-icon",56),l(8," Reveal "),r()()}if(n&2){let t=e.$implicit,o=c(3);i(),p("state",t.state),i(2),_(o.linkTarget(t)),i(2),u(t.provenance?5:-1),i(),I("aria-label","Reveal "+o.linkTarget(t)),i(),p("size",12)}}function pe(n,e){if(n&1&&(a(0,"div",29),k(1,ce,9,5,"div",51,D),r()),n&2){let t=c(2);i(),S(t.links())}}function se(n,e){if(n&1){let t=P();a(0,"div",10)(1,"a",11),s(2,"app-icon",12),l(3," Specs "),r(),a(4,"span",13),l(5,"/"),r(),a(6,"span",14),l(7),r(),a(8,"span",13),l(9,"\xB7"),r(),a(10,"span",15),l(11),r(),s(12,"app-copy-btn",16),r(),a(13,"h1",17),l(14),r(),a(15,"div",18),s(16,"app-state-pill",19),g(17,Y,2,3,"app-pill",20),a(18,"span",21),l(19),r(),g(20,Z,4,1,"span",22),g(21,ee,2,1,"span",22),r(),a(22,"section",23)(23,"div",24),l(24,"Requirement"),r(),s(25,"div",25),r(),g(26,re,12,4,"section",23),a(27,"section",23)(28,"div",26)(29,"div",24),l(30,"Linked code"),r(),g(31,ae,2,2,"div",27),r(),g(32,de,5,1,"div",28)(33,pe,3,0,"div",29),r(),a(34,"div",30)(35,"button",31),C("click",function(){f(t);let d=c();return b(d.onImplement())}),s(36,"app-icon",32),l(37),r(),a(38,"button",33),C("click",function(){f(t);let d=c();return b(d.onVerify())}),s(39,"app-icon",34),l(40),r(),a(41,"button",33),C("click",function(){f(t);let d=c();return b(d.onEdit())}),s(42,"app-icon",35),l(43," Edit spec "),r(),a(44,"button",33),C("click",function(){f(t);let d=c();return b(d.onShowInGraph())}),s(45,"app-icon",36),l(46," Show in graph "),r()()}if(n&2){let t,o=e,d=c();i(2),p("size",13),i(5),_(o.sourcePath),i(4),_(o.id),i(),p("text",o.id),i(2),_(o.title),i(2),p("state",d.overallState())("withDot",!0),i(),u(o.priority?17:-1),i(2),_(o.kind),i(),u(o.owner?20:-1),i(),u((t=d.verifiedAt())?21:-1,t),i(4),p("innerHTML",d.bodyHtml(),T),i(),u(d.criteria().length>0?26:-1),i(5),u(d.links().length>0?31:-1),i(),u(d.links().length===0?32:33),i(4),p("size",12),i(),y(" ",d.copied()==="implement"?"Copied!":"Implement"," "),i(2),p("size",12),i(),y(" ",d.copied()==="verify"?"Copied!":"Verify"," "),i(2),p("size",12),i(3),p("size",12)}}function K(n){return n.replace(/<!--[\s\S]*?-->/g,"")}var me=["broken","orphaned","drifted","drafted","implementing","implemented","verified"],xe={verified:"check",implemented:"check",completed:"check",drifted:"drift",broken:"cancel",orphaned:"cancel",failed:"cancel"};function ge(n){return n.length?n.some(e=>e.state==="broken")?"broken":n.some(e=>e.state==="orphaned")?"orphaned":n.some(e=>e.state==="drifted")?"drifted":n.every(e=>e.state==="verified")?"verified":"implemented":"pending"}var J=class n{api=v(R);projects=v(F);router=v($);route=v(N);sanitizer=v(L);paramMap=U(this.route.paramMap,{initialValue:this.route.snapshot.paramMap});specId=m(()=>this.paramMap().get("id")??"");detail=A(this.api,()=>{let e=this.specId();return e?`/api/spec/${encodeURIComponent(e)}${this.projects.projectQuery()}`:null});loading=m(()=>this.detail.state().loading);spec=m(()=>this.detail.state().data?.spec??null);links=m(()=>this.detail.state().data?.links??[]);children=m(()=>this.detail.state().data?.children??[]);childLinks=m(()=>this.detail.state().data?.childLinks??{});notFound=m(()=>!this.loading()&&!!this.specId()&&!this.spec());overallState=m(()=>{let e=this.links();if(!e.length)return"drafted";for(let t of me)if(e.some(o=>o.state===t))return t;return"implemented"});verifiedAt=m(()=>{let e=this.links().filter(t=>t.state==="verified").map(t=>t.updatedAt);return e.length?Math.max(...e):null});criteria=m(()=>{let e=this.childLinks();return this.children().filter(t=>t.kind==="acceptance").map(t=>{let o=e[t.id]??[],d=ge(o);return{id:t.id,title:K(t.title).trim(),state:d,hasLinks:o.length>0,met:d==="verified"}})});metCount=m(()=>this.criteria().filter(e=>e.met).length);critIcon(e){return xe[e]??null}critColor(e){return h[e]?.color??"var(--text-muted)"}critBg(e){return h[e]?.bg??"rgba(255,255,255,0.05)"}bodyHtml=m(()=>this.sanitizer.bypassSecurityTrustHtml(G(K(this.spec()?.body??""))));stateColor(e){return h[e]?.color??"var(--node-spec)"}stateLabel(e){return h[e]?.label??e}relTime(e){let t=Date.now()-e,o=Math.max(0,Math.round(t/1e3));if(o<60)return`${o}s ago`;let d=Math.round(o/60);if(d<60)return`${d}m ago`;let x=Math.round(d/60);return x<24?`${x}h ago`:`${Math.round(x/24)}d ago`}linkTarget(e){return`${e.targetFilePath}:${e.targetQualifiedName}`}copied=E(null);copyCmd(e,t){try{navigator.clipboard?.writeText(e)}catch{}this.copied.set(t),setTimeout(()=>{this.copied()===t&&this.copied.set(null)},1800)}onImplement(){let e=this.spec()?.id;e&&this.copyCmd(`/ss-spec implement ${e}`,"implement")}onVerify(){this.copyCmd("/ss-check","verify")}onEdit(){this.router.navigate(["/specs"])}onShowInGraph(){let e=this.spec()?.id;this.router.navigate(["/graph"],{queryParams:e?{focus:"spec:"+e}:{}})}revealLink(e){this.router.navigate(["/graph"],{queryParams:{focus:this.linkTarget(e)}})}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=z({type:n,selectors:[["app-spec-detail"]],decls:4,vars:1,consts:[[1,"scroll-y","spec-detail"],[1,"sd-skel"],["icon","book","title","Spec not found",3,"body"],[1,"skel",2,"height","16px","width","220px","border-radius","5px"],[1,"skel",2,"height","34px","width","60%","border-radius","7px","margin-top","14px"],[1,"skel",2,"height","20px","width","340px","border-radius","6px","margin-top","12px"],[1,"skel",2,"height","120px","border-radius","10px","margin-top","22px"],[1,"skel",2,"height","160px","border-radius","10px","margin-top","14px"],["action","","routerLink","/specs",1,"btn","btn-secondary","btn-sm"],["name","arrowRight",3,"size"],[1,"sd-crumb"],["routerLink","/specs",1,"sd-back"],["name","chevronLeft",3,"size"],[1,"sd-sep"],[1,"mono","sd-path"],[1,"mono","sd-id"],["label","Copy spec id",3,"text"],[1,"sd-title"],[1,"sd-meta"],[3,"state","withDot"],[3,"color","bg"],[1,"sd-meta-kind"],[1,"sd-meta-dim"],[1,"sd-section"],[1,"sd-eyebrow"],[1,"sd-prose",3,"innerHTML"],[1,"sd-section-head"],[1,"sd-count"],[1,"sd-empty-row"],[1,"sd-links"],[1,"sd-actions"],["type","button",1,"btn","btn-primary","btn-sm",3,"click"],["name","play",3,"size"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["name","check",3,"size"],["name","book",3,"size"],["name","graph",3,"size"],[1,"sd-meta-owner"],[1,"sd-rollup"],[1,"sd-crit-bars"],[1,"sd-crit-seg",3,"pending","background","title"],[1,"sd-criteria"],[1,"sd-crit"],[1,"sd-crit-seg",3,"title"],[1,"sd-crit-mark",3,"title"],[3,"name","size"],[1,"sd-crit-dot",3,"border-color"],[1,"sd-crit-id","mono"],[1,"sd-crit-text"],[1,"sd-crit-dot"],[1,"mono"],[1,"sd-link"],[3,"state"],[1,"mono","sd-link-target"],[1,"grow"],["type","button",1,"btn","btn-ghost","btn-xs",3,"click"],["name","reveal",3,"size"]],template:function(t,o){if(t&1&&(a(0,"div",0),g(1,W,6,0,"div",1)(2,X,4,2,"app-empty",2)(3,se,47,21),r()),t&2){let d;i(),u(o.loading()?1:o.notFound()?2:(d=o.spec())?3:-1,d)}},dependencies:[V,H,j,Q,B,q],styles:['@charset "UTF-8";[_nghost-%COMP%]{display:contents}.spec-detail[_ngcontent-%COMP%]{flex:1;padding:22px 26px 40px;color:var(--text-primary);background:var(--bg-canvas);max-width:920px}.sd-skel[_ngcontent-%COMP%]{display:flex;flex-direction:column}.sd-crumb[_ngcontent-%COMP%]{display:flex;align-items:center;gap:7px;font-size:12px;color:var(--text-muted);margin-bottom:12px}.sd-back[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:3px;color:var(--text-secondary);text-decoration:none;cursor:pointer}.sd-back[_ngcontent-%COMP%]:hover{color:var(--text-primary)}.sd-sep[_ngcontent-%COMP%]{color:var(--text-faint)}.sd-path[_ngcontent-%COMP%]{color:var(--text-secondary)}.sd-id[_ngcontent-%COMP%]{color:var(--node-spec)}.sd-title[_ngcontent-%COMP%]{font-size:24px;font-weight:650;letter-spacing:-.02em;line-height:1.18;margin:0 0 12px;color:var(--text-primary)}.sd-meta[_ngcontent-%COMP%]{display:flex;align-items:center;flex-wrap:wrap;gap:10px;margin-bottom:26px;font-size:12px}.sd-meta-kind[_ngcontent-%COMP%]{font-size:11px;color:var(--text-secondary);background:var(--bg-hover);border:1px solid var(--border-subtle);padding:2px 8px;border-radius:5px}.sd-meta-dim[_ngcontent-%COMP%]{color:var(--text-muted)}.sd-meta-owner[_ngcontent-%COMP%]{color:var(--text-secondary)}.sd-section[_ngcontent-%COMP%]{margin-bottom:24px}.sd-section-head[_ngcontent-%COMP%]{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:10px}.sd-eyebrow[_ngcontent-%COMP%]{font-size:10.5px;font-weight:650;letter-spacing:.09em;text-transform:uppercase;color:var(--text-muted);margin-bottom:10px}.sd-section-head[_ngcontent-%COMP%] .sd-eyebrow[_ngcontent-%COMP%]{margin-bottom:0}.sd-prose[_ngcontent-%COMP%]{font-size:14px;line-height:1.62;color:var(--text-secondary)}.sd-prose[_ngcontent-%COMP%] [_ngcontent-%COMP%]:global(strong){color:var(--text-primary);font-weight:600}.sd-prose[_ngcontent-%COMP%] [_ngcontent-%COMP%]:global(code){font-family:ui-monospace,Geist Mono,monospace;font-size:.86em;color:var(--node-spec);background:var(--node-spec-soft);padding:1px 5px;border-radius:4px}.sd-prose[_ngcontent-%COMP%] [_ngcontent-%COMP%]:global(p){margin:0 0 10px}.sd-rollup[_ngcontent-%COMP%]{font-size:11px;font-weight:600;color:var(--text-muted);font-family:ui-monospace,monospace}.sd-rollup.all-met[_ngcontent-%COMP%]{color:var(--success)}.sd-crit-bars[_ngcontent-%COMP%]{display:flex;gap:4px;margin-bottom:12px}.sd-crit-seg[_ngcontent-%COMP%]{flex:1;height:4px;border-radius:999px;opacity:.9}.sd-crit-seg.pending[_ngcontent-%COMP%]{opacity:.25}.sd-criteria[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:6px}.sd-crit[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:8px;background:var(--bg-panel);border:1px solid var(--border-subtle)}.sd-crit-mark[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:5px;flex-shrink:0}.sd-crit-dot[_ngcontent-%COMP%]{width:7px;height:7px;border-radius:50%;border:1.6px solid currentColor;box-sizing:border-box}.sd-crit-id[_ngcontent-%COMP%]{font-size:10px;color:var(--text-muted);flex-shrink:0;width:22px}.sd-crit-text[_ngcontent-%COMP%]{font-size:13px;color:var(--text-secondary);line-height:1.45}.sd-count[_ngcontent-%COMP%]{font-size:11px;color:var(--text-muted);font-family:ui-monospace,monospace}.sd-empty-row[_ngcontent-%COMP%]{font-size:12.5px;color:var(--text-muted);padding:12px;border-radius:8px;background:var(--bg-panel);border:1px dashed var(--border-subtle)}.sd-empty-row[_ngcontent-%COMP%] .mono[_ngcontent-%COMP%]{color:var(--text-secondary)}.sd-links[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:5px}.sd-link[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:9px 12px;border-radius:8px;background:var(--bg-panel);border:1px solid var(--border-subtle);font-size:12.5px}.sd-link-state[_ngcontent-%COMP%]{display:inline-flex;align-items:center;flex-shrink:0}.sd-link-target[_ngcontent-%COMP%]{color:var(--text-primary)}.grow[_ngcontent-%COMP%]{flex:1}.sd-prov[_ngcontent-%COMP%]{font-size:10px;color:var(--text-muted);background:var(--bg-hover);border:1px solid var(--border-subtle);padding:1px 6px;border-radius:4px}.sd-link-statelabel[_ngcontent-%COMP%]{font-size:11px;font-weight:600}.sd-actions[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:8px;margin-top:28px;padding-top:18px;border-top:1px solid var(--border-subtle)}.mono[_ngcontent-%COMP%]{font-family:ui-monospace,Geist Mono,monospace}'],changeDetection:0})};export{J as SpecDetail};
|
|
1
|
+
import{a as U}from"./chunk-NKPK3BR3.js";import{a as G}from"./chunk-G7VZT5KB.js";import{a as q}from"./chunk-YWIRU745.js";import{a as Q}from"./chunk-JLOJCDIY.js";import{a as B}from"./chunk-PZSU53SS.js";import{a as h,b as j}from"./chunk-WBJ5VEB5.js";import{a as N,c as $,d as V}from"./chunk-DOKZOFKM.js";import{c as A}from"./chunk-DTWIJ3GJ.js";import{a as F}from"./chunk-JGDK6YKG.js";import{a as R}from"./chunk-TWVVIWKO.js";import{Aa as s,Ga as P,I as v,Ia as C,Ka as c,M as f,N as b,Ta as M,Ua as w,Va as l,W as E,Wa as _,Xa as y,Ya as O,aa as T,ea as i,ka as z,lb as m,qa as I,ra as g,sa as u,va as k,wa as S,xa as p,ya as a,yb as L,za as r,zb as H}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var D=(n,e)=>e.id;function W(n,e){n&1&&(a(0,"div",1),s(1,"div",3)(2,"div",4)(3,"div",5)(4,"div",6)(5,"div",7),r())}function X(n,e){if(n&1&&(a(0,"app-empty",2)(1,"a",8),s(2,"app-icon",9),l(3," Back to Specs "),r()()),n&2){let t=c();p("body","No spec matches "+t.specId()+"."),i(2),p("size",12)}}function Y(n,e){if(n&1&&(a(0,"app-pill",20),l(1),r()),n&2){let t=c();p("color","var(--node-code)")("bg","var(--node-code-soft)"),i(),_(t.priority)}}function Z(n,e){if(n&1&&(a(0,"span",22),l(1,"owned by "),a(2,"span",37),l(3),r()()),n&2){let t=c();i(3),_(t.owner)}}function ee(n,e){if(n&1&&(a(0,"span",22),l(1),r()),n&2){let t=c(2);i(),y("verified ",t.relTime(e))}}function te(n,e){if(n&1&&s(0,"span",43),n&2){let t=e.$implicit,o=c(3);M("background",o.critColor(t.state)),w("pending",t.state==="pending"),p("title",t.id+" \xB7 "+o.stateLabel(t.state))}}function ne(n,e){n&1&&s(0,"app-icon",45),n&2&&p("name",e)("size",12)}function ie(n,e){if(n&1&&s(0,"span",49),n&2){let t=c().$implicit,o=c(3);M("border-color",o.critColor(t.state))}}function oe(n,e){if(n&1&&(a(0,"div",42)(1,"span",44),g(2,ne,1,2,"app-icon",45)(3,ie,1,2,"span",46),r(),a(4,"span",47),l(5),r(),a(6,"span",48),l(7),r()()),n&2){let t,o=e.$implicit,d=e.$index,x=c(3);i(),M("background",x.critBg(o.state))("color",x.critColor(o.state)),p("title",x.stateLabel(o.state)),i(),u((t=x.critIcon(o.state))?2:3,t),i(3),y("A",d+1),i(2),_(o.title)}}function re(n,e){if(n&1&&(a(0,"section",23)(1,"div",26)(2,"div",24),l(3,"Acceptance criteria"),r(),a(4,"div",38),l(5),r()(),a(6,"div",39),k(7,te,1,5,"span",40,D),r(),a(9,"div",41),k(10,oe,8,8,"div",42,D),r()()),n&2){let t=c(2);i(4),w("all-met",t.metCount()===t.criteria().length),i(),O(" ",t.metCount()," / ",t.criteria().length," met "),i(2),S(t.criteria()),i(3),S(t.criteria())}}function ae(n,e){if(n&1&&(a(0,"div",27),l(1),r()),n&2){let t=c(2);i(),O("",t.links().length," ",t.links().length===1?"symbol":"symbols")}}function de(n,e){if(n&1&&(a(0,"div",28),l(1,"No linked code yet \u2014 run "),a(2,"span",50),l(3),r(),l(4," to link it."),r()),n&2){let t,o=c(2);i(3),y("/ss-spec implement ",(t=o.spec())==null?null:t.id)}}function le(n,e){if(n&1&&(a(0,"app-pill"),l(1),r()),n&2){let t=c().$implicit;i(),_(t.provenance)}}function ce(n,e){if(n&1){let t=P();a(0,"div",51),s(1,"app-state-pill",52),a(2,"span",53),l(3),r(),s(4,"span",54),g(5,le,2,1,"app-pill"),a(6,"button",55),C("click",function(){let d=f(t).$implicit,x=c(3);return b(x.revealLink(d))}),s(7,"app-icon",56),l(8," Reveal "),r()()}if(n&2){let t=e.$implicit,o=c(3);i(),p("state",t.state),i(2),_(o.linkTarget(t)),i(2),u(t.provenance?5:-1),i(),I("aria-label","Reveal "+o.linkTarget(t)),i(),p("size",12)}}function pe(n,e){if(n&1&&(a(0,"div",29),k(1,ce,9,5,"div",51,D),r()),n&2){let t=c(2);i(),S(t.links())}}function se(n,e){if(n&1){let t=P();a(0,"div",10)(1,"a",11),s(2,"app-icon",12),l(3," Specs "),r(),a(4,"span",13),l(5,"/"),r(),a(6,"span",14),l(7),r(),a(8,"span",13),l(9,"\xB7"),r(),a(10,"span",15),l(11),r(),s(12,"app-copy-btn",16),r(),a(13,"h1",17),l(14),r(),a(15,"div",18),s(16,"app-state-pill",19),g(17,Y,2,3,"app-pill",20),a(18,"span",21),l(19),r(),g(20,Z,4,1,"span",22),g(21,ee,2,1,"span",22),r(),a(22,"section",23)(23,"div",24),l(24,"Requirement"),r(),s(25,"div",25),r(),g(26,re,12,4,"section",23),a(27,"section",23)(28,"div",26)(29,"div",24),l(30,"Linked code"),r(),g(31,ae,2,2,"div",27),r(),g(32,de,5,1,"div",28)(33,pe,3,0,"div",29),r(),a(34,"div",30)(35,"button",31),C("click",function(){f(t);let d=c();return b(d.onImplement())}),s(36,"app-icon",32),l(37),r(),a(38,"button",33),C("click",function(){f(t);let d=c();return b(d.onVerify())}),s(39,"app-icon",34),l(40),r(),a(41,"button",33),C("click",function(){f(t);let d=c();return b(d.onEdit())}),s(42,"app-icon",35),l(43," Edit spec "),r(),a(44,"button",33),C("click",function(){f(t);let d=c();return b(d.onShowInGraph())}),s(45,"app-icon",36),l(46," Show in graph "),r()()}if(n&2){let t,o=e,d=c();i(2),p("size",13),i(5),_(o.sourcePath),i(4),_(o.id),i(),p("text",o.id),i(2),_(o.title),i(2),p("state",d.overallState())("withDot",!0),i(),u(o.priority?17:-1),i(2),_(o.kind),i(),u(o.owner?20:-1),i(),u((t=d.verifiedAt())?21:-1,t),i(4),p("innerHTML",d.bodyHtml(),T),i(),u(d.criteria().length>0?26:-1),i(5),u(d.links().length>0?31:-1),i(),u(d.links().length===0?32:33),i(4),p("size",12),i(),y(" ",d.copied()==="implement"?"Copied!":"Implement"," "),i(2),p("size",12),i(),y(" ",d.copied()==="verify"?"Copied!":"Verify"," "),i(2),p("size",12),i(3),p("size",12)}}function K(n){return n.replace(/<!--[\s\S]*?-->/g,"")}var me=["broken","orphaned","drifted","drafted","implementing","implemented","verified"],xe={verified:"check",implemented:"check",completed:"check",drifted:"drift",broken:"cancel",orphaned:"cancel",failed:"cancel"};function ge(n){return n.length?n.some(e=>e.state==="broken")?"broken":n.some(e=>e.state==="orphaned")?"orphaned":n.some(e=>e.state==="drifted")?"drifted":n.every(e=>e.state==="verified")?"verified":"implemented":"pending"}var J=class n{api=v(R);projects=v(F);router=v($);route=v(N);sanitizer=v(L);paramMap=U(this.route.paramMap,{initialValue:this.route.snapshot.paramMap});specId=m(()=>this.paramMap().get("id")??"");detail=A(this.api,()=>{let e=this.specId();return e?`/api/spec/${encodeURIComponent(e)}${this.projects.projectQuery()}`:null});loading=m(()=>this.detail.state().loading);spec=m(()=>this.detail.state().data?.spec??null);links=m(()=>this.detail.state().data?.links??[]);children=m(()=>this.detail.state().data?.children??[]);childLinks=m(()=>this.detail.state().data?.childLinks??{});notFound=m(()=>!this.loading()&&!!this.specId()&&!this.spec());overallState=m(()=>{let e=this.links();if(!e.length)return"drafted";for(let t of me)if(e.some(o=>o.state===t))return t;return"implemented"});verifiedAt=m(()=>{let e=this.links().filter(t=>t.state==="verified").map(t=>t.updatedAt);return e.length?Math.max(...e):null});criteria=m(()=>{let e=this.childLinks();return this.children().filter(t=>t.kind==="acceptance").map(t=>{let o=e[t.id]??[],d=ge(o);return{id:t.id,title:K(t.title).trim(),state:d,hasLinks:o.length>0,met:d==="verified"}})});metCount=m(()=>this.criteria().filter(e=>e.met).length);critIcon(e){return xe[e]??null}critColor(e){return h[e]?.color??"var(--text-muted)"}critBg(e){return h[e]?.bg??"rgba(255,255,255,0.05)"}bodyHtml=m(()=>this.sanitizer.bypassSecurityTrustHtml(G(K(this.spec()?.body??""))));stateColor(e){return h[e]?.color??"var(--node-spec)"}stateLabel(e){return h[e]?.label??e}relTime(e){let t=Date.now()-e,o=Math.max(0,Math.round(t/1e3));if(o<60)return`${o}s ago`;let d=Math.round(o/60);if(d<60)return`${d}m ago`;let x=Math.round(d/60);return x<24?`${x}h ago`:`${Math.round(x/24)}d ago`}linkTarget(e){return`${e.targetFilePath}:${e.targetQualifiedName}`}copied=E(null);copyCmd(e,t){try{navigator.clipboard?.writeText(e)}catch{}this.copied.set(t),setTimeout(()=>{this.copied()===t&&this.copied.set(null)},1800)}onImplement(){let e=this.spec()?.id;e&&this.copyCmd(`/ss-spec implement ${e}`,"implement")}onVerify(){this.copyCmd("/ss-check","verify")}onEdit(){this.router.navigate(["/specs"])}onShowInGraph(){let e=this.spec()?.id;this.router.navigate(["/graph"],{queryParams:e?{focus:"spec:"+e}:{}})}revealLink(e){this.router.navigate(["/graph"],{queryParams:{focus:this.linkTarget(e)}})}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=z({type:n,selectors:[["app-spec-detail"]],decls:4,vars:1,consts:[[1,"scroll-y","spec-detail"],[1,"sd-skel"],["icon","book","title","Spec not found",3,"body"],[1,"skel",2,"height","16px","width","220px","border-radius","5px"],[1,"skel",2,"height","34px","width","60%","border-radius","7px","margin-top","14px"],[1,"skel",2,"height","20px","width","340px","border-radius","6px","margin-top","12px"],[1,"skel",2,"height","120px","border-radius","10px","margin-top","22px"],[1,"skel",2,"height","160px","border-radius","10px","margin-top","14px"],["action","","routerLink","/specs",1,"btn","btn-secondary","btn-sm"],["name","arrowRight",3,"size"],[1,"sd-crumb"],["routerLink","/specs",1,"sd-back"],["name","chevronLeft",3,"size"],[1,"sd-sep"],[1,"mono","sd-path"],[1,"mono","sd-id"],["label","Copy spec id",3,"text"],[1,"sd-title"],[1,"sd-meta"],[3,"state","withDot"],[3,"color","bg"],[1,"sd-meta-kind"],[1,"sd-meta-dim"],[1,"sd-section"],[1,"sd-eyebrow"],[1,"sd-prose",3,"innerHTML"],[1,"sd-section-head"],[1,"sd-count"],[1,"sd-empty-row"],[1,"sd-links"],[1,"sd-actions"],["type","button",1,"btn","btn-primary","btn-sm",3,"click"],["name","play",3,"size"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["name","check",3,"size"],["name","book",3,"size"],["name","graph",3,"size"],[1,"sd-meta-owner"],[1,"sd-rollup"],[1,"sd-crit-bars"],[1,"sd-crit-seg",3,"pending","background","title"],[1,"sd-criteria"],[1,"sd-crit"],[1,"sd-crit-seg",3,"title"],[1,"sd-crit-mark",3,"title"],[3,"name","size"],[1,"sd-crit-dot",3,"border-color"],[1,"sd-crit-id","mono"],[1,"sd-crit-text"],[1,"sd-crit-dot"],[1,"mono"],[1,"sd-link"],[3,"state"],[1,"mono","sd-link-target"],[1,"grow"],["type","button",1,"btn","btn-ghost","btn-xs",3,"click"],["name","reveal",3,"size"]],template:function(t,o){if(t&1&&(a(0,"div",0),g(1,W,6,0,"div",1)(2,X,4,2,"app-empty",2)(3,se,47,21),r()),t&2){let d;i(),u(o.loading()?1:o.notFound()?2:(d=o.spec())?3:-1,d)}},dependencies:[V,H,j,Q,B,q],styles:['@charset "UTF-8";[_nghost-%COMP%]{display:contents}.spec-detail[_ngcontent-%COMP%]{flex:1;padding:22px 26px 40px;color:var(--text-primary);background:var(--bg-canvas);max-width:920px}.sd-skel[_ngcontent-%COMP%]{display:flex;flex-direction:column}.sd-crumb[_ngcontent-%COMP%]{display:flex;align-items:center;gap:7px;font-size:12px;color:var(--text-muted);margin-bottom:12px}.sd-back[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:3px;color:var(--text-secondary);text-decoration:none;cursor:pointer}.sd-back[_ngcontent-%COMP%]:hover{color:var(--text-primary)}.sd-sep[_ngcontent-%COMP%]{color:var(--text-faint)}.sd-path[_ngcontent-%COMP%]{color:var(--text-secondary)}.sd-id[_ngcontent-%COMP%]{color:var(--node-spec)}.sd-title[_ngcontent-%COMP%]{font-size:24px;font-weight:650;letter-spacing:-.02em;line-height:1.18;margin:0 0 12px;color:var(--text-primary)}.sd-meta[_ngcontent-%COMP%]{display:flex;align-items:center;flex-wrap:wrap;gap:10px;margin-bottom:26px;font-size:12px}.sd-meta-kind[_ngcontent-%COMP%]{font-size:11px;color:var(--text-secondary);background:var(--bg-hover);border:1px solid var(--border-subtle);padding:2px 8px;border-radius:5px}.sd-meta-dim[_ngcontent-%COMP%]{color:var(--text-muted)}.sd-meta-owner[_ngcontent-%COMP%]{color:var(--text-secondary)}.sd-section[_ngcontent-%COMP%]{margin-bottom:24px}.sd-section-head[_ngcontent-%COMP%]{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:10px}.sd-eyebrow[_ngcontent-%COMP%]{font-size:10.5px;font-weight:650;letter-spacing:.09em;text-transform:uppercase;color:var(--text-muted);margin-bottom:10px}.sd-section-head[_ngcontent-%COMP%] .sd-eyebrow[_ngcontent-%COMP%]{margin-bottom:0}.sd-prose[_ngcontent-%COMP%]{font-size:14px;line-height:1.62;color:var(--text-secondary)}.sd-prose[_ngcontent-%COMP%] [_ngcontent-%COMP%]:global(strong){color:var(--text-primary);font-weight:600}.sd-prose[_ngcontent-%COMP%] [_ngcontent-%COMP%]:global(code){font-family:ui-monospace,Geist Mono,monospace;font-size:.86em;color:var(--node-spec);background:var(--node-spec-soft);padding:1px 5px;border-radius:4px}.sd-prose[_ngcontent-%COMP%] [_ngcontent-%COMP%]:global(p){margin:0 0 10px}.sd-rollup[_ngcontent-%COMP%]{font-size:11px;font-weight:600;color:var(--text-muted);font-family:ui-monospace,monospace}.sd-rollup.all-met[_ngcontent-%COMP%]{color:var(--success)}.sd-crit-bars[_ngcontent-%COMP%]{display:flex;gap:4px;margin-bottom:12px}.sd-crit-seg[_ngcontent-%COMP%]{flex:1;height:4px;border-radius:999px;opacity:.9}.sd-crit-seg.pending[_ngcontent-%COMP%]{opacity:.25}.sd-criteria[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:6px}.sd-crit[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:8px;background:var(--bg-panel);border:1px solid var(--border-subtle)}.sd-crit-mark[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:5px;flex-shrink:0}.sd-crit-dot[_ngcontent-%COMP%]{width:7px;height:7px;border-radius:50%;border:1.6px solid currentColor;box-sizing:border-box}.sd-crit-id[_ngcontent-%COMP%]{font-size:10px;color:var(--text-muted);flex-shrink:0;width:22px}.sd-crit-text[_ngcontent-%COMP%]{font-size:13px;color:var(--text-secondary);line-height:1.45}.sd-count[_ngcontent-%COMP%]{font-size:11px;color:var(--text-muted);font-family:ui-monospace,monospace}.sd-empty-row[_ngcontent-%COMP%]{font-size:12.5px;color:var(--text-muted);padding:12px;border-radius:8px;background:var(--bg-panel);border:1px dashed var(--border-subtle)}.sd-empty-row[_ngcontent-%COMP%] .mono[_ngcontent-%COMP%]{color:var(--text-secondary)}.sd-links[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:5px}.sd-link[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:9px 12px;border-radius:8px;background:var(--bg-panel);border:1px solid var(--border-subtle);font-size:12.5px}.sd-link-state[_ngcontent-%COMP%]{display:inline-flex;align-items:center;flex-shrink:0}.sd-link-target[_ngcontent-%COMP%]{color:var(--text-primary)}.grow[_ngcontent-%COMP%]{flex:1}.sd-prov[_ngcontent-%COMP%]{font-size:10px;color:var(--text-muted);background:var(--bg-hover);border:1px solid var(--border-subtle);padding:1px 6px;border-radius:4px}.sd-link-statelabel[_ngcontent-%COMP%]{font-size:11px;font-weight:600}.sd-actions[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:8px;margin-top:28px;padding-top:18px;border-top:1px solid var(--border-subtle)}.mono[_ngcontent-%COMP%]{font-family:ui-monospace,Geist Mono,monospace}'],changeDetection:0})};export{J as SpecDetail};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as L}from"./chunk-5NTGUSXJ.js";import{c as R}from"./chunk-
|
|
1
|
+
import{a as L}from"./chunk-5NTGUSXJ.js";import{c as R}from"./chunk-DTWIJ3GJ.js";import"./chunk-JGDK6YKG.js";import{a as j}from"./chunk-TWVVIWKO.js";import{Aa as x,Ga as D,I as S,Ia as $,Ka as p,M as E,N as P,Ta as u,Ua as C,Va as s,W as k,Wa as l,X as O,Xa as h,Ya as I,ea as a,gb as w,ib as y,ka as T,lb as f,ra as v,sa as _,ua as z,va as m,vb as F,wa as g,xa as b,ya as i,za as r,zb as H}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var M=(n,t)=>t.id,V=(n,t)=>t.label,U=(n,t)=>t.model;function W(n,t){if(n&1){let e=D();i(0,"button",20),$("click",function(){let c=E(e).$implicit,d=p();return P(d.toggle(c.id))}),s(1),r()}if(n&2){let e=t.$implicit,o=p();C("active",o.sel().has(e.id)),a(),l(e.name)}}function q(n,t){if(n&1&&s(0),n&2){let e=p(2);h(", just ",e.best().drift," drifted links")}}function G(n,t){if(n&1&&(i(0,"div",4)(1,"div",21),x(2,"app-icon",22),r(),i(3,"div",7)(4,"span",23),s(5,"Most efficient: "),r(),i(6,"span",24),s(7),r(),i(8,"span",25),s(9),w(10,"number"),v(11,q,1,1),r()(),i(12,"button",26),x(13,"app-icon",27),s(14,"Export report "),r()()),n&2){let e=p();a(2),b("size",18),a(5),l(e.best().name),a(2),I(" \u2014 ",y(10,6,e.best().cacheHit*100,"1.0-0"),"% cache hit, ",e.fmt$(e.best().avgCost)," avg/session"),a(2),_(e.best().drift>0?11:-1),a(2),b("size",12)}}function J(n,t){if(n&1&&(i(0,"code",34),s(1),r()),n&2){let e=t.$implicit;a(),l(e)}}function K(n,t){if(n&1&&m(0,J,2,1,"code",34,z),n&2){let e=p().$implicit;g(e.topTools)}}function Q(n,t){n&1&&(i(0,"span",33),s(1,"\u2014"),r())}function X(n,t){if(n&1&&(i(0,"div",28)(1,"span",29),s(2),r(),i(3,"span",30),s(4),r(),i(5,"span",30),s(6),r(),i(7,"span",30),s(8),r(),i(9,"span",30),s(10),w(11,"number"),r(),i(12,"span",31),s(13),r(),i(14,"span",32),v(15,K,2,0)(16,Q,2,0,"span",33),r()()),n&2){let e,o,c=t.$implicit,d=p();C("best-row",((e=d.best())==null?null:e.id)===c.id),a(),u("color",((o=d.best())==null?null:o.id)===c.id?"var(--success)":"var(--text-primary)"),a(),l(c.name),a(2),l(d.fmt$(c.cost)),a(2),l(c.sessions),a(2),l(d.fmt$(c.avgCost)),a(),u("color",d.cacheColor(c.cacheHit)),a(),h("",y(11,15,c.cacheHit*100,"1.0-0"),"%"),a(2),u("color",c.drift>10?"var(--warn)":"var(--text-secondary)"),a(),l(c.drift),a(2),_(c.topTools.length>0?15:16)}}function Y(n,t){if(n&1&&(i(0,"span",18),x(1,"span",35),s(2),r()),n&2){let e=t.$implicit;a(),u("background",e.color),a(),h(" ",e.label," ")}}function Z(n,t){if(n&1&&x(0,"div",40),n&2){let e=t.$implicit,o=p(2);u("width",e.widthPct,"%")("background",e.color),b("title",e.label+": "+o.fmt$(e.cost))}}function ee(n,t){if(n&1&&(i(0,"div",19)(1,"span",36),s(2),r(),i(3,"div",37),m(4,Z,1,5,"div",38,U),r(),i(6,"span",39),s(7),r()()),n&2){let e=t.$implicit,o=p();a(2),l(e.name),a(2),g(o.segments(e)),a(3),l(o.fmt$(e.cost))}}var te=[[/opus/i,"#A586F5"],[/sonnet/i,"#5B93F2"],[/haiku/i,"#29D2BE"]],ne="#5C6573";function N(n){for(let[t,e]of te)if(t.test(n))return e;return ne}function B(n){return/opus/i.test(n)?"Opus":/sonnet/i.test(n)?"Sonnet":/haiku/i.test(n)?"Haiku":n.replace(/^claude-/i,"")}var A=class n{api=S(j);resource=R(this.api,()=>"/api/claude/compare");all=f(()=>(this.resource.state().data?.projects??[]).map(e=>({id:e.path||e.name,name:(e.name||"").split("/").filter(Boolean).pop()||e.name||"?",sessions:e.sessions||0,cost:e.cost||0,avgCost:e.avgCost||0,cacheHit:e.cacheHit||0,prompts:e.prompts||0,drift:e.drift??0,byModel:e.byModel??[],topTools:e.topTools??[]})));sel=k(new Set);constructor(){O(()=>{let t=this.all();t.length>0&&this.sel().size===0&&this.sel.set(new Set(t.map(e=>e.id)))})}rows=f(()=>{let t=this.sel();return this.all().filter(e=>t.has(e.id))});best=f(()=>[...this.rows()].sort((e,o)=>o.cacheHit-o.avgCost/100-(e.cacheHit-e.avgCost/100))[0]??null);maxCost=f(()=>{let t=this.rows().map(e=>e.cost);return t.length?Math.max(...t):1});segments(t){let e=this.maxCost();return t.byModel.map(o=>({model:o.model,label:B(o.model),color:N(o.model),cost:o.cost,widthPct:e>0?o.cost/e*100:0}))}legend=f(()=>{let t=new Map;for(let e of this.rows())for(let o of e.byModel){let c=B(o.model);t.has(c)||t.set(c,{label:c,color:N(o.model)})}return[...t.values()]});toggle(t){this.sel.update(e=>{let o=new Set(e);return o.has(t)?o.delete(t):o.add(t),o})}cacheColor(t){return t>=.7?"var(--success)":t>=.5?"var(--warn)":"var(--error)"}fmt$(t){return"$"+t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=T({type:n,selectors:[["app-compare"]],decls:35,vars:2,consts:[[1,"page","scroll-y"],["icon","compare","title","Compare projects","sub","Which projects are cost-efficient vs hungry"],[1,"chip-row"],["type","button",1,"chip",3,"active"],[1,"best-card","card","card-pad",2,"margin-bottom","14px","border-color","rgba(70,194,107,0.3)","background","var(--success-soft)","display","flex","gap","12px","align-items","center"],[1,"card",2,"overflow","hidden","margin-bottom","14px"],[1,"row","header-row"],[1,"grow"],[1,"num"],[1,"num",2,"width","60px"],[2,"width","150px","text-align","right","font-size","10.5px","color","var(--text-muted)","text-transform","uppercase","letter-spacing","0.05em","font-weight","600"],[1,"row","data-row",3,"best-row"],[1,"card","card-pad"],[1,"row",2,"justify-content","space-between","margin-bottom","14px"],[1,"row","gap-8"],["name","dollar",2,"color","var(--accent)",3,"size"],[2,"font-weight","600","font-size","12.5px"],[1,"row","gap-12"],[1,"row","gap-4","muted",2,"font-size","10.5px"],[1,"stacked-row"],["type","button",1,"chip",3,"click"],[2,"color","var(--success)"],["name","sparkles",3,"size"],[2,"font-weight","600","font-size","13px"],[1,"mono",2,"color","var(--success)"],[1,"secondary",2,"font-size","12.5px"],[1,"btn","btn-secondary","btn-sm"],["name","external",3,"size"],[1,"row","data-row"],[1,"mono","grow","project-name"],[1,"mono","tabular","num"],[1,"mono","tabular",2,"width","60px","text-align","right","font-size","12px"],[1,"row","gap-4",2,"width","150px","justify-content","flex-end","flex-wrap","wrap"],[1,"mono",2,"font-size","12px","color","var(--text-secondary)"],[1,"tool-chip","mono"],[2,"width","9px","height","9px","border-radius","3px"],[1,"mono","stacked-lbl"],[1,"stacked-bars"],[1,"stacked-seg",3,"width","background","title"],[1,"mono","tabular","muted","stacked-total",2,"font-size","11px"],[1,"stacked-seg",3,"title"]],template:function(e,o){e&1&&(i(0,"div",0),x(1,"app-page-head",1),i(2,"div",2),m(3,W,2,3,"button",3,M),r(),v(5,G,15,9,"div",4),i(6,"div",5)(7,"div",6)(8,"span",7),s(9,"Project"),r(),i(10,"span",8),s(11,"Cost"),r(),i(12,"span",8),s(13,"Sessions"),r(),i(14,"span",8),s(15,"Avg"),r(),i(16,"span",8),s(17,"Cache"),r(),i(18,"span",9),s(19,"Drift"),r(),i(20,"span",10),s(21,"Top tools"),r()(),m(22,X,17,18,"div",11,M),r(),i(24,"div",12)(25,"div",13)(26,"div",14),x(27,"app-icon",15),i(28,"span",16),s(29,"Cost by model per project"),r()(),i(30,"div",17),m(31,Y,3,3,"span",18,V),r()(),m(33,ee,8,2,"div",19,M),r()()),e&2&&(a(3),g(o.all()),a(2),_(o.best()?5:-1),a(17),g(o.rows()),a(5),b("size",14),a(4),g(o.legend()),a(2),g(o.rows()))},dependencies:[L,H,F],styles:["[_nghost-%COMP%]{display:contents}.page[_ngcontent-%COMP%]{flex:1;padding:18px}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono)}.grow[_ngcontent-%COMP%]{flex:1}.secondary[_ngcontent-%COMP%]{color:var(--text-secondary)}.chip-row[_ngcontent-%COMP%]{display:flex;gap:6px;margin-bottom:14px;flex-wrap:wrap}.chip[_ngcontent-%COMP%]{height:28px;padding:0 12px;border-radius:999px;font-size:12px;font-family:var(--font-mono);cursor:pointer;border:1px solid var(--border-subtle);background:var(--bg-panel);color:var(--text-muted)}.chip.active[_ngcontent-%COMP%]{background:var(--accent-soft);color:var(--accent);border-color:transparent}.card[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:var(--r-lg)}.card-pad[_ngcontent-%COMP%]{padding:14px}.row[_ngcontent-%COMP%]{display:flex;align-items:center}.header-row[_ngcontent-%COMP%]{padding:9px 14px;gap:14px;font-size:10.5px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;font-weight:600;border-bottom:1px solid var(--border-subtle)}.data-row[_ngcontent-%COMP%]{display:flex;gap:14px;padding:11px 14px;align-items:center;border-top:1px solid var(--border-subtle)}.data-row[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.project-name[_ngcontent-%COMP%]{font-size:12.5px}.num[_ngcontent-%COMP%]{width:70px;text-align:right;font-size:12px;font-variant-numeric:tabular-nums}.stacked-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:140px 1fr 70px;gap:12px;align-items:center;padding:6px 0;border-top:1px solid var(--border-subtle)}.stacked-row[_ngcontent-%COMP%]:first-of-type{border-top:none}.stacked-lbl[_ngcontent-%COMP%]{font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.stacked-bars[_ngcontent-%COMP%]{display:flex;height:18px;border-radius:4px;overflow:hidden;gap:2px}.stacked-seg[_ngcontent-%COMP%]{height:100%;border-radius:3px}.stacked-total[_ngcontent-%COMP%]{text-align:right}.tool-chip[_ngcontent-%COMP%]{font-size:9.5px;background:var(--bg-canvas);color:var(--text-secondary);padding:1px 5px;border-radius:3px;white-space:nowrap}"],changeDetection:0})};export{A as Compare};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as R}from"./chunk-JLOJCDIY.js";import{a as V}from"./chunk-5NTGUSXJ.js";import{a as $}from"./chunk-PZSU53SS.js";import{c as N}from"./chunk-
|
|
1
|
+
import{a as R}from"./chunk-JLOJCDIY.js";import{a as V}from"./chunk-5NTGUSXJ.js";import{a as $}from"./chunk-PZSU53SS.js";import{c as N}from"./chunk-DTWIJ3GJ.js";import"./chunk-JGDK6YKG.js";import{a as F}from"./chunk-TWVVIWKO.js";import{Aa as p,Ea as S,Fa as T,Ga as h,I as P,Ia as O,Ka as c,M as b,N as y,Ta as E,Ua as I,Va as s,W as C,Wa as l,Xa as g,bb as D,ea as o,ka as z,lb as M,qa as k,ra as x,sa as _,ua as w,va as u,wa as f,xa as d,ya as a,za as r,zb as B}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var j=()=>[0,1,2,3],H=(n,t)=>t.id;function q(n,t){n&1&&p(0,"div",6)}function G(n,t){n&1&&u(0,q,1,0,"div",6,w),n&2&&f(D(0,j))}function J(n,t){n&1&&(a(0,"div",4),s(1,"No tips."),r())}function K(n,t){if(n&1&&p(0,"app-icon",13),n&2){let e=c().$implicit;d("name",e.icon)("size",15)}}function L(n,t){n&1&&p(0,"app-icon",14),n&2&&d("size",15)}function Q(n,t){if(n&1){let e=h();a(0,"div",37),O("click",function(){b(e);let m=c(2).$implicit,v=c(2);return y(v.dismiss(m.id))}),s(1),r()}if(n&2){let e=t.$implicit;o(),g("Snooze ",e)}}function U(n,t){if(n&1&&(a(0,"div",35),u(1,Q,2,1,"div",36,w),r()),n&2){let e=c(3);o(),f(e.snoozeOpts)}}function W(n,t){if(n&1){let e=h();a(0,"div",8),p(1,"div",9),a(2,"div",10)(3,"div",11)(4,"div",12),x(5,K,1,2,"app-icon",13)(6,L,1,1,"app-icon",14),r(),a(7,"div",15)(8,"div",16),s(9),r()(),a(10,"app-pill",3),s(11),r()(),a(12,"div",17),s(13),r(),a(14,"div",18)(15,"div",19)(16,"div",20),s(17,"Evidence"),r(),a(18,"div",21),p(19,"app-icon",22),a(20,"span",23),s(21),r()(),a(22,"div",24),s(23),r()(),a(24,"div",19)(25,"div",20),s(26,"Impact"),r(),a(27,"div",25),s(28),r()()(),a(29,"div",26)(30,"div",27)(31,"span",28),s(32,"fix"),r(),a(33,"code",29),s(34),r(),p(35,"app-copy-btn",30),r(),a(36,"button",31),s(37,"Apply"),r(),a(38,"div",32)(39,"button",33),O("click",function(){let m=b(e).$implicit,v=c(2);return y(v.toggleSnooze(m.id))}),s(40," Dismiss "),p(41,"app-icon",34),r(),x(42,U,3,0,"div",35),r()()()()}if(n&2){let e=t.$implicit,i=c(2);I("dismissed",i.isDismissed(e.id)),k("data-sev",e.severity),o(4),E("background",i.sevBg(e.severity))("color",i.sevColor(e.severity)),o(),_(e.icon?5:6),o(4),l(e.title),o(),d("color",i.sevColor(e.severity))("bg",i.sevBg(e.severity)),o(),l(e.severity),o(2),l(e.why),o(6),d("size",11),o(2),l(e.evidence.session),o(2),l(e.evidence.detail),o(5),l(e.saving),o(6),l(e.fix),o(),d("text",e.fix),o(6),d("size",12),o(),_(i.snoozeOpen(e.id)?42:-1)}}function X(n,t){if(n&1&&(a(0,"div",5),u(1,W,43,21,"div",7,H),r()),n&2){let e=c();o(),f(e.ordered())}}var A=class n{api=P(F);resource=N(this.api,()=>"/api/claude/tips");dismissedIds=C(new Set);snoozeOpenIds=C(new Set);snoozeOpts=["1 day","1 week","Forever"];ordered=M(()=>{let t=this.resource.state().data?.tips??[],e=this.dismissedIds(),i={error:0,warn:1,info:2};return[...t].filter(m=>!e.has(m.id)).sort((m,v)=>(i[m.severity]??9)-(i[v.severity]??9))});counts=M(()=>{let t=this.resource.state().data?.tips??[];return{error:t.filter(e=>e.severity==="error").length,warn:t.filter(e=>e.severity==="warn").length,info:t.filter(e=>e.severity==="info").length}});isDismissed(t){return this.dismissedIds().has(t)}snoozeOpen(t){return this.snoozeOpenIds().has(t)}toggleSnooze(t){this.snoozeOpenIds.update(e=>{let i=new Set(e);return i.has(t)?i.delete(t):i.add(t),i})}dismiss(t){this.dismissedIds.update(e=>new Set([...e,t])),this.snoozeOpenIds.update(e=>{let i=new Set(e);return i.delete(t),i})}sevColor(t){return t==="error"?"var(--error)":t==="warn"?"var(--warn)":"var(--info)"}sevBg(t){return t==="error"?"color-mix(in srgb, var(--error) 16%, transparent)":t==="warn"?"color-mix(in srgb, var(--warn) 16%, transparent)":"color-mix(in srgb, var(--info) 16%, transparent)"}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=z({type:n,selectors:[["app-tips"]],decls:12,vars:10,consts:[[1,"page","scroll-y"],["icon","tips","title","Tips","sub","A senior teammate reviewed your transcripts"],["actions",""],[3,"color","bg"],[1,"empty"],[1,"tips-grid"],[1,"skel","card-skel"],[1,"tip-card","card",3,"dismissed"],[1,"tip-card","card"],[1,"sev-bar"],[1,"tip-body"],[1,"row","gap-10",2,"margin-bottom","10px"],[1,"icon-tile"],[3,"name","size"],["name","tips",3,"size"],[1,"grow",2,"min-width","0"],[1,"tip-title"],[1,"tip-why"],[1,"tip-grid"],[1,"kv-block"],[1,"eyebrow"],[1,"row","gap-6",2,"font-size","11.5px","margin-top","2px"],["name","sessions",2,"color","var(--text-muted)",3,"size"],[1,"mono",2,"color","var(--accent)"],[1,"mono","secondary",2,"font-size","11px","margin-top","4px"],[2,"font-size","16px","font-weight","700","color","var(--success)","font-variant-numeric","tabular-nums","margin-top","2px"],[1,"actions"],[1,"fix-row","grow"],[1,"muted","fix-label"],[1,"mono","fix-code"],[3,"text"],["type","button",1,"btn","btn-primary","btn-sm"],[1,"dismiss-wrap",2,"position","relative"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["name","chevronDown",3,"size"],[1,"snooze-menu"],[1,"snooze-opt"],[1,"snooze-opt",3,"click"]],template:function(e,i){e&1&&(a(0,"div",0)(1,"app-page-head",1),S(2,2),a(3,"app-pill",3),s(4),r(),a(5,"app-pill",3),s(6),r(),a(7,"app-pill",3),s(8),r(),T(),r(),x(9,G,2,1)(10,J,2,0,"div",4)(11,X,3,0,"div",5),r()),e&2&&(o(3),d("color","var(--error)")("bg","var(--error-soft)"),o(),g("",i.counts().error," urgent"),o(),d("color","var(--warn)")("bg","var(--warn-soft)"),o(),g("",i.counts().warn," warn"),o(),d("color","var(--info)")("bg","var(--info-soft)"),o(),g("",i.counts().info," info"),o(),_(i.resource.state().loading?9:i.ordered().length===0?10:11))},dependencies:[V,R,$,B],styles:["[_nghost-%COMP%]{display:contents}.page[_ngcontent-%COMP%]{flex:1;padding:18px}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono)}.secondary[_ngcontent-%COMP%]{color:var(--text-secondary)}.grow[_ngcontent-%COMP%]{flex:1}.tips-grid[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:12px;max-width:860px}.tip-card[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:var(--r-lg);overflow:hidden;display:flex}.tip-card.dismissed[_ngcontent-%COMP%]{display:none}.tip-card[data-sev=error][_ngcontent-%COMP%] .sev-bar[_ngcontent-%COMP%]{background:var(--error)}.tip-card[data-sev=warn][_ngcontent-%COMP%] .sev-bar[_ngcontent-%COMP%]{background:var(--warn)}.tip-card[data-sev=info][_ngcontent-%COMP%] .sev-bar[_ngcontent-%COMP%]{background:var(--info)}.sev-bar[_ngcontent-%COMP%]{width:3px;flex-shrink:0}.tip-body[_ngcontent-%COMP%]{padding:14px 16px;flex:1;min-width:0}.icon-tile[_ngcontent-%COMP%]{width:28px;height:28px;border-radius:8px;display:grid;place-items:center;flex-shrink:0}.tip-title[_ngcontent-%COMP%]{font-size:14px;font-weight:600;letter-spacing:-.01em;text-wrap:pretty}.tip-why[_ngcontent-%COMP%]{color:var(--text-secondary);font-size:12.5px;line-height:1.6;margin-bottom:12px}.tip-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px}.kv-block[_ngcontent-%COMP%]{background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:var(--r-md);padding:10px}.eyebrow[_ngcontent-%COMP%]{font-size:10.5px;font-weight:600;text-transform:uppercase;letter-spacing:.07em;color:var(--text-muted);margin-bottom:5px}.actions[_ngcontent-%COMP%]{display:flex;gap:8px;align-items:center}.fix-row[_ngcontent-%COMP%]{min-width:0;display:flex;align-items:center;gap:8px;background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:7px;padding:6px 10px}.fix-label[_ngcontent-%COMP%]{color:var(--text-muted);font-size:10.5px;flex-shrink:0}.fix-code[_ngcontent-%COMP%]{flex:1;min-width:0;color:var(--text-primary);font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dismiss-wrap[_ngcontent-%COMP%]{position:relative}.snooze-menu[_ngcontent-%COMP%]{position:absolute;top:100%;right:0;margin-top:4px;background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:8px;box-shadow:0 4px 16px #00000059;padding:5px;width:130px;z-index:10}.snooze-opt[_ngcontent-%COMP%]{padding:6px 9px;border-radius:5px;cursor:pointer;font-size:12px;color:var(--text-primary)}.snooze-opt[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.skel[_ngcontent-%COMP%]{background:var(--bg-elevated);border-radius:5px;animation:_ngcontent-%COMP%_skeleton 1.4s ease-in-out infinite}.card-skel[_ngcontent-%COMP%]{height:200px;margin-bottom:12px}.empty[_ngcontent-%COMP%]{color:var(--text-muted);font-size:13px;padding:40px;text-align:center}@keyframes _ngcontent-%COMP%_skeleton{0%,to{opacity:.5}50%{opacity:.9}}"],changeDetection:0})};export{A as Tips};
|
package/lib/dist/web/index.html
CHANGED
|
@@ -142,5 +142,5 @@
|
|
|
142
142
|
})();
|
|
143
143
|
</script>
|
|
144
144
|
<app-root></app-root>
|
|
145
|
-
<link rel="modulepreload" href="chunk-2IVSOVQZ.js"><link rel="modulepreload" href="chunk-YV5LB22R.js"><link rel="modulepreload" href="chunk-DOKZOFKM.js"><link rel="modulepreload" href="chunk-
|
|
145
|
+
<link rel="modulepreload" href="chunk-2IVSOVQZ.js"><link rel="modulepreload" href="chunk-YV5LB22R.js"><link rel="modulepreload" href="chunk-DOKZOFKM.js"><link rel="modulepreload" href="chunk-DTWIJ3GJ.js"><link rel="modulepreload" href="chunk-JGDK6YKG.js"><link rel="modulepreload" href="chunk-TWVVIWKO.js"><link rel="modulepreload" href="chunk-SYGIPC2P.js"><link rel="modulepreload" href="chunk-Q7L6LLAK.js"><script src="main-5B4RR3BC.js" type="module"></script></body>
|
|
146
146
|
</html>
|