@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 +1 @@
|
|
|
1
|
-
import{a as V}from"./chunk-QPA2REUE.js";import{a as L}from"./chunk-5NTGUSXJ.js";import{a as H}from"./chunk-IOB4JJT4.js";import{c as $}from"./chunk-PAO2624Y.js";import{a as K}from"./chunk-PBRCKHEQ.js";import{a as B}from"./chunk-3H2EZLZN.js";import{Aa as c,Ea as z,Fa as D,Ga as j,I as M,Ia as S,Ka as m,M as T,N as E,Ta as k,Va as a,W as C,Wa as v,Xa as u,Ya as w,bb as _,ea as o,fb as N,gb as b,hb as F,ib as I,ka as O,lb as s,ra as g,sa as x,ua as P,va as y,vb as U,wa as f,xa as p,ya as e,za as t,zb as R}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var A=()=>({value:"today",label:"Today"}),Q=()=>({value:"week",label:"This week"}),G=()=>({value:"month",label:"This month"}),J=()=>({value:"all",label:"All time"}),W=(n,i,r,l)=>[n,i,r,l],X=()=>[0,1,2,3],Y=()=>[0,1,2],Z=(n,i)=>i.tool,ee=(n,i)=>i.project;function te(n,i){n&1&&(e(0,"div",4),c(1,"app-icon",5),e(2,"div",6),a(3,"No SpecShip tool usage in this range"),t()()),n&2&&(o(),p("size",28))}function ne(n,i){n&1&&(e(0,"div",27),a(1),b(2,"number"),t()),n&2&&(o(),u("",I(2,1,i.cost,"1.1-1"),"k tokens"))}function ie(n,i){if(n&1&&(e(0,"div",27),a(1),t()),n&2){let r=m(2);o(),u("",r.fmtK(r.spendTokens())," total")}}function ae(n,i){n&1&&(e(0,"div",27),a(1),b(2,"number"),t()),n&2&&(o(),u("",I(2,1,i.cost,"1.1-1"),"k tokens"))}function oe(n,i){if(n&1&&(e(0,"div",27),a(1),t()),n&2){let r=m(2);o(),u("",r.fmtK(r.savedTokens())," est. total")}}function re(n,i){n&1&&c(0,"div",36)}function de(n,i){n&1&&y(0,re,1,0,"div",36,P),n&2&&f(_(0,X))}function le(n,i){if(n&1&&(e(0,"div",42)(1,"span",44),a(2),t(),e(3,"span",45),a(4),b(5,"number"),t(),e(6,"span",46),a(7),t(),e(8,"span",47),a(9),t()()),n&2){let r=i.$implicit,l=m(3);o(2),v(r.tool),o(2),v(F(5,4,r.calls)),o(3),v(l.fmtK(r.spendTokens)),o(2),v(l.fmtK(r.savedTokens))}}function se(n,i){n&1&&(e(0,"div",43),a(1,"No tool data"),t())}function pe(n,i){if(n&1&&(e(0,"div",37)(1,"span",38),a(2,"Tool"),t(),e(3,"span",39),a(4,"Calls"),t(),e(5,"span",40),a(6,"Spend (tokens)"),t(),e(7,"span",41),a(8,"Est. saved"),t()(),y(9,le,10,6,"div",42,Z),g(11,se,2,0,"div",43)),n&2){let r=m(2);o(9),f(r.byTool()),o(2),x(r.byTool().length===0?11:-1)}}function ce(n,i){n&1&&c(0,"div",36)}function me(n,i){n&1&&y(0,ce,1,0,"div",36,P),n&2&&f(_(0,Y))}function ve(n,i){if(n&1&&(e(0,"div",52)(1,"span",53),a(2),t(),e(3,"span",46),a(4),t(),e(5,"span",47),a(6),t(),e(7,"span",54),a(8),t()()),n&2){let r=i.$implicit,l=m(4);o(2),v(r.project),o(2),v(l.fmtK(r.spendTokens)),o(2),v(l.fmtK(r.savedTokens)),o(),k("color",r.netTokens>=0?"var(--success)":"var(--warn)"),o(),v(l.fmtK(r.netTokens))}}function ue(n,i){if(n&1&&(e(0,"div",49)(1,"span",50),a(2,"Project"),t(),e(3,"span",40),a(4,"Spend (tokens)"),t(),e(5,"span",41),a(6,"Est. saved"),t(),e(7,"span",51),a(8,"Net"),t()(),y(9,ve,9,6,"div",52,ee)),n&2){let r=m(3);o(9),f(r.byProject())}}function ge(n,i){if(n&1&&(e(0,"div",30)(1,"div",31),c(2,"app-icon",48),e(3,"span",26),a(4,"By project"),t()(),g(5,me,2,1)(6,ue,11,0),t()),n&2){let r=m(2);o(2),p("size",14),o(3),x(r.resource.state().loading?5:6)}}function xe(n,i){if(n&1){let r=j();e(0,"div",7)(1,"div",8)(2,"div",9),c(3,"app-icon",10),e(4,"span",11),a(5,"Spend"),t()(),e(6,"div",12),a(7),t(),e(8,"div",13),a(9),t()(),e(10,"div",14)(11,"div",9),c(12,"app-icon",15),e(13,"span",11),a(14,"Est. saved"),t(),e(15,"span",16),a(16,"est."),t()(),e(17,"div",17),a(18),t(),e(19,"div",13),a(20),t()(),e(21,"div",8)(22,"div",9),c(23,"app-icon",18),e(24,"span",11),a(25,"Net"),t()(),e(26,"div",19)(27,"div",12),a(28),t()(),e(29,"div",13),a(30),t()(),e(31,"div",8)(32,"div",9),c(33,"app-icon",20),e(34,"span",11),a(35,"Coverage"),t()(),e(36,"div",12),a(37),t(),e(38,"div",13),a(39),t()()(),e(40,"div",21)(41,"div",22)(42,"div",23)(43,"div")(44,"div",24),c(45,"app-icon",25),e(46,"span",26),a(47,"Spend trend"),t()(),g(48,ne,3,4,"div",27)(49,ie,2,1,"div",27),t()(),e(50,"app-line-chart",28),S("hover",function(d){T(r);let h=m();return E(h.onHoverSpend(d))}),t()(),e(51,"div",22)(52,"div",23)(53,"div")(54,"div",24),c(55,"app-icon",15),e(56,"span",26),a(57,"Est. saved trend"),t(),e(58,"span",16),a(59,"est."),t()(),g(60,ae,3,4,"div",27)(61,oe,2,1,"div",27),t()(),e(62,"app-line-chart",29),S("hover",function(d){T(r);let h=m();return E(h.onHoverSaved(d))}),t()()(),e(63,"div",30)(64,"div",31),c(65,"app-icon",32),e(66,"span",26),a(67,"By tool"),t()(),g(68,de,2,1)(69,pe,12,1),t(),g(70,ge,7,2,"div",30),e(71,"details",33)(72,"summary",34),a(73,"Methodology & estimates"),t(),e(74,"p",35),a(75,` Estimates. Tokens \u2248 chars \xF7 4. "Saved" = the size of files a SpecShip query made unnecessary to Read, deduplicated per prompt; unresolved/natural-language queries count as 0. Cost priced at the model input rate. Net = saved \u2212 spend \u2212 overhead (a fixed per-session tool-definition cost). Per-project rows show saved \u2212 spend only \u2014 the per-session overhead isn't attributed to individual projects, so they won't sum to the headline net. Savings currently estimated for the primary project only. `),t(),e(76,"p",35)(77,"strong"),a(78,'"Saved" is a conservative lower bound.'),t(),a(79," It credits only a single direct read of the files a query's symbols live in \u2014 not the multi-call grep + read exploration (re-reads, dead-ends, and extra turns) SpecShip actually replaces. So net can read negative even when SpecShip reduced your real cost; the measured end-to-end savings (fewer turns over a smaller context) come from a with-vs-without comparison, which this per-session estimate can't see. Treat spend as exact and saved as a floor. "),t()()}if(n&2){let r,l,d=m();o(3),p("size",12),o(4),v(d.fmtK(d.spendTokens())),o(2),u("tokens \xB7 ",d.fmt$(d.spendCostUsd())),o(3),p("size",12),o(6),v(d.fmtK(d.savedTokens())),o(2),u("tokens \xB7 ",d.fmt$(d.savedCostUsd())),o(3),p("size",12),o(4),k("color",d.netTokens()>=0?"var(--success)":"var(--warn)"),o(),w("",d.netTokens()>0?"+":"","",d.fmtK(d.netTokens())),o(2),u("tokens \xB7 ",d.fmt$(d.netCostUsd())," \xB7 saved \u2212 spend \u2212 overhead"),o(3),p("size",12),o(4),w("",d.resolvedCalls(),"/",d.totalCalls()),o(2),u("resolved calls \xB7 ",d.unresolvedCalls()," unresolved"),o(6),p("size",13),o(3),x((r=d.hoveredSpend())?48:49,r),o(2),p("series",d.spendSeries())("height",150),o(5),p("size",13),o(5),x((l=d.hoveredSaved())?60:61,l),o(2),p("series",d.savedSeries())("height",150),o(3),p("size",14),o(3),x(d.resource.state().loading?68:69),o(2),x(d.byProject().length>0?70:-1)}}var q=class n{api=M(B);projects=M(K);range=C("month");ranges=["today","week","month","all"];hoveredSpend=C(null);hoveredSaved=C(null);resource=$(this.api,()=>`/api/claude/specship-impact?range=${this.range()}${this.projects.projectQuery("&")}`);data=s(()=>this.resource.state().data);spendTokens=s(()=>this.data()?.spendTokens??0);spendCostUsd=s(()=>this.data()?.spendCostUsd??0);savedTokens=s(()=>this.data()?.savedTokens??0);savedCostUsd=s(()=>this.data()?.savedCostUsd??0);netTokens=s(()=>this.data()?.netTokens??0);netCostUsd=s(()=>this.data()?.netCostUsd??0);overheadTokens=s(()=>this.data()?.overheadTokens??0);unresolvedCalls=s(()=>this.data()?.unresolvedCalls??0);totalCalls=s(()=>this.data()?.totalSpecshipCalls??0);resolvedCalls=s(()=>this.totalCalls()-this.unresolvedCalls());byTool=s(()=>this.data()?.byTool??[]);byProject=s(()=>this.data()?.byProject??[]);spendSeries=s(()=>(this.data()?.trend??[]).map((i,r)=>({day:r+1,cost:i.spendTokens/1e3,prompts:0})));savedSeries=s(()=>(this.data()?.trend??[]).map((i,r)=>({day:r+1,cost:i.savedTokens/1e3,prompts:0})));isEmpty=s(()=>this.totalCalls()===0&&!this.resource.state().loading);setRange(i){this.range.set(i)}onHoverSpend(i){this.hoveredSpend.set(i)}onHoverSaved(i){this.hoveredSaved.set(i)}fmt$(i){return"$"+i.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}fmtK(i){return i>=1e6?(i/1e6).toFixed(1)+"M":i>=1e3?(i/1e3).toFixed(i>=1e4?0:1)+"k":String(i)}static \u0275fac=function(r){return new(r||n)};static \u0275cmp=O({type:n,selectors:[["app-specship-impact"]],decls:6,vars:12,consts:[[1,"page","scroll-y"],["icon","graph","title","SpecShip Impact","sub","Token spend vs estimated savings from SpecShip tool calls"],["actions",""],["size","sm",3,"change","value","options"],[1,"empty-state","card","card-pad"],["name","graph",2,"color","var(--text-muted)",3,"size"],[1,"muted",2,"margin-top","8px","font-size","13px"],[1,"tiles"],[1,"card","card-pad","tile"],[1,"tile-label","row","gap-6"],["name","dollar",2,"color","var(--text-muted)",3,"size"],[1,"muted"],[1,"big-number","mono"],[1,"muted","tile-sub"],[1,"card","card-pad","tile","tile-saved"],["name","trendDown",2,"color","var(--success)",3,"size"],[1,"est-badge"],[1,"big-number","mono",2,"color","var(--success)"],["name","coins",2,"color","var(--text-muted)",3,"size"],[1,"row","gap-8",2,"align-items","baseline"],["name","check",2,"color","var(--text-muted)",3,"size"],[1,"top-grid"],[1,"card","card-pad","chart-card"],[1,"chart-header"],[1,"row","gap-6"],["name","dollar",2,"color","var(--accent)",3,"size"],[2,"font-weight","600","font-size","12.5px"],[1,"mono","muted",2,"font-size","11px","margin-top","2px"],["color","var(--accent)",3,"hover","series","height"],["color","var(--success)",3,"hover","series","height"],[1,"card","card-pad",2,"margin-bottom","14px"],[1,"row","gap-8",2,"margin-bottom","12px"],["name","layers",2,"color","var(--accent)",3,"size"],[1,"card","card-pad","methodology"],[1,"muted","methodology-summary"],[1,"muted","methodology-body"],[1,"skel","row-skel"],[1,"tool-row","tool-header"],[1,"muted","col-tool"],[1,"muted","col-calls"],[1,"muted","col-spend"],[1,"muted","col-saved"],[1,"tool-row"],[1,"muted",2,"font-size","12px","padding","6px 0"],[1,"mono","col-tool","tool-name"],[1,"mono","tabular","col-calls"],[1,"mono","tabular","col-spend"],[1,"mono","tabular","col-saved","est-val"],["name","folder",2,"color","var(--accent)",3,"size"],[1,"proj-row","proj-header"],[1,"muted","col-proj"],[1,"muted","col-net"],[1,"proj-row"],[1,"mono","col-proj"],[1,"mono","tabular","col-net"]],template:function(r,l){r&1&&(e(0,"div",0)(1,"app-page-head",1),z(2,2),e(3,"app-segmented",3),S("change",function(h){return l.setRange(h)}),t(),D(),t(),g(4,te,4,1,"div",4)(5,xe,80,27),t()),r&2&&(o(3),p("value",l.range())("options",N(7,W,_(3,A),_(4,Q),_(5,G),_(6,J))),o(),x(l.isEmpty()?4:5))},dependencies:[V,L,H,R,U],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)}.row[_ngcontent-%COMP%]{display:flex;align-items:center}.gap-6[_ngcontent-%COMP%]{gap:6px}.gap-8[_ngcontent-%COMP%]{gap:8px}.tabular[_ngcontent-%COMP%]{font-variant-numeric:tabular-nums}.card[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:var(--r-lg)}.card-pad[_ngcontent-%COMP%]{padding:14px}.tiles[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:14px}.tile[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:4px}.tile-label[_ngcontent-%COMP%]{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em}.tile-sub[_ngcontent-%COMP%]{font-size:11.5px;margin-top:1px}.big-number[_ngcontent-%COMP%]{font-size:28px;font-weight:700;letter-spacing:-.02em;line-height:1.1}.est-badge[_ngcontent-%COMP%]{font-size:9.5px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--success);border:1px solid var(--success);border-radius:3px;padding:0 3px;line-height:14px;opacity:.75}.est-val[_ngcontent-%COMP%]{color:var(--success)}.top-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:14px}.chart-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:10px}.chart-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:flex-start}.tool-header[_ngcontent-%COMP%]{border-top:none!important;font-size:10.5px;font-weight:600;text-transform:uppercase;letter-spacing:.05em}.tool-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 60px 110px 110px;gap:12px;align-items:center;padding:8px 0;border-top:1px solid var(--border-subtle);font-size:12.5px}.tool-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-tool[_ngcontent-%COMP%]{min-width:0}.col-calls[_ngcontent-%COMP%], .col-spend[_ngcontent-%COMP%], .col-saved[_ngcontent-%COMP%]{text-align:right}.proj-header[_ngcontent-%COMP%]{border-top:none!important;font-size:10.5px;font-weight:600;text-transform:uppercase;letter-spacing:.05em}.proj-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 110px 110px 80px;gap:12px;align-items:center;padding:8px 0;border-top:1px solid var(--border-subtle);font-size:12.5px}.col-proj[_ngcontent-%COMP%]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-net[_ngcontent-%COMP%]{text-align:right}.methodology[_ngcontent-%COMP%]{margin-top:0}.methodology-summary[_ngcontent-%COMP%]{cursor:pointer;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;-webkit-user-select:none;user-select:none;list-style:none}.methodology-summary[_ngcontent-%COMP%]::marker{display:none}.methodology-body[_ngcontent-%COMP%]{font-size:11.5px;line-height:1.6;margin-top:8px}.skel[_ngcontent-%COMP%]{background:var(--bg-elevated);border-radius:5px;animation:_ngcontent-%COMP%_skeleton 1.4s ease-in-out infinite}.row-skel[_ngcontent-%COMP%]{height:30px;margin:6px 0}@keyframes _ngcontent-%COMP%_skeleton{0%,to{opacity:.5}50%{opacity:.9}}.empty-state[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 24px;text-align:center}"],changeDetection:0})};export{q as SpecshipImpact};
|
|
1
|
+
import{a as V}from"./chunk-QPA2REUE.js";import{a as L}from"./chunk-5NTGUSXJ.js";import{a as H}from"./chunk-IOB4JJT4.js";import{c as $}from"./chunk-DTWIJ3GJ.js";import{a as K}from"./chunk-JGDK6YKG.js";import{a as B}from"./chunk-TWVVIWKO.js";import{Aa as c,Ea as z,Fa as D,Ga as j,I as M,Ia as S,Ka as m,M as T,N as E,Ta as k,Va as a,W as C,Wa as v,Xa as u,Ya as w,bb as _,ea as o,fb as N,gb as b,hb as F,ib as I,ka as O,lb as s,ra as g,sa as x,ua as P,va as y,vb as U,wa as f,xa as p,ya as e,za as t,zb as R}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var A=()=>({value:"today",label:"Today"}),Q=()=>({value:"week",label:"This week"}),G=()=>({value:"month",label:"This month"}),J=()=>({value:"all",label:"All time"}),W=(n,i,r,l)=>[n,i,r,l],X=()=>[0,1,2,3],Y=()=>[0,1,2],Z=(n,i)=>i.tool,ee=(n,i)=>i.project;function te(n,i){n&1&&(e(0,"div",4),c(1,"app-icon",5),e(2,"div",6),a(3,"No SpecShip tool usage in this range"),t()()),n&2&&(o(),p("size",28))}function ne(n,i){n&1&&(e(0,"div",27),a(1),b(2,"number"),t()),n&2&&(o(),u("",I(2,1,i.cost,"1.1-1"),"k tokens"))}function ie(n,i){if(n&1&&(e(0,"div",27),a(1),t()),n&2){let r=m(2);o(),u("",r.fmtK(r.spendTokens())," total")}}function ae(n,i){n&1&&(e(0,"div",27),a(1),b(2,"number"),t()),n&2&&(o(),u("",I(2,1,i.cost,"1.1-1"),"k tokens"))}function oe(n,i){if(n&1&&(e(0,"div",27),a(1),t()),n&2){let r=m(2);o(),u("",r.fmtK(r.savedTokens())," est. total")}}function re(n,i){n&1&&c(0,"div",36)}function de(n,i){n&1&&y(0,re,1,0,"div",36,P),n&2&&f(_(0,X))}function le(n,i){if(n&1&&(e(0,"div",42)(1,"span",44),a(2),t(),e(3,"span",45),a(4),b(5,"number"),t(),e(6,"span",46),a(7),t(),e(8,"span",47),a(9),t()()),n&2){let r=i.$implicit,l=m(3);o(2),v(r.tool),o(2),v(F(5,4,r.calls)),o(3),v(l.fmtK(r.spendTokens)),o(2),v(l.fmtK(r.savedTokens))}}function se(n,i){n&1&&(e(0,"div",43),a(1,"No tool data"),t())}function pe(n,i){if(n&1&&(e(0,"div",37)(1,"span",38),a(2,"Tool"),t(),e(3,"span",39),a(4,"Calls"),t(),e(5,"span",40),a(6,"Spend (tokens)"),t(),e(7,"span",41),a(8,"Est. saved"),t()(),y(9,le,10,6,"div",42,Z),g(11,se,2,0,"div",43)),n&2){let r=m(2);o(9),f(r.byTool()),o(2),x(r.byTool().length===0?11:-1)}}function ce(n,i){n&1&&c(0,"div",36)}function me(n,i){n&1&&y(0,ce,1,0,"div",36,P),n&2&&f(_(0,Y))}function ve(n,i){if(n&1&&(e(0,"div",52)(1,"span",53),a(2),t(),e(3,"span",46),a(4),t(),e(5,"span",47),a(6),t(),e(7,"span",54),a(8),t()()),n&2){let r=i.$implicit,l=m(4);o(2),v(r.project),o(2),v(l.fmtK(r.spendTokens)),o(2),v(l.fmtK(r.savedTokens)),o(),k("color",r.netTokens>=0?"var(--success)":"var(--warn)"),o(),v(l.fmtK(r.netTokens))}}function ue(n,i){if(n&1&&(e(0,"div",49)(1,"span",50),a(2,"Project"),t(),e(3,"span",40),a(4,"Spend (tokens)"),t(),e(5,"span",41),a(6,"Est. saved"),t(),e(7,"span",51),a(8,"Net"),t()(),y(9,ve,9,6,"div",52,ee)),n&2){let r=m(3);o(9),f(r.byProject())}}function ge(n,i){if(n&1&&(e(0,"div",30)(1,"div",31),c(2,"app-icon",48),e(3,"span",26),a(4,"By project"),t()(),g(5,me,2,1)(6,ue,11,0),t()),n&2){let r=m(2);o(2),p("size",14),o(3),x(r.resource.state().loading?5:6)}}function xe(n,i){if(n&1){let r=j();e(0,"div",7)(1,"div",8)(2,"div",9),c(3,"app-icon",10),e(4,"span",11),a(5,"Spend"),t()(),e(6,"div",12),a(7),t(),e(8,"div",13),a(9),t()(),e(10,"div",14)(11,"div",9),c(12,"app-icon",15),e(13,"span",11),a(14,"Est. saved"),t(),e(15,"span",16),a(16,"est."),t()(),e(17,"div",17),a(18),t(),e(19,"div",13),a(20),t()(),e(21,"div",8)(22,"div",9),c(23,"app-icon",18),e(24,"span",11),a(25,"Net"),t()(),e(26,"div",19)(27,"div",12),a(28),t()(),e(29,"div",13),a(30),t()(),e(31,"div",8)(32,"div",9),c(33,"app-icon",20),e(34,"span",11),a(35,"Coverage"),t()(),e(36,"div",12),a(37),t(),e(38,"div",13),a(39),t()()(),e(40,"div",21)(41,"div",22)(42,"div",23)(43,"div")(44,"div",24),c(45,"app-icon",25),e(46,"span",26),a(47,"Spend trend"),t()(),g(48,ne,3,4,"div",27)(49,ie,2,1,"div",27),t()(),e(50,"app-line-chart",28),S("hover",function(d){T(r);let h=m();return E(h.onHoverSpend(d))}),t()(),e(51,"div",22)(52,"div",23)(53,"div")(54,"div",24),c(55,"app-icon",15),e(56,"span",26),a(57,"Est. saved trend"),t(),e(58,"span",16),a(59,"est."),t()(),g(60,ae,3,4,"div",27)(61,oe,2,1,"div",27),t()(),e(62,"app-line-chart",29),S("hover",function(d){T(r);let h=m();return E(h.onHoverSaved(d))}),t()()(),e(63,"div",30)(64,"div",31),c(65,"app-icon",32),e(66,"span",26),a(67,"By tool"),t()(),g(68,de,2,1)(69,pe,12,1),t(),g(70,ge,7,2,"div",30),e(71,"details",33)(72,"summary",34),a(73,"Methodology & estimates"),t(),e(74,"p",35),a(75,` Estimates. Tokens \u2248 chars \xF7 4. "Saved" = the size of files a SpecShip query made unnecessary to Read, deduplicated per prompt; unresolved/natural-language queries count as 0. Cost priced at the model input rate. Net = saved \u2212 spend \u2212 overhead (a fixed per-session tool-definition cost). Per-project rows show saved \u2212 spend only \u2014 the per-session overhead isn't attributed to individual projects, so they won't sum to the headline net. Savings currently estimated for the primary project only. `),t(),e(76,"p",35)(77,"strong"),a(78,'"Saved" is a conservative lower bound.'),t(),a(79," It credits only a single direct read of the files a query's symbols live in \u2014 not the multi-call grep + read exploration (re-reads, dead-ends, and extra turns) SpecShip actually replaces. So net can read negative even when SpecShip reduced your real cost; the measured end-to-end savings (fewer turns over a smaller context) come from a with-vs-without comparison, which this per-session estimate can't see. Treat spend as exact and saved as a floor. "),t()()}if(n&2){let r,l,d=m();o(3),p("size",12),o(4),v(d.fmtK(d.spendTokens())),o(2),u("tokens \xB7 ",d.fmt$(d.spendCostUsd())),o(3),p("size",12),o(6),v(d.fmtK(d.savedTokens())),o(2),u("tokens \xB7 ",d.fmt$(d.savedCostUsd())),o(3),p("size",12),o(4),k("color",d.netTokens()>=0?"var(--success)":"var(--warn)"),o(),w("",d.netTokens()>0?"+":"","",d.fmtK(d.netTokens())),o(2),u("tokens \xB7 ",d.fmt$(d.netCostUsd())," \xB7 saved \u2212 spend \u2212 overhead"),o(3),p("size",12),o(4),w("",d.resolvedCalls(),"/",d.totalCalls()),o(2),u("resolved calls \xB7 ",d.unresolvedCalls()," unresolved"),o(6),p("size",13),o(3),x((r=d.hoveredSpend())?48:49,r),o(2),p("series",d.spendSeries())("height",150),o(5),p("size",13),o(5),x((l=d.hoveredSaved())?60:61,l),o(2),p("series",d.savedSeries())("height",150),o(3),p("size",14),o(3),x(d.resource.state().loading?68:69),o(2),x(d.byProject().length>0?70:-1)}}var q=class n{api=M(B);projects=M(K);range=C("month");ranges=["today","week","month","all"];hoveredSpend=C(null);hoveredSaved=C(null);resource=$(this.api,()=>`/api/claude/specship-impact?range=${this.range()}${this.projects.projectQuery("&")}`);data=s(()=>this.resource.state().data);spendTokens=s(()=>this.data()?.spendTokens??0);spendCostUsd=s(()=>this.data()?.spendCostUsd??0);savedTokens=s(()=>this.data()?.savedTokens??0);savedCostUsd=s(()=>this.data()?.savedCostUsd??0);netTokens=s(()=>this.data()?.netTokens??0);netCostUsd=s(()=>this.data()?.netCostUsd??0);overheadTokens=s(()=>this.data()?.overheadTokens??0);unresolvedCalls=s(()=>this.data()?.unresolvedCalls??0);totalCalls=s(()=>this.data()?.totalSpecshipCalls??0);resolvedCalls=s(()=>this.totalCalls()-this.unresolvedCalls());byTool=s(()=>this.data()?.byTool??[]);byProject=s(()=>this.data()?.byProject??[]);spendSeries=s(()=>(this.data()?.trend??[]).map((i,r)=>({day:r+1,cost:i.spendTokens/1e3,prompts:0})));savedSeries=s(()=>(this.data()?.trend??[]).map((i,r)=>({day:r+1,cost:i.savedTokens/1e3,prompts:0})));isEmpty=s(()=>this.totalCalls()===0&&!this.resource.state().loading);setRange(i){this.range.set(i)}onHoverSpend(i){this.hoveredSpend.set(i)}onHoverSaved(i){this.hoveredSaved.set(i)}fmt$(i){return"$"+i.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}fmtK(i){return i>=1e6?(i/1e6).toFixed(1)+"M":i>=1e3?(i/1e3).toFixed(i>=1e4?0:1)+"k":String(i)}static \u0275fac=function(r){return new(r||n)};static \u0275cmp=O({type:n,selectors:[["app-specship-impact"]],decls:6,vars:12,consts:[[1,"page","scroll-y"],["icon","graph","title","SpecShip Impact","sub","Token spend vs estimated savings from SpecShip tool calls"],["actions",""],["size","sm",3,"change","value","options"],[1,"empty-state","card","card-pad"],["name","graph",2,"color","var(--text-muted)",3,"size"],[1,"muted",2,"margin-top","8px","font-size","13px"],[1,"tiles"],[1,"card","card-pad","tile"],[1,"tile-label","row","gap-6"],["name","dollar",2,"color","var(--text-muted)",3,"size"],[1,"muted"],[1,"big-number","mono"],[1,"muted","tile-sub"],[1,"card","card-pad","tile","tile-saved"],["name","trendDown",2,"color","var(--success)",3,"size"],[1,"est-badge"],[1,"big-number","mono",2,"color","var(--success)"],["name","coins",2,"color","var(--text-muted)",3,"size"],[1,"row","gap-8",2,"align-items","baseline"],["name","check",2,"color","var(--text-muted)",3,"size"],[1,"top-grid"],[1,"card","card-pad","chart-card"],[1,"chart-header"],[1,"row","gap-6"],["name","dollar",2,"color","var(--accent)",3,"size"],[2,"font-weight","600","font-size","12.5px"],[1,"mono","muted",2,"font-size","11px","margin-top","2px"],["color","var(--accent)",3,"hover","series","height"],["color","var(--success)",3,"hover","series","height"],[1,"card","card-pad",2,"margin-bottom","14px"],[1,"row","gap-8",2,"margin-bottom","12px"],["name","layers",2,"color","var(--accent)",3,"size"],[1,"card","card-pad","methodology"],[1,"muted","methodology-summary"],[1,"muted","methodology-body"],[1,"skel","row-skel"],[1,"tool-row","tool-header"],[1,"muted","col-tool"],[1,"muted","col-calls"],[1,"muted","col-spend"],[1,"muted","col-saved"],[1,"tool-row"],[1,"muted",2,"font-size","12px","padding","6px 0"],[1,"mono","col-tool","tool-name"],[1,"mono","tabular","col-calls"],[1,"mono","tabular","col-spend"],[1,"mono","tabular","col-saved","est-val"],["name","folder",2,"color","var(--accent)",3,"size"],[1,"proj-row","proj-header"],[1,"muted","col-proj"],[1,"muted","col-net"],[1,"proj-row"],[1,"mono","col-proj"],[1,"mono","tabular","col-net"]],template:function(r,l){r&1&&(e(0,"div",0)(1,"app-page-head",1),z(2,2),e(3,"app-segmented",3),S("change",function(h){return l.setRange(h)}),t(),D(),t(),g(4,te,4,1,"div",4)(5,xe,80,27),t()),r&2&&(o(3),p("value",l.range())("options",N(7,W,_(3,A),_(4,Q),_(5,G),_(6,J))),o(),x(l.isEmpty()?4:5))},dependencies:[V,L,H,R,U],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)}.row[_ngcontent-%COMP%]{display:flex;align-items:center}.gap-6[_ngcontent-%COMP%]{gap:6px}.gap-8[_ngcontent-%COMP%]{gap:8px}.tabular[_ngcontent-%COMP%]{font-variant-numeric:tabular-nums}.card[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:var(--r-lg)}.card-pad[_ngcontent-%COMP%]{padding:14px}.tiles[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:14px}.tile[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:4px}.tile-label[_ngcontent-%COMP%]{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em}.tile-sub[_ngcontent-%COMP%]{font-size:11.5px;margin-top:1px}.big-number[_ngcontent-%COMP%]{font-size:28px;font-weight:700;letter-spacing:-.02em;line-height:1.1}.est-badge[_ngcontent-%COMP%]{font-size:9.5px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--success);border:1px solid var(--success);border-radius:3px;padding:0 3px;line-height:14px;opacity:.75}.est-val[_ngcontent-%COMP%]{color:var(--success)}.top-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:14px}.chart-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:10px}.chart-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:flex-start}.tool-header[_ngcontent-%COMP%]{border-top:none!important;font-size:10.5px;font-weight:600;text-transform:uppercase;letter-spacing:.05em}.tool-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 60px 110px 110px;gap:12px;align-items:center;padding:8px 0;border-top:1px solid var(--border-subtle);font-size:12.5px}.tool-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-tool[_ngcontent-%COMP%]{min-width:0}.col-calls[_ngcontent-%COMP%], .col-spend[_ngcontent-%COMP%], .col-saved[_ngcontent-%COMP%]{text-align:right}.proj-header[_ngcontent-%COMP%]{border-top:none!important;font-size:10.5px;font-weight:600;text-transform:uppercase;letter-spacing:.05em}.proj-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 110px 110px 80px;gap:12px;align-items:center;padding:8px 0;border-top:1px solid var(--border-subtle);font-size:12.5px}.col-proj[_ngcontent-%COMP%]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-net[_ngcontent-%COMP%]{text-align:right}.methodology[_ngcontent-%COMP%]{margin-top:0}.methodology-summary[_ngcontent-%COMP%]{cursor:pointer;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;-webkit-user-select:none;user-select:none;list-style:none}.methodology-summary[_ngcontent-%COMP%]::marker{display:none}.methodology-body[_ngcontent-%COMP%]{font-size:11.5px;line-height:1.6;margin-top:8px}.skel[_ngcontent-%COMP%]{background:var(--bg-elevated);border-radius:5px;animation:_ngcontent-%COMP%_skeleton 1.4s ease-in-out infinite}.row-skel[_ngcontent-%COMP%]{height:30px;margin:6px 0}@keyframes _ngcontent-%COMP%_skeleton{0%,to{opacity:.5}50%{opacity:.9}}.empty-state[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 24px;text-align:center}"],changeDetection:0})};export{q as SpecshipImpact};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as F}from"./chunk-JLOJCDIY.js";import{a as z}from"./chunk-5NTGUSXJ.js";import{c as I}from"./chunk-
|
|
1
|
+
import{a as F}from"./chunk-JLOJCDIY.js";import{a as z}from"./chunk-5NTGUSXJ.js";import{c as I}from"./chunk-DTWIJ3GJ.js";import{a as O}from"./chunk-JGDK6YKG.js";import{a as w}from"./chunk-TWVVIWKO.js";import{Aa as c,Ea as M,Fa as S,I as u,Ka as g,Va as i,Wa as l,Xa as v,Ya as y,Za as P,bb as E,ea as a,ka as C,lb as f,ra as p,sa as s,ua as h,va as m,wa as x,xa as _,ya as o,za as r,zb as T}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var D=()=>[0,1,2],b=(e,n)=>n.nodeId,j=(e,n)=>n.filePath,$=(e,n)=>n.files[0];function N(e,n){e&1&&c(0,"div",5)}function B(e,n){e&1&&m(0,N,1,0,"div",5,h),e&2&&x(E(0,D))}function L(e,n){e&1&&(o(0,"div",4),i(1,"Select a project to see its maintainability signals."),r())}function R(e,n){e&1&&(o(0,"div",4),i(1,"No maintainability data \u2014 run "),o(2,"code"),i(3,"specship index"),r(),i(4," first."),r())}function G(e,n){e&1&&(o(0,"div",4),c(1,"app-icon",6),o(2,"div",7),i(3,"Clean"),r(),o(4,"div",8),i(5,"Nothing crossed a threshold. Tune them in "),o(6,"code"),i(7,"specship.config.json"),r(),i(8,"."),r()()),e&2&&(a(),_("size",28))}function A(e,n){if(e&1&&(o(0,"div",14)(1,"span",15),i(2),r(),o(3,"span",16),i(4),r(),o(5,"span",17),i(6),r()()),e&2){let t=n.$implicit;a(2),l(t.name),a(2),l(t.reason),a(2),l(t.filePath)}}function H(e,n){if(e&1&&(o(0,"section",9)(1,"div",11),c(2,"span",12),i(3,"Coupling hotspots "),o(4,"span",13),i(5),r()(),m(6,A,7,3,"div",14,b),r()),e&2){let t=g(2);a(5),l(t.report().coupling.length),a(),x(t.report().coupling)}}function Q(e,n){if(e&1&&(o(0,"div",14)(1,"span",15),i(2),r(),o(3,"span",16),i(4),r(),o(5,"span",17),i(6),r()()),e&2){let t=n.$implicit;a(2),l(t.name),a(2),l(t.reason),a(2),y("",t.filePath,":",t.startLine)}}function q(e,n){if(e&1&&(o(0,"section",9)(1,"div",11),c(2,"span",18),i(3,"Oversized symbols "),o(4,"span",13),i(5),r()(),m(6,Q,7,4,"div",14,b),r()),e&2){let t=g(2);a(5),l(t.report().oversized.length),a(),x(t.report().oversized)}}function J(e,n){if(e&1&&(o(0,"div",14)(1,"span",19),i(2),r(),o(3,"span",16),i(4),r()()),e&2){let t=n.$implicit;a(2),l(t.filePath),a(2),l(t.reason)}}function K(e,n){if(e&1&&(o(0,"section",9)(1,"div",11),c(2,"span",18),i(3,"God files "),o(4,"span",13),i(5),r()(),m(6,J,5,2,"div",14,j),r()),e&2){let t=g(2);a(5),l(t.report().godFiles.length),a(),x(t.report().godFiles)}}function U(e,n){if(e&1&&(o(0,"div",14)(1,"span",19),i(2),r()()),e&2){let t=n.$implicit;a(2),l(t.files.join(" \u2192 "))}}function V(e,n){if(e&1&&(o(0,"section",9)(1,"div",11),c(2,"span",20),i(3,"Dependency cycles "),o(4,"span",13),i(5),r()(),m(6,U,3,1,"div",14,$),r()),e&2){let t=g(2);a(5),l(t.report().cycles.length),a(),x(t.report().cycles)}}function W(e,n){if(e&1&&(o(0,"div",14)(1,"span",15),i(2),r(),o(3,"span",19),i(4),r()()),e&2){let t=n.$implicit;a(2),l(t.name),a(2),y("",t.filePath,":",t.startLine)}}function X(e,n){if(e&1&&(o(0,"section",9)(1,"div",11),c(2,"span",21),i(3,"Dead-code candidates "),o(4,"span",13),i(5),r(),o(6,"span",22),i(7,"heuristic \u2014 verify before removing"),r()(),m(8,W,5,3,"div",14,b),r()),e&2){let t=g(2);a(5),l(t.report().deadCode.length),a(3),x(t.report().deadCode)}}function Y(e,n){if(e&1&&(p(0,H,8,1,"section",9),p(1,q,8,1,"section",9),p(2,K,8,1,"section",9),p(3,V,8,1,"section",9),p(4,X,10,1,"section",9),o(5,"div",10),i(6),o(7,"code"),i(8,"specship.config.json"),r(),i(9,". "),r()),e&2){let t=g();s(t.report().coupling.length?0:-1),a(),s(t.report().oversized.length?1:-1),a(),s(t.report().godFiles.length?2:-1),a(),s(t.report().cycles.length?3:-1),a(),s(t.report().deadCode.length?4:-1),a(2),P(" Thresholds \u2014 fan-in/out \u2265 ",t.report().thresholds.highDegree," \xB7 symbol \u2265 ",t.report().thresholds.largeSymbolLines," lines \xB7 god-file \u2265 ",t.report().thresholds.godFileSymbols," symbols. Override in ")}}var k=class e{api=u(w);projects=u(O);resource=I(this.api,()=>`/api/maintainability${this.projects.projectQuery()}`);report=f(()=>this.resource.state().data);counts=f(()=>{let n=this.resource.state().data;return{coupling:n?.coupling.length??0,oversized:n?.oversized.length??0,godFiles:n?.godFiles.length??0,cycles:n?.cycles.length??0,deadCode:n?.deadCode.length??0}});total=f(()=>{let n=this.counts();return n.coupling+n.oversized+n.godFiles+n.cycles+n.deadCode});base(n){return n.split("/").pop()||n}static \u0275fac=function(t){return new(t||e)};static \u0275cmp=C({type:e,selectors:[["app-maintainability"]],decls:16,vars:13,consts:[[1,"page","scroll-y"],["icon","wrench","title","Maintainability","sub","Graph-derived signals \u2014 coupling, size, cycles, dead code"],["actions",""],[3,"color","bg"],[1,"empty"],[1,"skel","card-skel"],["name","check",3,"size"],[1,"empty-title"],[1,"empty-sub"],[1,"sig","card"],[1,"thresholds"],[1,"sig-head"],[1,"dot",2,"background","var(--error)"],[1,"n"],[1,"row"],[1,"sym","mono"],[1,"why"],[1,"loc","mono"],[1,"dot",2,"background","var(--warn)"],[1,"loc","mono","grow"],[1,"dot",2,"background","var(--info)"],[1,"dot",2,"background","var(--text-muted)"],[1,"caveat"]],template:function(t,d){t&1&&(o(0,"div",0)(1,"app-page-head",1),M(2,2),o(3,"app-pill",3),i(4),r(),o(5,"app-pill",3),i(6),r(),o(7,"app-pill",3),i(8),r(),o(9,"app-pill",3),i(10),r(),S(),r(),p(11,B,2,1)(12,L,2,0,"div",4)(13,R,5,0,"div",4)(14,G,9,1,"div",4)(15,Y,10,8),r()),t&2&&(a(3),_("color","var(--error)")("bg","var(--error-soft)"),a(),v("",d.counts().coupling," coupling"),a(),_("color","var(--warn)")("bg","var(--warn-soft)"),a(),v("",d.counts().oversized+d.counts().godFiles," size"),a(),_("color","var(--info)")("bg","var(--info-soft)"),a(),v("",d.counts().cycles," cycles"),a(),_("color","var(--text-muted)")("bg","var(--bg-elevated)"),a(),v("",d.counts().deadCode," dead"),a(),s(d.resource.state().loading?11:d.resource.state().noProject?12:d.report()?d.report().clean?14:15:13))},dependencies:[z,F,T],styles:[".page[_ngcontent-%COMP%]{padding:20px 24px 48px}.empty[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;gap:8px;text-align:center;padding:64px 24px;color:var(--text-muted)}.empty[_ngcontent-%COMP%] .empty-title[_ngcontent-%COMP%]{font-size:15px;font-weight:600;color:var(--text)}.empty[_ngcontent-%COMP%] .empty-sub[_ngcontent-%COMP%]{font-size:12.5px;max-width:460px;line-height:1.5}.empty[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace);font-size:.92em}.card-skel[_ngcontent-%COMP%]{height:120px;border-radius:12px;margin-bottom:12px}.sig[_ngcontent-%COMP%]{padding:0;margin-bottom:14px;overflow:hidden}.sig-head[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:12px 16px;font-size:13px;font-weight:600;border-bottom:1px solid var(--border, color-mix(in srgb, var(--text) 12%, transparent))}.sig-head[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:50%;flex:0 0 8px}.sig-head[_ngcontent-%COMP%] .n[_ngcontent-%COMP%]{font-size:11px;font-weight:600;color:var(--text-muted);background:var(--bg-elevated, color-mix(in srgb, var(--text) 7%, transparent));border-radius:999px;padding:1px 8px}.sig-head[_ngcontent-%COMP%] .caveat[_ngcontent-%COMP%]{margin-left:auto;font-size:11px;font-weight:400;color:var(--text-muted);font-style:italic}.row[_ngcontent-%COMP%]{display:flex;align-items:baseline;gap:12px;padding:8px 16px;font-size:12px;border-top:1px solid var(--border-subtle, color-mix(in srgb, var(--text) 6%, transparent))}.row[_ngcontent-%COMP%]:first-of-type{border-top:none}.row[_ngcontent-%COMP%] .sym[_ngcontent-%COMP%]{color:var(--text);font-weight:500;flex:0 0 auto;max-width:38%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row[_ngcontent-%COMP%] .why[_ngcontent-%COMP%]{color:var(--text-secondary, var(--text-muted));flex:0 0 auto}.row[_ngcontent-%COMP%] .loc[_ngcontent-%COMP%]{color:var(--text-muted);font-size:11px;margin-left:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row[_ngcontent-%COMP%] .grow[_ngcontent-%COMP%]{flex:1;margin-left:0}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono, ui-monospace, monospace)}.thresholds[_ngcontent-%COMP%]{margin-top:8px;font-size:11.5px;color:var(--text-muted);line-height:1.5}.thresholds[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace)}"],changeDetection:0})};export{k as Maintainability};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as j}from"./chunk-G7VZT5KB.js";import{a as re}from"./chunk-YWIRU745.js";import{a as ae}from"./chunk-JLOJCDIY.js";import{a as oe}from"./chunk-PZSU53SS.js";import{a as $,b as ie}from"./chunk-WBJ5VEB5.js";import{a as ne}from"./chunk-SQPYSOV6.js";import{c as Y}from"./chunk-DOKZOFKM.js";import{a as te,c as V}from"./chunk-
|
|
1
|
+
import{a as j}from"./chunk-G7VZT5KB.js";import{a as re}from"./chunk-YWIRU745.js";import{a as ae}from"./chunk-JLOJCDIY.js";import{a as oe}from"./chunk-PZSU53SS.js";import{a as $,b as ie}from"./chunk-WBJ5VEB5.js";import{a as ne}from"./chunk-SQPYSOV6.js";import{c as Y}from"./chunk-DOKZOFKM.js";import{a as te,c as V}from"./chunk-DTWIJ3GJ.js";import{a as ee}from"./chunk-JGDK6YKG.js";import{a as Z}from"./chunk-TWVVIWKO.js";import{Aa as s,Ga as M,I as y,Ia as b,Ka as c,M as v,N as C,Oa as U,Pa as K,Qa as X,R as B,T as O,Ta as w,Ua as D,Va as l,W as f,Wa as _,Xa as h,Ya as J,aa as R,ea as o,ka as z,lb as x,ra as g,sa as u,va as S,wa as k,xa as p,ya as d,yb as F,za as a,zb as I}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var A=null,xe="self.onmessage = () => {};";function de(){return A||(typeof window<"u"&&!window.MonacoEnvironment&&(window.MonacoEnvironment={getWorker:(n,t)=>{let e=new Blob([xe],{type:"text/javascript"}),i=URL.createObjectURL(e);return new Worker(i,{name:t||"monaco-noop"})}}),A=import("./chunk-FMV5PXRC.js"),A)}var le=!1;function ce(n){le||(le=!0,ve(n))}function se(n,t){let e=[],i=t.getValue().split(`
|
|
2
2
|
`),r=null,m=new Map,E=/<!--\s*id\s*:\s*([^\s-][^\s]*)\s*-->/,_e=/^#{1,6}\s+/;for(let T=0;T<i.length;T++){let N=i[T]??"",L=T+1,G=N.match(E);if(G&&G[1]){r!==null&&e.push({severity:n.MarkerSeverity.Warning,message:`Stranded <!-- id: ${r.id} -->: no heading follows on line ${r.line+1}.`,startLineNumber:r.line+1,startColumn:1,endLineNumber:r.line+1,endColumn:(i[r.line]??"").length+1,code:"spec_stranded_id"});let P=G[1];r={id:P,line:T};let Q=m.get(P);Q!==void 0?e.push({severity:n.MarkerSeverity.Warning,message:`Duplicate spec ID "${P}" \u2014 first seen on line ${Q+1}. The second occurrence will be silently lost by the parser.`,startLineNumber:L,startColumn:N.indexOf(P)+1,endLineNumber:L,endColumn:N.indexOf(P)+P.length+1,code:"spec_duplicate_id"}):m.set(P,T);continue}_e.test(N)&&(r===null?e.push({severity:n.MarkerSeverity.Error,message:"This heading has no embedded ID. Add `<!-- id: REQ-X -->` on the line above it \u2014 required by the SpecShip parser.",startLineNumber:L,startColumn:1,endLineNumber:L,endColumn:N.length+1,code:"spec_missing_id"}):r=null)}n.editor.setModelMarkers(t,"specship-spec",e)}function ve(n){n.languages.registerCompletionItemProvider("markdown",{provideCompletionItems:(t,e)=>{let i=t.getWordUntilPosition(e),r={startLineNumber:e.lineNumber,endLineNumber:e.lineNumber,startColumn:i.startColumn,endColumn:i.endColumn},m=n.languages.CompletionItemKind,E=n.languages.CompletionItemInsertTextRule;return{suggestions:[{label:"req",kind:m.Snippet,insertText:["<!-- id: REQ-${1:AREA}-${2:001} -->","## ${3:Title MUST be concrete}","","${4:Body \u2014 describe the contract, not the implementation.}","","## Acceptance","<!-- id: REQ-${1:AREA}-${2:001}.A1 -->","- ${5:First testable acceptance criterion}","$0"].join(`
|
|
3
3
|
`),insertTextRules:E.InsertAsSnippet,documentation:"Insert a full requirement (heading + acceptance) with embedded IDs.",detail:"SpecShip \xB7 requirement",range:r},{label:"doc",kind:m.Snippet,insertText:["---","id: ${1:AREA}-DOC","title: ${2:Title}","owner: ${3:team-or-person}","priority: ${4|high,medium,low|}","---","","<!-- id: ${1:AREA}-DOC -->","# ${2:Title}","","${5:One-paragraph summary of what this document covers.}","$0"].join(`
|
|
4
4
|
`),insertTextRules:E.InsertAsSnippet,documentation:"Insert a new spec document with frontmatter.",detail:"SpecShip \xB7 document",range:r},{label:"accept",kind:m.Snippet,insertText:["## Acceptance","<!-- id: ${1:REQ-X}.A1 -->","- ${2:First testable acceptance criterion}","<!-- id: ${1:REQ-X}.A2 -->","- ${3:Second testable acceptance criterion}","$0"].join(`
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{a as W}from"./chunk-JLOJCDIY.js";import{a as G}from"./chunk-YV5LB22R.js";import{b as U}from"./chunk-WBJ5VEB5.js";import{a as Q}from"./chunk-IOB4JJT4.js";import{a as K}from"./chunk-
|
|
1
|
+
import{a as W}from"./chunk-JLOJCDIY.js";import{a as G}from"./chunk-YV5LB22R.js";import{b as U}from"./chunk-WBJ5VEB5.js";import{a as Q}from"./chunk-IOB4JJT4.js";import{a as K}from"./chunk-TWVVIWKO.js";import{Aa as x,Ga as k,I as O,Ia as h,Ka as s,M as v,N as y,Ra as N,Sa as H,Ta as R,Ua as B,Va as l,W as w,Wa as u,Xa as g,Ya as $,aa as z,ea as i,ka as V,lb as D,qa as T,qb as L,ra as p,sa as _,ta as F,ua as A,va as C,wa as f,xa as m,ya as o,yb as j,za as a,zb as q}from"./chunk-SYGIPC2P.js";import{a as S,b as M}from"./chunk-Q7L6LLAK.js";var te=["listEl"],ne=(t,n)=>n.name,Z=(t,n)=>n.qualifiedName,ie=(t,n)=>n.target,oe=(t,n)=>n.cmd;function ae(t,n){if(t&1&&(o(0,"div",22),x(1,"div",24),a()),t&2){let e=s().$implicit,r=s();i(),m("innerHTML",r.renderMd(e.text),z)}}function re(t,n){if(t&1&&(o(0,"div",39)(1,"div",40),l(2,"output"),a(),o(3,"div",41),l(4),a()()),t&2){let e=s().$implicit;i(4),u(e.output)}}function le(t,n){if(t&1){let e=k();o(0,"div",31)(1,"button",32),h("click",function(){let d=v(e).$implicit,c=s(3).$implicit,b=s();return y(b.toggleToolCall(c,d))}),x(2,"app-icon",33)(3,"app-icon",34),o(4,"span",35),l(5),o(6,"span",36),l(7),a()(),o(8,"span",37),x(9,"app-icon",38),l(10),a()(),p(11,re,5,1,"div",39),a()}if(t&2){let e=n.$implicit;i(),T("aria-expanded",e.open),i(),m("name",e.open?"chevronDown":"chevronRight")("size",12),i(),m("size",12),i(2),g(" ",e.name),i(2),g("(",e.input,")"),i(2),m("size",9),i(),g(" ",e.status," "),i(),_(e.open?11:-1)}}function de(t,n){if(t&1&&C(0,le,12,9,"div",31,ne),t&2){let e=s(2).$implicit;f(e.tools)}}function se(t,n){if(t&1&&l(0),t&2){let e=s(2).$implicit;g(":",e.line)}}function ce(t,n){if(t&1&&(l(0),p(1,se,1,1)),t&2){let e=s().$implicit;g(" \xB7 ",e.filePath),i(),_(e.line?1:-1)}}function pe(t,n){if(t&1&&l(0),t&2){let e=s().$implicit;g(" \xB7 ",e.ref," ")}}function _e(t,n){if(t&1&&(o(0,"div",47),l(1),a()),t&2){let e=s(3).$implicit;i(),u(e.detail.signature)}}function me(t,n){if(t&1&&(o(0,"pre",48),l(1),a()),t&2){let e=s(3).$implicit;i(),u(e.detail.body)}}function xe(t,n){if(t&1&&(o(0,"div",51),l(1),o(2,"span",36),l(3),a()()),t&2){let e=n.$implicit;i(),g("",e.name," "),i(2),$("",e.filePath,":",e.line)}}function ue(t,n){if(t&1&&(o(0,"div",49)(1,"div",50),l(2,"callers"),a(),C(3,xe,4,3,"div",51,Z),a()),t&2){let e=s(3).$implicit;i(3),f(e.detail.callers)}}function ge(t,n){if(t&1&&(o(0,"div",51),l(1),o(2,"span",36),l(3),a()()),t&2){let e=n.$implicit;i(),g("",e.name," "),i(2),$("",e.filePath,":",e.line)}}function he(t,n){if(t&1&&(o(0,"div",49)(1,"div",50),l(2,"callees"),a(),C(3,ge,4,3,"div",51,Z),a()),t&2){let e=s(3).$implicit;i(3),f(e.detail.callees)}}function Ce(t,n){if(t&1&&(p(0,_e,2,1,"div",47),p(1,me,2,1,"pre",48),p(2,ue,5,0,"div",49),p(3,he,5,0,"div",49)),t&2){let e=s(2).$implicit;_(e.detail!=null&&e.detail.signature?0:-1),i(),_(e.detail!=null&&e.detail.body?1:-1),i(),_(!(e.detail==null||e.detail.callers==null)&&e.detail.callers.length?2:-1),i(),_(!(e.detail==null||e.detail.callees==null)&&e.detail.callees.length?3:-1)}}function fe(t,n){if(t&1&&(o(0,"pre",48),l(1),a()),t&2){let e=s(3).$implicit;i(),u(e.detail.body)}}function be(t,n){if(t&1&&(o(0,"div",52)(1,"span",53),l(2),a(),x(3,"app-state-pill",54),a()),t&2){let e=n.$implicit;i(2),u(e.target),i(),m("state",e.state)}}function ve(t,n){if(t&1&&(o(0,"div",49)(1,"div",50),l(2,"links"),a(),C(3,be,4,2,"div",52,ie),a()),t&2){let e=s(3).$implicit;i(3),f(e.detail.links)}}function ye(t,n){if(t&1&&(p(0,fe,2,1,"pre",48),p(1,ve,5,0,"div",49)),t&2){let e=s(2).$implicit;_(e.detail!=null&&e.detail.body?0:-1),i(),_(!(e.detail==null||e.detail.links==null)&&e.detail.links.length?1:-1)}}function we(t,n){if(t&1&&(o(0,"pre",48),l(1),a()),t&2){let e=s(3).$implicit;i(),u(e.detail.body)}}function ke(t,n){if(t&1&&p(0,we,2,1,"pre",48),t&2){let e=s(2).$implicit;_(e.detail!=null&&e.detail.body?0:-1)}}function Se(t,n){if(t&1&&(o(0,"div",46),p(1,Ce,4,4)(2,ye,2,2)(3,ke,1,1),a()),t&2){let e=s().$implicit;i(),_(e.kind==="symbol"?1:e.kind==="spec"?2:3)}}function Me(t,n){if(t&1){let e=k();o(0,"div",43)(1,"button",44),h("click",function(){let d=v(e).$index,c=s(3).$index,b=s();return y(b.toggleDetail(c,d))}),x(2,"app-icon",33),o(3,"span",35),l(4),o(5,"span",36),p(6,ce,2,2)(7,pe,1,1),a()(),o(8,"span",45),l(9),a()(),p(10,Se,4,1,"div",46),a()}if(t&2){let e=n.$implicit,r=n.$index,d=s(3).$index,c=s();i(),T("aria-expanded",c.isDetailOpen(d,r)),i(),m("name",c.isDetailOpen(d,r)?"chevronDown":"chevronRight")("size",12),i(2),g(" ",e.label),i(2),_(e.filePath?6:7),i(3),u(e.kind),i(),_(c.isDetailOpen(d,r)?10:-1)}}function Te(t,n){if(t&1&&(o(0,"div",30)(1,"div",42),l(2),a(),C(3,Me,11,7,"div",43,F),a()),t&2){let e=s(2).$implicit;i(2),g("Retrieved detail \xB7 ",e.sources.length),i(),f(e.sources)}}function Ee(t,n){if(t&1&&(o(0,"div",23)(1,"div",25),x(2,"app-logo-mark",26),o(3,"span",27),l(4,"specship"),a()(),o(5,"div",28),x(6,"div",29),p(7,de,2,0),p(8,Te,5,1,"div",30),a()()),t&2){let e=s().$implicit,r=s();i(2),m("size",22)("glow",!1),i(4),m("innerHTML",r.renderMd(e.text),z),i(),_(e.tools!=null&&e.tools.length?7:-1),i(),_(e.sources!=null&&e.sources.length?8:-1)}}function Pe(t,n){if(t&1&&p(0,ae,2,1,"div",22)(1,Ee,9,5,"div",23),t&2){let e=n.$implicit;_(e.role==="user"?0:1)}}function Oe(t,n){t&1&&(o(0,"div",5),x(1,"span",55),l(2," thinking with specship context\u2026 "),a())}function ze(t,n){if(t&1&&(o(0,"span",59),l(1),a()),t&2){let e=s().$implicit;i(),u(e.arg)}}function Fe(t,n){if(t&1){let e=k();o(0,"button",57),h("click",function(){let d=v(e).$implicit,c=s(2);return y(c.pickSlash(d.cmd))}),o(1,"span",58),l(2),a(),p(3,ze,2,1,"span",59),o(4,"span",60),l(5),a()()}if(t&2){let e=n.$implicit;i(2),u(e.cmd),i(),_(e.arg?3:-1),i(2),u(e.desc)}}function $e(t,n){if(t&1&&(o(0,"div",8),C(1,Fe,6,3,"button",56,oe),a()),t&2){let e=s();i(),f(e.filteredSlash())}}function De(t,n){if(t&1){let e=k();o(0,"div",20)(1,"button",61),h("click",function(){v(e);let d=s();return y(d.toggleContext())}),x(2,"app-icon",62),a()()}t&2&&(i(2),m("size",14))}function Ie(t,n){if(t&1){let e=k();o(0,"div",77)(1,"button",81),h("click",function(){let d=v(e).$implicit,c=s(2);return y(c.toggleTool(d))}),x(2,"span",82),a(),o(3,"span",83),l(4),a()()}if(t&2){let e=n.$implicit,r=s(2);i(),B("on",r.enabledTools().has(e)),T("aria-pressed",r.enabledTools().has(e))("aria-label",e+(r.enabledTools().has(e)?" enabled":" disabled")),i(2),R("color",r.enabledTools().has(e)?"var(--text-primary)":"var(--text-muted)"),i(),u(e)}}function Ve(t,n){if(t&1){let e=k();o(0,"aside",21)(1,"div",63)(2,"span",64),l(3,"Context"),a(),o(4,"button",65),h("click",function(){v(e);let d=s();return y(d.toggleContext())}),x(5,"app-icon",66),a()(),o(6,"div",67)(7,"div",68),x(8,"app-icon",69),o(9,"div",70)(10,"div",71),l(11,"Project"),a(),o(12,"div",72),l(13,"~/dev/specship"),a()()(),o(14,"div",68),x(15,"app-icon",73),o(16,"div",70)(17,"div",71),l(18,"Indexed files"),a(),o(19,"div",74),l(20),a()()(),o(21,"div",68),x(22,"app-icon",75),o(23,"div",70)(24,"div",71),l(25,"Drift queue"),a(),o(26,"div",74),l(27,"\u2013 links"),a()()(),o(28,"div",76),l(29,"MCP tools"),a(),C(30,Ie,5,7,"div",77,A),a(),o(32,"div",78)(33,"div",79),l(34,"Tool access"),a(),o(35,"app-segmented",80),h("change",function(d){v(e);let c=s();return y(c.setToolAccess(d))}),a()()()}if(t&2){let e=s();i(5),m("size",13),i(3),m("size",13),i(7),m("size",13),i(5),u(e.api.isConfigured?"\u2013":"offline"),i(2),m("size",13),i(8),f(e.mcpTools),i(5),m("value",e.toolAccess())("options",e.toolAccessOptions)}}var J=[{cmd:"/ss-spec",arg:"REQ-ID | new <desc>",desc:"Intent door \u2014 view, author, implement, or review a spec"},{cmd:"/ss-explore",arg:"symbols | from\u2192to",desc:"Reads door \u2014 explore an area, trace a flow, or get impact"},{cmd:"/ss-check",arg:"(gate) | drifted | health",desc:"Gate & health door \u2014 run the gate, review drift, or see health"}],X=["specship_explore","specship_search","specship_spec","specship_link_verify"],Y=class t{sanitizer=O(j);api=O(K);listEl=L("listEl");closeStream;messages=w([{role:"assistant",text:`Hi \u2014 ask anything about your specs, code, or recent Claude Code sessions.
|
|
2
2
|
|
|
3
3
|
Try **/ss-spec REQ-AUTH-005** to inspect a requirement, or **/ss-explore validateSession** to walk its callers.`}]);draft=w("");thinking=w(!1);contextCollapsed=w(!1);enabledTools=w(new Set(X));toolAccess=w("safe");slashCommands=J;mcpTools=X;toolAccessOptions=[{value:"ask",label:"Ask"},{value:"safe",label:"Auto-safe"},{value:"all",label:"All"}];showSlash=D(()=>{let n=this.draft();return n.startsWith("/")&&!n.includes(" ")});filteredSlash=D(()=>{let n=this.draft();return J.filter(e=>e.cmd.startsWith(n))});setDraft(n){this.draft.set(n)}onKey(n){n.key==="Enter"&&!n.shiftKey&&(n.preventDefault(),this.send())}send(){let n=this.draft().trim();if(!n)return;this.draft.set(""),this.messages.update(d=>[...d,{role:"user",text:n}]),this.thinking.set(!0),this.scrollToBottom();let e=this.messages().length;this.messages.update(d=>[...d,{role:"assistant",text:"",tools:[]}]),this.closeStream?.();let r="/api/chat/stream?question="+encodeURIComponent(n);this.closeStream=this.api.openEventStream(r,(d,c)=>this.onStreamEvent(e,d,c),()=>this.endStream(),["thinking","tool","result_summary","chunk","done"])}onStreamEvent(n,e,r){switch(e){case"tool":{let d=r??{};this.patchMsg(n,c=>M(S({},c),{tools:[...c.tools??[],{name:d.name??"",input:d.input??"",output:"",status:"ok"}]}));break}case"result_summary":{let d=r??{},c=d.sourceCount??0,b=d.found?`${c} source${c===1?"":"s"} returned`:"no matches in the index";this.patchMsg(n,E=>{let P=E.tools??[];return P.length===0?E:M(S({},E),{tools:P.map((I,ee)=>ee===P.length-1?M(S({},I),{output:b}):I)})});break}case"chunk":{let c=(r??{}).text??"";this.patchMsg(n,b=>M(S({},b),{text:b.text+c})),this.scrollToBottom();break}case"done":{let d=r??{};d.sources?.length&&this.patchMsg(n,c=>M(S({},c),{sources:d.sources})),this.endStream();break}}}patchMsg(n,e){this.messages.update(r=>r.map((d,c)=>c===n?e(d):d))}endStream(){this.thinking.set(!1),this.closeStream?.(),this.closeStream=void 0,this.scrollToBottom()}ngOnDestroy(){this.closeStream?.(),this.closeStream=void 0}pickSlash(n){this.draft.set(n+" ")}toggleTool(n){this.enabledTools.update(e=>{let r=new Set(e);return r.has(n)?r.delete(n):r.add(n),r})}setToolAccess(n){this.toolAccess.set(n)}toggleContext(){this.contextCollapsed.update(n=>!n)}toggleToolCall(n,e){e.open=!e.open,this.messages.update(r=>[...r])}openDetails=w(new Set);detailKey(n,e){return`${n}:${e}`}isDetailOpen(n,e){return this.openDetails().has(this.detailKey(n,e))}toggleDetail(n,e){let r=this.detailKey(n,e);this.openDetails.update(d=>{let c=new Set(d);return c.has(r)?c.delete(r):c.add(r),c})}renderMd(n){let e=n.replace(/&/g,"&").replace(/</g,"<").replace(/\*\*(.+?)\*\*/g,'<strong style="color:var(--text-primary)">$1</strong>').replace(/`(.+?)`/g,'<code class="mono" style="font-size:12px;background:var(--bg-canvas);padding:1px 5px;border-radius:4px;border:1px solid var(--border-subtle);color:var(--node-spec)">$1</code>').replace(/\n\n/g,"<br/><br/>").replace(/\n/g,"<br/>");return this.sanitizer.bypassSecurityTrustHtml(e)}scrollToBottom(){setTimeout(()=>{let n=this.listEl()?.nativeElement;n&&(n.scrollTop=n.scrollHeight)},0)}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=V({type:t,selectors:[["app-chat"]],viewQuery:function(e,r){e&1&&N(r.listEl,te,5),e&2&&H()},decls:29,vars:8,consts:[["listEl",""],[1,"chat-page"],[1,"chat-col"],[1,"thread","scroll-y"],[1,"thread-inner"],[1,"row","gap-8","muted","thinking"],[1,"composer"],[1,"composer-inner"],["role","listbox","aria-label","Slash commands",1,"slash-menu"],[1,"composer-box","row"],["type","button","title","Attach files or spec IDs",1,"btn","btn-ghost","btn-sm","attach-btn"],["name","paperclip",3,"size"],["placeholder","Ask with specship context\u2026 / for commands, Tab to complete spec IDs","rows","1",1,"composer-ta",3,"input","keydown","value"],["type","button","aria-label","Send message",1,"btn","btn-primary","btn-sm","send-btn",3,"click","disabled"],["name","send",3,"size"],[1,"composer-footer","row","gap-8"],[1,"row","gap-6"],["name","bot",3,"size"],[1,"muted",2,"font-size","10.5px"],[1,"grow"],[1,"ctx-collapsed"],["aria-label","Context panel",1,"ctx-panel","col"],[1,"msg-user"],[1,"msg-assistant"],[1,"bubble-user",3,"innerHTML"],[1,"row","gap-8","asst-meta"],["aria-hidden","true",3,"size","glow"],[2,"font-size","12px","font-weight","600"],[1,"asst-body"],[1,"bubble-asst",3,"innerHTML"],[1,"detail-list"],[1,"tool-call"],["type","button",1,"tool-header","row","gap-8",3,"click"],[2,"color","var(--text-muted)",3,"name","size"],["name","wrench",2,"color","var(--node-code)",3,"size"],[1,"mono","grow",2,"font-size","11.5px"],[1,"muted"],[1,"pill",2,"font-size","9.5px","color","var(--success)","background","var(--success-soft)"],["name","check",3,"size"],[1,"tool-output"],[1,"mono","muted",2,"font-size","10.5px","margin-bottom","3px"],[1,"mono",2,"font-size","11.5px","color","var(--text-secondary)"],[1,"eyebrow",2,"margin","4px 0 2px"],[1,"source-detail"],["type","button",1,"detail-header","row","gap-8",3,"click"],[1,"pill",2,"font-size","9.5px","color","var(--text-muted)","background","var(--bg-canvas)"],[1,"detail-body"],[1,"mono","detail-sig"],[1,"mono","detail-src"],[1,"detail-rel"],[1,"mono","muted","detail-rel-label"],[1,"mono","detail-rel-item"],[1,"row","gap-8","detail-rel-item"],[1,"mono","grow"],[3,"state"],[1,"thinking-dot"],["type","button","role","option",1,"slash-item","row","gap-8"],["type","button","role","option",1,"slash-item","row","gap-8",3,"click"],[1,"mono",2,"font-size","12px","color","var(--accent)"],[1,"mono","muted",2,"font-size","11px"],[1,"muted","grow",2,"font-size","11px","text-align","right"],["type","button","title","Show context",1,"btn","btn-ghost","btn-xs",3,"click"],["name","chevronLeft",3,"size"],[1,"ctx-header","row"],[1,"eyebrow","grow"],["type","button",1,"btn","btn-ghost","btn-xs",3,"click"],["name","chevronRight",3,"size"],[1,"ctx-body","scroll-y"],[1,"ctx-row","row","gap-8"],["name","folder",2,"color","var(--text-muted)","flex-shrink","0",3,"size"],[2,"min-width","0"],[1,"muted",2,"font-size","10px"],[1,"mono",2,"font-size","11.5px","overflow","hidden","text-overflow","ellipsis","white-space","nowrap"],["name","box",2,"color","var(--text-muted)","flex-shrink","0",3,"size"],[1,"mono",2,"font-size","11.5px"],["name","drift",2,"color","var(--warn)","flex-shrink","0",3,"size"],[1,"eyebrow",2,"margin","16px 0 8px"],[1,"row","gap-8",2,"padding","5px 0"],[1,"ctx-footer"],[1,"eyebrow",2,"margin-bottom","6px"],["size","sm",3,"change","value","options"],["type","button",1,"toggle-btn",3,"click"],[1,"toggle-thumb"],[1,"mono",2,"font-size","11px"]],template:function(e,r){e&1&&(o(0,"div",1)(1,"div",2)(2,"div",3,0)(4,"div",4),C(5,Pe,2,1,null,null,F),p(7,Oe,3,0,"div",5),a()(),o(8,"div",6)(9,"div",7),p(10,$e,3,0,"div",8),o(11,"div",9)(12,"button",10),x(13,"app-icon",11),a(),o(14,"textarea",12),h("input",function(c){return r.setDraft(c.target.value)})("keydown",function(c){return r.onKey(c)}),a(),o(15,"button",13),h("click",function(){return r.send()}),x(16,"app-icon",14),a()(),o(17,"div",15)(18,"div",16)(19,"app-pill"),x(20,"app-icon",17),l(21," Opus 4 "),a(),o(22,"span",18),l(23,"single thread \xB7 this project"),a()(),x(24,"span",19),o(25,"span",18),l(26,"Enter to send \xB7 Shift+Enter for newline"),a()()()()(),p(27,De,3,1,"div",20)(28,Ve,36,7,"aside",21),a()),e&2&&(i(5),f(r.messages()),i(2),_(r.thinking()?7:-1),i(3),_(r.showSlash()&&r.filteredSlash().length>0?10:-1),i(3),m("size",15),i(),m("value",r.draft()),i(),m("disabled",!r.draft().trim()),i(),m("size",14),i(4),m("size",10),i(7),_(r.contextCollapsed()?27:28))},dependencies:[q,W,Q,U,G],styles:["[_nghost-%COMP%]{display:flex;flex:1;min-height:0}.chat-page[_ngcontent-%COMP%]{display:flex;flex:1;min-height:0;min-width:0}.chat-col[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;min-width:0;min-height:0}.thread[_ngcontent-%COMP%]{flex:1;padding:20px 24px;overflow-y:auto}.thread-inner[_ngcontent-%COMP%]{max-width:760px;margin:0 auto}.msg-user[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;margin-bottom:18px}.bubble-user[_ngcontent-%COMP%]{max-width:76%;background:var(--bg-elevated);border:1px solid var(--border-subtle);border-radius:12px 12px 4px;padding:9px 13px;font-size:13.5px;line-height:1.55}.msg-assistant[_ngcontent-%COMP%]{margin-bottom:22px}.asst-meta[_ngcontent-%COMP%]{align-items:center;margin-bottom:8px}.asst-logo[_ngcontent-%COMP%]{display:inline-grid;place-items:center;width:22px;height:22px;border-radius:50%;background:var(--accent);color:#fff;font-size:11px;font-weight:700;flex-shrink:0}.asst-body[_ngcontent-%COMP%]{padding-left:30px}.bubble-asst[_ngcontent-%COMP%]{font-size:13.5px;line-height:1.62;color:var(--text-secondary);text-wrap:pretty;margin-bottom:4px}.tool-call[_ngcontent-%COMP%]{border:1px solid var(--border-subtle);border-radius:7px;margin-top:8px;overflow:hidden;background:var(--bg-canvas)}.tool-header[_ngcontent-%COMP%]{width:100%;background:transparent;border:none;cursor:pointer;padding:6px 10px;text-align:left;color:inherit;font-family:var(--font-ui)}.tool-header[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.tool-header[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.tool-output[_ngcontent-%COMP%]{padding:8px 10px 10px 30px;border-top:1px solid var(--border-subtle)}.detail-list[_ngcontent-%COMP%]{margin-top:10px;display:flex;flex-direction:column;gap:6px}.source-detail[_ngcontent-%COMP%]{border:1px solid var(--border-subtle);border-radius:7px;overflow:hidden;background:var(--bg-canvas)}.detail-header[_ngcontent-%COMP%]{width:100%;background:transparent;border:none;cursor:pointer;padding:6px 10px;text-align:left;color:inherit;font-family:var(--font-ui)}.detail-header[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.detail-header[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.detail-body[_ngcontent-%COMP%]{padding:8px 10px 10px;border-top:1px solid var(--border-subtle);display:flex;flex-direction:column;gap:8px}.detail-sig[_ngcontent-%COMP%]{font-size:11.5px;color:var(--node-code);white-space:pre-wrap;word-break:break-word}.detail-src[_ngcontent-%COMP%]{margin:0;padding:8px 10px;font-size:11.5px;line-height:1.5;color:var(--text-secondary);background:var(--bg-base);border:1px solid var(--border-subtle);border-radius:5px;overflow-x:auto;white-space:pre;max-height:320px;overflow-y:auto}.detail-rel-label[_ngcontent-%COMP%]{font-size:10.5px;margin-bottom:3px}.detail-rel-item[_ngcontent-%COMP%]{font-size:11.5px;color:var(--text-secondary);padding:1px 0}.thinking[_ngcontent-%COMP%]{padding-left:30px;font-size:12px}.thinking-dot[_ngcontent-%COMP%]{width:6px;height:6px;border-radius:50%;background:var(--accent);animation:skeleton 1s infinite;flex-shrink:0}.composer[_ngcontent-%COMP%]{padding:12px 24px 18px;border-top:1px solid var(--border-subtle);flex-shrink:0}.composer-inner[_ngcontent-%COMP%]{max-width:760px;margin:0 auto;position:relative}.composer-box[_ngcontent-%COMP%]{align-items:flex-end;background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:12px;padding:8px;gap:8px}.attach-btn[_ngcontent-%COMP%]{padding:7px;flex-shrink:0}.send-btn[_ngcontent-%COMP%]{padding:7px 10px;flex-shrink:0}.composer-ta[_ngcontent-%COMP%]{flex:1;resize:none;background:transparent;border:none;outline:none;color:var(--text-primary);font-size:13.5px;font-family:var(--font-ui);line-height:1.5;padding:5px 2px;max-height:120px}.composer-ta[_ngcontent-%COMP%]::placeholder{color:var(--text-muted)}.composer-footer[_ngcontent-%COMP%]{margin-top:8px;align-items:center}.slash-menu[_ngcontent-%COMP%]{position:absolute;bottom:100%;left:0;margin-bottom:8px;background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:8px;box-shadow:var(--shadow-pop);padding:5px;width:320px;z-index:10}.slash-item[_ngcontent-%COMP%]{width:100%;background:transparent;border:none;cursor:pointer;padding:6px 9px;border-radius:5px;text-align:left;color:inherit;font-family:var(--font-ui)}.slash-item[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.slash-item[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.ctx-collapsed[_ngcontent-%COMP%]{width:40px;flex-shrink:0;border-left:1px solid var(--border-subtle);display:flex;justify-content:center;padding-top:12px}.ctx-panel[_ngcontent-%COMP%]{width:264px;flex-shrink:0;border-left:1px solid var(--border-subtle);background:var(--bg-panel);display:flex;flex-direction:column;min-height:0}.ctx-header[_ngcontent-%COMP%]{padding:11px 13px;border-bottom:1px solid var(--border-subtle);align-items:center}.ctx-body[_ngcontent-%COMP%]{flex:1;padding:13px;overflow-y:auto;min-height:0}.ctx-row[_ngcontent-%COMP%]{padding:5px 0;align-items:flex-start}.ctx-footer[_ngcontent-%COMP%]{padding:12px;border-top:1px solid var(--border-subtle)}.toggle-btn[_ngcontent-%COMP%]{width:30px;height:17px;border-radius:999px;border:none;cursor:pointer;padding:2px;background:var(--bg-elevated);display:flex;justify-content:flex-start;align-items:center;transition:background .12s,justify-content .12s;flex-shrink:0}.toggle-btn.on[_ngcontent-%COMP%]{background:var(--accent);justify-content:flex-end}.toggle-btn[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.toggle-thumb[_ngcontent-%COMP%]{width:13px;height:13px;border-radius:50%;background:#fff;flex-shrink:0}.eyebrow[_ngcontent-%COMP%]{color:var(--text-muted);font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono)}.pill[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;padding:3px 9px;border-radius:999px;line-height:1.4;white-space:nowrap}.grow[_ngcontent-%COMP%]{flex:1}"],changeDetection:0})};export{Y as Chat};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as W}from"./chunk-JLOJCDIY.js";import{a as Q}from"./chunk-5NTGUSXJ.js";import{a as U}from"./chunk-IOB4JJT4.js";import{d as B}from"./chunk-DOKZOFKM.js";import{b as Y,c as G}from"./chunk-
|
|
1
|
+
import{a as W}from"./chunk-JLOJCDIY.js";import{a as Q}from"./chunk-5NTGUSXJ.js";import{a as U}from"./chunk-IOB4JJT4.js";import{d as B}from"./chunk-DOKZOFKM.js";import{b as Y,c as G}from"./chunk-DTWIJ3GJ.js";import{a as H}from"./chunk-JGDK6YKG.js";import{a as $}from"./chunk-TWVVIWKO.js";import{Aa as m,Ea as T,Fa as O,I as c,Ia as S,Ka as C,R,Ta as D,Ua as I,Va as s,W as f,Wa as g,X as E,Xa as h,Za as z,bb as u,cb as F,ea as a,eb as j,gb as L,ib as N,ka as P,lb as w,qa as M,ra as v,sa as x,ua as k,va as y,vb as A,wa as b,xa as d,ya as r,za as o,zb as J}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var K=()=>({value:"time",label:"Latest"}),V=()=>({value:"cost",label:"Cost"}),X=()=>({value:"prompts",label:"Prompts"}),Z=(i,e,t)=>[i,e,t],ee=()=>[0,1,2,3,4],te=i=>["/sessions",i],ne=(i,e)=>e.fullId;function ie(i,e){i&1&&(r(0,"span",10),s(1,"\u26A0 refresh failed"),o()),i&2&&d("title",e)}function re(i,e){i&1&&(r(0,"div",20),m(1,"div",21),o())}function oe(i,e){i&1&&y(0,re,2,0,"div",20,k),i&2&&b(u(0,ee))}function se(i,e){i&1&&(r(0,"div",19),s(1," No sessions in this range. Either nothing's been logged yet, or the JSONL ingest watcher hasn't caught up \u2014 click Refresh. "),o())}function ae(i,e){if(i&1&&(r(0,"a",22)(1,"span",23),s(2),o(),r(3,"span",17)(4,"app-pill"),s(5),o()(),r(6,"span",24),s(7),o(),r(8,"span",25),s(9),o(),r(10,"span",25),s(11),L(12,"number"),o(),r(13,"span",26),s(14),o()()),i&2){let t=e.$implicit,n=C(2);d("routerLink",F(15,te,t.fullId)),M("aria-label","Open session "+t.id),a(2),g(t.id),a(3),g(t.project),a(2),z(" ",t.started," \u2013 ",t.ended," \xB7 ",t.model," "),a(2),g(t.prompts),a(),D("color",n.cacheColor(t.cache)),a(),h(" ",N(12,12,t.cache*100,"1.0-0"),"% "),a(3),h(" $",t.cost.toFixed(2)," ")}}function le(i,e){if(i&1&&y(0,ae,15,17,"a",22,ne),i&2){let t=C();b(t.sorted())}}var de=1e4,q=class i{api=c($);projects=c(H);refresh=c(Y);destroyRef=c(R);range=f("all");sort=f("time");ranges=["today","week","month","all"];localRefreshing=f(!1);resource=G(this.api,()=>`/api/claude/sessions?range=${this.range()}&limit=200${this.projects.projectQuery("&")}`);rows=w(()=>(this.resource.state().data?.sessions??[]).map(t=>this.adapt(t)));sorted=w(()=>{let e=this.sort();return[...this.rows()].sort((t,n)=>e==="cost"?n.cost-t.cost:e==="prompts"?n.prompts-t.prompts:n.startedAt-t.startedAt)});constructor(){let e=null,t=()=>{e===null&&(e=setInterval(()=>{typeof document<"u"&&document.visibilityState==="visible"&&this.resource.refetch()},de))},n=()=>{e!==null&&(clearInterval(e),e=null)},l=()=>{typeof document>"u"||document.visibilityState==="visible"&&this.resource.refetch()};t(),typeof document<"u"&&document.addEventListener("visibilitychange",l),this.destroyRef.onDestroy(()=>{n(),typeof document<"u"&&document.removeEventListener("visibilitychange",l)}),E(()=>{!this.resource.state().loading&&this.localRefreshing()&&this.localRefreshing.set(!1)})}async forceRefresh(){this.localRefreshing.set(!0),await this.refresh.triggerGlobalRefresh()}adapt(e){let t=(e.total_input_tokens||0)+(e.total_cache_creation_tokens||0)+(e.total_cache_read_tokens||0);return{id:(e.id||"").slice(0,8),fullId:e.id,project:(e.project_path||"").split("/").filter(Boolean).pop()||"?",startedAt:e.started_at||0,started:this.fmtTime(e.started_at),ended:this.fmtTime(e.ended_at).split(" ").pop()||"",prompts:e.prompt_count||0,cost:e.total_cost_usd||0,cache:t>0?(e.total_cache_read_tokens||0)/t:0,model:e.last_model||"unknown"}}fmtTime(e){if(!e)return"";try{let t=new Date(e),n=new Date;n.setHours(0,0,0,0);let l=864e5,p=n.getTime()-new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime(),_=t.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"});return p===0?"Today "+_:p===l?"Yest "+_:t.toLocaleDateString([],{month:"short",day:"numeric"})+" "+_}catch{return String(e)}}setSort(e){this.sort.set(e)}setRange(e){this.range.set(e)}cacheColor(e){return e>=.7?"var(--success)":e>=.5?"var(--warn)":"var(--error)"}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=P({type:i,selectors:[["app-sessions"]],decls:35,vars:18,consts:[[1,"page"],[2,"padding","16px 18px 12px"],["icon","sessions","title","Sessions",3,"sub"],["actions",""],["type","button","title","Force refresh: sync the index + re-ingest Claude Code transcripts","aria-label","Refresh sessions",1,"btn","btn-secondary","btn-sm","refresh-btn",3,"click","disabled"],["name","refresh",3,"size"],[1,"filter-bar",2,"padding","0 18px 12px"],["name","filter",2,"color","var(--text-muted)",3,"size"],[1,"input",2,"font-size","12px","padding","4px 8px"],[1,"grow"],[2,"color","var(--warn)","font-size","11.5px","cursor","help",3,"title"],[1,"muted",2,"font-size","11.5px"],["size","sm",3,"change","value","options"],[1,"scroll-y",2,"flex","1","padding","0 18px 18px"],[1,"card",2,"overflow","hidden"],[1,"row",2,"padding","8px 14px","font-size","10.5px","color","var(--text-muted)","text-transform","uppercase","letter-spacing","0.05em","font-weight","600","border-bottom","1px solid var(--border-subtle)"],[2,"width","90px"],[2,"width","110px"],[2,"width","70px","text-align","right"],[2,"padding","28px 18px","text-align","center","color","var(--text-secondary)","font-size","12.5px","line-height","1.5"],[1,"row",2,"padding","10px 14px","border-top","1px solid var(--border-subtle)"],[1,"skel",2,"flex","1","height","18px"],[1,"row","session-row",2,"padding","11px 14px","border-top","1px solid var(--border-subtle)","display","flex","align-items","center","gap","0","text-decoration","none","color","inherit","cursor","pointer",3,"routerLink"],[1,"mono",2,"width","90px","font-size","12px"],[1,"mono","muted","grow",2,"font-size","11.5px","overflow","hidden","text-overflow","ellipsis","white-space","nowrap"],[1,"mono","tabular",2,"width","70px","text-align","right","font-size","12px"],[1,"mono","tabular",2,"width","70px","text-align","right","font-size","12.5px","font-weight","600"]],template:function(t,n){if(t&1&&(r(0,"div",0)(1,"div",1)(2,"app-page-head",2),T(3,3),r(4,"button",4),S("click",function(){return n.forceRefresh()}),m(5,"app-icon",5),s(6),o(),O(),o()(),r(7,"div",6),m(8,"app-icon",7),r(9,"select",8)(10,"option"),s(11,"All models"),o()(),m(12,"div",9),v(13,ie,2,1,"span",10),r(14,"span",11),s(15,"sort"),o(),r(16,"app-segmented",12),S("change",function(p){return n.setSort(p)}),o()(),r(17,"div",13)(18,"div",14)(19,"div",15)(20,"span",16),s(21,"Session"),o(),r(22,"span",17),s(23,"Project"),o(),r(24,"span",9),s(25,"Window"),o(),r(26,"span",18),s(27,"Prompts"),o(),r(28,"span",18),s(29,"Cache"),o(),r(30,"span",18),s(31,"Cost"),o()(),v(32,oe,2,1)(33,se,2,0,"div",19)(34,le,2,0),o()()()),t&2){let l;a(2),d("sub",n.resource.state().loading?"loading\u2026":n.sorted().length+" sessions \xB7 across all projects"),a(2),I("spinning",n.localRefreshing()||n.refresh.loading()),d("disabled",n.refresh.loading()),a(),d("size",13),a(),h(" ",n.localRefreshing()||n.refresh.loading()?"Refreshing\u2026":"Refresh"," "),a(2),d("size",13),a(5),x((l=n.refresh.error())?13:-1,l),a(3),d("value",n.sort())("options",j(14,Z,u(11,K),u(12,V),u(13,X))),a(16),x(n.resource.state().loading&&n.sorted().length===0?32:n.sorted().length===0?33:34)}},dependencies:[B,J,Q,U,W,A],styles:["[_nghost-%COMP%]{display:contents}.page[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;min-height:0}.filter-bar[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.card[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:var(--r-lg)}.row[_ngcontent-%COMP%]{display:flex;align-items:center}.session-row[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.session-row[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.skel[_ngcontent-%COMP%]{background:var(--bg-elevated);border-radius:5px;animation:_ngcontent-%COMP%_skeleton 1.4s ease-in-out infinite}@keyframes _ngcontent-%COMP%_skeleton{0%,to{opacity:.5}50%{opacity:.9}}.refresh-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:6px}.refresh-btn.spinning[_ngcontent-%COMP%] app-icon[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_spin .9s linear infinite;color:var(--accent)}.refresh-btn[_ngcontent-%COMP%]:disabled{cursor:progress;opacity:.8}@keyframes _ngcontent-%COMP%_spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}"],changeDetection:0})};export{q as Sessions};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as K,b as J,c as X}from"./chunk-7656MA24.js";import{a as W}from"./chunk-P62EJGSF.js";import{a as q}from"./chunk-YNYVOPWF.js";import{a as U}from"./chunk-5NTGUSXJ.js";import{a as Z}from"./chunk-QIZ65CGB.js";import{a as Q}from"./chunk-IOB4JJT4.js";import{c as V,d as j}from"./chunk-DOKZOFKM.js";import{a as H,c as _}from"./chunk-
|
|
1
|
+
import{a as K,b as J,c as X}from"./chunk-7656MA24.js";import{a as W}from"./chunk-P62EJGSF.js";import{a as q}from"./chunk-YNYVOPWF.js";import{a as U}from"./chunk-5NTGUSXJ.js";import{a as Z}from"./chunk-QIZ65CGB.js";import{a as Q}from"./chunk-IOB4JJT4.js";import{c as V,d as j}from"./chunk-DOKZOFKM.js";import{a as H,c as _}from"./chunk-DTWIJ3GJ.js";import{a as A}from"./chunk-JGDK6YKG.js";import{a as L}from"./chunk-TWVVIWKO.js";import{Aa as l,Ga as T,I as E,Ia as b,Ka as c,M as C,N as y,Ta as w,Ua as M,Va as s,W as R,Wa as x,Xa as v,Ya as O,bb as N,ea as r,gb as z,ib as I,ka as $,lb as m,qa as G,ra as u,sa as g,ua as D,va as S,vb as B,wa as k,xa as p,ya as a,za as o,zb as Y}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var te=()=>[0,1,2,3],ne=()=>[0,1,2,3,4],F=(i,t)=>t.id;function ie(i,t){if(i&1&&s(0),i&2){let e=c();v(" ",e.fmt$(e.lastSessionCostStat().value)," ")}}function ae(i,t){i&1&&s(0," \xA0 ")}function oe(i,t){if(i&1&&l(0,"app-sparkline",11),i&2){let e=c();p("data",e.lastSessionCostStat().series)("width",64)("height",22)("fill",!0)}}function re(i,t){if(i&1&&l(0,"app-delta",12),i&2){let e=c();p("value",e.lastSessionCostStat().delta)("invert",!0)}}function se(i,t){if(i&1&&s(0),i&2){let e=c();v(" ",e.toolCallsStat().value.toLocaleString()," ")}}function le(i,t){i&1&&s(0," \xA0 ")}function de(i,t){if(i&1&&l(0,"app-sparkline",14),i&2){let e=c();p("data",e.toolCallsStat().series)("width",64)("height",22)("fill",!0)}}function pe(i,t){if(i&1&&l(0,"app-delta",12),i&2){let e=c();p("value",e.toolCallsStat().delta)("invert",!0)}}function ce(i,t){if(i&1&&s(0),i&2){let e=c();v(" ",e.subagentPctStat().value,"% ")}}function me(i,t){i&1&&s(0," \xA0 ")}function ue(i,t){if(i&1&&l(0,"app-sparkline",16),i&2){let e=c();p("data",e.subagentPctStat().series)("width",64)("height",22)("fill",!0)}}function ge(i,t){if(i&1&&l(0,"app-delta",12),i&2){let e=c();p("value",e.subagentPctStat().delta)("invert",!0)}}function he(i,t){if(i&1&&s(0),i&2){let e=c();v(" ",e.driftStat().value," ")}}function be(i,t){i&1&&s(0," \xA0 ")}function ve(i,t){if(i&1&&(a(0,"span",72),s(1),o()),i&2){let e=t.$implicit;r(),x(e)}}function xe(i,t){if(i&1){let e=T();a(0,"button",63),b("click",function(){let d=C(e).$implicit,h=c();return y(h.go(d.route))}),a(1,"div",64)(2,"span",65),l(3,"app-icon",66),o(),a(4,"div",67)(5,"div",68),s(6),o(),a(7,"code",69),s(8),o()()(),a(9,"div",70),s(10),o(),a(11,"div",71),S(12,ve,2,1,"span",72,D),o()()}if(i&2){let e=t.$implicit;G("aria-label",e.label+" door \u2014 "+e.cmd+". "+e.blurb),r(2),w("color",e.color)("background","color-mix(in srgb, "+e.color+" 14%, transparent)"),r(),p("name",e.icon)("size",15),r(3),v("",e.label," door"),r(),w("color",e.color),r(),x(e.cmd),r(2),x(e.blurb),r(2),k(e.subs)}}function _e(i,t){i&1&&(a(0,"span",32),s(1,"seed"),o())}function fe(i,t){if(i&1&&(a(0,"span",39),s(1),o()),i&2){let e=c();r(),v(" ",e.urgentTipCount()," urgent ")}}function Ce(i,t){i&1&&l(0,"div",73)}function ye(i,t){i&1&&S(0,Ce,1,0,"div",73,D),i&2&&k(N(0,te))}function Se(i,t){i&1&&(a(0,"div",42),s(1,"No tips yet. Run more sessions to populate."),o())}function ke(i,t){if(i&1&&(a(0,"code",80),s(1),o()),i&2){let e=c().$implicit;r(),x(e.fix)}}function we(i,t){if(i&1&&(a(0,"span",87),s(1),o()),i&2){let e=c().$implicit,n=c(2);w("color",n.tipSevColor(e.severity)),r(),x(e.saving)}}function Me(i,t){if(i&1){let e=T();a(0,"div",75)(1,"div",76),l(2,"app-icon",66),o(),a(3,"div",77)(4,"div",78),s(5),o(),a(6,"div",79),u(7,ke,2,1,"code",80),l(8,"span",81),u(9,we,2,3,"span",82),o()(),a(10,"div",83)(11,"button",84),b("click",function(){C(e);let d=c(2);return y(d.go("tips"))}),s(12,"Apply"),o(),a(13,"button",85),b("click",function(){let d=C(e).$implicit,h=c(2);return y(h.dismissTip(d.id))}),l(14,"app-icon",86),o()()()}if(i&2){let e=t.$implicit,n=c(2);w("border-left-color",n.tipSevColor(e.severity)),r(),w("color",n.tipSevColor(e.severity)),r(),p("name",n.tipIcon(e))("size",14),r(3),x(e.title),r(2),g(e.fix?7:-1),r(2),g(e.saving?9:-1),r(5),p("size",12)}}function Pe(i,t){if(i&1&&S(0,Me,15,10,"div",74,F),i&2){let e=c();k(e.visibleTips())}}function Ee(i,t){i&1&&l(0,"div",47)}function Te(i,t){i&1&&(a(0,"div",48),s(1," No tool calls in the selected window. "),o())}function De(i,t){if(i&1){let e=T();a(0,"app-treemap",88),b("pick",function(){C(e);let d=c();return y(d.go("heatmap"))}),o()}if(i&2){let e=c();p("items",e.treemapItems())("height",116)("selKey",null)}}function Oe(i,t){i&1&&l(0,"div",89)}function ze(i,t){i&1&&S(0,Oe,1,0,"div",89,D),i&2&&k(N(0,ne))}function Ie(i,t){i&1&&(a(0,"div",42),s(1,"No prompts ingested for this range."),o())}function Re(i,t){i&1&&l(0,"app-icon",94),i&2&&p("size",11)}function Ne(i,t){if(i&1){let e=T();a(0,"div",91),b("click",function(){C(e);let d=c(2);return y(d.go("sessions"))})("keydown.enter",function(){C(e);let d=c(2);return y(d.go("sessions"))})("keydown.space",function(){C(e);let d=c(2);return y(d.go("sessions"))}),a(1,"div",92)(2,"div",93),u(3,Re,1,1,"app-icon",94),s(4),o(),a(5,"div",95),l(6,"app-bar",96),o()(),a(7,"div",97)(8,"div",98),s(9),o(),a(10,"div",99),s(11),z(12,"number"),o()()()}if(i&2){let e=t.$implicit,n=c(2);r(3),g(e.is_sidechain?3:-1),r(),v(" ",e.text||"(no text)"," "),r(2),p("frac",n.promptFrac(e.cost_usd))("color",n.promptBarColor(e.cost_usd))("height",4),r(2),w("color",e.cost_usd/n.maxPromptCost()>.7?"var(--error)":"var(--text-primary)"),M("expensive",e.cost_usd/n.maxPromptCost()>.7),r(),v(" ",n.fmt$(e.cost_usd)," "),r(2),O(" ",n.fmtK(n.promptTotalTokens(e))," \xB7 ",I(12,12,n.promptCacheRate(e)*100,"1.0-0"),"% ")}}function Fe(i,t){if(i&1&&S(0,Ne,13,15,"div",90,F),i&2){let e=c();k(e.topPrompts())}}function $e(i,t){i&1&&l(0,"div",61)}function Ge(i,t){if(i&1&&(a(0,"div",100)(1,"div",101),s(2),z(3,"number"),o(),a(4,"div",102)(5,"div",23),s(6,"cache read rate"),o(),l(7,"app-delta",12),o()(),l(8,"div",103),a(9,"div",104)(10,"div",105)(11,"div",106),s(12,"Creation tokens"),o(),a(13,"div",107),s(14),o(),a(15,"div",108),s(16,"ephemeral"),o()(),a(17,"div",105)(18,"div",106),s(19,"Read tokens"),o(),a(20,"div",107),s(21),o(),a(22,"div",108),s(23,"charged at ~10%"),o()(),a(24,"div",105)(25,"div",106),s(26,"Saved this week"),o(),a(27,"div",109),s(28),o(),a(29,"div",108),s(30,"vs no cache"),o()(),a(31,"div",105)(32,"div",106),s(33,"WoW"),o(),a(34,"div",109),s(35),z(36,"number"),o(),a(37,"div",108),s(38,"more reuse"),o()()()),i&2){let e=c(),n=e.cache.state().data;r(2),v("",I(3,8,n.readRate*100,"1.0-0"),"%"),r(5),p("value",n.wowDelta)("invert",!1),r(7),x(e.fmtK(n.creationTokens)),r(7),x(e.fmtK(n.readTokens)),r(7),x(e.fmt$(n.dollarsSaved)),r(7),O(" ",n.wowDelta>=0?"+":"","",I(36,11,n.wowDelta*100,"1.0-0"),"% ")}}var ee=class i{api=E(L);router=E(V);projects=E(A);conn=E(H);range=R("week");rangeOptions=[{value:"today",label:"Today"},{value:"week",label:"This week"},{value:"month",label:"This month"},{value:"all",label:"All time"}];status=_(this.api,()=>`/api/status${this.projects.projectQuery()}`);miniGraphSearch=_(this.api,()=>`/api/graph/search?q=on&limit=18${this.projects.projectQuery("&")}`);tips=_(this.api,()=>"/api/claude/tips");heatmap=_(this.api,()=>`/api/claude/heatmap?range=${this.range()}`);costs=_(this.api,()=>`/api/claude/costs?range=${this.range()}`);cache=_(this.api,()=>`/api/claude/cache?range=${this.range()}`);sessions=_(this.api,()=>`/api/claude/sessions?range=${this.range()}&limit=10`);stats=_(this.api,()=>`/api/claude/stats?range=${this.range()}`);EMPTY_METRIC={value:0,delta:0,series:[]};lastSessionCostStat=m(()=>this.stats.state().data?.lastSessionCost??this.EMPTY_METRIC);toolCallsStat=m(()=>this.stats.state().data?.toolCalls??this.EMPTY_METRIC);subagentPctStat=m(()=>this.stats.state().data?.subagentPct??this.EMPTY_METRIC);driftStat=m(()=>this.stats.state().data?.drift??this.EMPTY_METRIC);lastSession=m(()=>(this.sessions.state().data?.sessions??[])[0]??null);lastSessionCost=m(()=>this.lastSession()?.total_cost_usd??0);toolCallCount=m(()=>(this.heatmap.state().data?.tools??[]).reduce((e,n)=>e+(n.calls??0),0));subagentShare=m(()=>{let t=this.heatmap.state().data?.subagents??[],e=t.find(f=>f.type==="subagent"),n=t.find(f=>f.type==="main"),d=e?.cost??0,h=n?.cost??0,P=d+h;return P>0?Math.round(d/P*100):0});driftCount=m(()=>this.status.state().data?.drift??0);nodeCountLabel=m(()=>this.status.state().data?.nodeCount??0);urgentTipCount=m(()=>(this.tips.state().data?.tips??[]).filter(e=>e.severity==="error").length);dismissedTips=R(new Set);dismissTip(t){this.dismissedTips.update(e=>{let n=new Set(e);return n.add(t),n})}isTipDismissed(t){return this.dismissedTips().has(t)}visibleTips=m(()=>{let t=this.dismissedTips();return(this.tips.state().data?.tips??[]).filter(e=>!t.has(e.id)).slice(0,4)});treemapItems=m(()=>{let t=(this.heatmap.state().data?.files??[]).slice(0,30);if(!t.length)return[];let e=Math.max(1,...t.map(n=>n.resultBytes&&n.calls?n.resultBytes/n.calls:0));return t.map(n=>{let d=n.calls>0?n.resultBytes/n.calls:0,h=Math.min(1,d/e);return{key:n.path,label:K(n.path),value:n.calls,intensity:h,sub:n.calls+" calls",title:`${n.path}
|
|
2
2
|
${n.calls} calls \xB7 ${this.fmtK(Math.round(d))}/call`}})});topPrompts=m(()=>(this.costs.state().data?.topPrompts??[]).slice(0,8));maxPromptCost=m(()=>Math.max(.01,...this.topPrompts().map(t=>t.cost_usd??0)));rangeTotal=m(()=>(this.costs.state().data?.series??[]).reduce((e,n)=>e+(n.cost??0),0));liveSource=m(()=>this.conn.online()?"live":"offline");miniGraphSource=m(()=>(this.miniGraphSearch.state().data?.results?.length??0)>0?"api":"seed");miniGraphNodes=m(()=>{let t=this.miniGraphSearch.state().data?.results??[];return t.length>0?je(t.slice(0,18).map(e=>({id:e.node.id,label:e.node.name,sub:e.node.filePath?.split("/").slice(-2).join("/"),kind:e.node.kind}))):Be});miniGraphEdges=m(()=>{if(this.miniGraphSource()==="api"){let t=this.miniGraphNodes(),e=[];for(let n=1;n<t.length;n++){let d=t[Math.floor(Math.random()*n)],h=t[n];d&&h&&e.push({from:d.id,to:h.id,kind:"calls"})}return e}return Ve});onMiniGraphPick(t){this.router.navigate(["/graph"],{queryParams:{focus:t}})}doors=[{id:"intent",label:"Intent",cmd:"/ss-spec",icon:"book",color:"var(--node-spec)",route:"specs",blurb:"View, author, implement, review, or extend a spec \u2014 the whole lifecycle.",subs:["new","fast","implement","review","triage","behaviour","domain"]},{id:"reads",label:"Reads",cmd:"/ss-explore",icon:"search",color:"var(--accent)",route:"graph",blurb:"Explore an area, trace a flow, or get a change\u2019s blast radius.",subs:["explore","flow","impact"]},{id:"gate",label:"Gate & health",cmd:"/ss-check",icon:"check",color:"var(--warn)",route:"drift",blurb:"Run the enforcement gate, review drift, repair links, or see code-health.",subs:["gate","drifted","fix","relink","health"]}];setRange(t){this.range.set(t)}go(t){this.router.navigate(["/"+t])}fmt$(t){return"$"+t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}fmtK(t){return t>=1e6?(t/1e6).toFixed(1)+"M":t>=1e3?(t/1e3).toFixed(t>=1e4?0:1)+"k":String(t)}promptCacheRate(t){let e=(t.input_tokens??0)+(t.cache_creation_tokens??0)+(t.cache_read_tokens??0);return e>0?(t.cache_read_tokens??0)/e:0}promptTotalTokens(t){return(t.input_tokens??0)+(t.output_tokens??0)+(t.cache_creation_tokens??0)+(t.cache_read_tokens??0)}promptBarColor(t){return t/this.maxPromptCost()>.7?"var(--error)":"var(--accent)"}promptFrac(t){return Math.max(0,Math.min(1,t/this.maxPromptCost()))}tipSevColor(t){return t==="error"?"var(--error)":t==="warn"?"var(--warn)":"var(--info)"}tipIcon(t){return t.icon?t.icon:t.severity==="error"?"cancel":t.severity==="warn"?"warn":"info"}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=$({type:i,selectors:[["app-dashboard"]],decls:133,vars:49,consts:[[1,"scroll-y","dashboard"],["icon","dashboard","title","Dashboard",3,"sub"],["actions",""],["size","sm",3,"change","options","value"],[1,"stat-grid"],["type","button",1,"stat-tile",3,"click"],[1,"row","gap-8","stat-eyebrow"],["name","coins",2,"color","var(--accent)",3,"size"],[1,"eyebrow",2,"letter-spacing","0.04em"],[1,"row","stat-value-row"],[1,"stat-value","tabular"],["color","var(--accent)",3,"data","width","height","fill"],[3,"value","invert"],["name","wrench",2,"color","var(--node-spec)",3,"size"],["color","var(--node-spec)",3,"data","width","height","fill"],["name","bot",2,"color","var(--node-code)",3,"size"],["color","var(--node-code)",3,"data","width","height","fill"],["name","drift",2,"color","var(--warn)",3,"size"],[1,"card","card-pad","doors-card"],[1,"row","doors-head"],[1,"row","gap-8"],["name","command",2,"color","var(--node-spec)",3,"size"],[2,"font-weight","600","font-size","12.5px"],[1,"muted",2,"font-size","11px"],[1,"doors-grid"],["type","button",1,"door-tile"],[1,"center-grid"],[1,"card","graph-card"],[1,"card-head"],[1,"card-title","row","gap-8"],["name","graph",2,"color","var(--accent)",3,"size"],[1,"muted",2,"font-size","11px","font-weight","400"],["title","No graph data yet \u2014 illustrative",1,"pill","seed-pill"],["routerLink","/graph",1,"btn","btn-ghost","btn-xs"],["name","arrowRight",3,"size"],[1,"mini-graph"],[3,"nodeClick","nodes","edges"],[1,"card","tips-card"],["name","tips",2,"color","var(--warn)",3,"size"],[1,"pill",2,"font-size","10px","background","var(--error-soft)","color","var(--error)"],["routerLink","/tips",1,"btn","btn-ghost","btn-xs"],[1,"scroll-y","tips-body"],[1,"tip-empty"],[1,"card","card-pad","heatmap-card"],[1,"row","heatmap-head"],["name","flame",2,"color","var(--warn)",3,"size"],["routerLink","/heatmap",1,"btn","btn-ghost","btn-xs"],[1,"skel",2,"height","116px","border-radius","7px"],[1,"tip-empty",2,"height","116px","display","grid","place-items","center"],[3,"items","height","selKey"],[1,"row","gap-10","heatmap-legend"],[1,"muted",2,"font-size","10px"],[1,"heatmap-gradient"],[1,"muted",2,"font-size","9.5px"],[1,"bottom-grid"],[1,"card","card-pad","prompts-card"],[1,"row","prompts-head"],["routerLink","/costs",1,"btn","btn-ghost","btn-xs"],[1,"col"],[1,"card","card-pad","cache-card"],["name","database",2,"color","var(--node-route)",3,"size"],[1,"skel",2,"height","70px","border-radius","5px"],[1,"dash-footer","mono","muted"],["type","button",1,"door-tile",3,"click"],[1,"row","door-top"],[1,"door-ic"],[3,"name","size"],[1,"door-titles"],[1,"door-label"],[1,"mono","door-cmd"],[1,"door-blurb"],[1,"door-subs"],[1,"door-sub"],[1,"skel",2,"height","64px","border-radius","8px"],[1,"tip-row",3,"border-left-color"],[1,"tip-row"],[1,"tip-sev-icon"],[1,"grow","tip-body-col",2,"min-width","0"],[1,"tip-title"],[1,"row","gap-8","tip-meta-row"],[1,"mono","tip-fix"],[1,"grow"],[1,"pill",2,"font-size","10px","color","inherit","background","transparent",3,"color"],[1,"row","gap-4",2,"flex-shrink","0"],["type","button",1,"btn","btn-secondary","btn-xs",3,"click"],["type","button","title","Dismiss",1,"btn","btn-ghost","btn-xs",3,"click"],["name","x",3,"size"],[1,"pill",2,"font-size","10px","color","inherit","background","transparent"],[3,"pick","items","height","selKey"],[1,"skel",2,"height","26px","margin","4px 0","border-radius","4px"],["role","button","tabindex","0",1,"prompt-row"],["role","button","tabindex","0",1,"prompt-row",3,"click","keydown.enter","keydown.space"],[1,"grow","prompt-left",2,"min-width","0"],[1,"prompt-text"],["name","bot",2,"color","var(--node-code)","margin-right","5px","vertical-align","-1px",3,"size"],[2,"margin-top","4px","width","70%"],[3,"frac","color","height"],[1,"prompt-right"],[1,"mono","tabular","prompt-cost"],[1,"mono","muted",2,"font-size","10px"],[1,"row","cache-headline"],[1,"tabular","cache-rate"],[2,"padding-bottom","3px"],[1,"cache-divider"],[1,"cache-kv-grid"],[1,"kv"],[1,"kv-label"],[1,"kv-value","mono","tabular"],[1,"kv-sub","mono","muted"],[1,"kv-value","mono","tabular",2,"color","var(--success)"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"app-page-head",1)(2,"div",2)(3,"app-segmented",3),b("change",function(h){return n.setRange(h)}),o()()(),a(4,"div",4)(5,"button",5),b("click",function(){return n.go("sessions")}),a(6,"div",6),l(7,"app-icon",7),a(8,"span",8),s(9,"Last session cost"),o()(),a(10,"div",9)(11,"div",10),u(12,ie,1,1)(13,ae,1,0),o(),u(14,oe,1,4,"app-sparkline",11),o(),u(15,re,1,2,"app-delta",12),o(),a(16,"button",5),b("click",function(){return n.go("heatmap")}),a(17,"div",6),l(18,"app-icon",13),a(19,"span",8),s(20),o()(),a(21,"div",9)(22,"div",10),u(23,se,1,1)(24,le,1,0),o(),u(25,de,1,4,"app-sparkline",14),o(),u(26,pe,1,2,"app-delta",12),o(),a(27,"button",5),b("click",function(){return n.go("heatmap")}),a(28,"div",6),l(29,"app-icon",15),a(30,"span",8),s(31,"Subagent spend"),o()(),a(32,"div",9)(33,"div",10),u(34,ce,1,1)(35,me,1,0),o(),u(36,ue,1,4,"app-sparkline",16),o(),u(37,ge,1,2,"app-delta",12),o(),a(38,"button",5),b("click",function(){return n.go("drift")}),a(39,"div",6),l(40,"app-icon",17),a(41,"span",8),s(42,"Drift queue"),o()(),a(43,"div",9)(44,"div",10),u(45,he,1,1)(46,be,1,0),o()()()(),a(47,"div",18)(48,"div",19)(49,"div",20),l(50,"app-icon",21),a(51,"span",22),s(52,"Command doors"),o(),a(53,"span",23),s(54,"\xB7 your whole SpecShip command surface, in Claude Code"),o()()(),a(55,"div",24),S(56,xe,14,12,"button",25,F),o()(),a(58,"div",26)(59,"div",27)(60,"div",28)(61,"div",29),l(62,"app-icon",30),a(63,"span"),s(64,"Recent neighborhood"),o(),a(65,"span",31),s(66,"\xB7 last edited files"),o(),u(67,_e,2,0,"span",32),o(),a(68,"a",33),s(69," Open graph "),l(70,"app-icon",34),o()(),a(71,"div",35)(72,"app-graph-canvas",36),b("nodeClick",function(h){return n.onMiniGraphPick(h)}),o()()(),a(73,"div",37)(74,"div",28)(75,"div",29),l(76,"app-icon",38),a(77,"span"),s(78,"Tips"),o(),u(79,fe,2,1,"span",39),o(),a(80,"a",40),s(81,"All"),o()(),a(82,"div",41),u(83,ye,2,1)(84,Se,2,0,"div",42)(85,Pe,2,0),o()()(),a(86,"div",43)(87,"div",44)(88,"div",20),l(89,"app-icon",45),a(90,"span",22),s(91,"Tool-call heatmap"),o(),a(92,"span",23),s(93,"\xB7 area = calls, color = tokens / call"),o()(),a(94,"a",46),s(95," Open heatmap "),l(96,"app-icon",34),o()(),u(97,Ee,1,0,"div",47)(98,Te,2,0,"div",48)(99,De,1,3,"app-treemap",49),a(100,"div",50)(101,"span",51),s(102,"tokens / call"),o(),l(103,"div",52),a(104,"span",53),s(105,"efficient \u2192 wasteful"),o()()(),a(106,"div",54)(107,"div",55)(108,"div",56)(109,"div",20),l(110,"app-icon",7),a(111,"span",22),s(112,"Recent prompts"),o(),a(113,"span",23),s(114,"\xB7 by cost"),o()(),a(115,"a",57),s(116,"Cost ranking"),o()(),a(117,"div",58),u(118,ze,2,1)(119,Ie,2,0,"div",42)(120,Fe,2,0),o()(),a(121,"div",59)(122,"div",20),l(123,"app-icon",60),a(124,"span",22),s(125,"Cache analytics"),o()(),u(126,$e,1,0,"div",61)(127,Ge,39,14),o()(),a(128,"footer",62),s(129),a(130,"span"),s(131,"\u25CF"),o(),s(132),o()()),e&2&&(r(),p("sub","specship \xB7 "+n.nodeCountLabel().toLocaleString()+" nodes \xB7 last session "+n.fmt$(n.lastSessionCost())),r(2),p("options",n.rangeOptions)("value",n.range()),r(4),p("size",13),r(4),M("skel",n.stats.state().loading),r(),g(n.stats.state().loading?13:12),r(2),g(n.lastSessionCostStat().series.length>0?14:-1),r(),g(n.lastSessionCostStat().delta!==0?15:-1),r(3),p("size",13),r(2),v("Tool calls \xB7 ",n.range()),r(2),M("skel",n.stats.state().loading),r(),g(n.stats.state().loading?24:23),r(2),g(n.toolCallsStat().series.length>0?25:-1),r(),g(n.toolCallsStat().delta!==0?26:-1),r(3),p("size",13),r(4),M("skel",n.stats.state().loading),r(),g(n.stats.state().loading?35:34),r(2),g(n.subagentPctStat().series.length>0?36:-1),r(),g(n.subagentPctStat().delta!==0?37:-1),r(3),p("size",13),r(4),M("skel",n.stats.state().loading),r(),g(n.stats.state().loading?46:45),r(5),p("size",14),r(6),k(n.doors),r(6),p("size",14),r(5),g(n.miniGraphSource()==="seed"?67:-1),r(3),p("size",11),r(2),p("nodes",n.miniGraphNodes())("edges",n.miniGraphEdges()),r(4),p("size",14),r(3),g(n.urgentTipCount()>0?79:-1),r(4),g(n.tips.state().loading?83:n.visibleTips().length===0?84:85),r(6),p("size",14),r(7),p("size",11),r(),g(n.heatmap.state().loading?97:n.treemapItems().length===0?98:99),r(13),p("size",14),r(8),g(n.costs.state().loading?118:n.topPrompts().length===0?119:120),r(5),p("size",14),r(3),g(n.cache.state().loading?126:n.cache.state().data?127:-1),r(3),O(" ",n.range()," window total: ",n.fmt$(n.rangeTotal())," \xB7 "),r(),M("dot-live",n.liveSource()==="live")("dot-mock",n.liveSource()==="offline"),r(2),v(" ",n.liveSource()==="live"?"Live":"Offline"," "))},dependencies:[j,Y,U,Q,q,W,J,X,Z,B],styles:['@charset "UTF-8";[_nghost-%COMP%]{display:contents}.dashboard[_ngcontent-%COMP%]{flex:1;padding:18px;color:var(--text-primary);background:var(--bg-canvas)}.stat-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:14px}.stat-tile[_ngcontent-%COMP%]{text-align:left;padding:11px 13px;cursor:pointer;background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:var(--r-lg);display:flex;flex-direction:column;gap:6px;color:var(--text-primary);font-family:inherit;transition:background .1s,border-color .1s}.stat-tile[_ngcontent-%COMP%]:hover{background:var(--bg-panel-2);border-color:var(--border-strong)}.stat-eyebrow[_ngcontent-%COMP%]{color:var(--text-muted)}.stat-value-row[_ngcontent-%COMP%]{justify-content:space-between;align-items:flex-end;gap:8px}.stat-value[_ngcontent-%COMP%]{font-size:23px;font-weight:650;letter-spacing:-.02em;line-height:1;min-height:23px}.doors-card[_ngcontent-%COMP%]{margin-bottom:14px}.doors-head[_ngcontent-%COMP%]{margin-bottom:12px}.doors-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}@media(max-width:760px){.doors-grid[_ngcontent-%COMP%]{grid-template-columns:1fr}}.door-tile[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;text-align:left;padding:12px 13px;border:1px solid var(--border-subtle);border-radius:var(--r-lg);background:var(--bg-panel-2);cursor:pointer;transition:border-color .12s,transform .12s}.door-tile[_ngcontent-%COMP%]:hover{border-color:var(--border-strong);transform:translateY(-1px)}.door-tile[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}.door-top[_ngcontent-%COMP%]{gap:10px;align-items:center}.door-ic[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:8px;flex-shrink:0}.door-titles[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:1px;min-width:0}.door-label[_ngcontent-%COMP%]{font-weight:650;font-size:12.5px;color:var(--text-primary)}.door-cmd[_ngcontent-%COMP%]{font-size:11.5px}.door-blurb[_ngcontent-%COMP%]{font-size:11.5px;line-height:1.45;color:var(--text-secondary)}.door-subs[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:4px;margin-top:auto}.door-sub[_ngcontent-%COMP%]{font-family:ui-monospace,Geist Mono,monospace;font-size:10px;padding:2px 6px;border-radius:5px;color:var(--text-muted);background:var(--bg-hover);border:1px solid var(--border-subtle)}.center-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:2fr 1fr;gap:12px;margin-bottom:14px}.graph-card[_ngcontent-%COMP%], .tips-card[_ngcontent-%COMP%]{height:340px;display:flex;flex-direction:column;background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:var(--r-lg);overflow:hidden}.card-head[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;padding:11px 13px;border-bottom:1px solid var(--border-subtle);flex-shrink:0}.card-title[_ngcontent-%COMP%]{font-weight:600;font-size:12.5px;display:inline-flex;align-items:center;gap:8px}.mini-graph[_ngcontent-%COMP%]{flex:1;min-height:0;overflow:hidden;border-bottom-left-radius:var(--r-lg);border-bottom-right-radius:var(--r-lg)}.mini-graph[_ngcontent-%COMP%] app-graph-canvas[_ngcontent-%COMP%]{display:block;width:100%;height:100%}.seed-pill[_ngcontent-%COMP%]{color:var(--warn);background:var(--warn-soft);font-size:9.5px;font-weight:600;padding:1px 6px}.tips-body[_ngcontent-%COMP%]{flex:1;padding:10px;display:flex;flex-direction:column;gap:8px;min-height:0}.tip-empty[_ngcontent-%COMP%]{color:var(--text-muted);font-size:12px;text-align:center;padding:12px}.tip-row[_ngcontent-%COMP%]{display:flex;gap:10px;padding:10px 12px;border-radius:8px;background:var(--bg-panel-2);border:1px solid var(--border-subtle);border-left-width:2.5px;animation:_ngcontent-%COMP%_slideInRight .2s ease;flex-shrink:0}.tip-sev-icon[_ngcontent-%COMP%]{flex-shrink:0;margin-top:1px}.tip-body-col[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:0}.tip-title[_ngcontent-%COMP%]{font-size:12.5px;font-weight:550;line-height:1.35;text-wrap:pretty}.tip-meta-row[_ngcontent-%COMP%]{margin-top:7px}.tip-fix[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-secondary);background:var(--bg-canvas);padding:2px 6px;border-radius:4px;border:1px solid var(--border-subtle);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:220px}.heatmap-card[_ngcontent-%COMP%]{margin-bottom:14px}.heatmap-head[_ngcontent-%COMP%]{justify-content:space-between;margin-bottom:10px}.heatmap-legend[_ngcontent-%COMP%]{margin-top:9px;align-items:center}.heatmap-gradient[_ngcontent-%COMP%]{width:96px;height:6px;border-radius:999px;background:linear-gradient(90deg,var(--node-route),var(--warn),var(--error))}.bottom-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1.4fr 1fr;gap:12px}.prompts-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:0}.prompts-head[_ngcontent-%COMP%]{justify-content:space-between;margin-bottom:6px}.prompt-row[_ngcontent-%COMP%]{display:flex;gap:10px;padding:7px 4px;border-radius:6px;cursor:pointer;align-items:center}.prompt-row[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.prompt-text[_ngcontent-%COMP%]{font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.prompt-right[_ngcontent-%COMP%]{text-align:right;flex-shrink:0}.prompt-cost[_ngcontent-%COMP%]{font-size:12px;font-weight:600}.prompt-cost.expensive[_ngcontent-%COMP%]{color:var(--error)}.cache-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:12px}.cache-headline[_ngcontent-%COMP%]{align-items:flex-end;gap:10px}.cache-rate[_ngcontent-%COMP%]{font-size:38px;font-weight:700;letter-spacing:-.03em;line-height:.9;color:var(--node-route)}.cache-divider[_ngcontent-%COMP%]{height:1px;background:var(--border-subtle)}.cache-kv-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:10px 14px}.kv[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:1px}.kv-label[_ngcontent-%COMP%]{color:var(--text-muted);font-size:10.5px}.kv-value[_ngcontent-%COMP%]{font-size:15px;font-weight:600}.kv-sub[_ngcontent-%COMP%]{font-size:9.5px}.dash-footer[_ngcontent-%COMP%]{margin-top:16px;text-align:right;font-size:10px}.dot-live[_ngcontent-%COMP%]{color:var(--success)}.dot-mock[_ngcontent-%COMP%]{color:var(--warn)}@keyframes _ngcontent-%COMP%_slideInRight{0%{opacity:0;transform:translate(14px)}to{opacity:1;transform:translate(0)}}'],changeDetection:0})},Be=[{id:"s-1",label:"validateSession",sub:"src/auth.ts",kind:"function",x:0,y:0},{id:"s-2",label:"checkExpiry",sub:"src/auth.ts",kind:"method",x:-180,y:-70},{id:"s-3",label:"signToken",sub:"src/auth.ts",kind:"function",x:-180,y:50},{id:"s-4",label:"AuthRoute",sub:"src/routes/auth.ts",kind:"route",x:200,y:-90},{id:"s-5",label:"login",sub:"src/routes/auth.ts",kind:"function",x:200,y:30},{id:"s-6",label:"logout",sub:"src/routes/auth.ts",kind:"function",x:230,y:110},{id:"s-7",label:"auth.test.ts",sub:"test/auth.test.ts",kind:"test",x:-240,y:140},{id:"s-8",label:"session.test.ts",sub:"test/session.test.ts",kind:"test",x:-100,y:180},{id:"s-9",label:"REQ-AUTH-005",sub:"reject expired tokens",kind:"spec",state:"drifted",x:30,y:-180},{id:"s-10",label:"REQ-AUTH-001",sub:"sign session tokens",kind:"spec",state:"verified",x:-150,y:-190},{id:"s-11",label:"User",sub:"src/types/user.ts",kind:"class",x:-340,y:-10},{id:"s-12",label:"Session",sub:"src/types/session.ts",kind:"class",x:60,y:130},{id:"s-13",label:"jwtSign",sub:"src/lib/jwt.ts",kind:"function",x:-340,y:80},{id:"s-14",label:"jwtVerify",sub:"src/lib/jwt.ts",kind:"function",x:350,y:-10},{id:"s-15",label:"tokenStore",sub:"src/db/tokens.ts",kind:"function",x:350,y:90}],Ve=[{from:"s-1",to:"s-2",kind:"calls"},{from:"s-1",to:"s-3",kind:"calls"},{from:"s-4",to:"s-5",kind:"calls"},{from:"s-4",to:"s-6",kind:"calls"},{from:"s-5",to:"s-1",kind:"calls"},{from:"s-6",to:"s-1",kind:"calls"},{from:"s-3",to:"s-13",kind:"calls"},{from:"s-2",to:"s-14",kind:"calls"},{from:"s-1",to:"s-12",kind:"references"},{from:"s-5",to:"s-11",kind:"references"},{from:"s-9",to:"s-1",kind:"implements"},{from:"s-10",to:"s-3",kind:"implements"},{from:"s-7",to:"s-1",kind:"references"},{from:"s-8",to:"s-12",kind:"references"},{from:"s-14",to:"s-15",kind:"calls"}];function je(i){if(i.length===0)return[];let t=i[0],e=i.slice(1),n=[{id:t.id,label:t.label,sub:t.sub,kind:t.kind,x:0,y:0}],d=220;for(let h=0;h<e.length;h++){let P=h/e.length*Math.PI*2-Math.PI/2,f=e[h];n.push({id:f.id,label:f.label,sub:f.sub,kind:f.kind,x:Math.cos(P)*d,y:Math.sin(P)*d})}return n}export{ee as Dashboard};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as N,b as D}from"./chunk-2IVSOVQZ.js";import{a as z}from"./chunk-5NTGUSXJ.js";import{a as T}from"./chunk-IOB4JJT4.js";import{a as M}from"./chunk-3H2EZLZN.js";import{Aa as a,Ga as C,I as v,Ia as c,Ka as P,M as S,N as E,Ta as u,Ua as g,Va as n,W as f,Wa as b,ea as o,ka as w,qa as m,ra as x,sa as y,ua as k,va as _,wa as h,xa as s,ya as e,za as t,zb as O}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var A=(r,l)=>l.model;function B(r,l){r&1&&n(0," Enabled \u2014 popups fire while the dashboard is open or backgrounded ")}function j(r,l){r&1&&n(0," Blocked \u2014 re-enable notifications for this site in your browser settings ")}function V(r,l){r&1&&n(0," Not supported in this browser ")}function $(r,l){r&1&&n(0," Get a desktop popup when a run needs approval, finishes, or drift appears ")}function F(r,l){if(r&1){let p=C();e(0,"button",50),c("click",function(){S(p);let d=P();return E(d.enableNotifications())}),n(1,"Enable"),t()}}function L(r,l){r&1&&(e(0,"span",24),n(1,"\u25CF On"),t())}function H(r,l){r&1&&(e(0,"span",25),n(1,"\u2014"),t())}function W(r,l){if(r&1&&(e(0,"div",34)(1,"span",51),n(2),t(),a(3,"input",52)(4,"input",52),t()),r&2){let p=l.$implicit;o(2),b(p.model),o(),s("value",p.input),o(),s("value",p.output)}}function q(r,l){if(r&1&&(e(0,"option"),n(1),t()),r&2){let p=l.$implicit;o(),b(p)}}var I=class r{api=v(M);theme=v(N);notify=v(D);setTheme(l){this.theme.setPref(l)}enableNotifications(){this.notify.requestPermission()}ingest=f(!0);watch=f(!0);motion=f(!1);toggleIngest(){this.ingest.update(l=>!l)}toggleWatch(){this.watch.update(l=>!l)}toggleMotion(){this.motion.update(l=>!l)}replayIntro(){try{sessionStorage.removeItem("specship-booted")}catch{}window.location.reload()}themeOptions=[{value:"dark",label:"Dark"},{value:"light",label:"Light"},{value:"system",label:"System"}];editorOptions=["code (VS Code)","subl (Sublime)","cursor","nvim"];pricing=[{model:"claude-opus-4",input:"15.00",output:"75.00"},{model:"claude-sonnet-4",input:"3.00",output:"15.00"},{model:"claude-haiku-4",input:"0.80",output:"4.00"}];static \u0275fac=function(p){return new(p||r)};static \u0275cmp=w({type:r,selectors:[["app-settings"]],decls:183,vars:42,consts:[[1,"settings-page","scroll-y"],["icon","settings","title","Settings"],[1,"settings-body"],[1,"card","card-pad","section-card"],[1,"section-head","row","gap-8"],["name","folder",2,"color","var(--accent)",3,"size"],[1,"section-title"],[1,"field"],[1,"field-label"],["value","~/dev/specship","readonly","",1,"input","mono",2,"width","100%"],[1,"field-hint"],["value","specs/",1,"input","mono",2,"width","100%"],["value","node_modules/, dist/, .cg/wt/",1,"input","mono",2,"width","100%"],["name","sessions",2,"color","var(--accent)",3,"size"],["value","~/.claude/projects/",1,"input","mono",2,"width","100%"],[1,"toggle-row","row"],[1,"grow"],[1,"toggle-label"],[1,"muted",2,"font-size","11px"],["type","button","aria-label","Enable transcript ingest",1,"toggle-btn",3,"click"],[1,"toggle-thumb"],["type","button","aria-label","Real-time watch",1,"toggle-btn",3,"click"],["name","zap",2,"color","var(--accent)",3,"size"],["type","button",2,"height","30px","padding","0 12px","border-radius","6px","border","1px solid var(--accent)","background","var(--accent)","color","#fff","font-size","12px","cursor","pointer"],[2,"font-size","12px","color","var(--accent)"],[1,"muted",2,"font-size","12px"],["type","button","aria-label","Notify when a run needs approval",1,"toggle-btn",3,"click"],["type","button","aria-label","Notify when a run completes or fails",1,"toggle-btn",3,"click"],["type","button","aria-label","Notify when drift is detected",1,"toggle-btn",3,"click"],["type","button","aria-label","Notify when a new improvement is found",1,"toggle-btn",3,"click"],["name","dollar",2,"color","var(--accent)",3,"size"],[1,"muted",2,"font-size","11.5px","margin-bottom","12px"],[1,"pricing-header","row"],[1,"price-col"],[1,"pricing-row","row"],["name","sparkles",2,"color","var(--accent)",3,"size"],[3,"change","value","options"],["type","button","aria-label","Reduced motion",1,"toggle-btn",3,"click"],[1,"toggle-row","row",2,"border-top","1px solid var(--border-subtle)","margin-top","4px","padding-top","8px"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["name","refresh",3,"size"],["name","reveal",2,"color","var(--accent)",3,"size"],[1,"input",2,"width","200px"],["name","graph",2,"color","var(--accent)",3,"size"],[1,"about-grid"],[1,"about-row","row"],[1,"mono",2,"font-size","12px"],[1,"mono",2,"font-size","12px","color","var(--success)"],[1,"status-dot",2,"background","var(--success)"],[2,"height","30px"],["type","button",2,"height","30px","padding","0 12px","border-radius","6px","border","1px solid var(--accent)","background","var(--accent)","color","#fff","font-size","12px","cursor","pointer",3,"click"],[1,"mono","grow",2,"font-size","12px"],[1,"input","mono","tabular","price-input",3,"value"]],template:function(p,i){if(p&1&&(e(0,"div",0),a(1,"app-page-head",1),e(2,"div",2)(3,"section",3)(4,"div",4),a(5,"app-icon",5),e(6,"span",6),n(7,"Project"),t()(),e(8,"div",7)(9,"label",8),n(10,"Project root"),t(),a(11,"input",9),e(12,"div",10),n(13,"Set at app open \xB7 read-only"),t()(),e(14,"div",7)(15,"label",8),n(16,"Spec roots"),t(),a(17,"input",11),t(),e(18,"div",7)(19,"label",8),n(20,"Ignore patterns"),t(),a(21,"input",12),t()(),e(22,"section",3)(23,"div",4),a(24,"app-icon",13),e(25,"span",6),n(26,"Claude Code"),t()(),e(27,"div",7)(28,"label",8),n(29,"Transcripts path"),t(),a(30,"input",14),e(31,"div",10),n(32,"Auto-detected \xB7 overridable"),t()(),e(33,"div",15)(34,"div",16)(35,"div",17),n(36,"Enable transcript ingest"),t(),e(37,"div",18),n(38,"Read JSONL transcripts for analytics"),t()(),e(39,"button",19),c("click",function(){return i.toggleIngest()}),a(40,"span",20),t()(),e(41,"div",15)(42,"div",16)(43,"div",17),n(44,"Real-time watch"),t(),e(45,"div",18),n(46,"Tail new transcript lines as they're written"),t()(),e(47,"button",21),c("click",function(){return i.toggleWatch()}),a(48,"span",20),t()()(),e(49,"section",3)(50,"div",4),a(51,"app-icon",22),e(52,"span",6),n(53,"Notifications"),t()(),e(54,"div",15)(55,"div",16)(56,"div",17),n(57,"Desktop notifications"),t(),e(58,"div",18),x(59,B,1,0)(60,j,1,0)(61,V,1,0)(62,$,1,0),t()(),x(63,F,2,0,"button",23)(64,L,2,0,"span",24)(65,H,2,0,"span",25),t(),e(66,"div",15)(67,"div",16)(68,"div",17),n(69,"Run needs approval"),t(),e(70,"div",18),n(71,"A workflow run paused at an approval gate"),t()(),e(72,"button",26),c("click",function(){return i.notify.toggle("approval")}),a(73,"span",20),t()(),e(74,"div",15)(75,"div",16)(76,"div",17),n(77,"Run completed or failed"),t(),e(78,"div",18),n(79,"A workflow run finished or errored"),t()(),e(80,"button",27),c("click",function(){return i.notify.toggle("runDone")}),a(81,"span",20),t()(),e(82,"div",15)(83,"div",16)(84,"div",17),n(85,"Drift detected"),t(),e(86,"div",18),n(87,"Spec \u2192 code drift appeared"),t()(),e(88,"button",28),c("click",function(){return i.notify.toggle("drift")}),a(89,"span",20),t()(),e(90,"div",15)(91,"div",16)(92,"div",17),n(93,"New improvement"),t(),e(94,"div",18),n(95,"A new high-severity self-improvement proposal was found"),t()(),e(96,"button",29),c("click",function(){return i.notify.toggle("reflect")}),a(97,"span",20),t()()(),e(98,"section",3)(99,"div",4),a(100,"app-icon",30),e(101,"span",6),n(102,"Pricing table"),t()(),e(103,"div",31),n(104,"Per-million-token prices. Bump these when Anthropic publishes new tiers."),t(),e(105,"div",32)(106,"span",16),n(107,"Model"),t(),e(108,"span",33),n(109,"Input $/M"),t(),e(110,"span",33),n(111,"Output $/M"),t()(),_(112,W,5,3,"div",34,A),t(),e(114,"section",3)(115,"div",4),a(116,"app-icon",35),e(117,"span",6),n(118,"Appearance"),t()(),e(119,"div",7)(120,"label",8),n(121,"Theme"),t(),e(122,"app-segmented",36),c("change",function(R){return i.setTheme(R)}),t(),e(123,"div",10),n(124,"Now fully supported \u2014 dark, light, or follow your OS"),t()(),e(125,"div",15)(126,"div",16)(127,"div",17),n(128,"Reduced motion"),t(),e(129,"div",18),n(130,"Honor OS preference \u2014 instant transitions"),t()(),e(131,"button",37),c("click",function(){return i.toggleMotion()}),a(132,"span",20),t()(),e(133,"div",38)(134,"div",16)(135,"div",17),n(136,"Boot animation"),t(),e(137,"div",18),n(138,"The graph-assembly splash on app launch"),t()(),e(139,"button",39),c("click",function(){return i.replayIntro()}),a(140,"app-icon",40),n(141," Replay intro "),t()()(),e(142,"section",3)(143,"div",4),a(144,"app-icon",41),e(145,"span",6),n(146,"Editor"),t()(),e(147,"div",7)(148,"label",8),n(149,"Open files with"),t(),e(150,"select",42),_(151,q,2,1,"option",null,k),t(),e(153,"div",10),n(154,"Detected via code / subl / etc."),t()()(),e(155,"section",3)(156,"div",4),a(157,"app-icon",43),e(158,"span",6),n(159,"About"),t()(),e(160,"div",44)(161,"div",45)(162,"span",25),n(163,"Version"),t(),e(164,"span",46),n(165,"0.4.0"),t()(),e(166,"div",45)(167,"span",25),n(168,"MCP server"),t(),e(169,"span",47),a(170,"span",48),n(171,"running "),t()(),e(172,"div",45)(173,"span",25),n(174,"Backend"),t(),e(175,"span",46),n(176),t()(),e(177,"div",45)(178,"span",25),n(179,"Log path"),t(),e(180,"span",46),n(181,"~/.cg/logs/desktop.log"),t()()()(),a(182,"div",49),t()()),p&2){let d;o(5),s("size",15),o(19),s("size",15),o(15),g("on",i.ingest()),m("aria-pressed",i.ingest()),o(8),g("on",i.watch()),m("aria-pressed",i.watch()),o(4),s("size",15),o(8),y((d=i.notify.permission())==="granted"?59:d==="denied"?60:d==="unsupported"?61:62),o(4),y(i.notify.permission()==="default"?63:i.notify.permission()==="granted"?64:65),o(3),u("opacity",i.notify.granted()?"1":"0.5"),o(6),g("on",i.notify.enabled("approval")),m("aria-pressed",i.notify.enabled("approval")),o(2),u("opacity",i.notify.granted()?"1":"0.5"),o(6),g("on",i.notify.enabled("runDone")),m("aria-pressed",i.notify.enabled("runDone")),o(2),u("opacity",i.notify.granted()?"1":"0.5"),o(6),g("on",i.notify.enabled("drift")),m("aria-pressed",i.notify.enabled("drift")),o(2),u("opacity",i.notify.granted()?"1":"0.5"),o(6),g("on",i.notify.enabled("reflect")),m("aria-pressed",i.notify.enabled("reflect")),o(4),s("size",15),o(12),h(i.pricing),o(4),s("size",15),o(6),s("value",i.theme.pref())("options",i.themeOptions),o(9),g("on",i.motion()),m("aria-pressed",i.motion()),o(9),s("size",13),o(4),s("size",15),o(7),h(i.editorOptions),o(6),s("size",15),o(19),b(i.api.isConfigured?i.api.apiBase:"not configured")}},dependencies:[O,z,T],styles:["[_nghost-%COMP%]{display:flex;flex:1;min-height:0}.settings-page[_ngcontent-%COMP%]{flex:1;padding:18px;overflow-y:auto}.settings-body[_ngcontent-%COMP%]{max-width:720px}.section-card[_ngcontent-%COMP%]{margin-bottom:14px}.section-head[_ngcontent-%COMP%]{align-items:center;margin-bottom:14px;padding-bottom:12px;border-bottom:1px solid var(--border-subtle)}.section-title[_ngcontent-%COMP%]{font-weight:600;font-size:13.5px}.field[_ngcontent-%COMP%]{margin-bottom:16px}.field-label[_ngcontent-%COMP%]{display:block;font-size:12.5px;font-weight:500;margin-bottom:6px;color:var(--text-primary)}.field-hint[_ngcontent-%COMP%]{color:var(--text-muted);font-size:11px;margin-top:5px}.toggle-row[_ngcontent-%COMP%]{align-items:center;padding:8px 0}.toggle-label[_ngcontent-%COMP%]{font-size:12.5px;font-weight:500}.toggle-btn[_ngcontent-%COMP%]{width:36px;height:20px;border-radius:999px;border:none;cursor:pointer;padding:2px;background:var(--bg-elevated);display:flex;justify-content:flex-start;align-items:center;transition:background .12s;flex-shrink:0}.toggle-btn.on[_ngcontent-%COMP%]{background:var(--accent);justify-content:flex-end}.toggle-btn[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.toggle-thumb[_ngcontent-%COMP%]{width:16px;height:16px;border-radius:50%;background:#fff;flex-shrink:0}.pricing-header[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;font-weight:600;margin-bottom:6px}.pricing-row[_ngcontent-%COMP%]{padding:6px 0;border-top:1px solid var(--border-subtle);align-items:center;gap:10px}.price-col[_ngcontent-%COMP%]{width:110px;text-align:right}.price-input[_ngcontent-%COMP%]{width:100px;text-align:right;padding:4px 8px}.about-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:10px 20px}.about-row[_ngcontent-%COMP%]{justify-content:space-between;padding:5px 0;border-bottom:1px solid var(--border-subtle)}.status-dot[_ngcontent-%COMP%]{display:inline-block;width:6px;height:6px;border-radius:50%;margin-right:6px;vertical-align:middle}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono)}.grow[_ngcontent-%COMP%]{flex:1}"],changeDetection:0})};export{I as Settings};
|
|
1
|
+
import{a as N,b as D}from"./chunk-2IVSOVQZ.js";import{a as z}from"./chunk-5NTGUSXJ.js";import{a as T}from"./chunk-IOB4JJT4.js";import{a as M}from"./chunk-TWVVIWKO.js";import{Aa as a,Ga as C,I as v,Ia as c,Ka as P,M as S,N as E,Ta as u,Ua as g,Va as n,W as f,Wa as b,ea as o,ka as w,qa as m,ra as x,sa as y,ua as k,va as _,wa as h,xa as s,ya as e,za as t,zb as O}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var A=(r,l)=>l.model;function B(r,l){r&1&&n(0," Enabled \u2014 popups fire while the dashboard is open or backgrounded ")}function j(r,l){r&1&&n(0," Blocked \u2014 re-enable notifications for this site in your browser settings ")}function V(r,l){r&1&&n(0," Not supported in this browser ")}function $(r,l){r&1&&n(0," Get a desktop popup when a run needs approval, finishes, or drift appears ")}function F(r,l){if(r&1){let p=C();e(0,"button",50),c("click",function(){S(p);let d=P();return E(d.enableNotifications())}),n(1,"Enable"),t()}}function L(r,l){r&1&&(e(0,"span",24),n(1,"\u25CF On"),t())}function H(r,l){r&1&&(e(0,"span",25),n(1,"\u2014"),t())}function W(r,l){if(r&1&&(e(0,"div",34)(1,"span",51),n(2),t(),a(3,"input",52)(4,"input",52),t()),r&2){let p=l.$implicit;o(2),b(p.model),o(),s("value",p.input),o(),s("value",p.output)}}function q(r,l){if(r&1&&(e(0,"option"),n(1),t()),r&2){let p=l.$implicit;o(),b(p)}}var I=class r{api=v(M);theme=v(N);notify=v(D);setTheme(l){this.theme.setPref(l)}enableNotifications(){this.notify.requestPermission()}ingest=f(!0);watch=f(!0);motion=f(!1);toggleIngest(){this.ingest.update(l=>!l)}toggleWatch(){this.watch.update(l=>!l)}toggleMotion(){this.motion.update(l=>!l)}replayIntro(){try{sessionStorage.removeItem("specship-booted")}catch{}window.location.reload()}themeOptions=[{value:"dark",label:"Dark"},{value:"light",label:"Light"},{value:"system",label:"System"}];editorOptions=["code (VS Code)","subl (Sublime)","cursor","nvim"];pricing=[{model:"claude-opus-4",input:"15.00",output:"75.00"},{model:"claude-sonnet-4",input:"3.00",output:"15.00"},{model:"claude-haiku-4",input:"0.80",output:"4.00"}];static \u0275fac=function(p){return new(p||r)};static \u0275cmp=w({type:r,selectors:[["app-settings"]],decls:183,vars:42,consts:[[1,"settings-page","scroll-y"],["icon","settings","title","Settings"],[1,"settings-body"],[1,"card","card-pad","section-card"],[1,"section-head","row","gap-8"],["name","folder",2,"color","var(--accent)",3,"size"],[1,"section-title"],[1,"field"],[1,"field-label"],["value","~/dev/specship","readonly","",1,"input","mono",2,"width","100%"],[1,"field-hint"],["value","specs/",1,"input","mono",2,"width","100%"],["value","node_modules/, dist/, .cg/wt/",1,"input","mono",2,"width","100%"],["name","sessions",2,"color","var(--accent)",3,"size"],["value","~/.claude/projects/",1,"input","mono",2,"width","100%"],[1,"toggle-row","row"],[1,"grow"],[1,"toggle-label"],[1,"muted",2,"font-size","11px"],["type","button","aria-label","Enable transcript ingest",1,"toggle-btn",3,"click"],[1,"toggle-thumb"],["type","button","aria-label","Real-time watch",1,"toggle-btn",3,"click"],["name","zap",2,"color","var(--accent)",3,"size"],["type","button",2,"height","30px","padding","0 12px","border-radius","6px","border","1px solid var(--accent)","background","var(--accent)","color","#fff","font-size","12px","cursor","pointer"],[2,"font-size","12px","color","var(--accent)"],[1,"muted",2,"font-size","12px"],["type","button","aria-label","Notify when a run needs approval",1,"toggle-btn",3,"click"],["type","button","aria-label","Notify when a run completes or fails",1,"toggle-btn",3,"click"],["type","button","aria-label","Notify when drift is detected",1,"toggle-btn",3,"click"],["type","button","aria-label","Notify when a new improvement is found",1,"toggle-btn",3,"click"],["name","dollar",2,"color","var(--accent)",3,"size"],[1,"muted",2,"font-size","11.5px","margin-bottom","12px"],[1,"pricing-header","row"],[1,"price-col"],[1,"pricing-row","row"],["name","sparkles",2,"color","var(--accent)",3,"size"],[3,"change","value","options"],["type","button","aria-label","Reduced motion",1,"toggle-btn",3,"click"],[1,"toggle-row","row",2,"border-top","1px solid var(--border-subtle)","margin-top","4px","padding-top","8px"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["name","refresh",3,"size"],["name","reveal",2,"color","var(--accent)",3,"size"],[1,"input",2,"width","200px"],["name","graph",2,"color","var(--accent)",3,"size"],[1,"about-grid"],[1,"about-row","row"],[1,"mono",2,"font-size","12px"],[1,"mono",2,"font-size","12px","color","var(--success)"],[1,"status-dot",2,"background","var(--success)"],[2,"height","30px"],["type","button",2,"height","30px","padding","0 12px","border-radius","6px","border","1px solid var(--accent)","background","var(--accent)","color","#fff","font-size","12px","cursor","pointer",3,"click"],[1,"mono","grow",2,"font-size","12px"],[1,"input","mono","tabular","price-input",3,"value"]],template:function(p,i){if(p&1&&(e(0,"div",0),a(1,"app-page-head",1),e(2,"div",2)(3,"section",3)(4,"div",4),a(5,"app-icon",5),e(6,"span",6),n(7,"Project"),t()(),e(8,"div",7)(9,"label",8),n(10,"Project root"),t(),a(11,"input",9),e(12,"div",10),n(13,"Set at app open \xB7 read-only"),t()(),e(14,"div",7)(15,"label",8),n(16,"Spec roots"),t(),a(17,"input",11),t(),e(18,"div",7)(19,"label",8),n(20,"Ignore patterns"),t(),a(21,"input",12),t()(),e(22,"section",3)(23,"div",4),a(24,"app-icon",13),e(25,"span",6),n(26,"Claude Code"),t()(),e(27,"div",7)(28,"label",8),n(29,"Transcripts path"),t(),a(30,"input",14),e(31,"div",10),n(32,"Auto-detected \xB7 overridable"),t()(),e(33,"div",15)(34,"div",16)(35,"div",17),n(36,"Enable transcript ingest"),t(),e(37,"div",18),n(38,"Read JSONL transcripts for analytics"),t()(),e(39,"button",19),c("click",function(){return i.toggleIngest()}),a(40,"span",20),t()(),e(41,"div",15)(42,"div",16)(43,"div",17),n(44,"Real-time watch"),t(),e(45,"div",18),n(46,"Tail new transcript lines as they're written"),t()(),e(47,"button",21),c("click",function(){return i.toggleWatch()}),a(48,"span",20),t()()(),e(49,"section",3)(50,"div",4),a(51,"app-icon",22),e(52,"span",6),n(53,"Notifications"),t()(),e(54,"div",15)(55,"div",16)(56,"div",17),n(57,"Desktop notifications"),t(),e(58,"div",18),x(59,B,1,0)(60,j,1,0)(61,V,1,0)(62,$,1,0),t()(),x(63,F,2,0,"button",23)(64,L,2,0,"span",24)(65,H,2,0,"span",25),t(),e(66,"div",15)(67,"div",16)(68,"div",17),n(69,"Run needs approval"),t(),e(70,"div",18),n(71,"A workflow run paused at an approval gate"),t()(),e(72,"button",26),c("click",function(){return i.notify.toggle("approval")}),a(73,"span",20),t()(),e(74,"div",15)(75,"div",16)(76,"div",17),n(77,"Run completed or failed"),t(),e(78,"div",18),n(79,"A workflow run finished or errored"),t()(),e(80,"button",27),c("click",function(){return i.notify.toggle("runDone")}),a(81,"span",20),t()(),e(82,"div",15)(83,"div",16)(84,"div",17),n(85,"Drift detected"),t(),e(86,"div",18),n(87,"Spec \u2192 code drift appeared"),t()(),e(88,"button",28),c("click",function(){return i.notify.toggle("drift")}),a(89,"span",20),t()(),e(90,"div",15)(91,"div",16)(92,"div",17),n(93,"New improvement"),t(),e(94,"div",18),n(95,"A new high-severity self-improvement proposal was found"),t()(),e(96,"button",29),c("click",function(){return i.notify.toggle("reflect")}),a(97,"span",20),t()()(),e(98,"section",3)(99,"div",4),a(100,"app-icon",30),e(101,"span",6),n(102,"Pricing table"),t()(),e(103,"div",31),n(104,"Per-million-token prices. Bump these when Anthropic publishes new tiers."),t(),e(105,"div",32)(106,"span",16),n(107,"Model"),t(),e(108,"span",33),n(109,"Input $/M"),t(),e(110,"span",33),n(111,"Output $/M"),t()(),_(112,W,5,3,"div",34,A),t(),e(114,"section",3)(115,"div",4),a(116,"app-icon",35),e(117,"span",6),n(118,"Appearance"),t()(),e(119,"div",7)(120,"label",8),n(121,"Theme"),t(),e(122,"app-segmented",36),c("change",function(R){return i.setTheme(R)}),t(),e(123,"div",10),n(124,"Now fully supported \u2014 dark, light, or follow your OS"),t()(),e(125,"div",15)(126,"div",16)(127,"div",17),n(128,"Reduced motion"),t(),e(129,"div",18),n(130,"Honor OS preference \u2014 instant transitions"),t()(),e(131,"button",37),c("click",function(){return i.toggleMotion()}),a(132,"span",20),t()(),e(133,"div",38)(134,"div",16)(135,"div",17),n(136,"Boot animation"),t(),e(137,"div",18),n(138,"The graph-assembly splash on app launch"),t()(),e(139,"button",39),c("click",function(){return i.replayIntro()}),a(140,"app-icon",40),n(141," Replay intro "),t()()(),e(142,"section",3)(143,"div",4),a(144,"app-icon",41),e(145,"span",6),n(146,"Editor"),t()(),e(147,"div",7)(148,"label",8),n(149,"Open files with"),t(),e(150,"select",42),_(151,q,2,1,"option",null,k),t(),e(153,"div",10),n(154,"Detected via code / subl / etc."),t()()(),e(155,"section",3)(156,"div",4),a(157,"app-icon",43),e(158,"span",6),n(159,"About"),t()(),e(160,"div",44)(161,"div",45)(162,"span",25),n(163,"Version"),t(),e(164,"span",46),n(165,"0.4.0"),t()(),e(166,"div",45)(167,"span",25),n(168,"MCP server"),t(),e(169,"span",47),a(170,"span",48),n(171,"running "),t()(),e(172,"div",45)(173,"span",25),n(174,"Backend"),t(),e(175,"span",46),n(176),t()(),e(177,"div",45)(178,"span",25),n(179,"Log path"),t(),e(180,"span",46),n(181,"~/.cg/logs/desktop.log"),t()()()(),a(182,"div",49),t()()),p&2){let d;o(5),s("size",15),o(19),s("size",15),o(15),g("on",i.ingest()),m("aria-pressed",i.ingest()),o(8),g("on",i.watch()),m("aria-pressed",i.watch()),o(4),s("size",15),o(8),y((d=i.notify.permission())==="granted"?59:d==="denied"?60:d==="unsupported"?61:62),o(4),y(i.notify.permission()==="default"?63:i.notify.permission()==="granted"?64:65),o(3),u("opacity",i.notify.granted()?"1":"0.5"),o(6),g("on",i.notify.enabled("approval")),m("aria-pressed",i.notify.enabled("approval")),o(2),u("opacity",i.notify.granted()?"1":"0.5"),o(6),g("on",i.notify.enabled("runDone")),m("aria-pressed",i.notify.enabled("runDone")),o(2),u("opacity",i.notify.granted()?"1":"0.5"),o(6),g("on",i.notify.enabled("drift")),m("aria-pressed",i.notify.enabled("drift")),o(2),u("opacity",i.notify.granted()?"1":"0.5"),o(6),g("on",i.notify.enabled("reflect")),m("aria-pressed",i.notify.enabled("reflect")),o(4),s("size",15),o(12),h(i.pricing),o(4),s("size",15),o(6),s("value",i.theme.pref())("options",i.themeOptions),o(9),g("on",i.motion()),m("aria-pressed",i.motion()),o(9),s("size",13),o(4),s("size",15),o(7),h(i.editorOptions),o(6),s("size",15),o(19),b(i.api.isConfigured?i.api.apiBase:"not configured")}},dependencies:[O,z,T],styles:["[_nghost-%COMP%]{display:flex;flex:1;min-height:0}.settings-page[_ngcontent-%COMP%]{flex:1;padding:18px;overflow-y:auto}.settings-body[_ngcontent-%COMP%]{max-width:720px}.section-card[_ngcontent-%COMP%]{margin-bottom:14px}.section-head[_ngcontent-%COMP%]{align-items:center;margin-bottom:14px;padding-bottom:12px;border-bottom:1px solid var(--border-subtle)}.section-title[_ngcontent-%COMP%]{font-weight:600;font-size:13.5px}.field[_ngcontent-%COMP%]{margin-bottom:16px}.field-label[_ngcontent-%COMP%]{display:block;font-size:12.5px;font-weight:500;margin-bottom:6px;color:var(--text-primary)}.field-hint[_ngcontent-%COMP%]{color:var(--text-muted);font-size:11px;margin-top:5px}.toggle-row[_ngcontent-%COMP%]{align-items:center;padding:8px 0}.toggle-label[_ngcontent-%COMP%]{font-size:12.5px;font-weight:500}.toggle-btn[_ngcontent-%COMP%]{width:36px;height:20px;border-radius:999px;border:none;cursor:pointer;padding:2px;background:var(--bg-elevated);display:flex;justify-content:flex-start;align-items:center;transition:background .12s;flex-shrink:0}.toggle-btn.on[_ngcontent-%COMP%]{background:var(--accent);justify-content:flex-end}.toggle-btn[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.toggle-thumb[_ngcontent-%COMP%]{width:16px;height:16px;border-radius:50%;background:#fff;flex-shrink:0}.pricing-header[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;font-weight:600;margin-bottom:6px}.pricing-row[_ngcontent-%COMP%]{padding:6px 0;border-top:1px solid var(--border-subtle);align-items:center;gap:10px}.price-col[_ngcontent-%COMP%]{width:110px;text-align:right}.price-input[_ngcontent-%COMP%]{width:100px;text-align:right;padding:4px 8px}.about-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:10px 20px}.about-row[_ngcontent-%COMP%]{justify-content:space-between;padding:5px 0;border-bottom:1px solid var(--border-subtle)}.status-dot[_ngcontent-%COMP%]{display:inline-block;width:6px;height:6px;border-radius:50%;margin-right:6px;vertical-align:middle}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono)}.grow[_ngcontent-%COMP%]{flex:1}"],changeDetection:0})};export{I as Settings};
|