@selvakumaresra/specship 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/commands/ss-domain.md +98 -0
  2. package/commands/ss-triage.md +177 -0
  3. package/dist/bin/specship.js +249 -0
  4. package/dist/bin/specship.js.map +1 -1
  5. package/dist/db/schema.sql +1 -1
  6. package/dist/db/spec-queries.d.ts +29 -0
  7. package/dist/db/spec-queries.d.ts.map +1 -1
  8. package/dist/db/spec-queries.js +63 -0
  9. package/dist/db/spec-queries.js.map +1 -1
  10. package/dist/enforce/enforce.d.ts +70 -0
  11. package/dist/enforce/enforce.d.ts.map +1 -0
  12. package/dist/enforce/enforce.js +125 -0
  13. package/dist/enforce/enforce.js.map +1 -0
  14. package/dist/extraction/specs/markdown-spec-extractor.d.ts +21 -0
  15. package/dist/extraction/specs/markdown-spec-extractor.d.ts.map +1 -1
  16. package/dist/extraction/specs/markdown-spec-extractor.js +144 -0
  17. package/dist/extraction/specs/markdown-spec-extractor.js.map +1 -1
  18. package/dist/fitness/fitness.d.ts +75 -0
  19. package/dist/fitness/fitness.d.ts.map +1 -0
  20. package/dist/fitness/fitness.js +204 -0
  21. package/dist/fitness/fitness.js.map +1 -0
  22. package/dist/graph/maintainability.d.ts +101 -0
  23. package/dist/graph/maintainability.d.ts.map +1 -0
  24. package/dist/graph/maintainability.js +278 -0
  25. package/dist/graph/maintainability.js.map +1 -0
  26. package/dist/index.d.ts +45 -0
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +79 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/installer/instructions-template.d.ts +5 -4
  31. package/dist/installer/instructions-template.d.ts.map +1 -1
  32. package/dist/installer/instructions-template.js +10 -4
  33. package/dist/installer/instructions-template.js.map +1 -1
  34. package/dist/installer/targets/claude.d.ts.map +1 -1
  35. package/dist/installer/targets/claude.js +4 -0
  36. package/dist/installer/targets/claude.js.map +1 -1
  37. package/dist/installer/targets/shared.d.ts.map +1 -1
  38. package/dist/installer/targets/shared.js +4 -0
  39. package/dist/installer/targets/shared.js.map +1 -1
  40. package/dist/mcp/fitness-tool.d.ts +12 -0
  41. package/dist/mcp/fitness-tool.d.ts.map +1 -0
  42. package/dist/mcp/fitness-tool.js +46 -0
  43. package/dist/mcp/fitness-tool.js.map +1 -0
  44. package/dist/mcp/maintainability-tool.d.ts +13 -0
  45. package/dist/mcp/maintainability-tool.d.ts.map +1 -0
  46. package/dist/mcp/maintainability-tool.js +64 -0
  47. package/dist/mcp/maintainability-tool.js.map +1 -0
  48. package/dist/mcp/server-instructions.d.ts +1 -1
  49. package/dist/mcp/server-instructions.d.ts.map +1 -1
  50. package/dist/mcp/server-instructions.js +3 -2
  51. package/dist/mcp/server-instructions.js.map +1 -1
  52. package/dist/mcp/spec-tools.d.ts.map +1 -1
  53. package/dist/mcp/spec-tools.js +115 -1
  54. package/dist/mcp/spec-tools.js.map +1 -1
  55. package/dist/mcp/tools.d.ts +13 -0
  56. package/dist/mcp/tools.d.ts.map +1 -1
  57. package/dist/mcp/tools.js +75 -0
  58. package/dist/mcp/tools.js.map +1 -1
  59. package/dist/resolution/domain-gap-seed.d.ts +60 -0
  60. package/dist/resolution/domain-gap-seed.d.ts.map +1 -0
  61. package/dist/resolution/domain-gap-seed.js +87 -0
  62. package/dist/resolution/domain-gap-seed.js.map +1 -0
  63. package/dist/resolution/spec-link-resolver.d.ts +46 -1
  64. package/dist/resolution/spec-link-resolver.d.ts.map +1 -1
  65. package/dist/resolution/spec-link-resolver.js +78 -0
  66. package/dist/resolution/spec-link-resolver.js.map +1 -1
  67. package/dist/server/routes/domain.js +0 -0
  68. package/dist/server/routes/maintainability.js +18 -0
  69. package/dist/server/server.js +4 -0
  70. package/dist/types.d.ts +3 -1
  71. package/dist/types.d.ts.map +1 -1
  72. package/dist/types.js +6 -0
  73. package/dist/types.js.map +1 -1
  74. package/dist/web/chunk-EZZBWC7Z.js +1 -0
  75. package/dist/web/{chunk-UBOZGQNK.js → chunk-IZQXYQNQ.js} +1 -1
  76. package/dist/web/chunk-JQXCRIK2.js +1 -0
  77. package/dist/web/{chunk-ASZ77FMZ.js → chunk-JT2YIHPL.js} +1 -1
  78. package/dist/web/{chunk-WLIMNDS3.js → chunk-ONKHTXHJ.js} +1 -1
  79. package/dist/web/{chunk-FHZHD2ZG.js → chunk-P5JX67LT.js} +1 -1
  80. package/dist/web/{chunk-RJLLYZEQ.js → chunk-PDTQX2UL.js} +1 -1
  81. package/dist/web/{chunk-RASJHUXS.js → chunk-XWDR6MPC.js} +1 -1
  82. package/dist/web/{chunk-D5OCNEJA.js → chunk-ZG7H3XPL.js} +1 -1
  83. package/dist/web/index.html +1 -1
  84. package/dist/web/main-GYPY5V5H.js +1 -0
  85. package/package.json +1 -1
  86. package/dist/web/main-P33TUYUP.js +0 -1
@@ -1 +1 @@
1
- import{a as oe}from"./chunk-R5W2MDZN.js";import{a as ie}from"./chunk-WDU3WICG.js";import{b as ae}from"./chunk-HZA6NEAB.js";import{a as ne}from"./chunk-2GBEK2GM.js";import{a as te}from"./chunk-SUZYBYDW.js";import{c as K}from"./chunk-GR72OOCN.js";import{c as J}from"./chunk-SHPTC4RL.js";import{a as Z}from"./chunk-7RNS77UP.js";import{a as Y}from"./chunk-E44X4RH2.js";import{Aa as p,Ga as y,I as N,Ia as b,Ka as c,M as h,N as v,O as f,P as C,Ta as I,Ua as R,Va as l,W as P,Wa as m,Xa as z,Za as W,bb as X,ea as o,ka as q,lb as w,qa as T,ra as g,sa as u,ua as G,va as k,wa as S,xa as x,ya as i,za as a,zb as ee}from"./chunk-PDN6QYGJ.js";import{a as A,b as U}from"./chunk-Q7L6LLAK.js";var de=()=>[1,2,3,4],pe=(t,n)=>n.node.id,L=(t,n)=>n.id;function se(t,n){t&1&&p(0,"app-pick-project-empty",0)}function ce(t,n){if(t&1){let e=y();i(0,"button",19),b("click",function(){let d=h(e).$implicit,s=c(2);return v(s.toggleFilter(d))}),p(1,"span",20),l(2),i(3,"span",21),l(4),a()()}if(t&2){let e=n.$implicit,r=c(2);I("--chip-color",r.chipColor(e)),R("is-active",r.isFilterActive(e)),o(),T("data-kind",e),o(),z(" ",r.kindLabel(e)," "),o(2),m(r.countFor(e))}}function me(t,n){t&1&&p(0,"span",12)}function ge(t,n){if(t&1){let e=y();i(0,"button",23),b("click",function(){let d=h(e).$implicit,s=c(3);return v(s.pickResult(d.node))}),p(1,"span",24),i(2,"span",25),l(3),a(),i(4,"span",26),l(5),a(),i(6,"span",27),l(7),a()()}if(t&2){let e=n.$implicit,r=c(3);o(),R("is-spec",e.node.kind==="spec")("is-route",e.node.kind==="route")("is-test",e.node.kind==="test"),o(2),m(e.node.name),o(2),m(e.node.kind),o(2),m(r.shortPath(e.node.filePath))}}function ue(t,n){if(t&1&&(i(0,"div",13),k(1,ge,8,9,"button",22,pe),a()),t&2){let e=c(2);o(),S(e.searchResults.state().data.results)}}function _e(t,n){if(t&1&&(i(0,"p",28),l(1),a()),t&2){let e=n;o(),W("",e.nodeCount.toLocaleString()," nodes \xB7 ",e.edgeCount.toLocaleString()," edges \xB7 ",e.fileCount.toLocaleString()," files")}}function xe(t,n){if(t&1&&(i(0,"div",17)(1,"h3"),l(2,"Explore the graph"),a(),i(3,"p"),l(4,"Search for a function, method or class to start. The graph renders the symbol with its callers, callees and any linked specs."),a(),g(5,_e,2,3,"p",28),a()),t&2){let e,r=c(2);o(5),u((e=r.status.state().data)?5:-1,e)}}function he(t,n){t&1&&(i(0,"div",17)(1,"p"),l(2,"Loading\u2026"),a()())}function ve(t,n){if(t&1&&(i(0,"div",17)(1,"h3"),l(2,"Couldn't load that symbol"),a(),i(3,"p"),l(4),a()()),t&2){let e=c(2);o(4),m(e.nodeDetail.state().error)}}function fe(t,n){if(t&1&&(i(0,"div",17)(1,"p"),l(2),a()()),t&2){let e=c(2);o(2),z('No match for "',e.selectedSymbol(),'".')}}function Ce(t,n){if(t&1&&(i(0,"div",32),p(1,"span",42),i(2,"span",43),l(3),a()()),t&2){let e=n.$implicit;o(),T("data-kind",e),o(2),m(e)}}function be(t,n){if(t&1){let e=y();i(0,"app-graph-canvas",29),b("nodeClick",function(d){h(e);let s=c(2);return v(s.pickFromCanvas(d))}),a(),i(1,"div",30)(2,"div",31),k(3,Ce,4,2,"div",32,G),a(),p(5,"div",33),i(6,"div",34)(7,"div",35),f(),i(8,"svg",36),p(9,"line",37),a(),C(),i(10,"span",38),l(11,"implements"),a()(),i(12,"div",35),f(),i(13,"svg",36),p(14,"line",39),a(),C(),i(15,"span",38),l(16,"tests"),a()(),i(17,"div",35),f(),i(18,"svg",36),p(19,"line",40),a(),C(),i(20,"span",38),l(21,"calls"),a()(),i(22,"div",35),f(),i(23,"svg",36),p(24,"line",41),a(),C(),i(25,"span",38),l(26,"synth"),a()()()()}if(t&2){let e=c(2);x("nodes",e.visibleNodes())("edges",e.visibleEdges())("selectedId",e.selectedDetail().id)("fitKey",e.fitKey())("hiddenIds",e.hiddenIds()),o(3),S(e.kindKeys)}}function ye(t,n){if(t&1&&(i(0,"span",50),l(1),a()),t&2){let e=c();o(),m(e.startLine?"L"+e.startLine:"")}}function ke(t,n){if(t&1&&(i(0,"div",58)(1,"div",60),l(2,"Signature"),a(),i(3,"pre",61),l(4),a()()),t&2){let e=c();o(4),m(e.signature)}}function Se(t,n){if(t&1&&(i(0,"div",58)(1,"div",60),l(2,"Docstring"),a(),i(3,"p",62),l(4),a()()),t&2){let e=c();o(4),m(e.docstring)}}function we(t,n){if(t&1&&(i(0,"span",67),l(1),a()),t&2){let e=c().$implicit;o(),m(e.specTitle)}}function Me(t,n){if(t&1&&(i(0,"div",64),p(1,"app-state-pill",65),i(2,"span",66),l(3),a(),g(4,we,2,1,"span",67),a()),t&2){let e=n.$implicit;o(),x("state",e.state),o(2),m(e.specId),o(),u(e.specTitle?4:-1)}}function Ee(t,n){if(t&1&&(i(0,"div",58)(1,"div",60),l(2,"Linked specs "),i(3,"span",63),l(4),a()(),k(5,Me,5,3,"div",64,L),a()),t&2){let e=c();o(4),m(e.linkedSpecs.length),o(),S(e.linkedSpecs)}}function Pe(t,n){if(t&1){let e=y();i(0,"button",70),b("click",function(){let d=h(e).$implicit,s=c(5);return v(s.pickResult(d))}),p(1,"app-icon",71),i(2,"span",66),l(3),a(),i(4,"span",72),l(5),a()()}if(t&2){let e=n.$implicit,r=c(5);o(),x("size",12),o(2),m(e.name),o(2),m(r.fileName(e.filePath))}}function Oe(t,n){if(t&1&&k(0,Pe,6,3,"button",69,L),t&2){let e=c(2);S(e.callers)}}function Te(t,n){t&1&&(i(0,"div",68),l(1,"No callers"),a())}function Ge(t,n){if(t&1){let e=y();i(0,"button",70),b("click",function(){let d=h(e).$implicit,s=c(5);return v(s.pickResult(d))}),p(1,"app-icon",71),i(2,"span",66),l(3),a(),i(4,"span",72),l(5),a()()}if(t&2){let e=n.$implicit,r=c(5);o(),x("size",12),o(2),m(e.name),o(2),m(r.fileName(e.filePath))}}function Ie(t,n){if(t&1&&k(0,Ge,6,3,"button",69,L),t&2){let e=c(2);S(e.callees)}}function ze(t,n){t&1&&(i(0,"div",68),l(1,"No callees"),a())}function Ke(t,n){if(t&1&&(i(0,"div",58)(1,"div",60),l(2,"Callers "),i(3,"span",63),l(4),a()(),g(5,Oe,2,0)(6,Te,2,0,"div",68),a(),i(7,"div",58)(8,"div",60),l(9,"Callees "),i(10,"span",63),l(11),a()(),g(12,Ie,2,0)(13,ze,2,0,"div",68),a()),t&2){let e=c();o(4),m(e.callers.length),o(),u(e.callers.length?5:6),o(6),m(e.callees.length),o(),u(e.callees.length?12:13)}}function De(t,n){if(t&1){let e=y();i(0,"button",73),p(1,"app-icon",74),l(2," Implement "),a(),i(3,"button",14),b("click",function(){h(e);let d=c(3);return v(d.navigateToDrift())}),l(4,"Fix"),a(),i(5,"button",75),l(6,"Relink"),a()}t&2&&(o(),x("size",13))}function Ve(t,n){if(t&1){let e=y();i(0,"button",73),p(1,"app-icon",76),l(2," Reveal in editor "),a(),i(3,"button",14),b("click",function(){h(e);let d=c(3);return v(d.navigateToSpecs())}),l(4,"Open Specs"),a()}t&2&&(o(),x("size",13))}function Ne(t,n){if(t&1){let e=y();i(0,"div",44)(1,"div",45),p(2,"span",46),i(3,"div",47)(4,"div",48),l(5),a(),i(6,"div",49)(7,"span",50),l(8),a(),g(9,ye,2,1,"span",50),a()(),i(10,"button",51),b("click",function(){h(e);let d=c(2);return v(d.clearSelection())}),p(11,"app-icon",52),a()(),i(12,"div",53),p(13,"app-icon",54),i(14,"span",55),l(15),a(),p(16,"app-copy-btn",56),a()(),i(17,"div",57),g(18,ke,5,1,"div",58),g(19,Se,5,1,"div",58),g(20,Ee,7,1,"div",58),g(21,Ke,14,4),a(),i(22,"div",59),g(23,De,7,1)(24,Ve,5,1),a()}if(t&2){let e=n,r=e.kind==="spec",d=c(2).detailColor(e);o(2),I("background",d)("box-shadow","0 0 8px "+d),R("is-rect",r),o(3),m(e.name),o(2),I("color",d)("background","color-mix(in srgb, "+d+" 14%, transparent)"),o(),m(e.kind),o(),u(e.signature?9:-1),o(2),x("size",14),o(2),x("size",12),o(2),m(e.filePath),o(),x("text",e.filePath),o(2),u(e.signature?18:-1),o(),u(e.docstring?19:-1),o(),u(e.linkedSpecs&&e.linkedSpecs.length?20:-1),o(),u(r?-1:21),o(2),u(r?23:24)}}function Re(t,n){t&1&&(i(0,"span",81),l(1),a()),t&2&&(o(),z("",n.nodeCount.toLocaleString()," shown"))}function Le(t,n){if(t&1&&(i(0,"div",84),p(1,"span",86),i(2,"span",87),l(3),a(),i(4,"span",88),l(5),a()()),t&2){let e=n.$implicit,r=c(3);o(),T("data-kind",e),o(2),m(e),o(2),m(r.overviewKindCounts()[e])}}function Fe(t,n){t&1&&(i(0,"div",85),p(1,"app-state-pill",89)(2,"span",90)(3,"app-state-pill",91)(4,"span",90)(5,"app-state-pill",92)(6,"span",90),a())}function He(t,n){if(t&1&&(i(0,"div",85),p(1,"app-state-pill",89),i(2,"span",93),l(3),a(),p(4,"app-state-pill",91),i(5,"span",93),l(6),a(),p(7,"app-state-pill",92),i(8,"span",93),l(9),a()()),t&2){let e,r,d,s=c(3);o(3),m(((e=s.health.state().data)==null||e.linkHealth==null?null:e.linkHealth.verified)??0),o(3),m(((r=s.health.state().data)==null||r.linkHealth==null?null:r.linkHealth.drifted)??0),o(3),m((((d=s.health.state().data)==null||d.linkHealth==null?null:d.linkHealth.broken)??0)+(((d=s.health.state().data)==null||d.linkHealth==null?null:d.linkHealth.orphaned)??0))}}function $e(t,n){t&1&&(i(0,"div",94),f(),i(1,"svg",95),p(2,"line",96),a(),C(),p(3,"span",97),a(),i(4,"div",94),f(),i(5,"svg",95),p(6,"line",98),a(),C(),p(7,"span",97),a(),i(8,"div",94),f(),i(9,"svg",95),p(10,"line",99),a(),C(),p(11,"span",97),a(),i(12,"div",94),f(),i(13,"svg",95),p(14,"line",100),a(),C(),p(15,"span",97),a())}function je(t,n){if(t&1&&(i(0,"div",94),f(),i(1,"svg",95),p(2,"line",96),a(),C(),i(3,"span",101),l(4,"calls"),a(),i(5,"span",102),l(6),a()(),i(7,"div",94),f(),i(8,"svg",95),p(9,"line",98),a(),C(),i(10,"span",101),l(11,"implements / documents"),a(),i(12,"span",102),l(13),a()(),i(14,"div",94),f(),i(15,"svg",95),p(16,"line",99),a(),C(),i(17,"span",101),l(18,"tests"),a(),i(19,"span",102),l(20),a()(),i(21,"div",94),f(),i(22,"svg",95),p(23,"line",100),a(),C(),i(24,"span",101),l(25,"synthesized (heuristic)"),a(),i(26,"span",102),l(27),a()()),t&2){let e,r,d,s,M=c(3);o(6),m(((e=M.health.state().data)==null||e.edgeKinds==null?null:e.edgeKinds.calls)??0),o(7),m(((r=M.health.state().data)==null||r.edgeKinds==null?null:r.edgeKinds.implements)??0),o(7),m(((d=M.health.state().data)==null||d.edgeKinds==null?null:d.edgeKinds.tests)??0),o(7),m(((s=M.health.state().data)==null||s.edgeKinds==null?null:s.edgeKinds.synth)??0)}}function Be(t,n){t&1&&(i(0,"div",103),p(1,"span",104)(2,"span",105),a())}function Qe(t,n){t&1&&(i(0,"div",83)(1,"div",60),l(2,"Most connected"),a(),k(3,Be,3,0,"div",103,G),a()),t&2&&(o(3),S(X(0,de)))}function Ae(t,n){if(t&1){let e=y();i(0,"button",107),b("click",function(){let d=h(e).$implicit,s=c(4);return v(s.pickHub(d))}),p(1,"span",108),i(2,"span",109),l(3),a(),i(4,"span",110),l(5),a(),p(6,"app-icon",111),a()}if(t&2){let e=n.$implicit,r=c(4);T("aria-label",e.name+", "+e.degree+" edges"),o(),I("background",r.nodeColor(e.kind))("border-radius",e.kind==="spec"?"2px":"50%"),o(2),m(e.name),o(2),z("",e.degree," edges"),o(),x("size",11)}}function Ue(t,n){if(t&1&&(i(0,"div",83)(1,"div",60),l(2,"Most connected"),a(),k(3,Ae,7,8,"button",106,L),a()),t&2){let e=c(3);o(3),S(e.health.state().data.hubs.slice(0,8))}}function qe(t,n){if(t&1&&(i(0,"div",77),p(1,"app-icon",78),i(2,"span",79),l(3,"Graph overview"),a(),p(4,"div",80),g(5,Re,2,1,"span",81),a(),i(6,"div",57)(7,"p",82),l(8," Click any node to inspect its signature, links, callers and callees \u2014 without leaving this view. "),a(),i(9,"div",83)(10,"div",60),l(11,"Nodes by kind"),a(),k(12,Le,6,3,"div",84,G),a(),i(14,"div",83)(15,"div",60),l(16,"Spec link health"),a(),g(17,Fe,7,0,"div",85)(18,He,10,3,"div",85),a(),i(19,"div",83)(20,"div",60),l(21,"Edge types"),a(),g(22,$e,16,0)(23,je,28,4),a(),g(24,Qe,5,1,"div",83)(25,Ue,5,0,"div",83),a()),t&2){let e,r,d,s=c(2);o(),x("size",15),o(4),u((e=s.status.state().data)?5:-1,e),o(7),S(s.kindKeys),o(5),u(s.health.state().loading?17:18),o(5),u(s.health.state().loading?22:(r=s.health.state().data)!=null&&r.edgeKinds?23:-1),o(2),u(s.health.state().loading?24:!((d=s.health.state().data)==null||d.hubs==null)&&d.hubs.length?25:-1)}}function We(t,n){if(t&1){let e=y();i(0,"div",1)(1,"div",2)(2,"div",3)(3,"app-segmented",4),b("change",function(d){h(e);let s=c();return v(s.onLayoutChange(d))}),a(),p(4,"div",5),k(5,ce,5,7,"button",6,G),p(7,"div",7),i(8,"div",8)(9,"div",9),p(10,"app-icon",10),i(11,"input",11),b("input",function(d){h(e);let s=c();return v(s.onSearchInput(d.target.value))}),a(),g(12,me,1,0,"span",12),a(),g(13,ue,3,0,"div",13),a(),i(14,"button",14),b("click",function(){h(e);let d=c();return v(d.recenter())}),p(15,"app-icon",15),l(16," Recenter "),a()(),i(17,"div",16),g(18,xe,6,1,"div",17)(19,he,3,0,"div",17)(20,ve,5,1,"div",17)(21,fe,3,1,"div",17)(22,be,27,5),a()(),i(23,"aside",18),g(24,Ne,25,22)(25,qe,26,5),a()()}if(t&2){let e,r=c();o(3),x("options",r.layoutOptions)("value",r.layoutMode()),o(2),S(r.kindKeys),o(5),x("size",13),o(),x("value",r.searchInput()),o(),u(r.searchResults.state().loading?12:-1),o(),u(r.searchResults.state().data&&r.searchResults.state().data.results.length>0?13:-1),o(2),x("size",13),o(3),u(r.selectedSymbol()?r.nodeDetail.state().loading?19:r.nodeDetail.state().error?20:r.selectedDetail()?22:21:18),o(6),u((e=r.selectedDetail())?24:25,e)}}var re=class t{api=N(Y);projects=N(Z);router=N(J);status=K(this.api,()=>`/api/status${this.projects.projectQuery()}`);health=K(this.api,()=>`/api/graph/health${this.projects.projectQuery()}`);layoutMode=P("hierarchical");layoutOptions=[{value:"hierarchical",label:"Hierarchical"},{value:"force",label:"Force"},{value:"anchored",label:"Anchored"}];searchInput=P("");searchQuery=P("");searchDebounce=null;searchResults=K(this.api,()=>{let n=this.searchQuery().trim();return n.length>=2?`/api/graph/search?q=${encodeURIComponent(n)}&limit=12${this.projects.projectQuery("&")}`:null});selectedSymbol=P(null);nodeDetail=K(this.api,()=>{let n=this.selectedSymbol();return n?`/api/graph/node?symbol=${encodeURIComponent(n)}${this.projects.projectQuery("&")}`:null});selectedDetail=w(()=>this.nodeDetail.state().data?.matches?.[0]??null);filters=P({code:!0,spec:!0,route:!0,test:!0});fitKey=P(0);canvasData=w(()=>{let n=this.selectedDetail();if(!n)return{nodes:[],edges:[]};let e=this.filters(),r=_=>{let E=F(_);return e[E]},d={id:n.id,label:n.name,sub:H(n.filePath),kind:n.kind,x:0,y:0},s=(n.callers??[]).filter(_=>r(_.kind)),M=(n.callees??[]).filter(_=>r(_.kind)),$=(n.linkedSpecs??[]).filter(()=>e.spec),j=280,B=56,D=[d],V=[];return s.forEach((_,E)=>{let O=(E-(s.length-1)/2)*B;D.push(le(_,-j,O)),V.push({from:_.id,to:n.id,kind:"calls"})}),M.forEach((_,E)=>{let O=(E-(M.length-1)/2)*B;D.push(le(_,j,O)),V.push({from:n.id,to:_.id,kind:"calls"})}),$.forEach((_,E)=>{let O=(E-($.length-1)/2)*220,Q="spec:"+_.specId;D.push({id:Q,label:_.specId,sub:_.specTitle??void 0,kind:"spec",state:_.state,x:O,y:-160}),V.push({from:Q,to:n.id,kind:"implements"})}),{nodes:D,edges:V}});visibleNodes=w(()=>this.canvasData().nodes);visibleEdges=w(()=>this.canvasData().edges);hiddenIds=w(()=>{let n=this.filters(),e=new Set;for(let r of this.canvasData().nodes)n[F(r.kind)]||e.add(r.id);return e});kindCounts=w(()=>{let n={code:0,spec:0,route:0,test:0};for(let e of this.canvasData().nodes)n[F(e.kind)]++;return n});overviewKindCounts=w(()=>{let n=this.status.state().data;if(!n?.nodesByKind)return{code:0,spec:0,route:0,test:0};let e=n.nodesByKind;return{code:(e.function??0)+(e.method??0)+(e.class??0)+(e.variable??0)+(e.constant??0)+(e.type_alias??0)+(e.interface??0)+(e.struct??0)+(e.enum??0)+(e.property??0)+(e.field??0)+(e.file??0)+(e.module??0)+(e.namespace??0)+(e.component??0),spec:e.spec??0,route:e.route??0,test:e.test??0}});kindKeys=["code","spec","route","test"];isFilterActive(n){return this.filters()[n]}countFor(n){return this.kindCounts()[n]}chipColor(n){switch(n){case"spec":return"var(--node-spec)";case"route":return"var(--node-route)";case"test":return"var(--node-test)";default:return"var(--node-code)"}}onSearchInput(n){this.searchInput.set(n),this.searchDebounce&&clearTimeout(this.searchDebounce),this.searchDebounce=setTimeout(()=>this.searchQuery.set(n),180)}pickResult(n){this.searchInput.set(n.name),this.searchQuery.set(""),this.selectedSymbol.set(n.name)}pickFromCanvas(n){let e=this.selectedDetail();if(!e||n===e.id)return;let d=[...e.callers??[],...e.callees??[]].find(s=>s.id===n);d&&(this.selectedSymbol.set(d.name),this.fitKey.update(s=>s+1))}toggleFilter(n){this.filters.update(e=>U(A({},e),{[n]:!e[n]})),this.fitKey.update(e=>e+1)}recenter(){this.fitKey.update(n=>n+1)}clearSelection(){this.selectedSymbol.set(null),this.searchInput.set("")}onLayoutChange(n){this.layoutMode.set(n),this.fitKey.update(e=>e+1)}shortPath(n){return H(n)}fileName(n){return n?n.split("/").pop()??"":""}kindLabel(n){return n.charAt(0).toUpperCase()+n.slice(1)}navigateToSpecs(){this.router.navigate(["/specs"])}navigateToDrift(){this.router.navigate(["/drift"])}nodeColor(n){return n==="spec"?"var(--node-spec)":n==="route"?"var(--node-route)":n==="test"?"var(--node-test)":"var(--node-code)"}pickHub(n){this.selectedSymbol.set(n.name),this.fitKey.update(e=>e+1)}detailColor(n){if(n.kind==="spec"){let e=n.linkedSpecs??[],r=e.some(s=>s.state==="broken"||s.state==="orphaned"),d=!r&&e.some(s=>s.state==="drifted");return r?"var(--error)":d?"var(--warn)":"var(--node-spec)"}return n.kind==="test"?"var(--node-test)":n.kind==="route"?"var(--node-route)":"var(--node-code)"}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=q({type:t,selectors:[["app-graph"]],decls:2,vars:1,consts:[["surface","The graph"],[1,"gp-root"],[1,"gp-main"],[1,"gp-toolbar"],["size","sm",3,"change","options","value"],[1,"gp-divider"],["type","button",1,"gp-chip",3,"is-active","--chip-color"],[1,"gp-spacer"],[1,"gp-search"],[1,"gp-search-inner"],["name","search",1,"gp-search-icon",3,"size"],["type","text","placeholder","Fuzzy symbol search\u2026","aria-label","Symbol search",3,"input","value"],["aria-hidden","true",1,"gp-spinner"],["role","listbox",1,"gp-results"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["name","recenter",3,"size"],[1,"gp-canvas-wrap"],[1,"gp-empty"],[1,"gp-panel"],["type","button",1,"gp-chip",3,"click"],[1,"gp-chip-dot"],[1,"gp-chip-count"],["type","button",1,"gp-result"],["type","button",1,"gp-result",3,"click"],[1,"gp-result-dot"],[1,"gp-result-name","mono"],[1,"gp-result-kind"],[1,"gp-result-path","mono"],[1,"gp-stats"],[3,"nodeClick","nodes","edges","selectedId","fitKey","hiddenIds"],[1,"gp-legend"],[1,"gp-legend-kinds"],[1,"gp-legend-item"],[1,"gp-legend-sep"],[1,"gp-legend-edges"],[1,"gp-legend-edge-row"],["width","16","height","8"],["x1","0","y1","4","x2","16","y2","4","stroke","var(--node-spec)","stroke-width","1.6"],[1,"secondary"],["x1","0","y1","4","x2","16","y2","4","stroke","var(--node-test)","stroke-width","1.6"],["x1","0","y1","4","x2","16","y2","4","stroke","var(--text-muted)","stroke-width","1.6"],["x1","0","y1","4","x2","16","y2","4","stroke","var(--text-muted)","stroke-width","1.6","stroke-dasharray","4 3"],[1,"gp-legend-dot"],[1,"secondary",2,"text-transform","capitalize"],[1,"gp-panel-header"],[1,"gp-panel-header-inner"],[1,"gp-node-dot"],[1,"grow",2,"min-width","0"],[1,"mono","gp-panel-name"],[1,"row","gap-6",2,"margin-top","3px"],[1,"pill"],["type","button","aria-label","Close panel",1,"btn","btn-ghost","btn-xs",3,"click"],["name","x",3,"size"],[1,"gp-panel-path","row","gap-6"],["name","folder",2,"color","var(--text-muted)","flex-shrink","0",3,"size"],[1,"mono","secondary","gp-path-text"],[3,"text"],[1,"gp-panel-body","scroll-y"],[1,"gp-section"],[1,"gp-panel-footer"],[1,"eyebrow","gp-eyebrow"],[1,"gp-code","mono"],[1,"secondary",2,"font-size","12px","line-height","1.6","margin","0"],[1,"muted",2,"font-weight","400","margin-left","5px"],[1,"gp-link-row"],[3,"state"],[1,"mono","grow","gp-link-text"],[1,"muted",2,"font-size","10px","flex-shrink","0","overflow","hidden","text-overflow","ellipsis","white-space","nowrap","max-width","120px"],[1,"muted",2,"font-size","12px","padding","4px 8px"],["type","button",1,"gp-node-link"],["type","button",1,"gp-node-link",3,"click"],["name","box",2,"color","var(--node-code)","flex-shrink","0",3,"size"],[1,"mono","muted","gp-link-file"],["type","button",1,"btn","btn-primary","btn-sm","grow",2,"justify-content","center"],["name","play",3,"size"],["type","button",1,"btn","btn-secondary","btn-sm"],["name","reveal",3,"size"],[1,"gp-panel-header","gp-overview-head"],["name","graph",2,"color","var(--accent)",3,"size"],[2,"font-weight","600","font-size","13.5px"],[1,"grow"],[1,"mono","muted",2,"font-size","11px"],[1,"secondary",2,"font-size","12px","line-height","1.55","margin","0 0 18px"],[1,"gp-section-plain"],[1,"gp-kind-row"],[1,"row","gap-6",2,"flex-wrap","wrap","align-items","center"],[1,"gp-kind-dot"],[1,"grow",2,"font-size","12.5px","text-transform","capitalize"],[1,"mono","tabular",2,"font-size","12.5px","font-weight","600"],["state","verified"],["aria-hidden","true",1,"gp-skel","gp-skel-sm"],["state","drifted"],["state","broken"],[1,"mono","tabular","muted",2,"font-size","11px","align-self","center"],[1,"gp-edge-row"],["width","20","height","8"],["x1","0","y1","4","x2","20","y2","4","stroke","var(--text-muted)","stroke-width","1.8"],["aria-hidden","true",1,"gp-skel","gp-skel-lg"],["x1","0","y1","4","x2","20","y2","4","stroke","var(--node-spec)","stroke-width","1.8"],["x1","0","y1","4","x2","20","y2","4","stroke","var(--node-test)","stroke-width","1.8"],["x1","0","y1","4","x2","20","y2","4","stroke","var(--text-muted)","stroke-width","1.8","stroke-dasharray","4 3"],[1,"grow","secondary",2,"font-size","12px"],[1,"mono","tabular","muted",2,"font-size","11px"],["aria-hidden","true",1,"gp-hub-row"],[1,"gp-hub-dot","gp-skel-dot"],["aria-hidden","true",1,"gp-skel","gp-skel-hub"],["type","button",1,"gp-hub-row"],["type","button",1,"gp-hub-row",3,"click"],[1,"gp-hub-dot"],[1,"mono","grow","gp-hub-name"],[1,"muted","gp-hub-degree"],["name","chevron-right",2,"color","var(--text-muted)","flex-shrink","0",3,"size"]],template:function(e,r){e&1&&g(0,se,1,0,"app-pick-project-empty",0)(1,We,26,9,"div",1),e&2&&u(r.status.state().noProject?0:1)},dependencies:[ne,ie,ee,te,ae,oe],styles:["[_nghost-%COMP%]{display:contents}.gp-root[_ngcontent-%COMP%]{flex:1;display:flex;min-height:0;min-width:0}.gp-main[_ngcontent-%COMP%]{flex:1;min-width:0;display:flex;flex-direction:column}.gp-toolbar[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;padding:9px 14px;border-bottom:1px solid var(--border-subtle);background:var(--bg-panel-2, var(--bg-panel));flex-wrap:wrap;flex-shrink:0}.gp-divider[_ngcontent-%COMP%]{width:1px;height:20px;background:var(--border-subtle);flex-shrink:0}.gp-chip[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;height:26px;padding:0 10px;border-radius:999px;font-size:11.5px;font-weight:500;cursor:pointer;border:1px solid var(--border-subtle);background:var(--bg-panel);color:var(--text-secondary);transition:all .1s}.gp-chip.is-active[_ngcontent-%COMP%]{border-color:transparent;background:color-mix(in srgb,var(--chip-color, var(--accent)) 22%,var(--bg-panel));color:var(--chip-color, var(--accent))}.gp-chip-dot[_ngcontent-%COMP%]{width:7px;height:7px;border-radius:50%}.gp-chip-dot[data-kind=code][_ngcontent-%COMP%]{background:var(--node-code)}.gp-chip-dot[data-kind=spec][_ngcontent-%COMP%]{background:var(--node-spec);border-radius:2px}.gp-chip-dot[data-kind=route][_ngcontent-%COMP%]{background:var(--node-route)}.gp-chip-dot[data-kind=test][_ngcontent-%COMP%]{background:var(--node-test)}.gp-chip-count[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-muted);font-variant-numeric:tabular-nums}.gp-spacer[_ngcontent-%COMP%]{flex:1}.gp-search[_ngcontent-%COMP%]{position:relative;flex-shrink:0}.gp-search-inner[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;height:28px;padding:0 10px;background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:7px;width:220px}.gp-search-inner[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{flex:1;background:transparent;border:none;outline:none;color:var(--text-primary);font-size:12px;font-family:var(--font-mono)}.gp-search-icon[_ngcontent-%COMP%]{color:var(--text-muted);flex-shrink:0}.gp-spinner[_ngcontent-%COMP%]{width:12px;height:12px;border:2px solid var(--border-subtle);border-top-color:var(--accent);border-radius:50%;animation:_ngcontent-%COMP%_gp-spin .7s linear infinite;flex-shrink:0}@keyframes _ngcontent-%COMP%_gp-spin{to{transform:rotate(360deg)}}.gp-results[_ngcontent-%COMP%]{position:absolute;top:32px;left:0;right:0;background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:8px;box-shadow:var(--shadow-pop, 0 12px 28px rgba(0, 0, 0, .5));padding:5px;z-index:30;max-height:320px;overflow-y:auto}.gp-result[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;width:100%;padding:6px 8px;border-radius:5px;background:transparent;border:none;cursor:pointer;font:inherit;color:var(--text-primary);text-align:left}.gp-result[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.gp-result-dot[_ngcontent-%COMP%]{width:7px;height:7px;border-radius:50%;background:var(--node-code);flex-shrink:0}.gp-result-dot.is-spec[_ngcontent-%COMP%]{background:var(--node-spec);border-radius:2px}.gp-result-dot.is-route[_ngcontent-%COMP%]{background:var(--node-route)}.gp-result-dot.is-test[_ngcontent-%COMP%]{background:var(--node-test)}.gp-result-name[_ngcontent-%COMP%]{font-size:12px;flex-shrink:0}.gp-result-kind[_ngcontent-%COMP%]{font-size:10px;text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted)}.gp-result-path[_ngcontent-%COMP%]{flex:1;text-align:right;font-size:10px;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gp-canvas-wrap[_ngcontent-%COMP%]{flex:1;min-height:0;position:relative;display:flex}.gp-canvas-wrap[_ngcontent-%COMP%] app-graph-canvas[_ngcontent-%COMP%]{flex:1;min-height:0}.gp-empty[_ngcontent-%COMP%]{flex:1;display:grid;place-items:center;text-align:center;padding:60px 24px;background:var(--bg-canvas-2, var(--bg-canvas))}.gp-empty[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{font-size:18px;font-weight:600;margin:0 0 8px}.gp-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--text-secondary);font-size:13.5px;line-height:1.6;margin:0;max-width:520px}.gp-stats[_ngcontent-%COMP%]{margin-top:18px!important;font-family:var(--font-mono);font-size:11.5px!important;color:var(--text-muted)!important}.gp-legend[_ngcontent-%COMP%]{position:absolute;top:14px;left:14px;display:flex;align-items:center;gap:12px;flex-wrap:wrap;max-width:70%;background:color-mix(in srgb,var(--bg-panel) 86%,transparent);border:1px solid var(--border-subtle);border-radius:8px;padding:6px 10px;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);font-size:11px;pointer-events:none;z-index:3}.gp-legend-kinds[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px}.gp-legend-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.gp-legend-dot[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:50%;flex-shrink:0}.gp-legend-dot[data-kind=code][_ngcontent-%COMP%]{background:var(--node-code)}.gp-legend-dot[data-kind=spec][_ngcontent-%COMP%]{background:var(--node-spec);border-radius:2px}.gp-legend-dot[data-kind=route][_ngcontent-%COMP%]{background:var(--node-route)}.gp-legend-dot[data-kind=test][_ngcontent-%COMP%]{background:var(--node-test)}.gp-legend-sep[_ngcontent-%COMP%]{width:1px;height:16px;background:var(--border-subtle);flex-shrink:0}.gp-legend-edges[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px}.gp-legend-edge-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.gp-panel[_ngcontent-%COMP%]{width:360px;flex-shrink:0;border-left:1px solid var(--border-subtle);background:var(--bg-panel);display:flex;flex-direction:column;overflow:hidden}.gp-panel-header[_ngcontent-%COMP%]{padding:12px 14px;border-bottom:1px solid var(--border-subtle);flex-shrink:0}.gp-panel-header-inner[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:8px}.gp-overview-head[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.gp-node-dot[_ngcontent-%COMP%]{width:9px;height:9px;border-radius:50%;flex-shrink:0;margin-top:5px}.gp-node-dot.is-rect[_ngcontent-%COMP%]{border-radius:2px}.gp-panel-name[_ngcontent-%COMP%]{font-size:14px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gp-panel-path[_ngcontent-%COMP%]{margin-top:8px;font-size:11.5px;color:var(--text-secondary)}.gp-path-text[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.gp-panel-body[_ngcontent-%COMP%]{flex:1;padding:14px;overflow-y:auto;display:flex;flex-direction:column;gap:18px}.gp-section[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:4px}.gp-section-plain[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2px}.gp-eyebrow[_ngcontent-%COMP%]{font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);margin-bottom:6px}.gp-code[_ngcontent-%COMP%]{margin:0;font-size:11.5px;line-height:1.6;color:var(--text-secondary);background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:7px;padding:10px;overflow-x:auto;white-space:pre-wrap;word-break:break-word}.gp-link-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;border:1px solid var(--border-subtle);margin-bottom:5px;font-size:11.5px}.gp-link-text[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px}.gp-node-link[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;width:100%;padding:5px 8px;border-radius:6px;border:none;background:transparent;cursor:pointer;font:inherit;color:inherit;text-align:left;font-size:12px}.gp-node-link[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.gp-link-file[_ngcontent-%COMP%]{font-size:10px;flex-shrink:0}.gp-edge-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:4px 0}.gp-kind-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:5px 0}.gp-kind-dot[_ngcontent-%COMP%]{width:9px;height:9px;border-radius:50%;flex-shrink:0}.gp-kind-dot[data-kind=code][_ngcontent-%COMP%]{background:var(--node-code);box-shadow:0 0 6px var(--node-code)}.gp-kind-dot[data-kind=spec][_ngcontent-%COMP%]{background:var(--node-spec);border-radius:2px;box-shadow:0 0 6px var(--node-spec)}.gp-kind-dot[data-kind=route][_ngcontent-%COMP%]{background:var(--node-route);box-shadow:0 0 6px var(--node-route)}.gp-kind-dot[data-kind=test][_ngcontent-%COMP%]{background:var(--node-test);box-shadow:0 0 6px var(--node-test)}.gp-panel-footer[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:12px 14px;border-top:1px solid var(--border-subtle);flex-shrink:0}.gp-hub-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;width:100%;padding:5px 8px;border-radius:6px;border:none;background:transparent;cursor:pointer;font:inherit;color:inherit;text-align:left}.gp-hub-row[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.gp-hub-dot[_ngcontent-%COMP%]{width:8px;height:8px;flex-shrink:0}.gp-hub-name[_ngcontent-%COMP%]{font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gp-hub-degree[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-muted);flex-shrink:0;font-variant-numeric:tabular-nums}@keyframes _ngcontent-%COMP%_gp-skel-pulse{0%,to{opacity:.35}50%{opacity:.7}}.gp-skel[_ngcontent-%COMP%]{display:inline-block;background:var(--border-subtle);border-radius:4px;animation:_ngcontent-%COMP%_gp-skel-pulse 1.4s ease-in-out infinite}.gp-skel-sm[_ngcontent-%COMP%]{width:24px;height:12px}.gp-skel-lg[_ngcontent-%COMP%]{width:80px;height:12px;flex:1}.gp-skel-hub[_ngcontent-%COMP%]{width:120px;height:12px;flex:1}.gp-skel-dot[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:50%;flex-shrink:0;background:var(--border-subtle);animation:_ngcontent-%COMP%_gp-skel-pulse 1.4s ease-in-out infinite}.grow[_ngcontent-%COMP%]{flex:1}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono)}"],changeDetection:0})};function le(t,n,e){return{id:t.id,label:t.name,sub:H(t.filePath),kind:t.kind,x:n,y:e}}function H(t){return t?t.split("/").slice(-2).join("/"):""}function F(t){return t==="spec"?"spec":t==="route"?"route":t==="test"?"test":"code"}export{re as Graph};
1
+ import{a as oe}from"./chunk-R5W2MDZN.js";import{b as ae}from"./chunk-HZA6NEAB.js";import{a as ie}from"./chunk-WDU3WICG.js";import{a as ne}from"./chunk-2GBEK2GM.js";import{a as te}from"./chunk-SUZYBYDW.js";import{c as J}from"./chunk-SHPTC4RL.js";import{c as K}from"./chunk-GR72OOCN.js";import{a as Z}from"./chunk-7RNS77UP.js";import{a as Y}from"./chunk-E44X4RH2.js";import{Aa as p,Ga as y,I as N,Ia as b,Ka as c,M as h,N as v,O as f,P as C,Ta as I,Ua as R,Va as l,W as P,Wa as m,Xa as z,Za as W,bb as X,ea as o,ka as q,lb as w,qa as T,ra as g,sa as u,ua as G,va as k,wa as S,xa as x,ya as i,za as a,zb as ee}from"./chunk-PDN6QYGJ.js";import{a as A,b as U}from"./chunk-Q7L6LLAK.js";var de=()=>[1,2,3,4],pe=(t,n)=>n.node.id,L=(t,n)=>n.id;function se(t,n){t&1&&p(0,"app-pick-project-empty",0)}function ce(t,n){if(t&1){let e=y();i(0,"button",19),b("click",function(){let d=h(e).$implicit,s=c(2);return v(s.toggleFilter(d))}),p(1,"span",20),l(2),i(3,"span",21),l(4),a()()}if(t&2){let e=n.$implicit,r=c(2);I("--chip-color",r.chipColor(e)),R("is-active",r.isFilterActive(e)),o(),T("data-kind",e),o(),z(" ",r.kindLabel(e)," "),o(2),m(r.countFor(e))}}function me(t,n){t&1&&p(0,"span",12)}function ge(t,n){if(t&1){let e=y();i(0,"button",23),b("click",function(){let d=h(e).$implicit,s=c(3);return v(s.pickResult(d.node))}),p(1,"span",24),i(2,"span",25),l(3),a(),i(4,"span",26),l(5),a(),i(6,"span",27),l(7),a()()}if(t&2){let e=n.$implicit,r=c(3);o(),R("is-spec",e.node.kind==="spec")("is-route",e.node.kind==="route")("is-test",e.node.kind==="test"),o(2),m(e.node.name),o(2),m(e.node.kind),o(2),m(r.shortPath(e.node.filePath))}}function ue(t,n){if(t&1&&(i(0,"div",13),k(1,ge,8,9,"button",22,pe),a()),t&2){let e=c(2);o(),S(e.searchResults.state().data.results)}}function _e(t,n){if(t&1&&(i(0,"p",28),l(1),a()),t&2){let e=n;o(),W("",e.nodeCount.toLocaleString()," nodes \xB7 ",e.edgeCount.toLocaleString()," edges \xB7 ",e.fileCount.toLocaleString()," files")}}function xe(t,n){if(t&1&&(i(0,"div",17)(1,"h3"),l(2,"Explore the graph"),a(),i(3,"p"),l(4,"Search for a function, method or class to start. The graph renders the symbol with its callers, callees and any linked specs."),a(),g(5,_e,2,3,"p",28),a()),t&2){let e,r=c(2);o(5),u((e=r.status.state().data)?5:-1,e)}}function he(t,n){t&1&&(i(0,"div",17)(1,"p"),l(2,"Loading\u2026"),a()())}function ve(t,n){if(t&1&&(i(0,"div",17)(1,"h3"),l(2,"Couldn't load that symbol"),a(),i(3,"p"),l(4),a()()),t&2){let e=c(2);o(4),m(e.nodeDetail.state().error)}}function fe(t,n){if(t&1&&(i(0,"div",17)(1,"p"),l(2),a()()),t&2){let e=c(2);o(2),z('No match for "',e.selectedSymbol(),'".')}}function Ce(t,n){if(t&1&&(i(0,"div",32),p(1,"span",42),i(2,"span",43),l(3),a()()),t&2){let e=n.$implicit;o(),T("data-kind",e),o(2),m(e)}}function be(t,n){if(t&1){let e=y();i(0,"app-graph-canvas",29),b("nodeClick",function(d){h(e);let s=c(2);return v(s.pickFromCanvas(d))}),a(),i(1,"div",30)(2,"div",31),k(3,Ce,4,2,"div",32,G),a(),p(5,"div",33),i(6,"div",34)(7,"div",35),f(),i(8,"svg",36),p(9,"line",37),a(),C(),i(10,"span",38),l(11,"implements"),a()(),i(12,"div",35),f(),i(13,"svg",36),p(14,"line",39),a(),C(),i(15,"span",38),l(16,"tests"),a()(),i(17,"div",35),f(),i(18,"svg",36),p(19,"line",40),a(),C(),i(20,"span",38),l(21,"calls"),a()(),i(22,"div",35),f(),i(23,"svg",36),p(24,"line",41),a(),C(),i(25,"span",38),l(26,"synth"),a()()()()}if(t&2){let e=c(2);x("nodes",e.visibleNodes())("edges",e.visibleEdges())("selectedId",e.selectedDetail().id)("fitKey",e.fitKey())("hiddenIds",e.hiddenIds()),o(3),S(e.kindKeys)}}function ye(t,n){if(t&1&&(i(0,"span",50),l(1),a()),t&2){let e=c();o(),m(e.startLine?"L"+e.startLine:"")}}function ke(t,n){if(t&1&&(i(0,"div",58)(1,"div",60),l(2,"Signature"),a(),i(3,"pre",61),l(4),a()()),t&2){let e=c();o(4),m(e.signature)}}function Se(t,n){if(t&1&&(i(0,"div",58)(1,"div",60),l(2,"Docstring"),a(),i(3,"p",62),l(4),a()()),t&2){let e=c();o(4),m(e.docstring)}}function we(t,n){if(t&1&&(i(0,"span",67),l(1),a()),t&2){let e=c().$implicit;o(),m(e.specTitle)}}function Me(t,n){if(t&1&&(i(0,"div",64),p(1,"app-state-pill",65),i(2,"span",66),l(3),a(),g(4,we,2,1,"span",67),a()),t&2){let e=n.$implicit;o(),x("state",e.state),o(2),m(e.specId),o(),u(e.specTitle?4:-1)}}function Ee(t,n){if(t&1&&(i(0,"div",58)(1,"div",60),l(2,"Linked specs "),i(3,"span",63),l(4),a()(),k(5,Me,5,3,"div",64,L),a()),t&2){let e=c();o(4),m(e.linkedSpecs.length),o(),S(e.linkedSpecs)}}function Pe(t,n){if(t&1){let e=y();i(0,"button",70),b("click",function(){let d=h(e).$implicit,s=c(5);return v(s.pickResult(d))}),p(1,"app-icon",71),i(2,"span",66),l(3),a(),i(4,"span",72),l(5),a()()}if(t&2){let e=n.$implicit,r=c(5);o(),x("size",12),o(2),m(e.name),o(2),m(r.fileName(e.filePath))}}function Oe(t,n){if(t&1&&k(0,Pe,6,3,"button",69,L),t&2){let e=c(2);S(e.callers)}}function Te(t,n){t&1&&(i(0,"div",68),l(1,"No callers"),a())}function Ge(t,n){if(t&1){let e=y();i(0,"button",70),b("click",function(){let d=h(e).$implicit,s=c(5);return v(s.pickResult(d))}),p(1,"app-icon",71),i(2,"span",66),l(3),a(),i(4,"span",72),l(5),a()()}if(t&2){let e=n.$implicit,r=c(5);o(),x("size",12),o(2),m(e.name),o(2),m(r.fileName(e.filePath))}}function Ie(t,n){if(t&1&&k(0,Ge,6,3,"button",69,L),t&2){let e=c(2);S(e.callees)}}function ze(t,n){t&1&&(i(0,"div",68),l(1,"No callees"),a())}function Ke(t,n){if(t&1&&(i(0,"div",58)(1,"div",60),l(2,"Callers "),i(3,"span",63),l(4),a()(),g(5,Oe,2,0)(6,Te,2,0,"div",68),a(),i(7,"div",58)(8,"div",60),l(9,"Callees "),i(10,"span",63),l(11),a()(),g(12,Ie,2,0)(13,ze,2,0,"div",68),a()),t&2){let e=c();o(4),m(e.callers.length),o(),u(e.callers.length?5:6),o(6),m(e.callees.length),o(),u(e.callees.length?12:13)}}function De(t,n){if(t&1){let e=y();i(0,"button",73),p(1,"app-icon",74),l(2," Implement "),a(),i(3,"button",14),b("click",function(){h(e);let d=c(3);return v(d.navigateToDrift())}),l(4,"Fix"),a(),i(5,"button",75),l(6,"Relink"),a()}t&2&&(o(),x("size",13))}function Ve(t,n){if(t&1){let e=y();i(0,"button",73),p(1,"app-icon",76),l(2," Reveal in editor "),a(),i(3,"button",14),b("click",function(){h(e);let d=c(3);return v(d.navigateToSpecs())}),l(4,"Open Specs"),a()}t&2&&(o(),x("size",13))}function Ne(t,n){if(t&1){let e=y();i(0,"div",44)(1,"div",45),p(2,"span",46),i(3,"div",47)(4,"div",48),l(5),a(),i(6,"div",49)(7,"span",50),l(8),a(),g(9,ye,2,1,"span",50),a()(),i(10,"button",51),b("click",function(){h(e);let d=c(2);return v(d.clearSelection())}),p(11,"app-icon",52),a()(),i(12,"div",53),p(13,"app-icon",54),i(14,"span",55),l(15),a(),p(16,"app-copy-btn",56),a()(),i(17,"div",57),g(18,ke,5,1,"div",58),g(19,Se,5,1,"div",58),g(20,Ee,7,1,"div",58),g(21,Ke,14,4),a(),i(22,"div",59),g(23,De,7,1)(24,Ve,5,1),a()}if(t&2){let e=n,r=e.kind==="spec",d=c(2).detailColor(e);o(2),I("background",d)("box-shadow","0 0 8px "+d),R("is-rect",r),o(3),m(e.name),o(2),I("color",d)("background","color-mix(in srgb, "+d+" 14%, transparent)"),o(),m(e.kind),o(),u(e.signature?9:-1),o(2),x("size",14),o(2),x("size",12),o(2),m(e.filePath),o(),x("text",e.filePath),o(2),u(e.signature?18:-1),o(),u(e.docstring?19:-1),o(),u(e.linkedSpecs&&e.linkedSpecs.length?20:-1),o(),u(r?-1:21),o(2),u(r?23:24)}}function Re(t,n){t&1&&(i(0,"span",81),l(1),a()),t&2&&(o(),z("",n.nodeCount.toLocaleString()," shown"))}function Le(t,n){if(t&1&&(i(0,"div",84),p(1,"span",86),i(2,"span",87),l(3),a(),i(4,"span",88),l(5),a()()),t&2){let e=n.$implicit,r=c(3);o(),T("data-kind",e),o(2),m(e),o(2),m(r.overviewKindCounts()[e])}}function Fe(t,n){t&1&&(i(0,"div",85),p(1,"app-state-pill",89)(2,"span",90)(3,"app-state-pill",91)(4,"span",90)(5,"app-state-pill",92)(6,"span",90),a())}function He(t,n){if(t&1&&(i(0,"div",85),p(1,"app-state-pill",89),i(2,"span",93),l(3),a(),p(4,"app-state-pill",91),i(5,"span",93),l(6),a(),p(7,"app-state-pill",92),i(8,"span",93),l(9),a()()),t&2){let e,r,d,s=c(3);o(3),m(((e=s.health.state().data)==null||e.linkHealth==null?null:e.linkHealth.verified)??0),o(3),m(((r=s.health.state().data)==null||r.linkHealth==null?null:r.linkHealth.drifted)??0),o(3),m((((d=s.health.state().data)==null||d.linkHealth==null?null:d.linkHealth.broken)??0)+(((d=s.health.state().data)==null||d.linkHealth==null?null:d.linkHealth.orphaned)??0))}}function $e(t,n){t&1&&(i(0,"div",94),f(),i(1,"svg",95),p(2,"line",96),a(),C(),p(3,"span",97),a(),i(4,"div",94),f(),i(5,"svg",95),p(6,"line",98),a(),C(),p(7,"span",97),a(),i(8,"div",94),f(),i(9,"svg",95),p(10,"line",99),a(),C(),p(11,"span",97),a(),i(12,"div",94),f(),i(13,"svg",95),p(14,"line",100),a(),C(),p(15,"span",97),a())}function je(t,n){if(t&1&&(i(0,"div",94),f(),i(1,"svg",95),p(2,"line",96),a(),C(),i(3,"span",101),l(4,"calls"),a(),i(5,"span",102),l(6),a()(),i(7,"div",94),f(),i(8,"svg",95),p(9,"line",98),a(),C(),i(10,"span",101),l(11,"implements / documents"),a(),i(12,"span",102),l(13),a()(),i(14,"div",94),f(),i(15,"svg",95),p(16,"line",99),a(),C(),i(17,"span",101),l(18,"tests"),a(),i(19,"span",102),l(20),a()(),i(21,"div",94),f(),i(22,"svg",95),p(23,"line",100),a(),C(),i(24,"span",101),l(25,"synthesized (heuristic)"),a(),i(26,"span",102),l(27),a()()),t&2){let e,r,d,s,M=c(3);o(6),m(((e=M.health.state().data)==null||e.edgeKinds==null?null:e.edgeKinds.calls)??0),o(7),m(((r=M.health.state().data)==null||r.edgeKinds==null?null:r.edgeKinds.implements)??0),o(7),m(((d=M.health.state().data)==null||d.edgeKinds==null?null:d.edgeKinds.tests)??0),o(7),m(((s=M.health.state().data)==null||s.edgeKinds==null?null:s.edgeKinds.synth)??0)}}function Be(t,n){t&1&&(i(0,"div",103),p(1,"span",104)(2,"span",105),a())}function Qe(t,n){t&1&&(i(0,"div",83)(1,"div",60),l(2,"Most connected"),a(),k(3,Be,3,0,"div",103,G),a()),t&2&&(o(3),S(X(0,de)))}function Ae(t,n){if(t&1){let e=y();i(0,"button",107),b("click",function(){let d=h(e).$implicit,s=c(4);return v(s.pickHub(d))}),p(1,"span",108),i(2,"span",109),l(3),a(),i(4,"span",110),l(5),a(),p(6,"app-icon",111),a()}if(t&2){let e=n.$implicit,r=c(4);T("aria-label",e.name+", "+e.degree+" edges"),o(),I("background",r.nodeColor(e.kind))("border-radius",e.kind==="spec"?"2px":"50%"),o(2),m(e.name),o(2),z("",e.degree," edges"),o(),x("size",11)}}function Ue(t,n){if(t&1&&(i(0,"div",83)(1,"div",60),l(2,"Most connected"),a(),k(3,Ae,7,8,"button",106,L),a()),t&2){let e=c(3);o(3),S(e.health.state().data.hubs.slice(0,8))}}function qe(t,n){if(t&1&&(i(0,"div",77),p(1,"app-icon",78),i(2,"span",79),l(3,"Graph overview"),a(),p(4,"div",80),g(5,Re,2,1,"span",81),a(),i(6,"div",57)(7,"p",82),l(8," Click any node to inspect its signature, links, callers and callees \u2014 without leaving this view. "),a(),i(9,"div",83)(10,"div",60),l(11,"Nodes by kind"),a(),k(12,Le,6,3,"div",84,G),a(),i(14,"div",83)(15,"div",60),l(16,"Spec link health"),a(),g(17,Fe,7,0,"div",85)(18,He,10,3,"div",85),a(),i(19,"div",83)(20,"div",60),l(21,"Edge types"),a(),g(22,$e,16,0)(23,je,28,4),a(),g(24,Qe,5,1,"div",83)(25,Ue,5,0,"div",83),a()),t&2){let e,r,d,s=c(2);o(),x("size",15),o(4),u((e=s.status.state().data)?5:-1,e),o(7),S(s.kindKeys),o(5),u(s.health.state().loading?17:18),o(5),u(s.health.state().loading?22:(r=s.health.state().data)!=null&&r.edgeKinds?23:-1),o(2),u(s.health.state().loading?24:!((d=s.health.state().data)==null||d.hubs==null)&&d.hubs.length?25:-1)}}function We(t,n){if(t&1){let e=y();i(0,"div",1)(1,"div",2)(2,"div",3)(3,"app-segmented",4),b("change",function(d){h(e);let s=c();return v(s.onLayoutChange(d))}),a(),p(4,"div",5),k(5,ce,5,7,"button",6,G),p(7,"div",7),i(8,"div",8)(9,"div",9),p(10,"app-icon",10),i(11,"input",11),b("input",function(d){h(e);let s=c();return v(s.onSearchInput(d.target.value))}),a(),g(12,me,1,0,"span",12),a(),g(13,ue,3,0,"div",13),a(),i(14,"button",14),b("click",function(){h(e);let d=c();return v(d.recenter())}),p(15,"app-icon",15),l(16," Recenter "),a()(),i(17,"div",16),g(18,xe,6,1,"div",17)(19,he,3,0,"div",17)(20,ve,5,1,"div",17)(21,fe,3,1,"div",17)(22,be,27,5),a()(),i(23,"aside",18),g(24,Ne,25,22)(25,qe,26,5),a()()}if(t&2){let e,r=c();o(3),x("options",r.layoutOptions)("value",r.layoutMode()),o(2),S(r.kindKeys),o(5),x("size",13),o(),x("value",r.searchInput()),o(),u(r.searchResults.state().loading?12:-1),o(),u(r.searchResults.state().data&&r.searchResults.state().data.results.length>0?13:-1),o(2),x("size",13),o(3),u(r.selectedSymbol()?r.nodeDetail.state().loading?19:r.nodeDetail.state().error?20:r.selectedDetail()?22:21:18),o(6),u((e=r.selectedDetail())?24:25,e)}}var re=class t{api=N(Y);projects=N(Z);router=N(J);status=K(this.api,()=>`/api/status${this.projects.projectQuery()}`);health=K(this.api,()=>`/api/graph/health${this.projects.projectQuery()}`);layoutMode=P("hierarchical");layoutOptions=[{value:"hierarchical",label:"Hierarchical"},{value:"force",label:"Force"},{value:"anchored",label:"Anchored"}];searchInput=P("");searchQuery=P("");searchDebounce=null;searchResults=K(this.api,()=>{let n=this.searchQuery().trim();return n.length>=2?`/api/graph/search?q=${encodeURIComponent(n)}&limit=12${this.projects.projectQuery("&")}`:null});selectedSymbol=P(null);nodeDetail=K(this.api,()=>{let n=this.selectedSymbol();return n?`/api/graph/node?symbol=${encodeURIComponent(n)}${this.projects.projectQuery("&")}`:null});selectedDetail=w(()=>this.nodeDetail.state().data?.matches?.[0]??null);filters=P({code:!0,spec:!0,route:!0,test:!0});fitKey=P(0);canvasData=w(()=>{let n=this.selectedDetail();if(!n)return{nodes:[],edges:[]};let e=this.filters(),r=_=>{let E=F(_);return e[E]},d={id:n.id,label:n.name,sub:H(n.filePath),kind:n.kind,x:0,y:0},s=(n.callers??[]).filter(_=>r(_.kind)),M=(n.callees??[]).filter(_=>r(_.kind)),$=(n.linkedSpecs??[]).filter(()=>e.spec),j=280,B=56,D=[d],V=[];return s.forEach((_,E)=>{let O=(E-(s.length-1)/2)*B;D.push(le(_,-j,O)),V.push({from:_.id,to:n.id,kind:"calls"})}),M.forEach((_,E)=>{let O=(E-(M.length-1)/2)*B;D.push(le(_,j,O)),V.push({from:n.id,to:_.id,kind:"calls"})}),$.forEach((_,E)=>{let O=(E-($.length-1)/2)*220,Q="spec:"+_.specId;D.push({id:Q,label:_.specId,sub:_.specTitle??void 0,kind:"spec",state:_.state,x:O,y:-160}),V.push({from:Q,to:n.id,kind:"implements"})}),{nodes:D,edges:V}});visibleNodes=w(()=>this.canvasData().nodes);visibleEdges=w(()=>this.canvasData().edges);hiddenIds=w(()=>{let n=this.filters(),e=new Set;for(let r of this.canvasData().nodes)n[F(r.kind)]||e.add(r.id);return e});kindCounts=w(()=>{let n={code:0,spec:0,route:0,test:0};for(let e of this.canvasData().nodes)n[F(e.kind)]++;return n});overviewKindCounts=w(()=>{let n=this.status.state().data;if(!n?.nodesByKind)return{code:0,spec:0,route:0,test:0};let e=n.nodesByKind;return{code:(e.function??0)+(e.method??0)+(e.class??0)+(e.variable??0)+(e.constant??0)+(e.type_alias??0)+(e.interface??0)+(e.struct??0)+(e.enum??0)+(e.property??0)+(e.field??0)+(e.file??0)+(e.module??0)+(e.namespace??0)+(e.component??0),spec:e.spec??0,route:e.route??0,test:e.test??0}});kindKeys=["code","spec","route","test"];isFilterActive(n){return this.filters()[n]}countFor(n){return this.kindCounts()[n]}chipColor(n){switch(n){case"spec":return"var(--node-spec)";case"route":return"var(--node-route)";case"test":return"var(--node-test)";default:return"var(--node-code)"}}onSearchInput(n){this.searchInput.set(n),this.searchDebounce&&clearTimeout(this.searchDebounce),this.searchDebounce=setTimeout(()=>this.searchQuery.set(n),180)}pickResult(n){this.searchInput.set(n.name),this.searchQuery.set(""),this.selectedSymbol.set(n.name)}pickFromCanvas(n){let e=this.selectedDetail();if(!e||n===e.id)return;let d=[...e.callers??[],...e.callees??[]].find(s=>s.id===n);d&&(this.selectedSymbol.set(d.name),this.fitKey.update(s=>s+1))}toggleFilter(n){this.filters.update(e=>U(A({},e),{[n]:!e[n]})),this.fitKey.update(e=>e+1)}recenter(){this.fitKey.update(n=>n+1)}clearSelection(){this.selectedSymbol.set(null),this.searchInput.set("")}onLayoutChange(n){this.layoutMode.set(n),this.fitKey.update(e=>e+1)}shortPath(n){return H(n)}fileName(n){return n?n.split("/").pop()??"":""}kindLabel(n){return n.charAt(0).toUpperCase()+n.slice(1)}navigateToSpecs(){this.router.navigate(["/specs"])}navigateToDrift(){this.router.navigate(["/drift"])}nodeColor(n){return n==="spec"?"var(--node-spec)":n==="route"?"var(--node-route)":n==="test"?"var(--node-test)":"var(--node-code)"}pickHub(n){this.selectedSymbol.set(n.name),this.fitKey.update(e=>e+1)}detailColor(n){if(n.kind==="spec"){let e=n.linkedSpecs??[],r=e.some(s=>s.state==="broken"||s.state==="orphaned"),d=!r&&e.some(s=>s.state==="drifted");return r?"var(--error)":d?"var(--warn)":"var(--node-spec)"}return n.kind==="test"?"var(--node-test)":n.kind==="route"?"var(--node-route)":"var(--node-code)"}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=q({type:t,selectors:[["app-graph"]],decls:2,vars:1,consts:[["surface","The graph"],[1,"gp-root"],[1,"gp-main"],[1,"gp-toolbar"],["size","sm",3,"change","options","value"],[1,"gp-divider"],["type","button",1,"gp-chip",3,"is-active","--chip-color"],[1,"gp-spacer"],[1,"gp-search"],[1,"gp-search-inner"],["name","search",1,"gp-search-icon",3,"size"],["type","text","placeholder","Fuzzy symbol search\u2026","aria-label","Symbol search",3,"input","value"],["aria-hidden","true",1,"gp-spinner"],["role","listbox",1,"gp-results"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["name","recenter",3,"size"],[1,"gp-canvas-wrap"],[1,"gp-empty"],[1,"gp-panel"],["type","button",1,"gp-chip",3,"click"],[1,"gp-chip-dot"],[1,"gp-chip-count"],["type","button",1,"gp-result"],["type","button",1,"gp-result",3,"click"],[1,"gp-result-dot"],[1,"gp-result-name","mono"],[1,"gp-result-kind"],[1,"gp-result-path","mono"],[1,"gp-stats"],[3,"nodeClick","nodes","edges","selectedId","fitKey","hiddenIds"],[1,"gp-legend"],[1,"gp-legend-kinds"],[1,"gp-legend-item"],[1,"gp-legend-sep"],[1,"gp-legend-edges"],[1,"gp-legend-edge-row"],["width","16","height","8"],["x1","0","y1","4","x2","16","y2","4","stroke","var(--node-spec)","stroke-width","1.6"],[1,"secondary"],["x1","0","y1","4","x2","16","y2","4","stroke","var(--node-test)","stroke-width","1.6"],["x1","0","y1","4","x2","16","y2","4","stroke","var(--text-muted)","stroke-width","1.6"],["x1","0","y1","4","x2","16","y2","4","stroke","var(--text-muted)","stroke-width","1.6","stroke-dasharray","4 3"],[1,"gp-legend-dot"],[1,"secondary",2,"text-transform","capitalize"],[1,"gp-panel-header"],[1,"gp-panel-header-inner"],[1,"gp-node-dot"],[1,"grow",2,"min-width","0"],[1,"mono","gp-panel-name"],[1,"row","gap-6",2,"margin-top","3px"],[1,"pill"],["type","button","aria-label","Close panel",1,"btn","btn-ghost","btn-xs",3,"click"],["name","x",3,"size"],[1,"gp-panel-path","row","gap-6"],["name","folder",2,"color","var(--text-muted)","flex-shrink","0",3,"size"],[1,"mono","secondary","gp-path-text"],[3,"text"],[1,"gp-panel-body","scroll-y"],[1,"gp-section"],[1,"gp-panel-footer"],[1,"eyebrow","gp-eyebrow"],[1,"gp-code","mono"],[1,"secondary",2,"font-size","12px","line-height","1.6","margin","0"],[1,"muted",2,"font-weight","400","margin-left","5px"],[1,"gp-link-row"],[3,"state"],[1,"mono","grow","gp-link-text"],[1,"muted",2,"font-size","10px","flex-shrink","0","overflow","hidden","text-overflow","ellipsis","white-space","nowrap","max-width","120px"],[1,"muted",2,"font-size","12px","padding","4px 8px"],["type","button",1,"gp-node-link"],["type","button",1,"gp-node-link",3,"click"],["name","box",2,"color","var(--node-code)","flex-shrink","0",3,"size"],[1,"mono","muted","gp-link-file"],["type","button",1,"btn","btn-primary","btn-sm","grow",2,"justify-content","center"],["name","play",3,"size"],["type","button",1,"btn","btn-secondary","btn-sm"],["name","reveal",3,"size"],[1,"gp-panel-header","gp-overview-head"],["name","graph",2,"color","var(--accent)",3,"size"],[2,"font-weight","600","font-size","13.5px"],[1,"grow"],[1,"mono","muted",2,"font-size","11px"],[1,"secondary",2,"font-size","12px","line-height","1.55","margin","0 0 18px"],[1,"gp-section-plain"],[1,"gp-kind-row"],[1,"row","gap-6",2,"flex-wrap","wrap","align-items","center"],[1,"gp-kind-dot"],[1,"grow",2,"font-size","12.5px","text-transform","capitalize"],[1,"mono","tabular",2,"font-size","12.5px","font-weight","600"],["state","verified"],["aria-hidden","true",1,"gp-skel","gp-skel-sm"],["state","drifted"],["state","broken"],[1,"mono","tabular","muted",2,"font-size","11px","align-self","center"],[1,"gp-edge-row"],["width","20","height","8"],["x1","0","y1","4","x2","20","y2","4","stroke","var(--text-muted)","stroke-width","1.8"],["aria-hidden","true",1,"gp-skel","gp-skel-lg"],["x1","0","y1","4","x2","20","y2","4","stroke","var(--node-spec)","stroke-width","1.8"],["x1","0","y1","4","x2","20","y2","4","stroke","var(--node-test)","stroke-width","1.8"],["x1","0","y1","4","x2","20","y2","4","stroke","var(--text-muted)","stroke-width","1.8","stroke-dasharray","4 3"],[1,"grow","secondary",2,"font-size","12px"],[1,"mono","tabular","muted",2,"font-size","11px"],["aria-hidden","true",1,"gp-hub-row"],[1,"gp-hub-dot","gp-skel-dot"],["aria-hidden","true",1,"gp-skel","gp-skel-hub"],["type","button",1,"gp-hub-row"],["type","button",1,"gp-hub-row",3,"click"],[1,"gp-hub-dot"],[1,"mono","grow","gp-hub-name"],[1,"muted","gp-hub-degree"],["name","chevron-right",2,"color","var(--text-muted)","flex-shrink","0",3,"size"]],template:function(e,r){e&1&&g(0,se,1,0,"app-pick-project-empty",0)(1,We,26,9,"div",1),e&2&&u(r.status.state().noProject?0:1)},dependencies:[ne,ie,ee,te,ae,oe],styles:["[_nghost-%COMP%]{display:contents}.gp-root[_ngcontent-%COMP%]{flex:1;display:flex;min-height:0;min-width:0}.gp-main[_ngcontent-%COMP%]{flex:1;min-width:0;display:flex;flex-direction:column}.gp-toolbar[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;padding:9px 14px;border-bottom:1px solid var(--border-subtle);background:var(--bg-panel-2, var(--bg-panel));flex-wrap:wrap;flex-shrink:0}.gp-divider[_ngcontent-%COMP%]{width:1px;height:20px;background:var(--border-subtle);flex-shrink:0}.gp-chip[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;height:26px;padding:0 10px;border-radius:999px;font-size:11.5px;font-weight:500;cursor:pointer;border:1px solid var(--border-subtle);background:var(--bg-panel);color:var(--text-secondary);transition:all .1s}.gp-chip.is-active[_ngcontent-%COMP%]{border-color:transparent;background:color-mix(in srgb,var(--chip-color, var(--accent)) 22%,var(--bg-panel));color:var(--chip-color, var(--accent))}.gp-chip-dot[_ngcontent-%COMP%]{width:7px;height:7px;border-radius:50%}.gp-chip-dot[data-kind=code][_ngcontent-%COMP%]{background:var(--node-code)}.gp-chip-dot[data-kind=spec][_ngcontent-%COMP%]{background:var(--node-spec);border-radius:2px}.gp-chip-dot[data-kind=route][_ngcontent-%COMP%]{background:var(--node-route)}.gp-chip-dot[data-kind=test][_ngcontent-%COMP%]{background:var(--node-test)}.gp-chip-count[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-muted);font-variant-numeric:tabular-nums}.gp-spacer[_ngcontent-%COMP%]{flex:1}.gp-search[_ngcontent-%COMP%]{position:relative;flex-shrink:0}.gp-search-inner[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;height:28px;padding:0 10px;background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:7px;width:220px}.gp-search-inner[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{flex:1;background:transparent;border:none;outline:none;color:var(--text-primary);font-size:12px;font-family:var(--font-mono)}.gp-search-icon[_ngcontent-%COMP%]{color:var(--text-muted);flex-shrink:0}.gp-spinner[_ngcontent-%COMP%]{width:12px;height:12px;border:2px solid var(--border-subtle);border-top-color:var(--accent);border-radius:50%;animation:_ngcontent-%COMP%_gp-spin .7s linear infinite;flex-shrink:0}@keyframes _ngcontent-%COMP%_gp-spin{to{transform:rotate(360deg)}}.gp-results[_ngcontent-%COMP%]{position:absolute;top:32px;left:0;right:0;background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:8px;box-shadow:var(--shadow-pop, 0 12px 28px rgba(0, 0, 0, .5));padding:5px;z-index:30;max-height:320px;overflow-y:auto}.gp-result[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;width:100%;padding:6px 8px;border-radius:5px;background:transparent;border:none;cursor:pointer;font:inherit;color:var(--text-primary);text-align:left}.gp-result[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.gp-result-dot[_ngcontent-%COMP%]{width:7px;height:7px;border-radius:50%;background:var(--node-code);flex-shrink:0}.gp-result-dot.is-spec[_ngcontent-%COMP%]{background:var(--node-spec);border-radius:2px}.gp-result-dot.is-route[_ngcontent-%COMP%]{background:var(--node-route)}.gp-result-dot.is-test[_ngcontent-%COMP%]{background:var(--node-test)}.gp-result-name[_ngcontent-%COMP%]{font-size:12px;flex-shrink:0}.gp-result-kind[_ngcontent-%COMP%]{font-size:10px;text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted)}.gp-result-path[_ngcontent-%COMP%]{flex:1;text-align:right;font-size:10px;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gp-canvas-wrap[_ngcontent-%COMP%]{flex:1;min-height:0;position:relative;display:flex}.gp-canvas-wrap[_ngcontent-%COMP%] app-graph-canvas[_ngcontent-%COMP%]{flex:1;min-height:0}.gp-empty[_ngcontent-%COMP%]{flex:1;display:grid;place-items:center;text-align:center;padding:60px 24px;background:var(--bg-canvas-2, var(--bg-canvas))}.gp-empty[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{font-size:18px;font-weight:600;margin:0 0 8px}.gp-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--text-secondary);font-size:13.5px;line-height:1.6;margin:0;max-width:520px}.gp-stats[_ngcontent-%COMP%]{margin-top:18px!important;font-family:var(--font-mono);font-size:11.5px!important;color:var(--text-muted)!important}.gp-legend[_ngcontent-%COMP%]{position:absolute;top:14px;left:14px;display:flex;align-items:center;gap:12px;flex-wrap:wrap;max-width:70%;background:color-mix(in srgb,var(--bg-panel) 86%,transparent);border:1px solid var(--border-subtle);border-radius:8px;padding:6px 10px;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);font-size:11px;pointer-events:none;z-index:3}.gp-legend-kinds[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px}.gp-legend-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.gp-legend-dot[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:50%;flex-shrink:0}.gp-legend-dot[data-kind=code][_ngcontent-%COMP%]{background:var(--node-code)}.gp-legend-dot[data-kind=spec][_ngcontent-%COMP%]{background:var(--node-spec);border-radius:2px}.gp-legend-dot[data-kind=route][_ngcontent-%COMP%]{background:var(--node-route)}.gp-legend-dot[data-kind=test][_ngcontent-%COMP%]{background:var(--node-test)}.gp-legend-sep[_ngcontent-%COMP%]{width:1px;height:16px;background:var(--border-subtle);flex-shrink:0}.gp-legend-edges[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px}.gp-legend-edge-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.gp-panel[_ngcontent-%COMP%]{width:360px;flex-shrink:0;border-left:1px solid var(--border-subtle);background:var(--bg-panel);display:flex;flex-direction:column;overflow:hidden}.gp-panel-header[_ngcontent-%COMP%]{padding:12px 14px;border-bottom:1px solid var(--border-subtle);flex-shrink:0}.gp-panel-header-inner[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:8px}.gp-overview-head[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.gp-node-dot[_ngcontent-%COMP%]{width:9px;height:9px;border-radius:50%;flex-shrink:0;margin-top:5px}.gp-node-dot.is-rect[_ngcontent-%COMP%]{border-radius:2px}.gp-panel-name[_ngcontent-%COMP%]{font-size:14px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gp-panel-path[_ngcontent-%COMP%]{margin-top:8px;font-size:11.5px;color:var(--text-secondary)}.gp-path-text[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.gp-panel-body[_ngcontent-%COMP%]{flex:1;padding:14px;overflow-y:auto;display:flex;flex-direction:column;gap:18px}.gp-section[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:4px}.gp-section-plain[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2px}.gp-eyebrow[_ngcontent-%COMP%]{font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);margin-bottom:6px}.gp-code[_ngcontent-%COMP%]{margin:0;font-size:11.5px;line-height:1.6;color:var(--text-secondary);background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:7px;padding:10px;overflow-x:auto;white-space:pre-wrap;word-break:break-word}.gp-link-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;border:1px solid var(--border-subtle);margin-bottom:5px;font-size:11.5px}.gp-link-text[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px}.gp-node-link[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;width:100%;padding:5px 8px;border-radius:6px;border:none;background:transparent;cursor:pointer;font:inherit;color:inherit;text-align:left;font-size:12px}.gp-node-link[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.gp-link-file[_ngcontent-%COMP%]{font-size:10px;flex-shrink:0}.gp-edge-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:4px 0}.gp-kind-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:5px 0}.gp-kind-dot[_ngcontent-%COMP%]{width:9px;height:9px;border-radius:50%;flex-shrink:0}.gp-kind-dot[data-kind=code][_ngcontent-%COMP%]{background:var(--node-code);box-shadow:0 0 6px var(--node-code)}.gp-kind-dot[data-kind=spec][_ngcontent-%COMP%]{background:var(--node-spec);border-radius:2px;box-shadow:0 0 6px var(--node-spec)}.gp-kind-dot[data-kind=route][_ngcontent-%COMP%]{background:var(--node-route);box-shadow:0 0 6px var(--node-route)}.gp-kind-dot[data-kind=test][_ngcontent-%COMP%]{background:var(--node-test);box-shadow:0 0 6px var(--node-test)}.gp-panel-footer[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:12px 14px;border-top:1px solid var(--border-subtle);flex-shrink:0}.gp-hub-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;width:100%;padding:5px 8px;border-radius:6px;border:none;background:transparent;cursor:pointer;font:inherit;color:inherit;text-align:left}.gp-hub-row[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.gp-hub-dot[_ngcontent-%COMP%]{width:8px;height:8px;flex-shrink:0}.gp-hub-name[_ngcontent-%COMP%]{font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gp-hub-degree[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-muted);flex-shrink:0;font-variant-numeric:tabular-nums}@keyframes _ngcontent-%COMP%_gp-skel-pulse{0%,to{opacity:.35}50%{opacity:.7}}.gp-skel[_ngcontent-%COMP%]{display:inline-block;background:var(--border-subtle);border-radius:4px;animation:_ngcontent-%COMP%_gp-skel-pulse 1.4s ease-in-out infinite}.gp-skel-sm[_ngcontent-%COMP%]{width:24px;height:12px}.gp-skel-lg[_ngcontent-%COMP%]{width:80px;height:12px;flex:1}.gp-skel-hub[_ngcontent-%COMP%]{width:120px;height:12px;flex:1}.gp-skel-dot[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:50%;flex-shrink:0;background:var(--border-subtle);animation:_ngcontent-%COMP%_gp-skel-pulse 1.4s ease-in-out infinite}.grow[_ngcontent-%COMP%]{flex:1}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono)}"],changeDetection:0})};function le(t,n,e){return{id:t.id,label:t.name,sub:H(t.filePath),kind:t.kind,x:n,y:e}}function H(t){return t?t.split("/").slice(-2).join("/"):""}function F(t){return t==="spec"?"spec":t==="route"?"route":t==="test"?"test":"code"}export{re as Graph};
@@ -1 +1 @@
1
- import{a as q}from"./chunk-EMGMOEVR.js";import{a as Q}from"./chunk-X2HTISHL.js";import{a as N}from"./chunk-UYC52MBC.js";import{a as R}from"./chunk-WDU3WICG.js";import{a as $,b as j}from"./chunk-HZA6NEAB.js";import{c as V}from"./chunk-GR72OOCN.js";import{c as M}from"./chunk-SHPTC4RL.js";import{a as L}from"./chunk-7RNS77UP.js";import{a as O}from"./chunk-E44X4RH2.js";import{Aa as p,Ga as S,I as C,Ia as b,Ka as c,M as v,N as g,Ta as D,Ua as I,Va as l,W as y,Wa as u,Xa as x,ea as n,ka as z,lb as h,qa as P,ra as _,sa as f,ua as F,va as w,wa as k,xa as s,ya as r,za as o,zb as A}from"./chunk-PDN6QYGJ.js";import{a as E,b as T}from"./chunk-Q7L6LLAK.js";var H=(i,t)=>t.id;function J(i,t){i&1&&p(0,"app-pick-project-empty",0)}function K(i,t){if(i&1){let e=S();r(0,"button",10),b("click",function(){let d=v(e).$implicit,m=c(2);return g(m.toggleFilter(d))}),r(1,"span",11),l(2),o(),r(3,"span",12),l(4),o()()}if(i&2){let e=t.$implicit,a=c(2);D("background",a.stateFilter()[e]?a.STATE[e].bg:"var(--bg-panel)")("color",a.stateFilter()[e]?a.STATE[e].color:"var(--text-muted)")("border-color",a.stateFilter()[e]?"transparent":"var(--border-subtle)"),n(2),u(e),n(2),u(a.counts()[e])}}function U(i,t){if(i&1&&(r(0,"span",13),l(1),o(),r(2,"button",14),p(3,"app-icon",15),l(4," Re-verify all "),o(),r(5,"button",14),p(6,"app-icon",16),l(7," Open all "),o()),i&2){let e=c(2);n(),x("",e.selectedCount()," selected"),n(2),s("size",12),n(3),s("size",12)}}function W(i,t){i&1&&p(0,"app-empty",8)}function X(i,t){if(i&1&&(r(0,"app-pill",28),l(1),o()),i&2){let e=c().$implicit;n(),u(e.driftAxis)}}function Y(i,t){i&1&&(r(0,"button",37),p(1,"app-icon",39),l(2," Fix "),o()),i&2&&(n(),s("size",12))}function Z(i,t){i&1&&(r(0,"button",37),p(1,"app-icon",15),l(2," Re-verify "),o()),i&2&&(n(),s("size",12))}function ee(i,t){i&1&&(r(0,"button",37),p(1,"app-icon",40),l(2," Re-attach "),o()),i&2&&(n(),s("size",12))}function te(i,t){if(i&1){let e=S();r(0,"div",32)(1,"div",33)(2,"div")(3,"div",34),l(4,"Spec"),o(),r(5,"div",35),l(6),o()(),r(7,"div")(8,"div",34),l(9,"Target"),o(),r(10,"div",35),l(11),o()(),r(12,"div")(13,"div",34),l(14,"Provenance"),o(),r(15,"div",35),l(16),o()(),r(17,"div")(18,"div",34),l(19,"Drift axis"),o(),r(20,"div",35),l(21),o()(),r(22,"div")(23,"div",34),l(24,"Age"),o(),r(25,"div",35),l(26),o()()(),r(27,"div",36),_(28,Y,3,1,"button",37),_(29,Z,3,1,"button",37),_(30,ee,3,1,"button",37),r(31,"button",38),b("click",function(){v(e);let d=c().$implicit,m=c(3);return g(m.openSpec(d.specId))}),l(32," Open spec "),o(),r(33,"button",38),b("click",function(){v(e);let d=c().$implicit,m=c(3);return g(m.showInGraph(d.specId))}),l(34," Show in graph "),o()()()}if(i&2){let e=c().$implicit,a=c(3);n(6),u(e.specId),n(5),u(e.targetQualifiedName),n(5),u(e.provenance),n(5),u(e.driftAxis??"\u2014"),n(5),u(a.ageOf(e)),n(2),f(e.state==="drifted"?28:-1),n(),f(e.state==="broken"?29:-1),n(),f(e.state==="orphaned"?30:-1)}}function ie(i,t){if(i&1){let e=S();r(0,"div",18)(1,"div",19)(2,"input",20),b("click",function(d){let m=v(e).$implicit,B=c(3);return g(B.toggleSelect(m.id,d))})("change",function(d){return d.stopPropagation()}),o(),r(3,"div",21),b("click",function(){let d=v(e).$implicit,m=c(3);return g(m.toggleExpand(d.id))}),r(4,"div",22),p(5,"app-state-pill",23),o(),r(6,"span",24),l(7),o(),r(8,"span",25),l(9),o(),p(10,"app-icon",26),r(11,"span",27),l(12),o(),_(13,X,2,1,"app-pill",28),r(14,"span",29),l(15),o(),r(16,"span",30),l(17),o(),p(18,"app-icon",31),o()(),_(19,te,35,8,"div",32),o()}if(i&2){let e=t.$implicit,a=c(3);D("border-bottom","1px solid var(--border-subtle)"),n(),I("selected",a.isSelected(e.id)),n(),s("checked",a.isSelected(e.id)),P("aria-label","Select "+e.specId),n(3),s("state",e.state),n(2),x(" ",e.specId," "),n(2),x(" ",e.specTitle??""," "),n(),s("size",13),n(2),x(" ",e.targetQualifiedName," "),n(),f(e.driftAxis?13:-1),n(2),x(" ",e.provenance," "),n(2),x(" ",a.ageOf(e)," "),n(),s("name",a.isExpanded(e.id)?"chevronDown":"chevronRight")("size",13),n(),f(a.isExpanded(e.id)?19:-1)}}function ne(i,t){if(i&1&&(r(0,"div",9),w(1,ie,20,17,"div",17,H),o()),i&2){let e=c(2);n(),k(e.visibleLinks())}}function re(i,t){if(i&1&&(r(0,"div",1)(1,"div",2),p(2,"app-page-head",3),o(),r(3,"div",4),p(4,"app-icon",5),w(5,K,5,8,"button",6,F),p(7,"div",7),_(8,U,8,3),o(),_(9,W,1,0,"app-empty",8)(10,ne,3,0,"div",9),o()),i&2){let e=c();n(2),s("sub",e.resource.state().loading?"loading\u2026":e.allLinks().length+" links need attention"),n(2),s("size",13),n(),k(e.states),n(3),f(e.selectedCount()>0?8:-1),n(),f(e.visibleLinks().length===0?9:10)}}var G=class i{api=C(O);projects=C(L);router=C(M);stateFilter=y({drifted:!0,broken:!0,orphaned:!0});resource=V(this.api,()=>`/api/drift?state=drifted,broken,orphaned${this.projects.projectQuery("&")}`);selected=y(new Set);expanded=y(new Set);allLinks=h(()=>this.resource.state().data?.links??[]);visibleLinks=h(()=>{let t=this.stateFilter();return this.allLinks().filter(e=>t[e.state])});counts=h(()=>{let t={drifted:0,broken:0,orphaned:0};for(let e of this.allLinks())e.state in t&&t[e.state]++;return t});selectedCount=h(()=>this.selected().size);states=["drifted","broken","orphaned"];STATE=$;toggleFilter(t){this.stateFilter.update(e=>T(E({},e),{[t]:!e[t]}))}toggleSelect(t,e){e.stopPropagation(),this.selected.update(a=>{let d=new Set(a);return d.has(t)?d.delete(t):d.add(t),d})}isSelected(t){return this.selected().has(t)}toggleExpand(t){this.expanded.update(e=>{let a=new Set(e);return a.has(t)?a.delete(t):a.add(t),a})}isExpanded(t){return this.expanded().has(t)}ageOf(t){if(!t.updatedAt)return"";let e=Date.now()-t.updatedAt;return e<6e4?"just now":e<36e5?Math.round(e/6e4)+"m":e<864e5?Math.round(e/36e5)+"h":Math.round(e/864e5)+"d"}openSpec(t){this.router.navigate(["/specs"],{queryParams:{sel:t}})}showInGraph(t){this.router.navigate(["/graph"],{queryParams:{focus:"spec:"+t}})}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=z({type:i,selectors:[["app-drift"]],decls:2,vars:1,consts:[["surface","The drift queue"],[1,"page","col"],[2,"padding","16px 18px 0"],["icon","drift","title","Drift queue",3,"sub"],[1,"filter-bar","row","gap-8"],["name","filter",2,"color","var(--text-muted)",3,"size"],["type","button",1,"filter-chip","row","gap-6",3,"background","color","border-color"],[1,"grow"],["icon","check","title","All links in good standing \u2728","body","Nothing has drifted. Every spec link points at code that still matches."],[1,"scroll-y","list-frame"],["type","button",1,"filter-chip","row","gap-6",3,"click"],[2,"text-transform","capitalize"],[1,"tabular",2,"opacity","0.7"],[1,"secondary",2,"font-size","12px"],["type","button",1,"btn","btn-secondary","btn-sm"],["name","refresh",3,"size"],["name","reveal",3,"size"],[1,"drift-row-wrap",3,"border-bottom"],[1,"drift-row-wrap"],[1,"drift-row","row","gap-10"],["type","checkbox",1,"drift-checkbox",3,"click","change","checked"],[1,"row","gap-10","grow",2,"min-width","0","cursor","pointer",3,"click"],[2,"width","92px","flex-shrink","0"],[3,"state"],[1,"mono",2,"font-size","12px","color","var(--node-spec)","flex-shrink","0","width","130px","overflow","hidden","text-overflow","ellipsis","white-space","nowrap"],[1,"secondary",2,"font-size","12.5px","overflow","hidden","text-overflow","ellipsis","white-space","nowrap","flex","0 1 220px"],["name","arrowRight",2,"color","var(--text-muted)","flex-shrink","0",3,"size"],[1,"mono","grow",2,"font-size","11.5px","color","var(--text-secondary)","overflow","hidden","text-overflow","ellipsis","white-space","nowrap"],["color","var(--warn)","bg","var(--warn-soft)"],[1,"mono","muted",2,"font-size","11px","flex-shrink","0","width","48px","text-align","right"],[1,"mono","muted","tabular",2,"font-size","11px","flex-shrink","0","width","32px","text-align","right"],[2,"color","var(--text-muted)","flex-shrink","0",3,"name","size"],[1,"drift-detail"],[1,"row",2,"gap","22px","padding","10px 0","flex-wrap","wrap"],[1,"muted",2,"font-size","10.5px"],[1,"mono",2,"font-size","12.5px","margin-top","1px"],[1,"row","gap-8"],["type","button",1,"btn","btn-primary","btn-sm"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["name","wrench",3,"size"],["name","graph",3,"size"]],template:function(e,a){e&1&&_(0,J,1,0,"app-pick-project-empty",0)(1,re,11,4,"div",1),e&2&&f(a.resource.state().noProject?0:1)},dependencies:[R,A,N,q,j,Q],styles:["[_nghost-%COMP%]{display:contents}.page[_ngcontent-%COMP%]{flex:1;min-height:0}.filter-bar[_ngcontent-%COMP%]{padding:0 18px 12px;flex-wrap:wrap;align-items:center}.filter-chip[_ngcontent-%COMP%]{height:26px;padding:0 10px;border-radius:999px;border:1px solid var(--border-subtle);font-size:11.5px;font-weight:500;cursor:pointer;font-family:inherit;align-items:center;transition:background .12s,color .12s}.list-frame[_ngcontent-%COMP%]{flex:1;border-top:1px solid var(--border-subtle);margin:0}.drift-row[_ngcontent-%COMP%]{padding:10px 14px;cursor:default;align-items:center;transition:background 80ms;background:transparent}.drift-row[_ngcontent-%COMP%]:not(.selected):hover{background:var(--bg-hover)}.drift-row.selected[_ngcontent-%COMP%]{background:var(--accent-soft)}.drift-checkbox[_ngcontent-%COMP%]{accent-color:var(--accent);width:14px;height:14px;flex-shrink:0;cursor:pointer}.drift-detail[_ngcontent-%COMP%]{padding:0 14px 14px 50px;background:var(--bg-canvas)}"],changeDetection:0})};export{G as Drift};
1
+ import{a as q}from"./chunk-EMGMOEVR.js";import{a as Q}from"./chunk-X2HTISHL.js";import{a as N}from"./chunk-UYC52MBC.js";import{a as $,b as j}from"./chunk-HZA6NEAB.js";import{a as R}from"./chunk-WDU3WICG.js";import{c as M}from"./chunk-SHPTC4RL.js";import{c as V}from"./chunk-GR72OOCN.js";import{a as L}from"./chunk-7RNS77UP.js";import{a as O}from"./chunk-E44X4RH2.js";import{Aa as p,Ga as S,I as C,Ia as b,Ka as c,M as v,N as g,Ta as D,Ua as I,Va as l,W as y,Wa as u,Xa as x,ea as n,ka as z,lb as h,qa as P,ra as _,sa as f,ua as F,va as w,wa as k,xa as s,ya as r,za as o,zb as A}from"./chunk-PDN6QYGJ.js";import{a as E,b as T}from"./chunk-Q7L6LLAK.js";var H=(i,t)=>t.id;function J(i,t){i&1&&p(0,"app-pick-project-empty",0)}function K(i,t){if(i&1){let e=S();r(0,"button",10),b("click",function(){let d=v(e).$implicit,m=c(2);return g(m.toggleFilter(d))}),r(1,"span",11),l(2),o(),r(3,"span",12),l(4),o()()}if(i&2){let e=t.$implicit,a=c(2);D("background",a.stateFilter()[e]?a.STATE[e].bg:"var(--bg-panel)")("color",a.stateFilter()[e]?a.STATE[e].color:"var(--text-muted)")("border-color",a.stateFilter()[e]?"transparent":"var(--border-subtle)"),n(2),u(e),n(2),u(a.counts()[e])}}function U(i,t){if(i&1&&(r(0,"span",13),l(1),o(),r(2,"button",14),p(3,"app-icon",15),l(4," Re-verify all "),o(),r(5,"button",14),p(6,"app-icon",16),l(7," Open all "),o()),i&2){let e=c(2);n(),x("",e.selectedCount()," selected"),n(2),s("size",12),n(3),s("size",12)}}function W(i,t){i&1&&p(0,"app-empty",8)}function X(i,t){if(i&1&&(r(0,"app-pill",28),l(1),o()),i&2){let e=c().$implicit;n(),u(e.driftAxis)}}function Y(i,t){i&1&&(r(0,"button",37),p(1,"app-icon",39),l(2," Fix "),o()),i&2&&(n(),s("size",12))}function Z(i,t){i&1&&(r(0,"button",37),p(1,"app-icon",15),l(2," Re-verify "),o()),i&2&&(n(),s("size",12))}function ee(i,t){i&1&&(r(0,"button",37),p(1,"app-icon",40),l(2," Re-attach "),o()),i&2&&(n(),s("size",12))}function te(i,t){if(i&1){let e=S();r(0,"div",32)(1,"div",33)(2,"div")(3,"div",34),l(4,"Spec"),o(),r(5,"div",35),l(6),o()(),r(7,"div")(8,"div",34),l(9,"Target"),o(),r(10,"div",35),l(11),o()(),r(12,"div")(13,"div",34),l(14,"Provenance"),o(),r(15,"div",35),l(16),o()(),r(17,"div")(18,"div",34),l(19,"Drift axis"),o(),r(20,"div",35),l(21),o()(),r(22,"div")(23,"div",34),l(24,"Age"),o(),r(25,"div",35),l(26),o()()(),r(27,"div",36),_(28,Y,3,1,"button",37),_(29,Z,3,1,"button",37),_(30,ee,3,1,"button",37),r(31,"button",38),b("click",function(){v(e);let d=c().$implicit,m=c(3);return g(m.openSpec(d.specId))}),l(32," Open spec "),o(),r(33,"button",38),b("click",function(){v(e);let d=c().$implicit,m=c(3);return g(m.showInGraph(d.specId))}),l(34," Show in graph "),o()()()}if(i&2){let e=c().$implicit,a=c(3);n(6),u(e.specId),n(5),u(e.targetQualifiedName),n(5),u(e.provenance),n(5),u(e.driftAxis??"\u2014"),n(5),u(a.ageOf(e)),n(2),f(e.state==="drifted"?28:-1),n(),f(e.state==="broken"?29:-1),n(),f(e.state==="orphaned"?30:-1)}}function ie(i,t){if(i&1){let e=S();r(0,"div",18)(1,"div",19)(2,"input",20),b("click",function(d){let m=v(e).$implicit,B=c(3);return g(B.toggleSelect(m.id,d))})("change",function(d){return d.stopPropagation()}),o(),r(3,"div",21),b("click",function(){let d=v(e).$implicit,m=c(3);return g(m.toggleExpand(d.id))}),r(4,"div",22),p(5,"app-state-pill",23),o(),r(6,"span",24),l(7),o(),r(8,"span",25),l(9),o(),p(10,"app-icon",26),r(11,"span",27),l(12),o(),_(13,X,2,1,"app-pill",28),r(14,"span",29),l(15),o(),r(16,"span",30),l(17),o(),p(18,"app-icon",31),o()(),_(19,te,35,8,"div",32),o()}if(i&2){let e=t.$implicit,a=c(3);D("border-bottom","1px solid var(--border-subtle)"),n(),I("selected",a.isSelected(e.id)),n(),s("checked",a.isSelected(e.id)),P("aria-label","Select "+e.specId),n(3),s("state",e.state),n(2),x(" ",e.specId," "),n(2),x(" ",e.specTitle??""," "),n(),s("size",13),n(2),x(" ",e.targetQualifiedName," "),n(),f(e.driftAxis?13:-1),n(2),x(" ",e.provenance," "),n(2),x(" ",a.ageOf(e)," "),n(),s("name",a.isExpanded(e.id)?"chevronDown":"chevronRight")("size",13),n(),f(a.isExpanded(e.id)?19:-1)}}function ne(i,t){if(i&1&&(r(0,"div",9),w(1,ie,20,17,"div",17,H),o()),i&2){let e=c(2);n(),k(e.visibleLinks())}}function re(i,t){if(i&1&&(r(0,"div",1)(1,"div",2),p(2,"app-page-head",3),o(),r(3,"div",4),p(4,"app-icon",5),w(5,K,5,8,"button",6,F),p(7,"div",7),_(8,U,8,3),o(),_(9,W,1,0,"app-empty",8)(10,ne,3,0,"div",9),o()),i&2){let e=c();n(2),s("sub",e.resource.state().loading?"loading\u2026":e.allLinks().length+" links need attention"),n(2),s("size",13),n(),k(e.states),n(3),f(e.selectedCount()>0?8:-1),n(),f(e.visibleLinks().length===0?9:10)}}var G=class i{api=C(O);projects=C(L);router=C(M);stateFilter=y({drifted:!0,broken:!0,orphaned:!0});resource=V(this.api,()=>`/api/drift?state=drifted,broken,orphaned${this.projects.projectQuery("&")}`);selected=y(new Set);expanded=y(new Set);allLinks=h(()=>this.resource.state().data?.links??[]);visibleLinks=h(()=>{let t=this.stateFilter();return this.allLinks().filter(e=>t[e.state])});counts=h(()=>{let t={drifted:0,broken:0,orphaned:0};for(let e of this.allLinks())e.state in t&&t[e.state]++;return t});selectedCount=h(()=>this.selected().size);states=["drifted","broken","orphaned"];STATE=$;toggleFilter(t){this.stateFilter.update(e=>T(E({},e),{[t]:!e[t]}))}toggleSelect(t,e){e.stopPropagation(),this.selected.update(a=>{let d=new Set(a);return d.has(t)?d.delete(t):d.add(t),d})}isSelected(t){return this.selected().has(t)}toggleExpand(t){this.expanded.update(e=>{let a=new Set(e);return a.has(t)?a.delete(t):a.add(t),a})}isExpanded(t){return this.expanded().has(t)}ageOf(t){if(!t.updatedAt)return"";let e=Date.now()-t.updatedAt;return e<6e4?"just now":e<36e5?Math.round(e/6e4)+"m":e<864e5?Math.round(e/36e5)+"h":Math.round(e/864e5)+"d"}openSpec(t){this.router.navigate(["/specs"],{queryParams:{sel:t}})}showInGraph(t){this.router.navigate(["/graph"],{queryParams:{focus:"spec:"+t}})}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=z({type:i,selectors:[["app-drift"]],decls:2,vars:1,consts:[["surface","The drift queue"],[1,"page","col"],[2,"padding","16px 18px 0"],["icon","drift","title","Drift queue",3,"sub"],[1,"filter-bar","row","gap-8"],["name","filter",2,"color","var(--text-muted)",3,"size"],["type","button",1,"filter-chip","row","gap-6",3,"background","color","border-color"],[1,"grow"],["icon","check","title","All links in good standing \u2728","body","Nothing has drifted. Every spec link points at code that still matches."],[1,"scroll-y","list-frame"],["type","button",1,"filter-chip","row","gap-6",3,"click"],[2,"text-transform","capitalize"],[1,"tabular",2,"opacity","0.7"],[1,"secondary",2,"font-size","12px"],["type","button",1,"btn","btn-secondary","btn-sm"],["name","refresh",3,"size"],["name","reveal",3,"size"],[1,"drift-row-wrap",3,"border-bottom"],[1,"drift-row-wrap"],[1,"drift-row","row","gap-10"],["type","checkbox",1,"drift-checkbox",3,"click","change","checked"],[1,"row","gap-10","grow",2,"min-width","0","cursor","pointer",3,"click"],[2,"width","92px","flex-shrink","0"],[3,"state"],[1,"mono",2,"font-size","12px","color","var(--node-spec)","flex-shrink","0","width","130px","overflow","hidden","text-overflow","ellipsis","white-space","nowrap"],[1,"secondary",2,"font-size","12.5px","overflow","hidden","text-overflow","ellipsis","white-space","nowrap","flex","0 1 220px"],["name","arrowRight",2,"color","var(--text-muted)","flex-shrink","0",3,"size"],[1,"mono","grow",2,"font-size","11.5px","color","var(--text-secondary)","overflow","hidden","text-overflow","ellipsis","white-space","nowrap"],["color","var(--warn)","bg","var(--warn-soft)"],[1,"mono","muted",2,"font-size","11px","flex-shrink","0","width","48px","text-align","right"],[1,"mono","muted","tabular",2,"font-size","11px","flex-shrink","0","width","32px","text-align","right"],[2,"color","var(--text-muted)","flex-shrink","0",3,"name","size"],[1,"drift-detail"],[1,"row",2,"gap","22px","padding","10px 0","flex-wrap","wrap"],[1,"muted",2,"font-size","10.5px"],[1,"mono",2,"font-size","12.5px","margin-top","1px"],[1,"row","gap-8"],["type","button",1,"btn","btn-primary","btn-sm"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["name","wrench",3,"size"],["name","graph",3,"size"]],template:function(e,a){e&1&&_(0,J,1,0,"app-pick-project-empty",0)(1,re,11,4,"div",1),e&2&&f(a.resource.state().noProject?0:1)},dependencies:[R,A,N,q,j,Q],styles:["[_nghost-%COMP%]{display:contents}.page[_ngcontent-%COMP%]{flex:1;min-height:0}.filter-bar[_ngcontent-%COMP%]{padding:0 18px 12px;flex-wrap:wrap;align-items:center}.filter-chip[_ngcontent-%COMP%]{height:26px;padding:0 10px;border-radius:999px;border:1px solid var(--border-subtle);font-size:11.5px;font-weight:500;cursor:pointer;font-family:inherit;align-items:center;transition:background .12s,color .12s}.list-frame[_ngcontent-%COMP%]{flex:1;border-top:1px solid var(--border-subtle);margin:0}.drift-row[_ngcontent-%COMP%]{padding:10px 14px;cursor:default;align-items:center;transition:background 80ms;background:transparent}.drift-row[_ngcontent-%COMP%]:not(.selected):hover{background:var(--bg-hover)}.drift-row.selected[_ngcontent-%COMP%]{background:var(--accent-soft)}.drift-checkbox[_ngcontent-%COMP%]{accent-color:var(--accent);width:14px;height:14px;flex-shrink:0;cursor:pointer}.drift-detail[_ngcontent-%COMP%]{padding:0 14px 14px 50px;background:var(--bg-canvas)}"],changeDetection:0})};export{G as Drift};
@@ -1,4 +1,4 @@
1
- import{a as j}from"./chunk-G7VZT5KB.js";import{a as ie}from"./chunk-EMGMOEVR.js";import{a as oe}from"./chunk-X2HTISHL.js";import{a as ne}from"./chunk-R5W2MDZN.js";import{a as ee}from"./chunk-WDU3WICG.js";import{a as q,b as te}from"./chunk-HZA6NEAB.js";import{a as Z,c as N}from"./chunk-GR72OOCN.js";import{c as X}from"./chunk-SHPTC4RL.js";import{a as Y}from"./chunk-7RNS77UP.js";import{a as J}from"./chunk-E44X4RH2.js";import{Aa as s,Ga as M,I as y,Ia as v,Ka as c,M as C,N as b,Oa as B,Pa as U,Qa as K,R as Q,T as P,Ta as V,Ua as $,Va as l,W as x,Wa as m,Xa as h,aa as z,ea as o,ka as k,lb as f,ra as g,sa as u,va as D,wa as I,xa as p,ya as a,yb as L,za as r,zb as E}from"./chunk-PDN6QYGJ.js";import"./chunk-Q7L6LLAK.js";var A=null,ue="self.onmessage = () => {};";function re(){return A||(typeof window<"u"&&!window.MonacoEnvironment&&(window.MonacoEnvironment={getWorker:(n,t)=>{let e=new Blob([ue],{type:"text/javascript"}),i=URL.createObjectURL(e);return new Worker(i,{name:t||"monaco-noop"})}}),A=import("./chunk-FMV5PXRC.js"),A)}var ae=!1;function de(n){ae||(ae=!0,_e(n))}function le(n,t){let e=[],i=t.getValue().split(`
1
+ import{a as j}from"./chunk-G7VZT5KB.js";import{a as ie}from"./chunk-EMGMOEVR.js";import{a as oe}from"./chunk-X2HTISHL.js";import{a as ne}from"./chunk-R5W2MDZN.js";import{a as q,b as te}from"./chunk-HZA6NEAB.js";import{a as ee}from"./chunk-WDU3WICG.js";import{c as X}from"./chunk-SHPTC4RL.js";import{a as Z,c as N}from"./chunk-GR72OOCN.js";import{a as Y}from"./chunk-7RNS77UP.js";import{a as J}from"./chunk-E44X4RH2.js";import{Aa as s,Ga as M,I as y,Ia as v,Ka as c,M as C,N as b,Oa as B,Pa as U,Qa as K,R as Q,T as P,Ta as V,Ua as $,Va as l,W as x,Wa as m,Xa as h,aa as z,ea as o,ka as k,lb as f,ra as g,sa as u,va as D,wa as I,xa as p,ya as a,yb as L,za as r,zb as E}from"./chunk-PDN6QYGJ.js";import"./chunk-Q7L6LLAK.js";var A=null,ue="self.onmessage = () => {};";function re(){return A||(typeof window<"u"&&!window.MonacoEnvironment&&(window.MonacoEnvironment={getWorker:(n,t)=>{let e=new Blob([ue],{type:"text/javascript"}),i=URL.createObjectURL(e);return new Worker(i,{name:t||"monaco-noop"})}}),A=import("./chunk-FMV5PXRC.js"),A)}var ae=!1;function de(n){ae||(ae=!0,_e(n))}function le(n,t){let e=[],i=t.getValue().split(`
2
2
  `),d=null,_=new Map,O=/<!--\s*id\s*:\s*([^\s-][^\s]*)\s*-->/,ge=/^#{1,6}\s+/;for(let S=0;S<i.length;S++){let T=i[S]??"",R=S+1,H=T.match(O);if(H&&H[1]){d!==null&&e.push({severity:n.MarkerSeverity.Warning,message:`Stranded <!-- id: ${d.id} -->: no heading follows on line ${d.line+1}.`,startLineNumber:d.line+1,startColumn:1,endLineNumber:d.line+1,endColumn:(i[d.line]??"").length+1,code:"spec_stranded_id"});let w=H[1];d={id:w,line:S};let G=_.get(w);G!==void 0?e.push({severity:n.MarkerSeverity.Warning,message:`Duplicate spec ID "${w}" \u2014 first seen on line ${G+1}. The second occurrence will be silently lost by the parser.`,startLineNumber:R,startColumn:T.indexOf(w)+1,endLineNumber:R,endColumn:T.indexOf(w)+w.length+1,code:"spec_duplicate_id"}):_.set(w,S);continue}ge.test(T)&&(d===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:R,startColumn:1,endLineNumber:R,endColumn:T.length+1,code:"spec_missing_id"}):d=null)}n.editor.setModelMarkers(t,"specship-spec",e)}function _e(n){n.languages.registerCompletionItemProvider("markdown",{provideCompletionItems:(t,e)=>{let i=t.getWordUntilPosition(e),d={startLineNumber:e.lineNumber,endLineNumber:e.lineNumber,startColumn:i.startColumn,endColumn:i.endColumn},_=n.languages.CompletionItemKind,O=n.languages.CompletionItemInsertTextRule;return{suggestions:[{label:"req",kind:_.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:O.InsertAsSnippet,documentation:"Insert a full requirement (heading + acceptance) with embedded IDs.",detail:"SpecShip \xB7 requirement",range:d},{label:"doc",kind:_.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:O.InsertAsSnippet,documentation:"Insert a new spec document with frontmatter.",detail:"SpecShip \xB7 document",range:d},{label:"accept",kind:_.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 +1 @@
1
- import{a as ce}from"./chunk-SEXBRGYK.js";import{a as se}from"./chunk-G7VZT5KB.js";import{a as de}from"./chunk-X2HTISHL.js";import{a as le}from"./chunk-DTRN7FZR.js";import{b as re,c as U}from"./chunk-GR72OOCN.js";import{a as ne,d as ie}from"./chunk-SHPTC4RL.js";import"./chunk-7RNS77UP.js";import{a as oe}from"./chunk-E44X4RH2.js";import{Aa as f,C as V,Ga as $,I as M,Ia as O,Ka as d,M as I,N as z,R as F,Ta as y,Ua as R,Va as l,W as w,Wa as x,X as B,Xa as _,Ya as N,Za as Q,aa as H,bb as X,ea as r,gb as S,hb as Z,ib as P,ka as Y,lb as b,qa as q,ra as p,sa as m,ua as K,va as E,vb as ee,wa as T,xa as u,ya as a,yb as te,za as o,zb as ae}from"./chunk-PDN6QYGJ.js";import"./chunk-Q7L6LLAK.js";function pe(n,t){let i=!t?.manualCleanup?t?.injector?.get(F)??M(F):null,s=Ce(t?.equal),c;t?.requireSync?c=w({kind:0},{equal:s}):c=w({kind:1,value:t?.initialValue},{equal:s});let h,k=n.subscribe({next:v=>c.set({kind:1,value:v}),error:v=>{c.set({kind:2,error:v}),h?.()},complete:()=>{h?.()}});if(t?.requireSync&&c().kind===0)throw new V(601,!1);return h=i?.onDestroy(k.unsubscribe.bind(k)),b(()=>{let v=c();switch(v.kind){case 1:return v.value;case 2:throw v.error;case 0:throw new V(601,!1)}},{equal:t?.equal})}function Ce(n=Object.is){return(t,e)=>t.kind===1&&e.kind===1&&n(t.value,e.value)}var ye=()=>["/sessions"],xe=(n,t)=>t.prompt.id,ke=(n,t)=>t.id,me=(n,t)=>t.name;function Se(n,t){if(n&1&&(a(0,"app-pill",7),l(1),o()),n&2){let e=d();u("color","var(--node-spec)")("bg","var(--node-spec-soft)"),r(),x(e.session().last_model)}}function Me(n,t){if(n&1&&l(0),n&2){let e=d(),i=d();Q(" \xB7 ",i.fmtClock(e.started_at)," \u2013 ",i.fmtClock(e.ended_at)," (",i.fmtDurationSec(e.started_at,e.ended_at),") ")}}function we(n,t){if(n&1&&(a(0,"div",10),l(1),p(2,Me,1,3),o()),n&2){let e=t;r(),_("",e.project_path," "),r(),m(e.started_at&&e.ended_at?2:-1)}}function Pe(n,t){n&1&&(a(0,"div",14),l(1,"Loading session\u2026"),o())}function Ee(n,t){if(n&1){let e=$();a(0,"div",15)(1,"div",18),l(2,"Couldn't load session"),o(),a(3,"div",19),l(4),o(),a(5,"button",20),O("click",function(){I(e);let s=d();return z(s.forceRefresh())}),l(6,"Retry"),o()()}if(n&2){let e,i=d();r(4),x((e=i.resource.state().error)==null?null:e.message)}}function Te(n,t){n&1&&(a(0,"app-pill",59),f(1,"app-icon",73),l(2,"subagent "),o()),n&2&&(u("color","var(--node-route)")("bg","var(--node-route-soft)"),r(),u("size",10))}function Oe(n,t){if(n&1&&f(0,"app-icon",60),n&2){let e=d().$implicit;u("size",12)("title",e.slashCommand)}}function De(n,t){if(n&1&&l(0),n&2){let e=d().$implicit;_(" ",e.prompt.text.length>140?e.prompt.text.slice(0,140)+"\u2026":e.prompt.text," ")}}function Ie(n,t){n&1&&(a(0,"span",62),l(1,"(assistant-only turn)"),o())}function ze(n,t){if(n&1&&(a(0,"span",63),l(1),o()),n&2){let e=d().$implicit;u("title","SpecShip \xB7 spent ~"+e.specshipSpendTokens+" tok \xB7 est. saved ~"+e.specshipSavedTokens+" tok"),r(),_("SS ~",e.specshipSpendTokens," tok")}}function Re(n,t){if(n&1&&(a(0,"span",67),l(1),o()),n&2){let e=d().$implicit,i=d(2);r(),x(i.fmtDurationMs(e.prompt.durationMs))}}function Fe(n,t){if(n&1&&(a(0,"section",74)(1,"div",75),l(2,"User prompt"),o(),a(3,"pre",81),l(4),o()()),n&2){let e=d(2).$implicit;r(4),x(e.prompt.text)}}function $e(n,t){if(n&1&&(a(0,"section",74)(1,"div",75),l(2,"Assistant response"),o(),f(3,"div",82),o()),n&2){let e=d(2).$implicit,i=d(2);r(3),u("innerHTML",i.renderAssistant(e.prompt.assistant_text),H)}}function Be(n,t){if(n&1&&(a(0,"section",74)(1,"details",83)(2,"summary",84),l(3," Extended thinking "),a(4,"span",85),l(5,"(click to expand)"),o()(),f(6,"div",86),o()()),n&2){let e=d(2).$implicit,i=d(2);r(6),u("innerHTML",i.renderAssistant(e.prompt.thinking_text),H)}}function Ne(n,t){if(n&1&&(a(0,"div",77)(1,"div",78),l(2,"Duration"),o(),a(3,"div",79),l(4),o()()),n&2){let e=d(2).$implicit,i=d(2);r(4),x(i.fmtDurationMs(e.prompt.durationMs))}}function je(n,t){if(n&1&&(a(0,"div",77)(1,"div",78),l(2,"Model"),o(),a(3,"div",79),l(4),o()()),n&2){let e=d(2).$implicit;r(4),x(e.prompt.model)}}function Le(n,t){if(n&1&&(a(0,"div",88)(1,"span",89),l(2),o()()),n&2){let e=t.$implicit;u("title",e),r(2),x(e)}}function Ae(n,t){if(n&1&&(a(0,"section",74)(1,"div",75),l(2),o(),a(3,"div",87),E(4,Le,3,2,"div",88,K),o()()),n&2){let e=d(2).$implicit;r(2),_("Files touched \xB7 ",e.filesTouched.length),r(2),T(e.filesTouched)}}function Ve(n,t){n&1&&l(0," \u203A ")}function He(n,t){if(n&1&&(a(0,"span",95),l(1),o()),n&2){let e=d().$implicit;r(),x(e.input_summary)}}function qe(n,t){if(n&1&&(a(0,"span",96),l(1),o()),n&2){let e=d().$implicit,i=d(5);r(),x(i.fmtBytes(e.result_length))}}function Ue(n,t){if(n&1&&(a(0,"pre",97),l(1),o()),n&2){let e=d().$implicit,i=d(5);r(),x(i.formatToolInput(e.input_json))}}function We(n,t){if(n&1){let e=$();a(0,"div",91)(1,"button",92),O("click",function(){let s=I(e).$implicit,c=d(5);return z(c.toggleToolInput(s.id))}),a(2,"span",93),p(3,Ve,1,0),o(),a(4,"span",94),l(5),o(),p(6,He,2,1,"span",95),f(7,"span",31),p(8,qe,2,1,"span",96),o(),p(9,Ue,2,1,"pre",97),o()}if(n&2){let e=t.$implicit,i=d(5);r(),R("has-input",!!e.input_json)("expanded",i.isToolInputExpanded(e.id)),u("disabled",!e.input_json),q("aria-expanded",i.isToolInputExpanded(e.id)),r(),R("open",i.isToolInputExpanded(e.id)),r(),m(e.input_json?3:-1),r(),y("color",i.toolColor(e.tool_name)),r(),x(e.tool_name),r(),m(e.input_summary?6:-1),r(2),m(e.result_length?8:-1),r(),m(e.input_json&&i.isToolInputExpanded(e.id)?9:-1)}}function Ge(n,t){if(n&1&&(a(0,"section",74)(1,"div",75),l(2),o(),a(3,"div",90),E(4,We,10,15,"div",91,ke),o()()),n&2){let e=d(2).$implicit,i=d(2);r(2),N("Tool calls \xB7 ",e.tools.length," \xB7 returned ",i.fmtBytes(e.toolBytes)),r(2),T(e.tools)}}function Je(n,t){if(n&1&&(a(0,"div",72),p(1,Fe,5,1,"section",74),p(2,$e,4,1,"section",74),p(3,Be,7,1,"section",74),a(4,"section",74)(5,"div",75),l(6,"Token breakdown"),o(),a(7,"div",76)(8,"div",77)(9,"div",78),l(10,"Input"),o(),a(11,"div",79),l(12),o()(),a(13,"div",77)(14,"div",78),l(15,"Output"),o(),a(16,"div",79),l(17),o()(),a(18,"div",77)(19,"div",78),l(20,"Cache write"),o(),a(21,"div",79),l(22),o()(),a(23,"div",77)(24,"div",78),l(25,"Cache read"),o(),a(26,"div",79),l(27),o()(),a(28,"div",77)(29,"div",78),l(30,"Cost"),o(),a(31,"div",80),l(32),o()(),p(33,Ne,5,1,"div",77),p(34,je,5,1,"div",77),o()(),p(35,Ae,6,1,"section",74),p(36,Ge,6,2,"section",74),o()),n&2){let e=d().$implicit,i=d(2);r(),m(e.prompt.text?1:-1),r(),m(e.prompt.assistant_text?2:-1),r(),m(e.prompt.thinking_text?3:-1),r(9),x(i.fmtTokens(e.prompt.input_tokens)),r(5),x(i.fmtTokens(e.prompt.output_tokens)),r(5),x(i.fmtTokens(e.prompt.cache_creation_tokens)),r(5),x(i.fmtTokens(e.prompt.cache_read_tokens)),r(5),_("$",e.prompt.cost_usd.toFixed(4)),r(),m(e.prompt.durationMs?33:-1),r(),m(e.prompt.model?34:-1),r(),m(e.filesTouched.length>0?35:-1),r(),m(e.tools.length>0?36:-1)}}function Ye(n,t){if(n&1){let e=$();a(0,"div",34)(1,"button",56),O("click",function(){let s=I(e).$implicit,c=d(2);return z(c.toggleExpand(s.prompt.id))}),a(2,"span",57),l(3),o(),f(4,"span",58),S(5,"number"),p(6,Te,3,3,"app-pill",59),p(7,Oe,1,2,"app-icon",60),a(8,"span",61),p(9,De,1,1)(10,Ie,2,0,"span",62),o(),p(11,ze,2,2,"span",63),a(12,"span",64),f(13,"app-icon",65),a(14,"span",66),l(15),o()(),p(16,Re,2,1,"span",67),a(17,"span",68),l(18),o(),a(19,"span",69),l(20),S(21,"number"),o(),a(22,"span",70),l(23),o(),f(24,"app-icon",71),o(),p(25,Je,37,12,"div",72),o()}if(n&2){let e=t.$implicit,i=d(2);r(),R("expanded",i.isExpanded(e.prompt.id)),q("aria-expanded",i.isExpanded(e.prompt.id)),r(2),x(i.fmtClock(e.prompt.ts)),r(),y("background",i.cacheColor(e.prompt.cache_read_tokens>0?e.prompt.cache_read_tokens/(e.prompt.input_tokens+e.prompt.cache_creation_tokens+e.prompt.cache_read_tokens||1):0)),u("title","Cache: "+Z(5,23,e.prompt.cache_read_tokens)),r(2),m(e.prompt.is_sidechain===1?6:-1),r(),m(e.slashCommand?7:-1),r(2),m(e.prompt.text?9:10),r(2),m(e.specshipSpendTokens>0?11:-1),r(2),u("size",11),r(2),x(e.tools.length),r(),m(e.prompt.durationMs?16:-1),r(2),x(i.fmtTokens(e.totalTokens)),r(),y("color",i.cacheColor(e.totalTokens>0?(e.prompt.cache_read_tokens||0)/e.totalTokens:0)),r(),_(" ",e.totalTokens>0?P(21,25,(e.prompt.cache_read_tokens||0)/e.totalTokens*100,"1.0-0"):0,"% "),r(2),y("color",e.prompt.cost_usd>2.5?"var(--error)":"var(--text-primary)"),r(),_("$",e.prompt.cost_usd.toFixed(2)),r(),u("size",14),r(),m(i.isExpanded(e.prompt.id)?25:-1)}}function Ke(n,t){n&1&&(a(0,"div",17),l(1,"No prompts logged for this session yet."),o())}function Qe(n,t){if(n&1&&(a(0,"span",104),l(1),o()),n&2){let e=d().$implicit;r(),_("\xD7",e.count)}}function Xe(n,t){if(n&1&&(a(0,"span",101),f(1,"app-icon",103),l(2),p(3,Qe,2,1,"span",104),o()),n&2){let e=t.$implicit;r(),u("size",10),r(),_("",e.name," "),r(),m(e.count>1?3:-1)}}function Ze(n,t){if(n&1&&(a(0,"span",104),l(1),o()),n&2){let e=d().$implicit;r(),_("\xD7",e.count)}}function et(n,t){if(n&1&&(a(0,"span",102),f(1,"app-icon",105),l(2),p(3,Ze,2,1,"span",104),o()),n&2){let e=t.$implicit;r(),u("size",10),r(),_("",e.name," "),r(),m(e.count>1?3:-1)}}function tt(n,t){if(n&1&&(a(0,"div",98)(1,"div",36),l(2,"Commands & skills"),o(),a(3,"div",100),E(4,Xe,4,3,"span",101,me),E(6,et,4,3,"span",102,me),o()()),n&2){let e=d();r(4),T(e.slashCommands),r(2),T(e.skills)}}function nt(n,t){if(n&1&&(a(0,"div",36),l(1),o(),f(2,"app-h-bars",106),a(3,"div",107),l(4,"bar = call count"),o()),n&2){let e=d(),i=d(2);r(),_("Tools used \xB7 ",e.byTool.length),r(),u("items",e.byTool)("fmt",i.fmtTokensFn)("color",i.toolBarColor)}}function it(n,t){if(n&1&&(a(0,"div",99)(1,"div",108)(2,"span",109),l(3,"SpecShip"),o(),a(4,"span",110),l(5,"est."),o()(),a(6,"div",111)(7,"div",112)(8,"span",113),l(9,"Spent"),o(),a(10,"span",114),l(11),o()(),a(12,"div",112)(13,"span",113),l(14,"Est. saved"),o(),a(15,"span",115),l(16),o()(),a(17,"div",116)(18,"span",113),l(19,"Net"),o(),a(20,"span",117),l(21),o()()()()),n&2){let e=d(),i=d(2);r(11),_("~",i.fmtTokens(e.specship.spendTokens)," tok"),r(5),_("~",i.fmtTokens(e.specship.savedTokens)," tok"),r(4),y("color",e.specship.netTokens>=0?"var(--success)":"var(--warn)"),r(),N("",e.specship.netTokens>0?"+":"","",i.fmtTokens(e.specship.netTokens)," tok")}}function ot(n,t){if(n&1&&(p(0,tt,8,0,"div",98),p(1,nt,5,4),p(2,it,22,6,"div",99)),n&2){let e=t;m(e.slashCommands.length||e.skills.length?0:-1),r(),m(e.byTool.length?1:-1),r(),m(e.specship&&e.specship.spendTokens>0?2:-1)}}function rt(n,t){if(n&1&&(a(0,"div",43)(1,"span",120),l(2),o(),a(3,"div",31),f(4,"app-bar",121),o(),a(5,"span",122),l(6),o()()),n&2){let e=t.$implicit,i=d(3);r(2),x(i.fmtClock(e.prompt.ts)),r(2),u("frac",e.prompt.cost_usd/i.maxPromptCost())("color",e.prompt.cost_usd>2.5?"var(--error)":"var(--accent)"),r(2),_("$",e.prompt.cost_usd.toFixed(2))}}function at(n,t){if(n&1&&(a(0,"div",118),l(1,"Cost per prompt"),o(),a(2,"div",119),E(3,rt,7,4,"div",43,xe),o()),n&2){let e=d(2);r(3),T(e.groups())}}function lt(n,t){if(n&1){let e=$();a(0,"div",16)(1,"div",21)(2,"div",22)(3,"div",23)(4,"div",24),l(5,"Cost"),o(),a(6,"div",25),l(7),o()(),a(8,"div",23)(9,"div",24),l(10,"Prompts"),o(),a(11,"div",26),l(12),o()(),a(13,"div",23)(14,"div",24),l(15,"Window"),o(),a(16,"div",27),l(17),o()(),a(18,"div",23)(19,"div",24),l(20,"Cache hit"),o(),a(21,"div",26),l(22),S(23,"number"),o()(),a(24,"div",23)(25,"div",24),l(26,"Tool calls"),o(),a(27,"div",26),l(28),o()()(),a(29,"div",28)(30,"span",29),l(31),o(),a(32,"span",30),l(33,"click a prompt for full detail"),o(),f(34,"div",31),a(35,"button",32),O("click",function(){I(e);let s=d();return z(s.expandAll())}),l(36,"Expand all"),o(),a(37,"button",32),O("click",function(){I(e);let s=d();return z(s.collapseAll())}),l(38,"Collapse all"),o()(),a(39,"div",33),E(40,Ye,26,28,"div",34,xe,!1,Ke,2,0,"div",17),o()(),a(43,"div",35)(44,"div",36),l(45,"Token mix"),o(),a(46,"div",37),f(47,"div",38)(48,"div",39)(49,"div",40)(50,"div",41),o(),a(51,"div",42)(52,"div",43),f(53,"span",44),a(54,"span",45),l(55,"Input"),o(),a(56,"span",46),l(57),o(),a(58,"span",47),l(59),S(60,"number"),o()(),a(61,"div",43),f(62,"span",48),a(63,"span",45),l(64,"Output"),o(),a(65,"span",46),l(66),o(),a(67,"span",47),l(68),S(69,"number"),o()(),a(70,"div",43),f(71,"span",49),a(72,"span",45),l(73,"Cache write"),o(),a(74,"span",46),l(75),o(),a(76,"span",47),l(77),S(78,"number"),o()(),a(79,"div",43),f(80,"span",50),a(81,"span",45),l(82,"Cache read"),o(),a(83,"span",46),l(84),o(),a(85,"span",47),l(86),S(87,"number"),o()()(),a(88,"div",51)(89,"div",43),f(90,"app-icon",52),a(91,"span",53),l(92,"Cache effectiveness"),o()(),a(93,"div",54)(94,"span",55),l(95),S(96,"number"),o(),a(97,"span",53),l(98,"of input served from cache"),o()()(),p(99,ot,3,3),p(100,at,5,0),o()()}if(n&2){let e,i=t,s=d();r(7),_("$",i.total_cost_usd.toFixed(2)),r(5),x(i.prompt_count),r(5),N(" ",s.fmtClock(i.started_at)," \u2013 ",s.fmtClock(i.ended_at).split(" ").pop()," "),r(4),y("color",s.cacheColor(s.cacheReadRate())),r(),_(" ",P(23,34,s.cacheReadRate()*100,"1.0-0"),"% "),r(6),x(s.totalToolCalls()),r(3),_("Prompt timeline \xB7 ",s.groups().length),r(9),T(s.groups()),r(7),y("width",s.tokPct("input"),"%"),u("title","Input: "+s.fmtTokens(i.total_input_tokens)),r(),y("width",s.tokPct("output"),"%"),u("title","Output: "+s.fmtTokens(i.total_output_tokens)),r(),y("width",s.tokPct("cacheWrite"),"%"),u("title","Cache write: "+s.fmtTokens(i.total_cache_creation_tokens)),r(),y("width",s.tokPct("cacheRead"),"%"),u("title","Cache read: "+s.fmtTokens(i.total_cache_read_tokens)),r(7),x(s.fmtTokens(i.total_input_tokens)),r(2),_("",P(60,37,s.tokPct("input"),"1.0-0"),"%"),r(7),x(s.fmtTokens(i.total_output_tokens)),r(2),_("",P(69,40,s.tokPct("output"),"1.0-0"),"%"),r(7),x(s.fmtTokens(i.total_cache_creation_tokens)),r(2),_("",P(78,43,s.tokPct("cacheWrite"),"1.0-0"),"%"),r(7),x(s.fmtTokens(i.total_cache_read_tokens)),r(2),_("",P(87,46,s.tokPct("cacheRead"),"1.0-0"),"%"),r(4),u("size",13),r(5),_("",P(96,49,s.cacheReadRate()*100,"1.0-0"),"%"),r(4),m((e=s.summaryData())?99:-1,e),r(),m(s.groups().length>0?100:-1)}}function st(n,t){n&1&&(a(0,"div",17),l(1,"Session not found."),o())}var dt=5e3,ct=/<command-name>([^<]+)<\/command-name>/,pt=new Set(["Read","Edit","Write","NotebookEdit","MultiEdit"]);function mt(n){if(!n)return[];try{let t=JSON.parse(n);return Array.isArray(t)?t.filter(e=>Array.isArray(e)&&e.length>=2&&typeof e[0]=="string"&&typeof e[1]=="number"):[]}catch{return[]}}var ue=class n{api=M(oe);route=M(ne);sanitizer=M(te);destroyRef=M(F);refresh=M(re);liveMode=w("idle");idSig=pe(this.route.paramMap,{initialValue:this.route.snapshot.paramMap});id=b(()=>this.idSig().get("id")??"");localRefreshing=w(!1);expandedIds=w(new Set);expandedToolInputs=w(new Set);resource=U(this.api,()=>{let t=this.id();return t?`/api/claude/session/${encodeURIComponent(t)}`:null});summary=U(this.api,()=>{let t=this.id();return t?`/api/claude/session/${encodeURIComponent(t)}/summary`:null});session=b(()=>this.resource.state().data?.session??null);prompts=b(()=>this.resource.state().data?.prompts??[]);toolCalls=b(()=>this.resource.state().data?.toolCalls??[]);summaryData=b(()=>this.summary.state().data??null);groups=b(()=>{let t=this.prompts(),e=this.toolCalls(),i=new Map;for(let s of e){let c=i.get(s.prompt_id)??[];c.push(s),i.set(s.prompt_id,c)}return t.map(s=>{let c=i.get(s.id)??[],h=(s.input_tokens||0)+(s.output_tokens||0)+(s.cache_creation_tokens||0)+(s.cache_read_tokens||0),k=c.reduce((g,C)=>g+(C.result_length||0),0),v=s.text?ct.exec(s.text):null,D=v?v[1].trim():null,W=c.length>0?Math.max(...c.map(g=>g.ts||0)):0,_e=W>s.ts?W-s.ts:0,j=new Map;for(let g of c)j.set(g.tool_name,(j.get(g.tool_name)??0)+1);let ge=Array.from(j.entries()).map(([g,C])=>({name:g,count:C,color:this.toolColor(g)})).sort((g,C)=>C.count-g.count),G=new Set;for(let g of c)pt.has(g.tool_name)&&g.input_summary&&G.add(g.input_summary);let L=c.filter(g=>g.is_specship===1),J=L.reduce((g,C)=>g+(C.result_length||0),0),fe=L.length>0?Math.ceil(J/4):0,A=new Map;for(let g of L)if(g.resolution==="resolved")for(let[C,be]of mt(g.displaced_files))A.has(C)||A.set(C,be);let ve=Array.from(A.values()).reduce((g,C)=>g+C,0),he=Math.ceil(Math.max(0,ve-J)/4);return{prompt:s,tools:c,totalTokens:h,toolBytes:k,slashCommand:D,durationMs:_e,toolBreakdown:ge,filesTouched:Array.from(G),specshipSpendTokens:fe,specshipSavedTokens:he}})});totalToolCalls=b(()=>this.toolCalls().length);totalTokens=b(()=>{let t=this.session();return t&&(t.total_input_tokens||0)+(t.total_output_tokens||0)+(t.total_cache_creation_tokens||0)+(t.total_cache_read_tokens||0)||1});maxPromptCost=b(()=>{let t=this.groups();return Math.max(1e-4,...t.map(e=>e.prompt.cost_usd||0))});toolBarColor=t=>{let e=t.name;return e==="Read"?"var(--node-spec)":e==="Edit"||e==="Write"||e==="MultiEdit"?"var(--accent)":e==="Bash"?"var(--warn)":e==="Grep"||e==="Glob"?"var(--node-test)":e==="Task"?"var(--node-route)":e.startsWith("mcp__")?"var(--success)":"var(--node-code)"};cacheReadRate=b(()=>{let t=this.session();if(!t)return 0;let e=(t.total_input_tokens||0)+(t.total_cache_creation_tokens||0)+(t.total_cache_read_tokens||0);return e>0?(t.total_cache_read_tokens||0)/e:0});constructor(){B(()=>{!this.resource.state().loading&&this.localRefreshing()&&this.localRefreshing.set(!1)});let t=null,e=null,i=()=>{e!==null&&(clearInterval(e),e=null)},s=()=>{e===null&&(e=setInterval(()=>{typeof document<"u"&&document.visibilityState==="visible"&&this.resource.refetch()},dt))},c=()=>{t&&(t(),t=null)},h=v=>{v&&(c(),t=this.api.openEventStream(`/api/claude/session/${encodeURIComponent(v)}/events`,D=>{D==="prompt_added"||D==="tool_call_added"?this.resource.refetch():D==="snapshot"?(this.liveMode.set("live"),i()):D==="stream_error"&&(this.liveMode.set("polling"),s())},()=>{this.liveMode.set("polling"),s()},["prompt_added","tool_call_added","snapshot","stream_error"]))},k=()=>{if(!(typeof document>"u"))if(document.visibilityState==="visible"){this.resource.refetch();let v=this.id();v&&this.liveMode()==="polling"&&h(v)}else i()};B(()=>{let v=this.id();if(c(),i(),!v){this.liveMode.set("idle");return}h(v)}),typeof document<"u"&&document.addEventListener("visibilitychange",k),this.destroyRef.onDestroy(()=>{c(),i(),this.liveMode.set("idle"),typeof document<"u"&&document.removeEventListener("visibilitychange",k)})}async forceRefresh(){this.localRefreshing.set(!0),await this.refresh.triggerGlobalRefresh()}isExpanded(t){return this.expandedIds().has(t)}toggleExpand(t){this.expandedIds.update(e=>{let i=new Set(e);return i.has(t)?i.delete(t):i.add(t),i})}expandAll(){this.expandedIds.set(new Set(this.prompts().map(t=>t.id)))}collapseAll(){this.expandedIds.set(new Set)}isToolInputExpanded(t){return this.expandedToolInputs().has(t)}toggleToolInput(t){this.expandedToolInputs.update(e=>{let i=new Set(e);return i.has(t)?i.delete(t):i.add(t),i})}renderAssistant(t){return this.sanitizer.bypassSecurityTrustHtml(se(t??""))}formatToolInput(t){if(!t)return"";try{return JSON.stringify(JSON.parse(t),null,2)}catch{return t}}fmtBytes(t){return t?t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} kB`:`${(t/(1024*1024)).toFixed(1)} MB`:"0"}fmtTokens(t){return t<1e3?`${t}`:t<1e6?`${(t/1e3).toFixed(1)}k`:`${(t/1e6).toFixed(2)}M`}fmtTokensFn=t=>this.fmtTokens(t);fmtClock(t){if(!t)return"";try{let e=new Date(t),i=new Date;i.setHours(0,0,0,0);let s=864e5,c=i.getTime()-new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),h=e.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"});return c===0?h:c===s?"Yest "+h:e.toLocaleDateString([],{month:"short",day:"numeric"})+" "+h}catch{return String(t)}}fmtDurationSec(t,e){if(!t||!e)return"";let i=Math.round((e-t)/1e3);if(i<60)return`${i}s`;let s=Math.floor(i/60),c=i%60;if(s<60)return`${s}m ${c}s`;let h=Math.floor(s/60),k=s%60;return`${h}h ${k}m`}fmtDurationMs(t){if(!t||t<=0)return"";if(t<1e3)return`${t}ms`;let e=t/1e3;if(e<60)return`${e.toFixed(e<10?1:0)}s`;let i=Math.floor(e/60),s=Math.round(e%60);if(i<60)return`${i}m ${s}s`;let c=Math.floor(i/60),h=i%60;return`${c}h ${h}m`}basename(t){if(!t)return"";if(t.length<=40)return t;let e=t.split("/");return e.length<=2?t:"\u2026/"+e.slice(-2).join("/")}toolColor(t){return t==="Read"?"var(--node-spec)":t==="Edit"||t==="Write"||t==="MultiEdit"||t==="NotebookEdit"?"var(--accent)":t==="Bash"?"var(--warn)":t==="Grep"||t==="Glob"?"var(--node-test)":t==="Task"?"var(--node-route)":t.startsWith("mcp__")?"var(--success)":"var(--text-secondary)"}cacheColor(t){return t>=.7?"var(--success)":t>=.5?"var(--warn)":"var(--error)"}tokPct(t){let e=this.session();if(!e)return 0;let i=this.totalTokens();return(t==="input"?e.total_input_tokens||0:t==="output"?e.total_output_tokens||0:t==="cacheWrite"?e.total_cache_creation_tokens||0:e.total_cache_read_tokens||0)/i*100}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=Y({type:n,selectors:[["app-session-detail"]],decls:22,vars:20,consts:[[1,"sd-root"],[1,"page-head"],[1,"back-link","btn","btn-ghost","btn-sm",3,"routerLink"],["name","chevronLeft",3,"size"],[1,"title-block"],[1,"title"],[1,"mono","session-id"],[3,"color","bg"],[1,"live-pill",3,"title"],[1,"dot"],[1,"sub"],[1,"page-actions"],["type","button","aria-label","Refresh session detail",1,"btn","btn-secondary","btn-sm","refresh-btn",3,"click","disabled"],["name","refresh",3,"size"],[1,"loading"],[1,"error"],[1,"sd-body"],[1,"empty"],[1,"error-title"],[1,"error-detail"],[1,"btn","btn-secondary","btn-sm",3,"click"],[1,"scroll-y","sd-main"],[1,"stat-strip"],[1,"stat"],[1,"stat-lbl"],[1,"stat-val","cost"],[1,"stat-val","mono"],[1,"stat-val","mono",2,"font-size","12px"],[1,"row","gap-8",2,"justify-content","space-between","margin-bottom","8px"],[1,"eyebrow"],[1,"muted",2,"font-size","11px"],[1,"grow"],["type","button",1,"btn","btn-ghost","btn-sm",3,"click"],[1,"col","gap-6",2,"padding-bottom","16px"],[1,"prompt","card"],[1,"scroll-y","sd-rail"],[1,"eyebrow",2,"margin-bottom","10px"],[1,"tok-bar",2,"margin-bottom","10px"],[1,"tok-seg",2,"background","var(--node-spec)",3,"title"],[1,"tok-seg",2,"background","var(--node-code)",3,"title"],[1,"tok-seg",2,"background","var(--warn)",3,"title"],[1,"tok-seg",2,"background","var(--node-route)",3,"title"],[1,"col","gap-6",2,"margin-bottom","20px"],[1,"row","gap-8"],[2,"width","9px","height","9px","border-radius","2px","background","var(--node-spec)","flex-shrink","0"],[1,"muted","grow",2,"font-size","11.5px"],[1,"mono","tabular",2,"font-size","11.5px"],[1,"mono","tabular","muted",2,"font-size","10px","width","32px","text-align","right"],[2,"width","9px","height","9px","border-radius","2px","background","var(--node-code)","flex-shrink","0"],[2,"width","9px","height","9px","border-radius","2px","background","var(--warn)","flex-shrink","0"],[2,"width","9px","height","9px","border-radius","2px","background","var(--node-route)","flex-shrink","0"],[1,"cache-card",2,"margin-bottom","20px"],["name","database",2,"color","var(--success)",3,"size"],[1,"muted",2,"font-size","10.5px"],[1,"row",2,"align-items","baseline","gap","8px","margin-top","4px"],[1,"tabular",2,"font-size","24px","font-weight","700","color","var(--success)"],["type","button",1,"prompt-head","row","gap-10",3,"click"],[1,"mono","muted",2,"font-size","10.5px","width","52px","flex-shrink","0"],[2,"width","8px","height","8px","border-radius","50%","flex-shrink","0",3,"title"],[2,"flex-shrink","0",3,"color","bg"],["name","command",2,"color","var(--node-code)","flex-shrink","0",3,"size","title"],[1,"grow",2,"font-size","12.5px","overflow","hidden","text-overflow","ellipsis","white-space","nowrap","min-width","0"],[1,"muted"],[1,"pill",2,"color","var(--success)","background","var(--success-soft)","font-family","var(--font-mono)","font-size","10px","font-weight","600","flex-shrink","0","cursor","help",3,"title"],[1,"row","gap-4",2,"flex-shrink","0"],["name","wrench",2,"color","var(--text-muted)",3,"size"],[1,"mono","tabular","muted",2,"font-size","11px"],["title","Wall-clock duration for this prompt",1,"mono","tabular","muted",2,"font-size","11px","width","44px","text-align","right","flex-shrink","0"],[1,"mono","tabular","muted",2,"font-size","11px","width","50px","text-align","right","flex-shrink","0"],[1,"mono","tabular",2,"font-size","11px","width","38px","text-align","right","flex-shrink","0"],[1,"mono","tabular",2,"font-size","13px","font-weight","600","width","54px","text-align","right","flex-shrink","0"],["name","chevronRight",2,"color","var(--text-muted)","flex-shrink","0",3,"size"],[1,"prompt-body"],["name","bot",3,"size"],[1,"prompt-section"],[1,"section-lbl"],[1,"kv-row"],[1,"kv"],[1,"kv-lbl"],[1,"kv-val","mono"],[1,"kv-val","mono","cost"],[1,"prompt-pre"],[1,"assistant-body","md-content",3,"innerHTML"],[1,"thinking-details"],[1,"section-lbl","thinking-summary"],[1,"muted","xs"],[1,"thinking-body","md-content",3,"innerHTML"],[1,"files-touched"],[1,"file-row",3,"title"],[1,"file-path","mono"],[1,"tools"],[1,"tool-block"],["type","button",1,"tool-row",3,"click","disabled"],["aria-hidden","true",1,"tool-chevron","mono"],[1,"tool-name","mono"],[1,"tool-input","mono"],[1,"tool-bytes","mono","muted"],[1,"tool-input-json","mono"],[2,"margin-bottom","20px"],[2,"margin-top","16px","padding","10px 12px","background","var(--success-soft)","border","1px solid rgba(70,194,107,0.25)","border-radius","8px"],[1,"row","gap-6",2,"flex-wrap","wrap"],[1,"pill",2,"color","var(--node-code)","background","var(--node-code-soft)","font-family","var(--font-mono)","font-weight","500"],[1,"pill",2,"color","var(--node-test)","background","var(--node-test-soft)","font-family","var(--font-mono)","font-weight","500"],["name","command",3,"size"],[2,"opacity","0.7"],["name","sparkles",3,"size"],["valueKey","calls",3,"items","fmt","color"],[1,"muted",2,"font-size","10px","margin-top","8px"],[1,"row","gap-8",2,"margin-bottom","4px"],[2,"font-size","10.5px","font-weight","700","color","var(--success)","text-transform","uppercase","letter-spacing","0.04em"],[1,"pill",2,"color","var(--success)","background","rgba(70,194,107,0.15)","font-size","9.5px","padding","1px 5px"],[1,"col","gap-4"],[1,"row","gap-6"],[1,"muted","grow",2,"font-size","11px"],[1,"mono","tabular",2,"font-size","11px","color","var(--text-primary)"],[1,"mono","tabular",2,"font-size","11px","color","var(--success)"],[1,"row","gap-6",2,"border-top","1px dashed rgba(70,194,107,0.3)","padding-top","4px","margin-top","2px"],[1,"mono","tabular",2,"font-size","11px"],[1,"eyebrow",2,"margin","20px 0 10px"],[1,"col","gap-5"],[1,"mono","muted",2,"font-size","10px","width","44px","flex-shrink","0"],[3,"frac","color"],[1,"mono","tabular",2,"font-size","10.5px","width","40px","text-align","right"]],template:function(e,i){if(e&1&&(a(0,"div",0)(1,"header",1)(2,"a",2),f(3,"app-icon",3),l(4," Sessions "),o(),a(5,"div",4)(6,"div",5)(7,"span",6),l(8),o(),p(9,Se,2,3,"app-pill",7),a(10,"span",8),f(11,"span",9),l(12),o()(),p(13,we,3,2,"div",10),o(),a(14,"div",11)(15,"button",12),O("click",function(){return i.forceRefresh()}),f(16,"app-icon",13),l(17),o()()(),p(18,Pe,2,0,"div",14)(19,Ee,7,1,"div",15)(20,lt,101,52,"div",16)(21,st,2,0,"div",17),o()),e&2){let s,c,h;r(2),u("routerLink",X(19,ye)),r(),u("size",14),r(5),x(i.id().slice(0,12)),r(),m((s=i.session())!=null&&s.last_model?9:-1),r(),R("live",i.liveMode()==="live")("polling",i.liveMode()==="polling")("idle",i.liveMode()==="idle"),u("title",i.liveMode()==="live"?"Live \u2014 new prompts push as Claude Code writes them":i.liveMode()==="polling"?"Polling \u2014 SSE unavailable, refetching every 5s":"Idle \u2014 live updates paused"),r(2),_(" ",i.liveMode()==="live"?"Live":i.liveMode()==="polling"?"Polling":"Idle"," "),r(),m((c=i.session())?13:-1,c),r(2),R("spinning",i.localRefreshing()||i.refresh.loading()),u("disabled",i.refresh.loading()),r(),u("size",13),r(),_(" ",i.localRefreshing()||i.refresh.loading()?"Refreshing\u2026":"Refresh"," "),r(),m(i.resource.state().loading&&!i.session()?18:i.resource.state().error?19:(h=i.session())?20:21,h)}},dependencies:[ie,ae,de,le,ce,ee],styles:['@charset "UTF-8";[_nghost-%COMP%]{display:contents}.sd-root[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;min-height:0;padding:16px 18px 0}.page-head[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:12px;margin-bottom:14px;flex-wrap:wrap}.back-link[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px;color:var(--text-muted);text-decoration:none}.title-block[_ngcontent-%COMP%]{flex:1;min-width:250px}.title[_ngcontent-%COMP%]{font-size:var(--fs-title);font-weight:600;letter-spacing:-.01em;display:flex;align-items:center;gap:10px;flex-wrap:wrap}.session-id[_ngcontent-%COMP%]{color:var(--accent);font-size:14px}.live-pill[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:6px;font-size:10.5px;font-weight:600;padding:2px 8px;border-radius:999px;white-space:nowrap;cursor:help}.live-pill[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{width:7px;height:7px;border-radius:50%;flex-shrink:0}.live-pill.live[_ngcontent-%COMP%]{color:var(--success);background:var(--success-soft)}.live-pill.live[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{background:var(--success);animation:_ngcontent-%COMP%_live-pulse 1.6s ease-in-out infinite}.live-pill.polling[_ngcontent-%COMP%]{color:var(--warn);background:var(--warn-soft)}.live-pill.polling[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{background:var(--warn)}.live-pill.idle[_ngcontent-%COMP%]{color:var(--text-muted);background:var(--bg-canvas)}.live-pill.idle[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{background:var(--text-muted)}@keyframes _ngcontent-%COMP%_live-pulse{0%,to{opacity:.4;transform:scale(.85)}50%{opacity:1;transform:scale(1.05)}}.sub[_ngcontent-%COMP%]{color:var(--text-secondary);font-size:12px;margin-top:2px}.page-actions[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.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)}}.sd-body[_ngcontent-%COMP%]{flex:1;display:flex;min-height:0;gap:0}.sd-main[_ngcontent-%COMP%]{flex:1;min-width:0;padding:0 0 18px}.sd-rail[_ngcontent-%COMP%]{width:290px;flex-shrink:0;border-left:1px solid var(--border-subtle);background:var(--bg-panel);padding:16px}.stat-strip[_ngcontent-%COMP%]{display:flex;gap:24px;padding:12px 0;border-top:1px solid var(--border-subtle);border-bottom:1px solid var(--border-subtle);margin-bottom:16px}.stat[_ngcontent-%COMP%] .stat-lbl[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-muted)}.stat[_ngcontent-%COMP%] .stat-val[_ngcontent-%COMP%]{font-size:16px;font-weight:600;margin-top:2px;color:var(--text-primary);font-variant-numeric:tabular-nums}.stat-val.cost[_ngcontent-%COMP%]{color:var(--accent)}.tok-bar[_ngcontent-%COMP%]{display:flex;height:10px;border-radius:999px;overflow:hidden}.tok-seg[_ngcontent-%COMP%]{height:100%}.cache-card[_ngcontent-%COMP%]{background:var(--success-soft);border:1px solid rgba(70,194,107,.25);border-radius:8px;padding:10px 12px}.prompt.card[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:9px;overflow:hidden;transition:border-color .12s}.prompt.card[_ngcontent-%COMP%]:hover{border-color:var(--border-strong)}.prompt-head[_ngcontent-%COMP%]{width:100%;padding:11px 12px;background:transparent;border:0;text-align:left;cursor:pointer;color:inherit;font-family:inherit}.prompt-head[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.prompt-head[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.prompt-body[_ngcontent-%COMP%]{border-top:1px solid var(--border-subtle);padding:14px 16px;background:var(--bg-canvas)}.prompt-section[_ngcontent-%COMP%]{margin-bottom:14px}.prompt-section[_ngcontent-%COMP%]:last-child{margin-bottom:0}.section-lbl[_ngcontent-%COMP%]{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);margin-bottom:6px}.prompt-pre[_ngcontent-%COMP%]{margin:0;padding:10px 12px;background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:7px;font-family:var(--font-mono);font-size:11.5px;line-height:1.55;color:var(--text-primary);white-space:pre-wrap;word-break:break-word;max-height:280px;overflow-y:auto}.kv-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fit,minmax(100px,1fr));gap:10px 18px}.kv[_ngcontent-%COMP%] .kv-lbl[_ngcontent-%COMP%]{font-size:10px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em;font-weight:600}.kv[_ngcontent-%COMP%] .kv-val[_ngcontent-%COMP%]{font-size:12.5px;font-weight:600;margin-top:2px;color:var(--text-primary);font-variant-numeric:tabular-nums}.kv-val.cost[_ngcontent-%COMP%]{color:var(--accent)}.tools[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:3px}.tool-block[_ngcontent-%COMP%]{display:flex;flex-direction:column}.tool-row[_ngcontent-%COMP%]{appearance:none;background:var(--bg-panel);border:1px solid var(--border-subtle);color:inherit;font-family:inherit;text-align:left;display:flex;align-items:center;gap:8px;width:100%;padding:5px 10px;border-radius:6px;font-size:11.5px;cursor:pointer}.tool-row[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--bg-hover)}.tool-row[_ngcontent-%COMP%]:disabled{cursor:default}.tool-row[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.tool-row.expanded[_ngcontent-%COMP%]{border-bottom-left-radius:0;border-bottom-right-radius:0}.tool-chevron[_ngcontent-%COMP%]{width:10px;color:var(--text-muted);transition:transform .12s;font-size:12px;flex-shrink:0;display:inline-block}.tool-chevron.open[_ngcontent-%COMP%]{transform:rotate(90deg);color:var(--accent)}.tool-name[_ngcontent-%COMP%]{font-weight:600;flex-shrink:0}.tool-input[_ngcontent-%COMP%]{color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:11px}.tool-bytes[_ngcontent-%COMP%]{font-size:10.5px;flex-shrink:0}.tool-input-json[_ngcontent-%COMP%]{margin:0;padding:10px 14px;background:var(--bg-canvas);border:1px solid var(--border-subtle);border-top:0;border-radius:0 0 6px 6px;font-family:var(--font-mono);font-size:11px;line-height:1.5;color:var(--text-primary);white-space:pre-wrap;word-break:break-word;max-height:320px;overflow-y:auto}.assistant-body[_ngcontent-%COMP%]{padding:10px 14px;background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:7px;font-size:12.5px;line-height:1.55;color:var(--text-primary);max-height:480px;overflow-y:auto;overflow-wrap:anywhere}.thinking-details[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:7px;padding:8px 12px}.thinking-summary[_ngcontent-%COMP%]{cursor:pointer;list-style:none;display:flex;align-items:center;gap:6px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted)}.thinking-summary[_ngcontent-%COMP%]::-webkit-details-marker{display:none}.thinking-summary[_ngcontent-%COMP%]:before{content:"\\203a";display:inline-block;transition:transform .12s;font-size:14px;color:var(--text-muted)}.thinking-details[open][_ngcontent-%COMP%] .thinking-summary[_ngcontent-%COMP%]:before{transform:rotate(90deg);color:var(--accent)}.thinking-body[_ngcontent-%COMP%]{margin-top:10px;padding:8px 0 0;border-top:1px dashed var(--border-subtle);font-size:12px;line-height:1.55;color:var(--text-secondary);max-height:320px;overflow-y:auto;overflow-wrap:anywhere}.files-touched[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:3px;font-size:11.5px;max-height:180px;overflow-y:auto;padding:6px 10px;background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:6px}.files-touched[_ngcontent-%COMP%] .file-row[_ngcontent-%COMP%]{display:flex;align-items:center;min-width:0}.files-touched[_ngcontent-%COMP%] .file-path[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-secondary)}.loading[_ngcontent-%COMP%]{padding:40px 18px;text-align:center;color:var(--text-muted);font-size:13px}.error[_ngcontent-%COMP%]{padding:16px;margin:12px 0;border-radius:8px;border:1px solid rgba(255,90,90,.35);background:var(--error-soft);color:var(--error);display:flex;flex-direction:column;gap:8px;align-items:flex-start}.error-title[_ngcontent-%COMP%]{font-weight:600;font-size:13px}.error-detail[_ngcontent-%COMP%]{font-size:12px;color:var(--text-secondary)}.empty[_ngcontent-%COMP%]{padding:30px 18px;color:var(--text-muted);font-size:12.5px;text-align:center}.md-content[_ngcontent-%COMP%] .md-h1[_ngcontent-%COMP%]{font-size:14px;font-weight:650;color:var(--text-primary);letter-spacing:-.01em;margin:0 0 8px}.md-content[_ngcontent-%COMP%] .md-h2[_ngcontent-%COMP%]{font-size:12.5px;font-weight:650;color:var(--text-primary);margin:14px 0 4px;padding-bottom:3px;border-bottom:1px solid var(--border-subtle)}.md-content[_ngcontent-%COMP%] .md-h3[_ngcontent-%COMP%]{font-size:12px;font-weight:650;color:var(--text-primary);margin:12px 0 4px}.md-content[_ngcontent-%COMP%] .md-p[_ngcontent-%COMP%]{font-size:12.5px;line-height:1.6;color:var(--text-primary);margin:0 0 4px;overflow-wrap:anywhere}.md-content[_ngcontent-%COMP%] .md-p[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-primary);font-weight:650}.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%], .md-content[_ngcontent-%COMP%] .md-ol[_ngcontent-%COMP%]{padding:0;margin:4px 0 6px}.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%], .md-content[_ngcontent-%COMP%] .md-ol[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{position:relative;padding:2px 0 2px 20px;font-size:12.5px;line-height:1.55;color:var(--text-primary);overflow-wrap:anywhere}.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%]{list-style:none}.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:before{content:"\\2022";position:absolute;left:4px;top:1px;color:var(--text-faint)}.md-content[_ngcontent-%COMP%] .md-spacer[_ngcontent-%COMP%]{height:5px}.md-content[_ngcontent-%COMP%] .md-inline-code[_ngcontent-%COMP%]{font-size:11px;background:var(--bg-canvas);padding:1px 5px;border-radius:3px;border:1px solid var(--border-subtle);color:var(--node-spec)}.md-content[_ngcontent-%COMP%] .md-blockquote[_ngcontent-%COMP%]{margin:5px 0;padding:6px 10px;border-left:3px solid var(--accent);background:var(--accent-soft);color:var(--text-secondary);font-size:12px;line-height:1.5;border-radius:0 5px 5px 0}.md-content[_ngcontent-%COMP%] .md-pre[_ngcontent-%COMP%]{position:relative;margin:6px 0 8px;padding:10px 12px;background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:6px;overflow-x:auto}.md-content[_ngcontent-%COMP%] .md-pre[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{display:block;font-size:11px;line-height:1.5;color:var(--text-primary);white-space:pre}.md-content[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child{margin-top:0}'],changeDetection:0})};export{ue as SessionDetail};
1
+ import{a as ce}from"./chunk-SEXBRGYK.js";import{a as se}from"./chunk-G7VZT5KB.js";import{a as de}from"./chunk-X2HTISHL.js";import{a as le}from"./chunk-DTRN7FZR.js";import{a as ne,d as ie}from"./chunk-SHPTC4RL.js";import{b as re,c as U}from"./chunk-GR72OOCN.js";import"./chunk-7RNS77UP.js";import{a as oe}from"./chunk-E44X4RH2.js";import{Aa as f,C as V,Ga as $,I as M,Ia as O,Ka as d,M as I,N as z,R as F,Ta as y,Ua as R,Va as l,W as w,Wa as x,X as B,Xa as _,Ya as N,Za as Q,aa as H,bb as X,ea as r,gb as S,hb as Z,ib as P,ka as Y,lb as b,qa as q,ra as p,sa as m,ua as K,va as E,vb as ee,wa as T,xa as u,ya as a,yb as te,za as o,zb as ae}from"./chunk-PDN6QYGJ.js";import"./chunk-Q7L6LLAK.js";function pe(n,t){let i=!t?.manualCleanup?t?.injector?.get(F)??M(F):null,s=Ce(t?.equal),c;t?.requireSync?c=w({kind:0},{equal:s}):c=w({kind:1,value:t?.initialValue},{equal:s});let h,k=n.subscribe({next:v=>c.set({kind:1,value:v}),error:v=>{c.set({kind:2,error:v}),h?.()},complete:()=>{h?.()}});if(t?.requireSync&&c().kind===0)throw new V(601,!1);return h=i?.onDestroy(k.unsubscribe.bind(k)),b(()=>{let v=c();switch(v.kind){case 1:return v.value;case 2:throw v.error;case 0:throw new V(601,!1)}},{equal:t?.equal})}function Ce(n=Object.is){return(t,e)=>t.kind===1&&e.kind===1&&n(t.value,e.value)}var ye=()=>["/sessions"],xe=(n,t)=>t.prompt.id,ke=(n,t)=>t.id,me=(n,t)=>t.name;function Se(n,t){if(n&1&&(a(0,"app-pill",7),l(1),o()),n&2){let e=d();u("color","var(--node-spec)")("bg","var(--node-spec-soft)"),r(),x(e.session().last_model)}}function Me(n,t){if(n&1&&l(0),n&2){let e=d(),i=d();Q(" \xB7 ",i.fmtClock(e.started_at)," \u2013 ",i.fmtClock(e.ended_at)," (",i.fmtDurationSec(e.started_at,e.ended_at),") ")}}function we(n,t){if(n&1&&(a(0,"div",10),l(1),p(2,Me,1,3),o()),n&2){let e=t;r(),_("",e.project_path," "),r(),m(e.started_at&&e.ended_at?2:-1)}}function Pe(n,t){n&1&&(a(0,"div",14),l(1,"Loading session\u2026"),o())}function Ee(n,t){if(n&1){let e=$();a(0,"div",15)(1,"div",18),l(2,"Couldn't load session"),o(),a(3,"div",19),l(4),o(),a(5,"button",20),O("click",function(){I(e);let s=d();return z(s.forceRefresh())}),l(6,"Retry"),o()()}if(n&2){let e,i=d();r(4),x((e=i.resource.state().error)==null?null:e.message)}}function Te(n,t){n&1&&(a(0,"app-pill",59),f(1,"app-icon",73),l(2,"subagent "),o()),n&2&&(u("color","var(--node-route)")("bg","var(--node-route-soft)"),r(),u("size",10))}function Oe(n,t){if(n&1&&f(0,"app-icon",60),n&2){let e=d().$implicit;u("size",12)("title",e.slashCommand)}}function De(n,t){if(n&1&&l(0),n&2){let e=d().$implicit;_(" ",e.prompt.text.length>140?e.prompt.text.slice(0,140)+"\u2026":e.prompt.text," ")}}function Ie(n,t){n&1&&(a(0,"span",62),l(1,"(assistant-only turn)"),o())}function ze(n,t){if(n&1&&(a(0,"span",63),l(1),o()),n&2){let e=d().$implicit;u("title","SpecShip \xB7 spent ~"+e.specshipSpendTokens+" tok \xB7 est. saved ~"+e.specshipSavedTokens+" tok"),r(),_("SS ~",e.specshipSpendTokens," tok")}}function Re(n,t){if(n&1&&(a(0,"span",67),l(1),o()),n&2){let e=d().$implicit,i=d(2);r(),x(i.fmtDurationMs(e.prompt.durationMs))}}function Fe(n,t){if(n&1&&(a(0,"section",74)(1,"div",75),l(2,"User prompt"),o(),a(3,"pre",81),l(4),o()()),n&2){let e=d(2).$implicit;r(4),x(e.prompt.text)}}function $e(n,t){if(n&1&&(a(0,"section",74)(1,"div",75),l(2,"Assistant response"),o(),f(3,"div",82),o()),n&2){let e=d(2).$implicit,i=d(2);r(3),u("innerHTML",i.renderAssistant(e.prompt.assistant_text),H)}}function Be(n,t){if(n&1&&(a(0,"section",74)(1,"details",83)(2,"summary",84),l(3," Extended thinking "),a(4,"span",85),l(5,"(click to expand)"),o()(),f(6,"div",86),o()()),n&2){let e=d(2).$implicit,i=d(2);r(6),u("innerHTML",i.renderAssistant(e.prompt.thinking_text),H)}}function Ne(n,t){if(n&1&&(a(0,"div",77)(1,"div",78),l(2,"Duration"),o(),a(3,"div",79),l(4),o()()),n&2){let e=d(2).$implicit,i=d(2);r(4),x(i.fmtDurationMs(e.prompt.durationMs))}}function je(n,t){if(n&1&&(a(0,"div",77)(1,"div",78),l(2,"Model"),o(),a(3,"div",79),l(4),o()()),n&2){let e=d(2).$implicit;r(4),x(e.prompt.model)}}function Le(n,t){if(n&1&&(a(0,"div",88)(1,"span",89),l(2),o()()),n&2){let e=t.$implicit;u("title",e),r(2),x(e)}}function Ae(n,t){if(n&1&&(a(0,"section",74)(1,"div",75),l(2),o(),a(3,"div",87),E(4,Le,3,2,"div",88,K),o()()),n&2){let e=d(2).$implicit;r(2),_("Files touched \xB7 ",e.filesTouched.length),r(2),T(e.filesTouched)}}function Ve(n,t){n&1&&l(0," \u203A ")}function He(n,t){if(n&1&&(a(0,"span",95),l(1),o()),n&2){let e=d().$implicit;r(),x(e.input_summary)}}function qe(n,t){if(n&1&&(a(0,"span",96),l(1),o()),n&2){let e=d().$implicit,i=d(5);r(),x(i.fmtBytes(e.result_length))}}function Ue(n,t){if(n&1&&(a(0,"pre",97),l(1),o()),n&2){let e=d().$implicit,i=d(5);r(),x(i.formatToolInput(e.input_json))}}function We(n,t){if(n&1){let e=$();a(0,"div",91)(1,"button",92),O("click",function(){let s=I(e).$implicit,c=d(5);return z(c.toggleToolInput(s.id))}),a(2,"span",93),p(3,Ve,1,0),o(),a(4,"span",94),l(5),o(),p(6,He,2,1,"span",95),f(7,"span",31),p(8,qe,2,1,"span",96),o(),p(9,Ue,2,1,"pre",97),o()}if(n&2){let e=t.$implicit,i=d(5);r(),R("has-input",!!e.input_json)("expanded",i.isToolInputExpanded(e.id)),u("disabled",!e.input_json),q("aria-expanded",i.isToolInputExpanded(e.id)),r(),R("open",i.isToolInputExpanded(e.id)),r(),m(e.input_json?3:-1),r(),y("color",i.toolColor(e.tool_name)),r(),x(e.tool_name),r(),m(e.input_summary?6:-1),r(2),m(e.result_length?8:-1),r(),m(e.input_json&&i.isToolInputExpanded(e.id)?9:-1)}}function Ge(n,t){if(n&1&&(a(0,"section",74)(1,"div",75),l(2),o(),a(3,"div",90),E(4,We,10,15,"div",91,ke),o()()),n&2){let e=d(2).$implicit,i=d(2);r(2),N("Tool calls \xB7 ",e.tools.length," \xB7 returned ",i.fmtBytes(e.toolBytes)),r(2),T(e.tools)}}function Je(n,t){if(n&1&&(a(0,"div",72),p(1,Fe,5,1,"section",74),p(2,$e,4,1,"section",74),p(3,Be,7,1,"section",74),a(4,"section",74)(5,"div",75),l(6,"Token breakdown"),o(),a(7,"div",76)(8,"div",77)(9,"div",78),l(10,"Input"),o(),a(11,"div",79),l(12),o()(),a(13,"div",77)(14,"div",78),l(15,"Output"),o(),a(16,"div",79),l(17),o()(),a(18,"div",77)(19,"div",78),l(20,"Cache write"),o(),a(21,"div",79),l(22),o()(),a(23,"div",77)(24,"div",78),l(25,"Cache read"),o(),a(26,"div",79),l(27),o()(),a(28,"div",77)(29,"div",78),l(30,"Cost"),o(),a(31,"div",80),l(32),o()(),p(33,Ne,5,1,"div",77),p(34,je,5,1,"div",77),o()(),p(35,Ae,6,1,"section",74),p(36,Ge,6,2,"section",74),o()),n&2){let e=d().$implicit,i=d(2);r(),m(e.prompt.text?1:-1),r(),m(e.prompt.assistant_text?2:-1),r(),m(e.prompt.thinking_text?3:-1),r(9),x(i.fmtTokens(e.prompt.input_tokens)),r(5),x(i.fmtTokens(e.prompt.output_tokens)),r(5),x(i.fmtTokens(e.prompt.cache_creation_tokens)),r(5),x(i.fmtTokens(e.prompt.cache_read_tokens)),r(5),_("$",e.prompt.cost_usd.toFixed(4)),r(),m(e.prompt.durationMs?33:-1),r(),m(e.prompt.model?34:-1),r(),m(e.filesTouched.length>0?35:-1),r(),m(e.tools.length>0?36:-1)}}function Ye(n,t){if(n&1){let e=$();a(0,"div",34)(1,"button",56),O("click",function(){let s=I(e).$implicit,c=d(2);return z(c.toggleExpand(s.prompt.id))}),a(2,"span",57),l(3),o(),f(4,"span",58),S(5,"number"),p(6,Te,3,3,"app-pill",59),p(7,Oe,1,2,"app-icon",60),a(8,"span",61),p(9,De,1,1)(10,Ie,2,0,"span",62),o(),p(11,ze,2,2,"span",63),a(12,"span",64),f(13,"app-icon",65),a(14,"span",66),l(15),o()(),p(16,Re,2,1,"span",67),a(17,"span",68),l(18),o(),a(19,"span",69),l(20),S(21,"number"),o(),a(22,"span",70),l(23),o(),f(24,"app-icon",71),o(),p(25,Je,37,12,"div",72),o()}if(n&2){let e=t.$implicit,i=d(2);r(),R("expanded",i.isExpanded(e.prompt.id)),q("aria-expanded",i.isExpanded(e.prompt.id)),r(2),x(i.fmtClock(e.prompt.ts)),r(),y("background",i.cacheColor(e.prompt.cache_read_tokens>0?e.prompt.cache_read_tokens/(e.prompt.input_tokens+e.prompt.cache_creation_tokens+e.prompt.cache_read_tokens||1):0)),u("title","Cache: "+Z(5,23,e.prompt.cache_read_tokens)),r(2),m(e.prompt.is_sidechain===1?6:-1),r(),m(e.slashCommand?7:-1),r(2),m(e.prompt.text?9:10),r(2),m(e.specshipSpendTokens>0?11:-1),r(2),u("size",11),r(2),x(e.tools.length),r(),m(e.prompt.durationMs?16:-1),r(2),x(i.fmtTokens(e.totalTokens)),r(),y("color",i.cacheColor(e.totalTokens>0?(e.prompt.cache_read_tokens||0)/e.totalTokens:0)),r(),_(" ",e.totalTokens>0?P(21,25,(e.prompt.cache_read_tokens||0)/e.totalTokens*100,"1.0-0"):0,"% "),r(2),y("color",e.prompt.cost_usd>2.5?"var(--error)":"var(--text-primary)"),r(),_("$",e.prompt.cost_usd.toFixed(2)),r(),u("size",14),r(),m(i.isExpanded(e.prompt.id)?25:-1)}}function Ke(n,t){n&1&&(a(0,"div",17),l(1,"No prompts logged for this session yet."),o())}function Qe(n,t){if(n&1&&(a(0,"span",104),l(1),o()),n&2){let e=d().$implicit;r(),_("\xD7",e.count)}}function Xe(n,t){if(n&1&&(a(0,"span",101),f(1,"app-icon",103),l(2),p(3,Qe,2,1,"span",104),o()),n&2){let e=t.$implicit;r(),u("size",10),r(),_("",e.name," "),r(),m(e.count>1?3:-1)}}function Ze(n,t){if(n&1&&(a(0,"span",104),l(1),o()),n&2){let e=d().$implicit;r(),_("\xD7",e.count)}}function et(n,t){if(n&1&&(a(0,"span",102),f(1,"app-icon",105),l(2),p(3,Ze,2,1,"span",104),o()),n&2){let e=t.$implicit;r(),u("size",10),r(),_("",e.name," "),r(),m(e.count>1?3:-1)}}function tt(n,t){if(n&1&&(a(0,"div",98)(1,"div",36),l(2,"Commands & skills"),o(),a(3,"div",100),E(4,Xe,4,3,"span",101,me),E(6,et,4,3,"span",102,me),o()()),n&2){let e=d();r(4),T(e.slashCommands),r(2),T(e.skills)}}function nt(n,t){if(n&1&&(a(0,"div",36),l(1),o(),f(2,"app-h-bars",106),a(3,"div",107),l(4,"bar = call count"),o()),n&2){let e=d(),i=d(2);r(),_("Tools used \xB7 ",e.byTool.length),r(),u("items",e.byTool)("fmt",i.fmtTokensFn)("color",i.toolBarColor)}}function it(n,t){if(n&1&&(a(0,"div",99)(1,"div",108)(2,"span",109),l(3,"SpecShip"),o(),a(4,"span",110),l(5,"est."),o()(),a(6,"div",111)(7,"div",112)(8,"span",113),l(9,"Spent"),o(),a(10,"span",114),l(11),o()(),a(12,"div",112)(13,"span",113),l(14,"Est. saved"),o(),a(15,"span",115),l(16),o()(),a(17,"div",116)(18,"span",113),l(19,"Net"),o(),a(20,"span",117),l(21),o()()()()),n&2){let e=d(),i=d(2);r(11),_("~",i.fmtTokens(e.specship.spendTokens)," tok"),r(5),_("~",i.fmtTokens(e.specship.savedTokens)," tok"),r(4),y("color",e.specship.netTokens>=0?"var(--success)":"var(--warn)"),r(),N("",e.specship.netTokens>0?"+":"","",i.fmtTokens(e.specship.netTokens)," tok")}}function ot(n,t){if(n&1&&(p(0,tt,8,0,"div",98),p(1,nt,5,4),p(2,it,22,6,"div",99)),n&2){let e=t;m(e.slashCommands.length||e.skills.length?0:-1),r(),m(e.byTool.length?1:-1),r(),m(e.specship&&e.specship.spendTokens>0?2:-1)}}function rt(n,t){if(n&1&&(a(0,"div",43)(1,"span",120),l(2),o(),a(3,"div",31),f(4,"app-bar",121),o(),a(5,"span",122),l(6),o()()),n&2){let e=t.$implicit,i=d(3);r(2),x(i.fmtClock(e.prompt.ts)),r(2),u("frac",e.prompt.cost_usd/i.maxPromptCost())("color",e.prompt.cost_usd>2.5?"var(--error)":"var(--accent)"),r(2),_("$",e.prompt.cost_usd.toFixed(2))}}function at(n,t){if(n&1&&(a(0,"div",118),l(1,"Cost per prompt"),o(),a(2,"div",119),E(3,rt,7,4,"div",43,xe),o()),n&2){let e=d(2);r(3),T(e.groups())}}function lt(n,t){if(n&1){let e=$();a(0,"div",16)(1,"div",21)(2,"div",22)(3,"div",23)(4,"div",24),l(5,"Cost"),o(),a(6,"div",25),l(7),o()(),a(8,"div",23)(9,"div",24),l(10,"Prompts"),o(),a(11,"div",26),l(12),o()(),a(13,"div",23)(14,"div",24),l(15,"Window"),o(),a(16,"div",27),l(17),o()(),a(18,"div",23)(19,"div",24),l(20,"Cache hit"),o(),a(21,"div",26),l(22),S(23,"number"),o()(),a(24,"div",23)(25,"div",24),l(26,"Tool calls"),o(),a(27,"div",26),l(28),o()()(),a(29,"div",28)(30,"span",29),l(31),o(),a(32,"span",30),l(33,"click a prompt for full detail"),o(),f(34,"div",31),a(35,"button",32),O("click",function(){I(e);let s=d();return z(s.expandAll())}),l(36,"Expand all"),o(),a(37,"button",32),O("click",function(){I(e);let s=d();return z(s.collapseAll())}),l(38,"Collapse all"),o()(),a(39,"div",33),E(40,Ye,26,28,"div",34,xe,!1,Ke,2,0,"div",17),o()(),a(43,"div",35)(44,"div",36),l(45,"Token mix"),o(),a(46,"div",37),f(47,"div",38)(48,"div",39)(49,"div",40)(50,"div",41),o(),a(51,"div",42)(52,"div",43),f(53,"span",44),a(54,"span",45),l(55,"Input"),o(),a(56,"span",46),l(57),o(),a(58,"span",47),l(59),S(60,"number"),o()(),a(61,"div",43),f(62,"span",48),a(63,"span",45),l(64,"Output"),o(),a(65,"span",46),l(66),o(),a(67,"span",47),l(68),S(69,"number"),o()(),a(70,"div",43),f(71,"span",49),a(72,"span",45),l(73,"Cache write"),o(),a(74,"span",46),l(75),o(),a(76,"span",47),l(77),S(78,"number"),o()(),a(79,"div",43),f(80,"span",50),a(81,"span",45),l(82,"Cache read"),o(),a(83,"span",46),l(84),o(),a(85,"span",47),l(86),S(87,"number"),o()()(),a(88,"div",51)(89,"div",43),f(90,"app-icon",52),a(91,"span",53),l(92,"Cache effectiveness"),o()(),a(93,"div",54)(94,"span",55),l(95),S(96,"number"),o(),a(97,"span",53),l(98,"of input served from cache"),o()()(),p(99,ot,3,3),p(100,at,5,0),o()()}if(n&2){let e,i=t,s=d();r(7),_("$",i.total_cost_usd.toFixed(2)),r(5),x(i.prompt_count),r(5),N(" ",s.fmtClock(i.started_at)," \u2013 ",s.fmtClock(i.ended_at).split(" ").pop()," "),r(4),y("color",s.cacheColor(s.cacheReadRate())),r(),_(" ",P(23,34,s.cacheReadRate()*100,"1.0-0"),"% "),r(6),x(s.totalToolCalls()),r(3),_("Prompt timeline \xB7 ",s.groups().length),r(9),T(s.groups()),r(7),y("width",s.tokPct("input"),"%"),u("title","Input: "+s.fmtTokens(i.total_input_tokens)),r(),y("width",s.tokPct("output"),"%"),u("title","Output: "+s.fmtTokens(i.total_output_tokens)),r(),y("width",s.tokPct("cacheWrite"),"%"),u("title","Cache write: "+s.fmtTokens(i.total_cache_creation_tokens)),r(),y("width",s.tokPct("cacheRead"),"%"),u("title","Cache read: "+s.fmtTokens(i.total_cache_read_tokens)),r(7),x(s.fmtTokens(i.total_input_tokens)),r(2),_("",P(60,37,s.tokPct("input"),"1.0-0"),"%"),r(7),x(s.fmtTokens(i.total_output_tokens)),r(2),_("",P(69,40,s.tokPct("output"),"1.0-0"),"%"),r(7),x(s.fmtTokens(i.total_cache_creation_tokens)),r(2),_("",P(78,43,s.tokPct("cacheWrite"),"1.0-0"),"%"),r(7),x(s.fmtTokens(i.total_cache_read_tokens)),r(2),_("",P(87,46,s.tokPct("cacheRead"),"1.0-0"),"%"),r(4),u("size",13),r(5),_("",P(96,49,s.cacheReadRate()*100,"1.0-0"),"%"),r(4),m((e=s.summaryData())?99:-1,e),r(),m(s.groups().length>0?100:-1)}}function st(n,t){n&1&&(a(0,"div",17),l(1,"Session not found."),o())}var dt=5e3,ct=/<command-name>([^<]+)<\/command-name>/,pt=new Set(["Read","Edit","Write","NotebookEdit","MultiEdit"]);function mt(n){if(!n)return[];try{let t=JSON.parse(n);return Array.isArray(t)?t.filter(e=>Array.isArray(e)&&e.length>=2&&typeof e[0]=="string"&&typeof e[1]=="number"):[]}catch{return[]}}var ue=class n{api=M(oe);route=M(ne);sanitizer=M(te);destroyRef=M(F);refresh=M(re);liveMode=w("idle");idSig=pe(this.route.paramMap,{initialValue:this.route.snapshot.paramMap});id=b(()=>this.idSig().get("id")??"");localRefreshing=w(!1);expandedIds=w(new Set);expandedToolInputs=w(new Set);resource=U(this.api,()=>{let t=this.id();return t?`/api/claude/session/${encodeURIComponent(t)}`:null});summary=U(this.api,()=>{let t=this.id();return t?`/api/claude/session/${encodeURIComponent(t)}/summary`:null});session=b(()=>this.resource.state().data?.session??null);prompts=b(()=>this.resource.state().data?.prompts??[]);toolCalls=b(()=>this.resource.state().data?.toolCalls??[]);summaryData=b(()=>this.summary.state().data??null);groups=b(()=>{let t=this.prompts(),e=this.toolCalls(),i=new Map;for(let s of e){let c=i.get(s.prompt_id)??[];c.push(s),i.set(s.prompt_id,c)}return t.map(s=>{let c=i.get(s.id)??[],h=(s.input_tokens||0)+(s.output_tokens||0)+(s.cache_creation_tokens||0)+(s.cache_read_tokens||0),k=c.reduce((g,C)=>g+(C.result_length||0),0),v=s.text?ct.exec(s.text):null,D=v?v[1].trim():null,W=c.length>0?Math.max(...c.map(g=>g.ts||0)):0,_e=W>s.ts?W-s.ts:0,j=new Map;for(let g of c)j.set(g.tool_name,(j.get(g.tool_name)??0)+1);let ge=Array.from(j.entries()).map(([g,C])=>({name:g,count:C,color:this.toolColor(g)})).sort((g,C)=>C.count-g.count),G=new Set;for(let g of c)pt.has(g.tool_name)&&g.input_summary&&G.add(g.input_summary);let L=c.filter(g=>g.is_specship===1),J=L.reduce((g,C)=>g+(C.result_length||0),0),fe=L.length>0?Math.ceil(J/4):0,A=new Map;for(let g of L)if(g.resolution==="resolved")for(let[C,be]of mt(g.displaced_files))A.has(C)||A.set(C,be);let ve=Array.from(A.values()).reduce((g,C)=>g+C,0),he=Math.ceil(Math.max(0,ve-J)/4);return{prompt:s,tools:c,totalTokens:h,toolBytes:k,slashCommand:D,durationMs:_e,toolBreakdown:ge,filesTouched:Array.from(G),specshipSpendTokens:fe,specshipSavedTokens:he}})});totalToolCalls=b(()=>this.toolCalls().length);totalTokens=b(()=>{let t=this.session();return t&&(t.total_input_tokens||0)+(t.total_output_tokens||0)+(t.total_cache_creation_tokens||0)+(t.total_cache_read_tokens||0)||1});maxPromptCost=b(()=>{let t=this.groups();return Math.max(1e-4,...t.map(e=>e.prompt.cost_usd||0))});toolBarColor=t=>{let e=t.name;return e==="Read"?"var(--node-spec)":e==="Edit"||e==="Write"||e==="MultiEdit"?"var(--accent)":e==="Bash"?"var(--warn)":e==="Grep"||e==="Glob"?"var(--node-test)":e==="Task"?"var(--node-route)":e.startsWith("mcp__")?"var(--success)":"var(--node-code)"};cacheReadRate=b(()=>{let t=this.session();if(!t)return 0;let e=(t.total_input_tokens||0)+(t.total_cache_creation_tokens||0)+(t.total_cache_read_tokens||0);return e>0?(t.total_cache_read_tokens||0)/e:0});constructor(){B(()=>{!this.resource.state().loading&&this.localRefreshing()&&this.localRefreshing.set(!1)});let t=null,e=null,i=()=>{e!==null&&(clearInterval(e),e=null)},s=()=>{e===null&&(e=setInterval(()=>{typeof document<"u"&&document.visibilityState==="visible"&&this.resource.refetch()},dt))},c=()=>{t&&(t(),t=null)},h=v=>{v&&(c(),t=this.api.openEventStream(`/api/claude/session/${encodeURIComponent(v)}/events`,D=>{D==="prompt_added"||D==="tool_call_added"?this.resource.refetch():D==="snapshot"?(this.liveMode.set("live"),i()):D==="stream_error"&&(this.liveMode.set("polling"),s())},()=>{this.liveMode.set("polling"),s()},["prompt_added","tool_call_added","snapshot","stream_error"]))},k=()=>{if(!(typeof document>"u"))if(document.visibilityState==="visible"){this.resource.refetch();let v=this.id();v&&this.liveMode()==="polling"&&h(v)}else i()};B(()=>{let v=this.id();if(c(),i(),!v){this.liveMode.set("idle");return}h(v)}),typeof document<"u"&&document.addEventListener("visibilitychange",k),this.destroyRef.onDestroy(()=>{c(),i(),this.liveMode.set("idle"),typeof document<"u"&&document.removeEventListener("visibilitychange",k)})}async forceRefresh(){this.localRefreshing.set(!0),await this.refresh.triggerGlobalRefresh()}isExpanded(t){return this.expandedIds().has(t)}toggleExpand(t){this.expandedIds.update(e=>{let i=new Set(e);return i.has(t)?i.delete(t):i.add(t),i})}expandAll(){this.expandedIds.set(new Set(this.prompts().map(t=>t.id)))}collapseAll(){this.expandedIds.set(new Set)}isToolInputExpanded(t){return this.expandedToolInputs().has(t)}toggleToolInput(t){this.expandedToolInputs.update(e=>{let i=new Set(e);return i.has(t)?i.delete(t):i.add(t),i})}renderAssistant(t){return this.sanitizer.bypassSecurityTrustHtml(se(t??""))}formatToolInput(t){if(!t)return"";try{return JSON.stringify(JSON.parse(t),null,2)}catch{return t}}fmtBytes(t){return t?t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} kB`:`${(t/(1024*1024)).toFixed(1)} MB`:"0"}fmtTokens(t){return t<1e3?`${t}`:t<1e6?`${(t/1e3).toFixed(1)}k`:`${(t/1e6).toFixed(2)}M`}fmtTokensFn=t=>this.fmtTokens(t);fmtClock(t){if(!t)return"";try{let e=new Date(t),i=new Date;i.setHours(0,0,0,0);let s=864e5,c=i.getTime()-new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),h=e.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"});return c===0?h:c===s?"Yest "+h:e.toLocaleDateString([],{month:"short",day:"numeric"})+" "+h}catch{return String(t)}}fmtDurationSec(t,e){if(!t||!e)return"";let i=Math.round((e-t)/1e3);if(i<60)return`${i}s`;let s=Math.floor(i/60),c=i%60;if(s<60)return`${s}m ${c}s`;let h=Math.floor(s/60),k=s%60;return`${h}h ${k}m`}fmtDurationMs(t){if(!t||t<=0)return"";if(t<1e3)return`${t}ms`;let e=t/1e3;if(e<60)return`${e.toFixed(e<10?1:0)}s`;let i=Math.floor(e/60),s=Math.round(e%60);if(i<60)return`${i}m ${s}s`;let c=Math.floor(i/60),h=i%60;return`${c}h ${h}m`}basename(t){if(!t)return"";if(t.length<=40)return t;let e=t.split("/");return e.length<=2?t:"\u2026/"+e.slice(-2).join("/")}toolColor(t){return t==="Read"?"var(--node-spec)":t==="Edit"||t==="Write"||t==="MultiEdit"||t==="NotebookEdit"?"var(--accent)":t==="Bash"?"var(--warn)":t==="Grep"||t==="Glob"?"var(--node-test)":t==="Task"?"var(--node-route)":t.startsWith("mcp__")?"var(--success)":"var(--text-secondary)"}cacheColor(t){return t>=.7?"var(--success)":t>=.5?"var(--warn)":"var(--error)"}tokPct(t){let e=this.session();if(!e)return 0;let i=this.totalTokens();return(t==="input"?e.total_input_tokens||0:t==="output"?e.total_output_tokens||0:t==="cacheWrite"?e.total_cache_creation_tokens||0:e.total_cache_read_tokens||0)/i*100}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=Y({type:n,selectors:[["app-session-detail"]],decls:22,vars:20,consts:[[1,"sd-root"],[1,"page-head"],[1,"back-link","btn","btn-ghost","btn-sm",3,"routerLink"],["name","chevronLeft",3,"size"],[1,"title-block"],[1,"title"],[1,"mono","session-id"],[3,"color","bg"],[1,"live-pill",3,"title"],[1,"dot"],[1,"sub"],[1,"page-actions"],["type","button","aria-label","Refresh session detail",1,"btn","btn-secondary","btn-sm","refresh-btn",3,"click","disabled"],["name","refresh",3,"size"],[1,"loading"],[1,"error"],[1,"sd-body"],[1,"empty"],[1,"error-title"],[1,"error-detail"],[1,"btn","btn-secondary","btn-sm",3,"click"],[1,"scroll-y","sd-main"],[1,"stat-strip"],[1,"stat"],[1,"stat-lbl"],[1,"stat-val","cost"],[1,"stat-val","mono"],[1,"stat-val","mono",2,"font-size","12px"],[1,"row","gap-8",2,"justify-content","space-between","margin-bottom","8px"],[1,"eyebrow"],[1,"muted",2,"font-size","11px"],[1,"grow"],["type","button",1,"btn","btn-ghost","btn-sm",3,"click"],[1,"col","gap-6",2,"padding-bottom","16px"],[1,"prompt","card"],[1,"scroll-y","sd-rail"],[1,"eyebrow",2,"margin-bottom","10px"],[1,"tok-bar",2,"margin-bottom","10px"],[1,"tok-seg",2,"background","var(--node-spec)",3,"title"],[1,"tok-seg",2,"background","var(--node-code)",3,"title"],[1,"tok-seg",2,"background","var(--warn)",3,"title"],[1,"tok-seg",2,"background","var(--node-route)",3,"title"],[1,"col","gap-6",2,"margin-bottom","20px"],[1,"row","gap-8"],[2,"width","9px","height","9px","border-radius","2px","background","var(--node-spec)","flex-shrink","0"],[1,"muted","grow",2,"font-size","11.5px"],[1,"mono","tabular",2,"font-size","11.5px"],[1,"mono","tabular","muted",2,"font-size","10px","width","32px","text-align","right"],[2,"width","9px","height","9px","border-radius","2px","background","var(--node-code)","flex-shrink","0"],[2,"width","9px","height","9px","border-radius","2px","background","var(--warn)","flex-shrink","0"],[2,"width","9px","height","9px","border-radius","2px","background","var(--node-route)","flex-shrink","0"],[1,"cache-card",2,"margin-bottom","20px"],["name","database",2,"color","var(--success)",3,"size"],[1,"muted",2,"font-size","10.5px"],[1,"row",2,"align-items","baseline","gap","8px","margin-top","4px"],[1,"tabular",2,"font-size","24px","font-weight","700","color","var(--success)"],["type","button",1,"prompt-head","row","gap-10",3,"click"],[1,"mono","muted",2,"font-size","10.5px","width","52px","flex-shrink","0"],[2,"width","8px","height","8px","border-radius","50%","flex-shrink","0",3,"title"],[2,"flex-shrink","0",3,"color","bg"],["name","command",2,"color","var(--node-code)","flex-shrink","0",3,"size","title"],[1,"grow",2,"font-size","12.5px","overflow","hidden","text-overflow","ellipsis","white-space","nowrap","min-width","0"],[1,"muted"],[1,"pill",2,"color","var(--success)","background","var(--success-soft)","font-family","var(--font-mono)","font-size","10px","font-weight","600","flex-shrink","0","cursor","help",3,"title"],[1,"row","gap-4",2,"flex-shrink","0"],["name","wrench",2,"color","var(--text-muted)",3,"size"],[1,"mono","tabular","muted",2,"font-size","11px"],["title","Wall-clock duration for this prompt",1,"mono","tabular","muted",2,"font-size","11px","width","44px","text-align","right","flex-shrink","0"],[1,"mono","tabular","muted",2,"font-size","11px","width","50px","text-align","right","flex-shrink","0"],[1,"mono","tabular",2,"font-size","11px","width","38px","text-align","right","flex-shrink","0"],[1,"mono","tabular",2,"font-size","13px","font-weight","600","width","54px","text-align","right","flex-shrink","0"],["name","chevronRight",2,"color","var(--text-muted)","flex-shrink","0",3,"size"],[1,"prompt-body"],["name","bot",3,"size"],[1,"prompt-section"],[1,"section-lbl"],[1,"kv-row"],[1,"kv"],[1,"kv-lbl"],[1,"kv-val","mono"],[1,"kv-val","mono","cost"],[1,"prompt-pre"],[1,"assistant-body","md-content",3,"innerHTML"],[1,"thinking-details"],[1,"section-lbl","thinking-summary"],[1,"muted","xs"],[1,"thinking-body","md-content",3,"innerHTML"],[1,"files-touched"],[1,"file-row",3,"title"],[1,"file-path","mono"],[1,"tools"],[1,"tool-block"],["type","button",1,"tool-row",3,"click","disabled"],["aria-hidden","true",1,"tool-chevron","mono"],[1,"tool-name","mono"],[1,"tool-input","mono"],[1,"tool-bytes","mono","muted"],[1,"tool-input-json","mono"],[2,"margin-bottom","20px"],[2,"margin-top","16px","padding","10px 12px","background","var(--success-soft)","border","1px solid rgba(70,194,107,0.25)","border-radius","8px"],[1,"row","gap-6",2,"flex-wrap","wrap"],[1,"pill",2,"color","var(--node-code)","background","var(--node-code-soft)","font-family","var(--font-mono)","font-weight","500"],[1,"pill",2,"color","var(--node-test)","background","var(--node-test-soft)","font-family","var(--font-mono)","font-weight","500"],["name","command",3,"size"],[2,"opacity","0.7"],["name","sparkles",3,"size"],["valueKey","calls",3,"items","fmt","color"],[1,"muted",2,"font-size","10px","margin-top","8px"],[1,"row","gap-8",2,"margin-bottom","4px"],[2,"font-size","10.5px","font-weight","700","color","var(--success)","text-transform","uppercase","letter-spacing","0.04em"],[1,"pill",2,"color","var(--success)","background","rgba(70,194,107,0.15)","font-size","9.5px","padding","1px 5px"],[1,"col","gap-4"],[1,"row","gap-6"],[1,"muted","grow",2,"font-size","11px"],[1,"mono","tabular",2,"font-size","11px","color","var(--text-primary)"],[1,"mono","tabular",2,"font-size","11px","color","var(--success)"],[1,"row","gap-6",2,"border-top","1px dashed rgba(70,194,107,0.3)","padding-top","4px","margin-top","2px"],[1,"mono","tabular",2,"font-size","11px"],[1,"eyebrow",2,"margin","20px 0 10px"],[1,"col","gap-5"],[1,"mono","muted",2,"font-size","10px","width","44px","flex-shrink","0"],[3,"frac","color"],[1,"mono","tabular",2,"font-size","10.5px","width","40px","text-align","right"]],template:function(e,i){if(e&1&&(a(0,"div",0)(1,"header",1)(2,"a",2),f(3,"app-icon",3),l(4," Sessions "),o(),a(5,"div",4)(6,"div",5)(7,"span",6),l(8),o(),p(9,Se,2,3,"app-pill",7),a(10,"span",8),f(11,"span",9),l(12),o()(),p(13,we,3,2,"div",10),o(),a(14,"div",11)(15,"button",12),O("click",function(){return i.forceRefresh()}),f(16,"app-icon",13),l(17),o()()(),p(18,Pe,2,0,"div",14)(19,Ee,7,1,"div",15)(20,lt,101,52,"div",16)(21,st,2,0,"div",17),o()),e&2){let s,c,h;r(2),u("routerLink",X(19,ye)),r(),u("size",14),r(5),x(i.id().slice(0,12)),r(),m((s=i.session())!=null&&s.last_model?9:-1),r(),R("live",i.liveMode()==="live")("polling",i.liveMode()==="polling")("idle",i.liveMode()==="idle"),u("title",i.liveMode()==="live"?"Live \u2014 new prompts push as Claude Code writes them":i.liveMode()==="polling"?"Polling \u2014 SSE unavailable, refetching every 5s":"Idle \u2014 live updates paused"),r(2),_(" ",i.liveMode()==="live"?"Live":i.liveMode()==="polling"?"Polling":"Idle"," "),r(),m((c=i.session())?13:-1,c),r(2),R("spinning",i.localRefreshing()||i.refresh.loading()),u("disabled",i.refresh.loading()),r(),u("size",13),r(),_(" ",i.localRefreshing()||i.refresh.loading()?"Refreshing\u2026":"Refresh"," "),r(),m(i.resource.state().loading&&!i.session()?18:i.resource.state().error?19:(h=i.session())?20:21,h)}},dependencies:[ie,ae,de,le,ce,ee],styles:['@charset "UTF-8";[_nghost-%COMP%]{display:contents}.sd-root[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;min-height:0;padding:16px 18px 0}.page-head[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:12px;margin-bottom:14px;flex-wrap:wrap}.back-link[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px;color:var(--text-muted);text-decoration:none}.title-block[_ngcontent-%COMP%]{flex:1;min-width:250px}.title[_ngcontent-%COMP%]{font-size:var(--fs-title);font-weight:600;letter-spacing:-.01em;display:flex;align-items:center;gap:10px;flex-wrap:wrap}.session-id[_ngcontent-%COMP%]{color:var(--accent);font-size:14px}.live-pill[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:6px;font-size:10.5px;font-weight:600;padding:2px 8px;border-radius:999px;white-space:nowrap;cursor:help}.live-pill[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{width:7px;height:7px;border-radius:50%;flex-shrink:0}.live-pill.live[_ngcontent-%COMP%]{color:var(--success);background:var(--success-soft)}.live-pill.live[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{background:var(--success);animation:_ngcontent-%COMP%_live-pulse 1.6s ease-in-out infinite}.live-pill.polling[_ngcontent-%COMP%]{color:var(--warn);background:var(--warn-soft)}.live-pill.polling[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{background:var(--warn)}.live-pill.idle[_ngcontent-%COMP%]{color:var(--text-muted);background:var(--bg-canvas)}.live-pill.idle[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{background:var(--text-muted)}@keyframes _ngcontent-%COMP%_live-pulse{0%,to{opacity:.4;transform:scale(.85)}50%{opacity:1;transform:scale(1.05)}}.sub[_ngcontent-%COMP%]{color:var(--text-secondary);font-size:12px;margin-top:2px}.page-actions[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.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)}}.sd-body[_ngcontent-%COMP%]{flex:1;display:flex;min-height:0;gap:0}.sd-main[_ngcontent-%COMP%]{flex:1;min-width:0;padding:0 0 18px}.sd-rail[_ngcontent-%COMP%]{width:290px;flex-shrink:0;border-left:1px solid var(--border-subtle);background:var(--bg-panel);padding:16px}.stat-strip[_ngcontent-%COMP%]{display:flex;gap:24px;padding:12px 0;border-top:1px solid var(--border-subtle);border-bottom:1px solid var(--border-subtle);margin-bottom:16px}.stat[_ngcontent-%COMP%] .stat-lbl[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-muted)}.stat[_ngcontent-%COMP%] .stat-val[_ngcontent-%COMP%]{font-size:16px;font-weight:600;margin-top:2px;color:var(--text-primary);font-variant-numeric:tabular-nums}.stat-val.cost[_ngcontent-%COMP%]{color:var(--accent)}.tok-bar[_ngcontent-%COMP%]{display:flex;height:10px;border-radius:999px;overflow:hidden}.tok-seg[_ngcontent-%COMP%]{height:100%}.cache-card[_ngcontent-%COMP%]{background:var(--success-soft);border:1px solid rgba(70,194,107,.25);border-radius:8px;padding:10px 12px}.prompt.card[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:9px;overflow:hidden;transition:border-color .12s}.prompt.card[_ngcontent-%COMP%]:hover{border-color:var(--border-strong)}.prompt-head[_ngcontent-%COMP%]{width:100%;padding:11px 12px;background:transparent;border:0;text-align:left;cursor:pointer;color:inherit;font-family:inherit}.prompt-head[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.prompt-head[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.prompt-body[_ngcontent-%COMP%]{border-top:1px solid var(--border-subtle);padding:14px 16px;background:var(--bg-canvas)}.prompt-section[_ngcontent-%COMP%]{margin-bottom:14px}.prompt-section[_ngcontent-%COMP%]:last-child{margin-bottom:0}.section-lbl[_ngcontent-%COMP%]{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);margin-bottom:6px}.prompt-pre[_ngcontent-%COMP%]{margin:0;padding:10px 12px;background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:7px;font-family:var(--font-mono);font-size:11.5px;line-height:1.55;color:var(--text-primary);white-space:pre-wrap;word-break:break-word;max-height:280px;overflow-y:auto}.kv-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fit,minmax(100px,1fr));gap:10px 18px}.kv[_ngcontent-%COMP%] .kv-lbl[_ngcontent-%COMP%]{font-size:10px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em;font-weight:600}.kv[_ngcontent-%COMP%] .kv-val[_ngcontent-%COMP%]{font-size:12.5px;font-weight:600;margin-top:2px;color:var(--text-primary);font-variant-numeric:tabular-nums}.kv-val.cost[_ngcontent-%COMP%]{color:var(--accent)}.tools[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:3px}.tool-block[_ngcontent-%COMP%]{display:flex;flex-direction:column}.tool-row[_ngcontent-%COMP%]{appearance:none;background:var(--bg-panel);border:1px solid var(--border-subtle);color:inherit;font-family:inherit;text-align:left;display:flex;align-items:center;gap:8px;width:100%;padding:5px 10px;border-radius:6px;font-size:11.5px;cursor:pointer}.tool-row[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--bg-hover)}.tool-row[_ngcontent-%COMP%]:disabled{cursor:default}.tool-row[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.tool-row.expanded[_ngcontent-%COMP%]{border-bottom-left-radius:0;border-bottom-right-radius:0}.tool-chevron[_ngcontent-%COMP%]{width:10px;color:var(--text-muted);transition:transform .12s;font-size:12px;flex-shrink:0;display:inline-block}.tool-chevron.open[_ngcontent-%COMP%]{transform:rotate(90deg);color:var(--accent)}.tool-name[_ngcontent-%COMP%]{font-weight:600;flex-shrink:0}.tool-input[_ngcontent-%COMP%]{color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:11px}.tool-bytes[_ngcontent-%COMP%]{font-size:10.5px;flex-shrink:0}.tool-input-json[_ngcontent-%COMP%]{margin:0;padding:10px 14px;background:var(--bg-canvas);border:1px solid var(--border-subtle);border-top:0;border-radius:0 0 6px 6px;font-family:var(--font-mono);font-size:11px;line-height:1.5;color:var(--text-primary);white-space:pre-wrap;word-break:break-word;max-height:320px;overflow-y:auto}.assistant-body[_ngcontent-%COMP%]{padding:10px 14px;background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:7px;font-size:12.5px;line-height:1.55;color:var(--text-primary);max-height:480px;overflow-y:auto;overflow-wrap:anywhere}.thinking-details[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:7px;padding:8px 12px}.thinking-summary[_ngcontent-%COMP%]{cursor:pointer;list-style:none;display:flex;align-items:center;gap:6px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted)}.thinking-summary[_ngcontent-%COMP%]::-webkit-details-marker{display:none}.thinking-summary[_ngcontent-%COMP%]:before{content:"\\203a";display:inline-block;transition:transform .12s;font-size:14px;color:var(--text-muted)}.thinking-details[open][_ngcontent-%COMP%] .thinking-summary[_ngcontent-%COMP%]:before{transform:rotate(90deg);color:var(--accent)}.thinking-body[_ngcontent-%COMP%]{margin-top:10px;padding:8px 0 0;border-top:1px dashed var(--border-subtle);font-size:12px;line-height:1.55;color:var(--text-secondary);max-height:320px;overflow-y:auto;overflow-wrap:anywhere}.files-touched[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:3px;font-size:11.5px;max-height:180px;overflow-y:auto;padding:6px 10px;background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:6px}.files-touched[_ngcontent-%COMP%] .file-row[_ngcontent-%COMP%]{display:flex;align-items:center;min-width:0}.files-touched[_ngcontent-%COMP%] .file-path[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-secondary)}.loading[_ngcontent-%COMP%]{padding:40px 18px;text-align:center;color:var(--text-muted);font-size:13px}.error[_ngcontent-%COMP%]{padding:16px;margin:12px 0;border-radius:8px;border:1px solid rgba(255,90,90,.35);background:var(--error-soft);color:var(--error);display:flex;flex-direction:column;gap:8px;align-items:flex-start}.error-title[_ngcontent-%COMP%]{font-weight:600;font-size:13px}.error-detail[_ngcontent-%COMP%]{font-size:12px;color:var(--text-secondary)}.empty[_ngcontent-%COMP%]{padding:30px 18px;color:var(--text-muted);font-size:12.5px;text-align:center}.md-content[_ngcontent-%COMP%] .md-h1[_ngcontent-%COMP%]{font-size:14px;font-weight:650;color:var(--text-primary);letter-spacing:-.01em;margin:0 0 8px}.md-content[_ngcontent-%COMP%] .md-h2[_ngcontent-%COMP%]{font-size:12.5px;font-weight:650;color:var(--text-primary);margin:14px 0 4px;padding-bottom:3px;border-bottom:1px solid var(--border-subtle)}.md-content[_ngcontent-%COMP%] .md-h3[_ngcontent-%COMP%]{font-size:12px;font-weight:650;color:var(--text-primary);margin:12px 0 4px}.md-content[_ngcontent-%COMP%] .md-p[_ngcontent-%COMP%]{font-size:12.5px;line-height:1.6;color:var(--text-primary);margin:0 0 4px;overflow-wrap:anywhere}.md-content[_ngcontent-%COMP%] .md-p[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-primary);font-weight:650}.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%], .md-content[_ngcontent-%COMP%] .md-ol[_ngcontent-%COMP%]{padding:0;margin:4px 0 6px}.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%], .md-content[_ngcontent-%COMP%] .md-ol[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{position:relative;padding:2px 0 2px 20px;font-size:12.5px;line-height:1.55;color:var(--text-primary);overflow-wrap:anywhere}.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%]{list-style:none}.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:before{content:"\\2022";position:absolute;left:4px;top:1px;color:var(--text-faint)}.md-content[_ngcontent-%COMP%] .md-spacer[_ngcontent-%COMP%]{height:5px}.md-content[_ngcontent-%COMP%] .md-inline-code[_ngcontent-%COMP%]{font-size:11px;background:var(--bg-canvas);padding:1px 5px;border-radius:3px;border:1px solid var(--border-subtle);color:var(--node-spec)}.md-content[_ngcontent-%COMP%] .md-blockquote[_ngcontent-%COMP%]{margin:5px 0;padding:6px 10px;border-left:3px solid var(--accent);background:var(--accent-soft);color:var(--text-secondary);font-size:12px;line-height:1.5;border-radius:0 5px 5px 0}.md-content[_ngcontent-%COMP%] .md-pre[_ngcontent-%COMP%]{position:relative;margin:6px 0 8px;padding:10px 12px;background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:6px;overflow-x:auto}.md-content[_ngcontent-%COMP%] .md-pre[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{display:block;font-size:11px;line-height:1.5;color:var(--text-primary);white-space:pre}.md-content[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child{margin-top:0}'],changeDetection:0})};export{ue as SessionDetail};