@specship/specship-win32-arm64 0.11.6 → 0.11.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/lib/dist/server/routes/chat.js +2 -3
  2. package/lib/dist/server/routes/claude.js +2 -3
  3. package/lib/dist/server/routes/events.js +2 -3
  4. package/lib/dist/server/routes/projects.js +2 -3
  5. package/lib/dist/server/routes/sse.js +23 -0
  6. package/lib/dist/server/routes/workflow.js +2 -3
  7. package/lib/dist/web/{chunk-H2TR6BKW.js → chunk-7KWBINA7.js} +1 -1
  8. package/lib/dist/web/{chunk-BZ5SMVXG.js → chunk-7MUNFW56.js} +1 -1
  9. package/lib/dist/web/{chunk-Z23KACD6.js → chunk-AZUUBUEJ.js} +1 -1
  10. package/lib/dist/web/{chunk-BDF4LLKR.js → chunk-CYXQILZI.js} +1 -1
  11. package/lib/dist/web/{chunk-PAO2624Y.js → chunk-DTWIJ3GJ.js} +1 -1
  12. package/lib/dist/web/{chunk-G2FTQVMJ.js → chunk-E27QAKAB.js} +1 -1
  13. package/lib/dist/web/{chunk-YPWBUJH7.js → chunk-EXBUKHH2.js} +1 -1
  14. package/lib/dist/web/{chunk-YVAUYHOB.js → chunk-F5TBUYDH.js} +1 -1
  15. package/lib/dist/web/{chunk-C6I5R6UZ.js → chunk-FC3R7YHR.js} +1 -1
  16. package/lib/dist/web/{chunk-IXQIWN6Z.js → chunk-G7RXFHYO.js} +1 -1
  17. package/lib/dist/web/{chunk-NY5CBIVU.js → chunk-HPKNOV45.js} +1 -1
  18. package/lib/dist/web/{chunk-PBRCKHEQ.js → chunk-JGDK6YKG.js} +1 -1
  19. package/lib/dist/web/{chunk-5CR7TMVN.js → chunk-JPSYO24K.js} +1 -1
  20. package/lib/dist/web/{chunk-FYXVIWM2.js → chunk-K7UD24Z4.js} +1 -1
  21. package/lib/dist/web/{chunk-QJSQ3ORB.js → chunk-LIFS4XH2.js} +1 -1
  22. package/lib/dist/web/{chunk-6FZTSHJS.js → chunk-MADMRWIK.js} +1 -1
  23. package/lib/dist/web/{chunk-7ALHQYYG.js → chunk-MNFTHCSJ.js} +1 -1
  24. package/lib/dist/web/{chunk-7ULUC3DC.js → chunk-N5WSFE4J.js} +1 -1
  25. package/lib/dist/web/{chunk-G2MHCJUR.js → chunk-PCW6R7OP.js} +1 -1
  26. package/lib/dist/web/{chunk-EAWW6PQJ.js → chunk-POCVU4VK.js} +1 -1
  27. package/lib/dist/web/chunk-TWVVIWKO.js +1 -0
  28. package/lib/dist/web/{chunk-HZYJAXHL.js → chunk-U67LRNER.js} +1 -1
  29. package/lib/dist/web/{chunk-KXMWAQNB.js → chunk-USVLLFVR.js} +1 -1
  30. package/lib/dist/web/{chunk-U6CWVOZO.js → chunk-UYOKO7C5.js} +1 -1
  31. package/lib/dist/web/{chunk-7V4MGZCG.js → chunk-XAUQEKZX.js} +1 -1
  32. package/lib/dist/web/{chunk-D7HQMX7C.js → chunk-YXYPTZ6E.js} +1 -1
  33. package/lib/dist/web/index.html +1 -1
  34. package/lib/dist/web/{main-A6QZ3DLK.js → main-5B4RR3BC.js} +1 -1
  35. package/lib/node_modules/.package-lock.json +1 -1
  36. package/lib/package.json +1 -1
  37. package/package.json +1 -1
  38. package/lib/dist/web/chunk-3H2EZLZN.js +0 -1
@@ -1,4 +1,4 @@
1
- import{a as j}from"./chunk-G7VZT5KB.js";import{a as G}from"./chunk-PZSU53SS.js";import{c as V}from"./chunk-PAO2624Y.js";import{a as H}from"./chunk-PBRCKHEQ.js";import{a as $}from"./chunk-3H2EZLZN.js";import{Aa as c,Ga as E,I as z,Ia as P,Ka as m,M as w,N as k,Ta as _,Ua as S,Va as l,W as T,Wa as p,X as A,Xa as y,aa as I,bb as R,ea as o,ka as B,lb as u,qa as M,ra as x,sa as v,ua as N,va as C,wa as h,xa as d,ya as i,yb as U,za as r,zb as K}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var J=()=>[1,2,3,4,5],Y=(n,t)=>t.key,F=(n,t)=>t.id;function X(n,t){n&1&&(i(0,"span",20),c(1,"span",33),l(2," Seed "),r())}function W(n,t){n&1&&(i(0,"span",21),c(1,"span",33),l(2," Live "),r())}function Z(n,t){if(n&1){let e=E();i(0,"div",24),c(1,"app-icon",34),i(2,"div",35)(3,"div",5),l(4,"Couldn't load memory"),r(),i(5,"div",36),l(6),r()(),i(7,"button",37),P("click",function(){w(e);let s=m();return k(s.reload())}),l(8,"Retry"),r()()}n&2&&(o(),d("size",16),o(5),p(t))}function ee(n,t){n&1&&(i(0,"div",25),c(1,"app-icon",38),i(2,"div",35)(3,"div",5),l(4,"No project selected"),r(),i(5,"div",36),l(6,"Pick a project from the top bar to see its CLAUDE.md hierarchy and saved notes."),r()()()),n&2&&(o(),d("size",16))}function te(n,t){n&1&&(i(0,"div",26),c(1,"app-icon",38),i(2,"div",35)(3,"div",5),l(4,"Showing example memory"),r(),i(5,"div",36),l(6,"The selected project has no CLAUDE.md or saved notes yet. The cards below illustrate what real data would look like."),r()()()),n&2&&(o(),d("size",16))}function ne(n,t){if(n&1&&c(0,"span",33),n&2){let e=m().$implicit;_("background",e.color)}}function oe(n,t){if(n&1&&(i(0,"span",41),l(1),r()),n&2){let e=m().$implicit;o(),p(e.count)}}function ie(n,t){if(n&1){let e=E();i(0,"button",39),P("click",function(){let s=w(e).$implicit,g=m();return k(g.onTypeFilter(s.key))}),x(1,ne,1,2,"span",40),l(2),x(3,oe,2,1,"span",41),r()}if(n&2){let e=t.$implicit,a=m();_("--chip-color",e.color)("--chip-bg",e.soft),S("active",a.typeFilter()===e.key),M("aria-pressed",a.typeFilter()===e.key),o(),v(e.key!=="all"?1:-1),o(),y(" ",e.label," "),o(),v(e.count!==void 0?3:-1)}}function re(n,t){if(n&1&&(i(0,"span",30),l(1),r()),n&2){let e=m();o(),p(e.typeDesc())}}function ae(n,t){n&1&&(i(0,"div",48),c(1,"div",49),i(2,"div",50),c(3,"div",51)(4,"div",52),r(),c(5,"div",53),r())}function le(n,t){n&1&&C(0,ae,6,0,"div",48,N),n&2&&h(R(0,J))}function ce(n,t){if(n&1){let e=E();i(0,"button",37),P("click",function(){w(e);let s=m(3);return k(s.clearFilter())}),l(1,"Show all types"),r()}}function de(n,t){if(n&1&&(i(0,"div",44)(1,"div",54),l(2,"Nothing here"),r(),i(3,"div"),l(4),r(),x(5,ce,2,0,"button",55),r()),n&2){let e=m(2);o(4),y("No ",e.filterEmptyNoun()," loaded for this project."),o(),v(e.typeFilter()!=="all"?5:-1)}}function se(n,t){n&1&&c(0,"app-icon",67),n&2&&d("size",10)}function pe(n,t){if(n&1){let e=E();i(0,"button",62),P("click",function(){let s=w(e).$implicit,g=m(4);return k(g.onSelectByObj(s))}),c(1,"span",63)(2,"app-icon",64),i(3,"span",65)(4,"span",66),l(5),x(6,se,1,1,"app-icon",67),r(),i(7,"span",68),l(8),r()(),i(9,"span",69),l(10),r()()}if(n&2){let e=t.$implicit,a=m(4);S("selected",a.selectedId()===e.id)("indent",a.isIndented(e)),M("aria-pressed",a.selectedId()===e.id)("aria-label",a.nameFor(e)+" \u2014 "+a.L[e.level].label),o(),_("background",a.L[e.level].color),o(),d("name",a.iconFor(e))("size",13),o(3),y(" ",a.nameFor(e)," "),o(),v(e.readOnly?6:-1),o(),d("title",a.shortPath(e)),o(),p(a.shortPath(e)),o(2),p(a.fmtK(e.tokens))}}function me(n,t){if(n&1&&(i(0,"div",56)(1,"div",57)(2,"span",58),l(3),r(),i(4,"span",59),l(5),r()(),i(6,"div",60),l(7),r(),C(8,pe,11,15,"button",61,F),r()),n&2){let e=t.$implicit,a=m(3);o(3),p(a.L[e.key].label),o(2),p(a.rowItems(e).length),o(2),p(a.L[e.key].desc),o(),h(a.rowItems(e))}}function ge(n,t){if(n&1&&C(0,me,10,3,"div",56,Y),n&2){let e=m(2);h(e.railGroups())}}function ue(n,t){n&1&&(i(0,"span",72),c(1,"app-icon",86),l(2," read-only"),r()),n&2&&(o(),d("size",10))}function xe(n,t){if(n&1&&(i(0,"div",77)(1,"div",12),l(2,"Saved in"),r(),i(3,"button",87),l(4),r()()),n&2){let e=m();o(3),M("aria-label","Jump to session "+e.session),o(),p(e.session)}}function ve(n,t){if(n&1&&(i(0,"span",88),l(1),r()),n&2){let e=t.$implicit;o(),y("#",e)}}function fe(n,t){if(n&1&&(i(0,"div",79),C(1,ve,2,1,"span",88,N),r()),n&2){let e=m();o(),h(e.tags)}}function _e(n,t){if(n&1&&(i(0,"div",90),c(1,"app-icon",91),i(2,"span",92),l(3),r(),i(4,"span",93),l(5),r()()),n&2){let e=t.$implicit,a=m(4);o(),d("size",12),o(),d("title",e.path),o(),p(e.path),o(2),p(a.fmtK(e.tokens))}}function ye(n,t){if(n&1&&(i(0,"div",81)(1,"div",58),l(2),r(),i(3,"div",89),C(4,_e,6,4,"div",90,F),r()()),n&2){let e=m(3);o(2),y("Imports \xB7 ",e.currentImports().length),o(2),h(e.currentImports())}}function be(n,t){if(n&1&&(i(0,"button",55),c(1,"app-icon",94),l(2),r()),n&2){let e=m();M("aria-label",(e.type==="note"?"Edit note":"Edit memory")+" "+e.path),o(),d("size",13),o(),y(" ",e.type==="note"?"Edit note":"Edit memory"," ")}}function Ce(n,t){if(n&1&&(i(0,"button",85),c(1,"app-icon",95),l(2," Forget "),r()),n&2){let e=m();M("aria-label","Forget note "+e.path),o(),d("size",13)}}function he(n,t){if(n&1&&(i(0,"div",46)(1,"div",70)(2,"span",71),c(3,"app-icon",64),l(4),r(),i(5,"span",71),l(6),r(),i(7,"span",30),l(8),r(),c(9,"span",19),x(10,ue,3,1,"span",72),r(),i(11,"div",73)(12,"span",74),l(13),r(),c(14,"app-copy-btn",75),r(),i(15,"div",76)(16,"div",77)(17,"div",12),l(18,"Tokens"),r(),i(19,"div",78),l(20),r()(),i(21,"div",77)(22,"div",12),l(23,"Lines"),r(),i(24,"div",78),l(25),r()(),i(26,"div",77)(27,"div",12),l(28,"Scope"),r(),i(29,"div",78),l(30),r()(),i(31,"div",77)(32,"div",12),l(33,"Modified"),r(),i(34,"div",78),l(35),r()(),x(36,xe,5,2,"div",77),r(),x(37,fe,3,0,"div",79),c(38,"div",80),x(39,ye,6,1,"div",81),i(40,"div",82),x(41,be,3,3,"button",55),i(42,"button",83),c(43,"app-icon",84),l(44," Copy contents "),r(),x(45,Ce,3,2,"button",85),r()()),n&2){let e=t,a=m(2);o(2),_("background",a.T[e.type].soft)("color",a.T[e.type].color),o(),d("name",a.T[e.type].icon)("size",10),o(),y(" ",a.T[e.type].label," "),o(),_("background",a.L[e.level].soft)("color",a.L[e.level].color),o(),p(a.L[e.level].label),o(2),p(a.L[e.level].desc),o(2),v(e.readOnly?10:-1),o(2),d("title",e.path),o(),p(e.path),o(),d("text",e.path),o(6),p(a.fmtK(e.tokens)),o(5),p(e.lines),o(5),p(a.L[e.level].label),o(5),p(e.modified),o(),v(e.type==="note"&&e.session?36:-1),o(),v(e.type==="note"&&(e.tags!=null&&e.tags.length)?37:-1),o(),d("innerHTML",a.currentBody(),I),o(),v(a.currentImports().length>0?39:-1),o(2),v(e.readOnly?-1:41),o(2),d("size",13),o(2),v(e.type==="note"?45:-1)}}function Me(n,t){n&1&&(i(0,"div",47),c(1,"app-icon",3),i(2,"div"),l(3,"Pick an item from the rail to see its contents."),r()()),n&2&&(o(),d("size",32))}function Pe(n,t){if(n&1&&(i(0,"div",31)(1,"div",42)(2,"div",43),x(3,le,2,1)(4,de,6,2,"div",44)(5,ge,2,0),r()(),i(6,"div",45),x(7,he,46,28,"div",46)(8,Me,4,1,"div",47),r()()),n&2){let e,a=m();o(3),v(a.loading()&&a.source()==="seed"?3:a.visibleCount()===0?4:5),o(4),v((e=a.current())?7:8,e)}}function Oe(n,t){n&1&&c(0,"app-icon",109),n&2&&d("size",11)}function we(n,t){if(n&1&&(i(0,"div",103),c(1,"div",104),i(2,"div",105)(3,"div",106)(4,"span",107),l(5),r(),i(6,"span",71),l(7),r(),i(8,"span",108),l(9),r(),c(10,"span",19),x(11,Oe,1,1,"app-icon",109),i(12,"span",110),l(13),r()(),c(14,"div",111),r()()),n&2){let e=t.$implicit,a=t.$index,s=m(3);o(),_("background",s.L[e.level].color),o(4),p(a+1),o(),_("background",s.L[e.level].soft)("color",s.L[e.level].color),o(),p(s.L[e.level].label),o(),d("title",e.path),o(),p(e.path),o(2),v(e.readOnly?11:-1),o(2),p(s.fmtK(e.tokens)),o(),d("innerHTML",s.renderBody(e.body),I)}}function ke(n,t){if(n&1&&(i(0,"div",101),l(1,"Instructions \xB7 precedence order"),r(),i(2,"div",102),C(3,we,15,13,"div",103,F),r()),n&2){let e=m(2);o(3),h(e.effectiveInstructions())}}function Ee(n,t){n&1&&(i(0,"div",100)(1,"div",54),l(2,"No instructions loaded"),r(),i(3,"div"),l(4,"This project has no CLAUDE.md hierarchy yet."),r()())}function Se(n,t){if(n&1&&(i(0,"div",103),c(1,"div",104),i(2,"div",105)(3,"div",106)(4,"span",71),l(5),r(),i(6,"span",108),l(7),r(),c(8,"span",19),i(9,"span",110),l(10),r()(),c(11,"div",111),r()()),n&2){let e=t.$implicit,a=m(3);o(),_("background",a.L[e.level].color),o(3),_("background",a.L[e.level].soft)("color",a.L[e.level].color),o(),p(a.L[e.level].label),o(),d("title",e.path),o(),p(e.path),o(3),p(a.fmtK(e.tokens)),o(),d("innerHTML",a.renderBody(e.body),I)}}function ze(n,t){if(n&1&&(i(0,"div",112)(1,"span"),l(2,"Notes \xB7 memory tool"),r(),i(3,"span",113),l(4,"retrieved facts, not precedence-ranked"),r()(),i(5,"div",102),C(6,Se,12,11,"div",103,F),r()),n&2){let e=m(2);o(6),h(e.effectiveNotes())}}function Te(n,t){if(n&1&&(i(0,"div",32)(1,"div",96),c(2,"app-icon",97),i(3,"span",98),l(4,"Effective memory"),r(),i(5,"span",30),l(6,"\xB7 everything the agent loads"),r()(),i(7,"div",99),l(8," Instructions merge in precedence order \u2014 managed policy is authoritative, and lower blocks fill in where higher ones are silent. Saved notes are appended as retrieved context. "),r(),x(9,ke,5,0)(10,Ee,5,0,"div",100),x(11,ze,8,0),r()),n&2){let e=m();o(2),d("size",15),o(7),v(e.effectiveInstructions().length>0?9:10),o(2),v(e.effectiveNotes().length>0?11:-1)}}var Q={enterprise:{key:"enterprise",label:"Managed",color:"#E5A50A",soft:"rgba(229,165,10,0.14)",desc:"Organization policy \xB7 cannot be overridden"},user:{key:"user",label:"User",color:"#29D2BE",soft:"rgba(41,210,190,0.14)",desc:"Personal \xB7 applies to every project"},project:{key:"project",label:"Project",color:"#5B93F2",soft:"rgba(91,147,242,0.14)",desc:"Team-shared \xB7 checked into the repo"},subdir:{key:"subdir",label:"Directory",color:"#A586F5",soft:"rgba(165,134,245,0.14)",desc:"Scoped to a subtree \xB7 loaded when cwd is inside"},import:{key:"import",label:"Import",color:"#7B8696",soft:"rgba(123,134,150,0.12)",desc:"Pulled in via @path reference"},note:{key:"note",label:"Notes",color:"#46C26B",soft:"rgba(70,194,107,0.14)",desc:"Agent-written \xB7 memory tool"}},f={instruction:{key:"instruction",label:"Instructions",color:"#5B93F2",soft:"rgba(91,147,242,0.14)",icon:"memory",desc:"Directives & rules from CLAUDE.md"},note:{key:"note",label:"Notes",color:"#46C26B",soft:"rgba(70,194,107,0.14)",icon:"tips",desc:"Facts the agent saved via the memory tool"},import:{key:"import",label:"Imports",color:"#29D2BE",soft:"rgba(41,210,190,0.14)",icon:"external",desc:"Files pulled in via @path"}},Ie=["enterprise","project","subdir","import","user"],Fe=[{id:"m-ent",level:"enterprise",type:"instruction",name:"CLAUDE.md",scope:"managed",readOnly:!0,path:"/Library/Application Support/ClaudeCode/CLAUDE.md",tokens:210,lines:9,modified:"managed",body:"# Engineering policy (managed)\n\n- All code must pass `pnpm lint` and `pnpm typecheck` before commit.\n- Never commit secrets, API keys, or `.env` files.\n- Prefer dependency-free solutions; new deps require review.\n- Validate all external input at trust boundaries.\n- Production logs must not contain user content."},{id:"m-user",level:"user",type:"instruction",name:"CLAUDE.md",scope:"~/.claude",path:"~/.claude/CLAUDE.md",tokens:280,lines:12,modified:"3d ago",body:"# Personal preferences\n\n- Before reading a file, try `specship_explore` for structure first.\n- Use conventional commits (`feat:`, `fix:`, `chore:`).\n- Prefer `rg` over `grep`, `fd` over `find`.\n- Keep responses terse \u2014 show diffs, not whole files.\n- Editor open command: `cursor`.\n- Default model for read/edit turns: Sonnet."},{id:"m-proj",level:"project",type:"instruction",name:"CLAUDE.md",scope:"project root",path:"~/dev/specship/CLAUDE.md",tokens:760,lines:28,modified:"2h ago",imports:["m-imp-conv","m-imp-style"],body:"# SpecShip \u2014 project memory\n\n## Architecture\n- Electron + Angular renderer in `packages/web-ng`.\n- MCP server in `src/mcp`, graph engine in `src/graph`.\n- SQLite via better-sqlite3; migrations in `src/db/migrations.ts`.\n\n## Commands\n- `npm run dev` \u2014 renderer + MCP in watch mode.\n- `npm test` \u2014 vitest; `npm run eval` \u2014 evaluation runner.\n- `npm run cli` \u2014 local SpecShip binary.\n\n## Conventions\n- Spec IDs are stable: `REQ-<AREA>-<NNN>`.\n- Never edit generated files under `src/graph/_gen`.\n\n@docs/conventions.md\n@specs/STYLE.md"},{id:"m-sub",level:"subdir",type:"instruction",name:"CLAUDE.md",scope:"src/graph",path:"~/dev/specship/src/graph/CLAUDE.md",tokens:190,lines:7,modified:"1d ago",body:`# Graph engine notes
1
+ import{a as j}from"./chunk-G7VZT5KB.js";import{a as G}from"./chunk-PZSU53SS.js";import{c as V}from"./chunk-DTWIJ3GJ.js";import{a as H}from"./chunk-JGDK6YKG.js";import{a as $}from"./chunk-TWVVIWKO.js";import{Aa as c,Ga as E,I as z,Ia as P,Ka as m,M as w,N as k,Ta as _,Ua as S,Va as l,W as T,Wa as p,X as A,Xa as y,aa as I,bb as R,ea as o,ka as B,lb as u,qa as M,ra as x,sa as v,ua as N,va as C,wa as h,xa as d,ya as i,yb as U,za as r,zb as K}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var J=()=>[1,2,3,4,5],Y=(n,t)=>t.key,F=(n,t)=>t.id;function X(n,t){n&1&&(i(0,"span",20),c(1,"span",33),l(2," Seed "),r())}function W(n,t){n&1&&(i(0,"span",21),c(1,"span",33),l(2," Live "),r())}function Z(n,t){if(n&1){let e=E();i(0,"div",24),c(1,"app-icon",34),i(2,"div",35)(3,"div",5),l(4,"Couldn't load memory"),r(),i(5,"div",36),l(6),r()(),i(7,"button",37),P("click",function(){w(e);let s=m();return k(s.reload())}),l(8,"Retry"),r()()}n&2&&(o(),d("size",16),o(5),p(t))}function ee(n,t){n&1&&(i(0,"div",25),c(1,"app-icon",38),i(2,"div",35)(3,"div",5),l(4,"No project selected"),r(),i(5,"div",36),l(6,"Pick a project from the top bar to see its CLAUDE.md hierarchy and saved notes."),r()()()),n&2&&(o(),d("size",16))}function te(n,t){n&1&&(i(0,"div",26),c(1,"app-icon",38),i(2,"div",35)(3,"div",5),l(4,"Showing example memory"),r(),i(5,"div",36),l(6,"The selected project has no CLAUDE.md or saved notes yet. The cards below illustrate what real data would look like."),r()()()),n&2&&(o(),d("size",16))}function ne(n,t){if(n&1&&c(0,"span",33),n&2){let e=m().$implicit;_("background",e.color)}}function oe(n,t){if(n&1&&(i(0,"span",41),l(1),r()),n&2){let e=m().$implicit;o(),p(e.count)}}function ie(n,t){if(n&1){let e=E();i(0,"button",39),P("click",function(){let s=w(e).$implicit,g=m();return k(g.onTypeFilter(s.key))}),x(1,ne,1,2,"span",40),l(2),x(3,oe,2,1,"span",41),r()}if(n&2){let e=t.$implicit,a=m();_("--chip-color",e.color)("--chip-bg",e.soft),S("active",a.typeFilter()===e.key),M("aria-pressed",a.typeFilter()===e.key),o(),v(e.key!=="all"?1:-1),o(),y(" ",e.label," "),o(),v(e.count!==void 0?3:-1)}}function re(n,t){if(n&1&&(i(0,"span",30),l(1),r()),n&2){let e=m();o(),p(e.typeDesc())}}function ae(n,t){n&1&&(i(0,"div",48),c(1,"div",49),i(2,"div",50),c(3,"div",51)(4,"div",52),r(),c(5,"div",53),r())}function le(n,t){n&1&&C(0,ae,6,0,"div",48,N),n&2&&h(R(0,J))}function ce(n,t){if(n&1){let e=E();i(0,"button",37),P("click",function(){w(e);let s=m(3);return k(s.clearFilter())}),l(1,"Show all types"),r()}}function de(n,t){if(n&1&&(i(0,"div",44)(1,"div",54),l(2,"Nothing here"),r(),i(3,"div"),l(4),r(),x(5,ce,2,0,"button",55),r()),n&2){let e=m(2);o(4),y("No ",e.filterEmptyNoun()," loaded for this project."),o(),v(e.typeFilter()!=="all"?5:-1)}}function se(n,t){n&1&&c(0,"app-icon",67),n&2&&d("size",10)}function pe(n,t){if(n&1){let e=E();i(0,"button",62),P("click",function(){let s=w(e).$implicit,g=m(4);return k(g.onSelectByObj(s))}),c(1,"span",63)(2,"app-icon",64),i(3,"span",65)(4,"span",66),l(5),x(6,se,1,1,"app-icon",67),r(),i(7,"span",68),l(8),r()(),i(9,"span",69),l(10),r()()}if(n&2){let e=t.$implicit,a=m(4);S("selected",a.selectedId()===e.id)("indent",a.isIndented(e)),M("aria-pressed",a.selectedId()===e.id)("aria-label",a.nameFor(e)+" \u2014 "+a.L[e.level].label),o(),_("background",a.L[e.level].color),o(),d("name",a.iconFor(e))("size",13),o(3),y(" ",a.nameFor(e)," "),o(),v(e.readOnly?6:-1),o(),d("title",a.shortPath(e)),o(),p(a.shortPath(e)),o(2),p(a.fmtK(e.tokens))}}function me(n,t){if(n&1&&(i(0,"div",56)(1,"div",57)(2,"span",58),l(3),r(),i(4,"span",59),l(5),r()(),i(6,"div",60),l(7),r(),C(8,pe,11,15,"button",61,F),r()),n&2){let e=t.$implicit,a=m(3);o(3),p(a.L[e.key].label),o(2),p(a.rowItems(e).length),o(2),p(a.L[e.key].desc),o(),h(a.rowItems(e))}}function ge(n,t){if(n&1&&C(0,me,10,3,"div",56,Y),n&2){let e=m(2);h(e.railGroups())}}function ue(n,t){n&1&&(i(0,"span",72),c(1,"app-icon",86),l(2," read-only"),r()),n&2&&(o(),d("size",10))}function xe(n,t){if(n&1&&(i(0,"div",77)(1,"div",12),l(2,"Saved in"),r(),i(3,"button",87),l(4),r()()),n&2){let e=m();o(3),M("aria-label","Jump to session "+e.session),o(),p(e.session)}}function ve(n,t){if(n&1&&(i(0,"span",88),l(1),r()),n&2){let e=t.$implicit;o(),y("#",e)}}function fe(n,t){if(n&1&&(i(0,"div",79),C(1,ve,2,1,"span",88,N),r()),n&2){let e=m();o(),h(e.tags)}}function _e(n,t){if(n&1&&(i(0,"div",90),c(1,"app-icon",91),i(2,"span",92),l(3),r(),i(4,"span",93),l(5),r()()),n&2){let e=t.$implicit,a=m(4);o(),d("size",12),o(),d("title",e.path),o(),p(e.path),o(2),p(a.fmtK(e.tokens))}}function ye(n,t){if(n&1&&(i(0,"div",81)(1,"div",58),l(2),r(),i(3,"div",89),C(4,_e,6,4,"div",90,F),r()()),n&2){let e=m(3);o(2),y("Imports \xB7 ",e.currentImports().length),o(2),h(e.currentImports())}}function be(n,t){if(n&1&&(i(0,"button",55),c(1,"app-icon",94),l(2),r()),n&2){let e=m();M("aria-label",(e.type==="note"?"Edit note":"Edit memory")+" "+e.path),o(),d("size",13),o(),y(" ",e.type==="note"?"Edit note":"Edit memory"," ")}}function Ce(n,t){if(n&1&&(i(0,"button",85),c(1,"app-icon",95),l(2," Forget "),r()),n&2){let e=m();M("aria-label","Forget note "+e.path),o(),d("size",13)}}function he(n,t){if(n&1&&(i(0,"div",46)(1,"div",70)(2,"span",71),c(3,"app-icon",64),l(4),r(),i(5,"span",71),l(6),r(),i(7,"span",30),l(8),r(),c(9,"span",19),x(10,ue,3,1,"span",72),r(),i(11,"div",73)(12,"span",74),l(13),r(),c(14,"app-copy-btn",75),r(),i(15,"div",76)(16,"div",77)(17,"div",12),l(18,"Tokens"),r(),i(19,"div",78),l(20),r()(),i(21,"div",77)(22,"div",12),l(23,"Lines"),r(),i(24,"div",78),l(25),r()(),i(26,"div",77)(27,"div",12),l(28,"Scope"),r(),i(29,"div",78),l(30),r()(),i(31,"div",77)(32,"div",12),l(33,"Modified"),r(),i(34,"div",78),l(35),r()(),x(36,xe,5,2,"div",77),r(),x(37,fe,3,0,"div",79),c(38,"div",80),x(39,ye,6,1,"div",81),i(40,"div",82),x(41,be,3,3,"button",55),i(42,"button",83),c(43,"app-icon",84),l(44," Copy contents "),r(),x(45,Ce,3,2,"button",85),r()()),n&2){let e=t,a=m(2);o(2),_("background",a.T[e.type].soft)("color",a.T[e.type].color),o(),d("name",a.T[e.type].icon)("size",10),o(),y(" ",a.T[e.type].label," "),o(),_("background",a.L[e.level].soft)("color",a.L[e.level].color),o(),p(a.L[e.level].label),o(2),p(a.L[e.level].desc),o(2),v(e.readOnly?10:-1),o(2),d("title",e.path),o(),p(e.path),o(),d("text",e.path),o(6),p(a.fmtK(e.tokens)),o(5),p(e.lines),o(5),p(a.L[e.level].label),o(5),p(e.modified),o(),v(e.type==="note"&&e.session?36:-1),o(),v(e.type==="note"&&(e.tags!=null&&e.tags.length)?37:-1),o(),d("innerHTML",a.currentBody(),I),o(),v(a.currentImports().length>0?39:-1),o(2),v(e.readOnly?-1:41),o(2),d("size",13),o(2),v(e.type==="note"?45:-1)}}function Me(n,t){n&1&&(i(0,"div",47),c(1,"app-icon",3),i(2,"div"),l(3,"Pick an item from the rail to see its contents."),r()()),n&2&&(o(),d("size",32))}function Pe(n,t){if(n&1&&(i(0,"div",31)(1,"div",42)(2,"div",43),x(3,le,2,1)(4,de,6,2,"div",44)(5,ge,2,0),r()(),i(6,"div",45),x(7,he,46,28,"div",46)(8,Me,4,1,"div",47),r()()),n&2){let e,a=m();o(3),v(a.loading()&&a.source()==="seed"?3:a.visibleCount()===0?4:5),o(4),v((e=a.current())?7:8,e)}}function Oe(n,t){n&1&&c(0,"app-icon",109),n&2&&d("size",11)}function we(n,t){if(n&1&&(i(0,"div",103),c(1,"div",104),i(2,"div",105)(3,"div",106)(4,"span",107),l(5),r(),i(6,"span",71),l(7),r(),i(8,"span",108),l(9),r(),c(10,"span",19),x(11,Oe,1,1,"app-icon",109),i(12,"span",110),l(13),r()(),c(14,"div",111),r()()),n&2){let e=t.$implicit,a=t.$index,s=m(3);o(),_("background",s.L[e.level].color),o(4),p(a+1),o(),_("background",s.L[e.level].soft)("color",s.L[e.level].color),o(),p(s.L[e.level].label),o(),d("title",e.path),o(),p(e.path),o(2),v(e.readOnly?11:-1),o(2),p(s.fmtK(e.tokens)),o(),d("innerHTML",s.renderBody(e.body),I)}}function ke(n,t){if(n&1&&(i(0,"div",101),l(1,"Instructions \xB7 precedence order"),r(),i(2,"div",102),C(3,we,15,13,"div",103,F),r()),n&2){let e=m(2);o(3),h(e.effectiveInstructions())}}function Ee(n,t){n&1&&(i(0,"div",100)(1,"div",54),l(2,"No instructions loaded"),r(),i(3,"div"),l(4,"This project has no CLAUDE.md hierarchy yet."),r()())}function Se(n,t){if(n&1&&(i(0,"div",103),c(1,"div",104),i(2,"div",105)(3,"div",106)(4,"span",71),l(5),r(),i(6,"span",108),l(7),r(),c(8,"span",19),i(9,"span",110),l(10),r()(),c(11,"div",111),r()()),n&2){let e=t.$implicit,a=m(3);o(),_("background",a.L[e.level].color),o(3),_("background",a.L[e.level].soft)("color",a.L[e.level].color),o(),p(a.L[e.level].label),o(),d("title",e.path),o(),p(e.path),o(3),p(a.fmtK(e.tokens)),o(),d("innerHTML",a.renderBody(e.body),I)}}function ze(n,t){if(n&1&&(i(0,"div",112)(1,"span"),l(2,"Notes \xB7 memory tool"),r(),i(3,"span",113),l(4,"retrieved facts, not precedence-ranked"),r()(),i(5,"div",102),C(6,Se,12,11,"div",103,F),r()),n&2){let e=m(2);o(6),h(e.effectiveNotes())}}function Te(n,t){if(n&1&&(i(0,"div",32)(1,"div",96),c(2,"app-icon",97),i(3,"span",98),l(4,"Effective memory"),r(),i(5,"span",30),l(6,"\xB7 everything the agent loads"),r()(),i(7,"div",99),l(8," Instructions merge in precedence order \u2014 managed policy is authoritative, and lower blocks fill in where higher ones are silent. Saved notes are appended as retrieved context. "),r(),x(9,ke,5,0)(10,Ee,5,0,"div",100),x(11,ze,8,0),r()),n&2){let e=m();o(2),d("size",15),o(7),v(e.effectiveInstructions().length>0?9:10),o(2),v(e.effectiveNotes().length>0?11:-1)}}var Q={enterprise:{key:"enterprise",label:"Managed",color:"#E5A50A",soft:"rgba(229,165,10,0.14)",desc:"Organization policy \xB7 cannot be overridden"},user:{key:"user",label:"User",color:"#29D2BE",soft:"rgba(41,210,190,0.14)",desc:"Personal \xB7 applies to every project"},project:{key:"project",label:"Project",color:"#5B93F2",soft:"rgba(91,147,242,0.14)",desc:"Team-shared \xB7 checked into the repo"},subdir:{key:"subdir",label:"Directory",color:"#A586F5",soft:"rgba(165,134,245,0.14)",desc:"Scoped to a subtree \xB7 loaded when cwd is inside"},import:{key:"import",label:"Import",color:"#7B8696",soft:"rgba(123,134,150,0.12)",desc:"Pulled in via @path reference"},note:{key:"note",label:"Notes",color:"#46C26B",soft:"rgba(70,194,107,0.14)",desc:"Agent-written \xB7 memory tool"}},f={instruction:{key:"instruction",label:"Instructions",color:"#5B93F2",soft:"rgba(91,147,242,0.14)",icon:"memory",desc:"Directives & rules from CLAUDE.md"},note:{key:"note",label:"Notes",color:"#46C26B",soft:"rgba(70,194,107,0.14)",icon:"tips",desc:"Facts the agent saved via the memory tool"},import:{key:"import",label:"Imports",color:"#29D2BE",soft:"rgba(41,210,190,0.14)",icon:"external",desc:"Files pulled in via @path"}},Ie=["enterprise","project","subdir","import","user"],Fe=[{id:"m-ent",level:"enterprise",type:"instruction",name:"CLAUDE.md",scope:"managed",readOnly:!0,path:"/Library/Application Support/ClaudeCode/CLAUDE.md",tokens:210,lines:9,modified:"managed",body:"# Engineering policy (managed)\n\n- All code must pass `pnpm lint` and `pnpm typecheck` before commit.\n- Never commit secrets, API keys, or `.env` files.\n- Prefer dependency-free solutions; new deps require review.\n- Validate all external input at trust boundaries.\n- Production logs must not contain user content."},{id:"m-user",level:"user",type:"instruction",name:"CLAUDE.md",scope:"~/.claude",path:"~/.claude/CLAUDE.md",tokens:280,lines:12,modified:"3d ago",body:"# Personal preferences\n\n- Before reading a file, try `specship_explore` for structure first.\n- Use conventional commits (`feat:`, `fix:`, `chore:`).\n- Prefer `rg` over `grep`, `fd` over `find`.\n- Keep responses terse \u2014 show diffs, not whole files.\n- Editor open command: `cursor`.\n- Default model for read/edit turns: Sonnet."},{id:"m-proj",level:"project",type:"instruction",name:"CLAUDE.md",scope:"project root",path:"~/dev/specship/CLAUDE.md",tokens:760,lines:28,modified:"2h ago",imports:["m-imp-conv","m-imp-style"],body:"# SpecShip \u2014 project memory\n\n## Architecture\n- Electron + Angular renderer in `packages/web-ng`.\n- MCP server in `src/mcp`, graph engine in `src/graph`.\n- SQLite via better-sqlite3; migrations in `src/db/migrations.ts`.\n\n## Commands\n- `npm run dev` \u2014 renderer + MCP in watch mode.\n- `npm test` \u2014 vitest; `npm run eval` \u2014 evaluation runner.\n- `npm run cli` \u2014 local SpecShip binary.\n\n## Conventions\n- Spec IDs are stable: `REQ-<AREA>-<NNN>`.\n- Never edit generated files under `src/graph/_gen`.\n\n@docs/conventions.md\n@specs/STYLE.md"},{id:"m-sub",level:"subdir",type:"instruction",name:"CLAUDE.md",scope:"src/graph",path:"~/dev/specship/src/graph/CLAUDE.md",tokens:190,lines:7,modified:"1d ago",body:`# Graph engine notes
2
2
 
3
3
  - Layout runs in a worker \u2014 keep \`applyLayout\` pure.
4
4
  - Node positions are cached by content hash.
@@ -1 +1 @@
1
- import{a as xe}from"./chunk-PZSU53SS.js";import{b as he}from"./chunk-WBJ5VEB5.js";import{a as _e}from"./chunk-SQPYSOV6.js";import{a as ge}from"./chunk-QIZ65CGB.js";import{a as ue}from"./chunk-IOB4JJT4.js";import{c as se}from"./chunk-DOKZOFKM.js";import{c as j}from"./chunk-PAO2624Y.js";import{a as ce}from"./chunk-PBRCKHEQ.js";import{a as pe}from"./chunk-3H2EZLZN.js";import{Aa as p,Ga as O,I as W,Ia as E,Ka as m,M as S,N as M,O as P,P as G,Ta as U,Ua as Y,Va as l,W as H,Wa as _,Xa as X,Ya as re,Za as le,bb as de,ea as o,ka as oe,lb as I,qa as Q,ra as C,sa as b,ua as q,va as D,wa as K,xa as k,ya as i,za as a,zb as me}from"./chunk-SYGIPC2P.js";import{a as ie,b as ae}from"./chunk-Q7L6LLAK.js";function fe(t,n,e){if(n.length===0)return new Map;switch(t){case"force":return te(n,e);case"anchored":return ye(n,e);default:return be(n,e)}}function be(t,n){let e=new Set(t.map(c=>c.id)),r=n.filter(c=>e.has(c.from)&&e.has(c.to)),d=new Map,s=new Map;for(let c of t)d.set(c.id,[]),s.set(c.id,0);for(let c of r)d.get(c.from).push(c.to),s.set(c.to,(s.get(c.to)??0)+1);let g=new Map;for(let c of t)g.set(c.id,0);let w=new Map(s),L=t.filter(c=>(s.get(c.id)??0)===0).map(c=>c.id),T=new Set;for(;L.length;){let c=L.shift();if(T.has(c))continue;T.add(c);let v=g.get(c);for(let f of d.get(c))g.set(f,Math.max(g.get(f),v+1)),w.set(f,(w.get(f)??1)-1),(w.get(f)??0)<=0&&L.push(f)}let u=14,z=new Map;for(let c of t){let v=Math.min(g.get(c.id),u),f=z.get(v)??[];f.push(c.id),z.set(v,f)}let h=210,y=48,x=new Map;for(let[c,v]of z)v.forEach((f,N)=>{x.set(f,{x:c*h,y:(N-(v.length-1)/2)*y})});return x}function te(t,n,e,r){let d=t.length,s=Math.max(220,d*9),g=new Map;t.forEach((h,y)=>{let x=r?.get(h.id);if(x){g.set(h.id,{x:x.x,y:x.y});return}let c=y/d*Math.PI*2,v=s*(.35+.65*(y*.6180339887%1));g.set(h.id,{x:Math.cos(c)*v,y:Math.sin(c)*v})});let w=new Set(t.map(h=>h.id)),L=n.filter(h=>w.has(h.from)&&w.has(h.to)),T=s/Math.sqrt(d),u=s/2,z=120;for(let h=0;h<z;h++){let y=new Map;for(let x of t)y.set(x.id,{x:0,y:0});for(let x=0;x<d;x++){let c=g.get(t[x].id),v=y.get(t[x].id);for(let f=x+1;f<d;f++){let N=g.get(t[f].id),V=c.x-N.x,R=c.y-N.y,$=Math.hypot(V,R)||.01,F=T*T/$,B=V/$,A=R/$;v.x+=B*F,v.y+=A*F;let ne=y.get(t[f].id);ne.x-=B*F,ne.y-=A*F}}for(let x of L){let c=g.get(x.from),v=g.get(x.to),f=c.x-v.x,N=c.y-v.y,V=Math.hypot(f,N)||.01,R=V*V/T,$=f/V,F=N/V,B=y.get(x.from),A=y.get(x.to);B.x-=$*R,B.y-=F*R,A.x+=$*R,A.y+=F*R}for(let x of t){if(e?.has(x.id))continue;let c=y.get(x.id),v=Math.hypot(c.x,c.y)||.01,f=g.get(x.id);f.x+=c.x/v*Math.min(v,u),f.y+=c.y/v*Math.min(v,u)}u*=.95}return g}function ye(t,n){let e=t.filter(g=>g.kind==="spec");if(e.length===0)return te(t,n);let r=-Math.max(340,t.length*5),d=new Map;e.forEach((g,w)=>d.set(g.id,{x:r,y:(w-(e.length-1)/2)*64}));let s=new Set(e.map(g=>g.id));return te(t,n,s,d)}var ke=()=>[1,2,3,4],we=(t,n)=>n.node.id,ee=(t,n)=>n.id;function Se(t,n){t&1&&p(0,"app-pick-project-empty",0)}function Me(t,n){if(t&1){let e=O();i(0,"button",19),E("click",function(){let d=S(e).$implicit,s=m(2);return M(s.toggleFilter(d))}),p(1,"span",20),l(2),i(3,"span",21),l(4),a()()}if(t&2){let e=n.$implicit,r=m(2);U("--chip-color",r.chipColor(e)),Y("is-active",r.isFilterActive(e)),o(),Q("data-kind",e),o(),X(" ",r.kindLabel(e)," "),o(2),_(r.countFor(e))}}function Ee(t,n){t&1&&p(0,"span",12)}function Pe(t,n){if(t&1){let e=O();i(0,"button",23),E("click",function(){let d=S(e).$implicit,s=m(3);return M(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=m(3);o(),Y("is-spec",e.node.kind==="spec")("is-route",e.node.kind==="route")("is-test",e.node.kind==="test"),o(2),_(e.node.name),o(2),_(e.node.kind),o(2),_(r.shortPath(e.node.filePath))}}function Ge(t,n){if(t&1&&(i(0,"div",13),D(1,Pe,8,9,"button",22,we),a()),t&2){let e=m(2);o(),K(e.searchResults.state().data.results)}}function Oe(t,n){if(t&1){let e=O();i(0,"app-graph-canvas",28),E("nodeClick",function(d){S(e);let s=m(3);return M(s.pickFromCanvas(d))}),a(),i(1,"div",29),l(2),a()}if(t&2){let e=m(3);k("nodes",e.visibleNodes())("edges",e.visibleEdges())("selectedId","")("fitKey",e.fitKey())("hiddenIds",e.hiddenIds()),o(2),re(" Showing the ",e.fullGraphCounts().shown," most-connected of ",e.fullGraphCounts().total.toLocaleString()," nodes \xB7 search or click a node to drill in ")}}function Te(t,n){t&1&&(i(0,"div",17)(1,"p"),l(2,"Loading graph\u2026"),a()())}function Ie(t,n){if(t&1&&(i(0,"p",30),l(1),a()),t&2){let e=n;o(),le("",e.nodeCount.toLocaleString()," nodes \xB7 ",e.edgeCount.toLocaleString()," edges \xB7 ",e.fileCount.toLocaleString()," files")}}function Le(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(),C(5,Ie,2,3,"p",30),a()),t&2){let e,r=m(3);o(5),b((e=r.status.state().data)?5:-1,e)}}function ze(t,n){if(t&1&&C(0,Oe,3,7)(1,Te,3,0,"div",17)(2,Le,6,1,"div",17),t&2){let e=m(2);b(e.fullGraphActive()?0:e.fullGraphLoading()?1:2)}}function De(t,n){t&1&&(i(0,"div",17)(1,"p"),l(2,"Loading\u2026"),a()())}function Ke(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=m(2);o(4),_(e.nodeDetail.state().error)}}function Ne(t,n){if(t&1&&(i(0,"div",17)(1,"p"),l(2),a()()),t&2){let e=m(2);o(2),X('No match for "',e.selectedSymbol(),'".')}}function Ve(t,n){if(t&1&&(i(0,"div",33),p(1,"span",43),i(2,"span",44),l(3),a()()),t&2){let e=n.$implicit;o(),Q("data-kind",e),o(2),_(e)}}function Re(t,n){if(t&1){let e=O();i(0,"app-graph-canvas",28),E("nodeClick",function(d){S(e);let s=m(2);return M(s.pickFromCanvas(d))}),a(),i(1,"div",31)(2,"div",32),D(3,Ve,4,2,"div",33,q),a(),p(5,"div",34),i(6,"div",35)(7,"div",36),P(),i(8,"svg",37),p(9,"line",38),a(),G(),i(10,"span",39),l(11,"implements"),a()(),i(12,"div",36),P(),i(13,"svg",37),p(14,"line",40),a(),G(),i(15,"span",39),l(16,"tests"),a()(),i(17,"div",36),P(),i(18,"svg",37),p(19,"line",41),a(),G(),i(20,"span",39),l(21,"calls"),a()(),i(22,"div",36),P(),i(23,"svg",37),p(24,"line",42),a(),G(),i(25,"span",39),l(26,"synth"),a()()()()}if(t&2){let e=m(2);k("nodes",e.visibleNodes())("edges",e.visibleEdges())("selectedId",e.selectedDetail().id)("fitKey",e.fitKey())("hiddenIds",e.hiddenIds()),o(3),K(e.kindKeys)}}function Fe(t,n){if(t&1&&(i(0,"span",51),l(1),a()),t&2){let e=m();o(),_(e.startLine?"L"+e.startLine:"")}}function He(t,n){if(t&1&&(i(0,"div",59)(1,"div",61),l(2,"Signature"),a(),i(3,"pre",62),l(4),a()()),t&2){let e=m();o(4),_(e.signature)}}function $e(t,n){if(t&1&&(i(0,"div",59)(1,"div",61),l(2,"Docstring"),a(),i(3,"p",63),l(4),a()()),t&2){let e=m();o(4),_(e.docstring)}}function je(t,n){if(t&1&&(i(0,"span",68),l(1),a()),t&2){let e=m().$implicit;o(),_(e.specTitle)}}function Be(t,n){if(t&1&&(i(0,"div",65),p(1,"app-state-pill",66),i(2,"span",67),l(3),a(),C(4,je,2,1,"span",68),a()),t&2){let e=n.$implicit;o(),k("state",e.state),o(2),_(e.specId),o(),b(e.specTitle?4:-1)}}function Ae(t,n){if(t&1&&(i(0,"div",59)(1,"div",61),l(2,"Linked specs "),i(3,"span",64),l(4),a()(),D(5,Be,5,3,"div",65,ee),a()),t&2){let e=m();o(4),_(e.linkedSpecs.length),o(),K(e.linkedSpecs)}}function Qe(t,n){if(t&1){let e=O();i(0,"button",71),E("click",function(){let d=S(e).$implicit,s=m(5);return M(s.pickResult(d))}),p(1,"app-icon",72),i(2,"span",67),l(3),a(),i(4,"span",73),l(5),a()()}if(t&2){let e=n.$implicit,r=m(5);o(),k("size",12),o(2),_(e.name),o(2),_(r.fileName(e.filePath))}}function qe(t,n){if(t&1&&D(0,Qe,6,3,"button",70,ee),t&2){let e=m(2);K(e.callers)}}function Ue(t,n){t&1&&(i(0,"div",69),l(1,"No callers"),a())}function Xe(t,n){if(t&1){let e=O();i(0,"button",71),E("click",function(){let d=S(e).$implicit,s=m(5);return M(s.pickResult(d))}),p(1,"app-icon",72),i(2,"span",67),l(3),a(),i(4,"span",73),l(5),a()()}if(t&2){let e=n.$implicit,r=m(5);o(),k("size",12),o(2),_(e.name),o(2),_(r.fileName(e.filePath))}}function We(t,n){if(t&1&&D(0,Xe,6,3,"button",70,ee),t&2){let e=m(2);K(e.callees)}}function Ye(t,n){t&1&&(i(0,"div",69),l(1,"No callees"),a())}function Je(t,n){if(t&1&&(i(0,"div",59)(1,"div",61),l(2,"Callers "),i(3,"span",64),l(4),a()(),C(5,qe,2,0)(6,Ue,2,0,"div",69),a(),i(7,"div",59)(8,"div",61),l(9,"Callees "),i(10,"span",64),l(11),a()(),C(12,We,2,0)(13,Ye,2,0,"div",69),a()),t&2){let e=m();o(4),_(e.callers.length),o(),b(e.callers.length?5:6),o(6),_(e.callees.length),o(),b(e.callees.length?12:13)}}function Ze(t,n){if(t&1){let e=O();i(0,"button",74),p(1,"app-icon",75),l(2," Implement "),a(),i(3,"button",14),E("click",function(){S(e);let d=m(3);return M(d.navigateToDrift())}),l(4,"Fix"),a(),i(5,"button",76),l(6,"Relink"),a()}t&2&&(o(),k("size",13))}function et(t,n){if(t&1){let e=O();i(0,"button",74),p(1,"app-icon",77),l(2," Reveal in editor "),a(),i(3,"button",14),E("click",function(){S(e);let d=m(3);return M(d.navigateToSpecs())}),l(4,"Open Specs"),a()}t&2&&(o(),k("size",13))}function tt(t,n){if(t&1){let e=O();i(0,"div",45)(1,"div",46),p(2,"span",47),i(3,"div",48)(4,"div",49),l(5),a(),i(6,"div",50)(7,"span",51),l(8),a(),C(9,Fe,2,1,"span",51),a()(),i(10,"button",52),E("click",function(){S(e);let d=m(2);return M(d.clearSelection())}),p(11,"app-icon",53),a()(),i(12,"div",54),p(13,"app-icon",55),i(14,"span",56),l(15),a(),p(16,"app-copy-btn",57),a()(),i(17,"div",58),C(18,He,5,1,"div",59),C(19,$e,5,1,"div",59),C(20,Ae,7,1,"div",59),C(21,Je,14,4),a(),i(22,"div",60),C(23,Ze,7,1)(24,et,5,1),a()}if(t&2){let e=n,r=e.kind==="spec",d=m(2).detailColor(e);o(2),U("background",d)("box-shadow","0 0 8px "+d),Y("is-rect",r),o(3),_(e.name),o(2),U("color",d)("background","color-mix(in srgb, "+d+" 14%, transparent)"),o(),_(e.kind),o(),b(e.signature?9:-1),o(2),k("size",14),o(2),k("size",12),o(2),_(e.filePath),o(),k("text",e.filePath),o(2),b(e.signature?18:-1),o(),b(e.docstring?19:-1),o(),b(e.linkedSpecs&&e.linkedSpecs.length?20:-1),o(),b(r?-1:21),o(2),b(r?23:24)}}function nt(t,n){t&1&&(i(0,"span",82),l(1),a()),t&2&&(o(),X("",n.nodeCount.toLocaleString()," shown"))}function it(t,n){if(t&1&&(i(0,"div",85),p(1,"span",87),i(2,"span",88),l(3),a(),i(4,"span",89),l(5),a()()),t&2){let e=n.$implicit,r=m(3);o(),Q("data-kind",e),o(2),_(e),o(2),_(r.overviewKindCounts()[e])}}function at(t,n){t&1&&(i(0,"div",86),p(1,"app-state-pill",90)(2,"span",91)(3,"app-state-pill",92)(4,"span",91)(5,"app-state-pill",93)(6,"span",91),a())}function ot(t,n){if(t&1&&(i(0,"div",86),p(1,"app-state-pill",90),i(2,"span",94),l(3),a(),p(4,"app-state-pill",92),i(5,"span",94),l(6),a(),p(7,"app-state-pill",93),i(8,"span",94),l(9),a()()),t&2){let e,r,d,s=m(3);o(3),_(((e=s.health.state().data)==null||e.linkHealth==null?null:e.linkHealth.verified)??0),o(3),_(((r=s.health.state().data)==null||r.linkHealth==null?null:r.linkHealth.drifted)??0),o(3),_((((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 rt(t,n){t&1&&(i(0,"div",95),P(),i(1,"svg",96),p(2,"line",97),a(),G(),p(3,"span",98),a(),i(4,"div",95),P(),i(5,"svg",96),p(6,"line",99),a(),G(),p(7,"span",98),a(),i(8,"div",95),P(),i(9,"svg",96),p(10,"line",100),a(),G(),p(11,"span",98),a(),i(12,"div",95),P(),i(13,"svg",96),p(14,"line",101),a(),G(),p(15,"span",98),a())}function lt(t,n){if(t&1&&(i(0,"div",95),P(),i(1,"svg",96),p(2,"line",97),a(),G(),i(3,"span",102),l(4,"calls"),a(),i(5,"span",103),l(6),a()(),i(7,"div",95),P(),i(8,"svg",96),p(9,"line",99),a(),G(),i(10,"span",102),l(11,"implements / documents"),a(),i(12,"span",103),l(13),a()(),i(14,"div",95),P(),i(15,"svg",96),p(16,"line",100),a(),G(),i(17,"span",102),l(18,"tests"),a(),i(19,"span",103),l(20),a()(),i(21,"div",95),P(),i(22,"svg",96),p(23,"line",101),a(),G(),i(24,"span",102),l(25,"synthesized (heuristic)"),a(),i(26,"span",103),l(27),a()()),t&2){let e,r,d,s,g=m(3);o(6),_(((e=g.health.state().data)==null||e.edgeKinds==null?null:e.edgeKinds.calls)??0),o(7),_(((r=g.health.state().data)==null||r.edgeKinds==null?null:r.edgeKinds.implements)??0),o(7),_(((d=g.health.state().data)==null||d.edgeKinds==null?null:d.edgeKinds.tests)??0),o(7),_(((s=g.health.state().data)==null||s.edgeKinds==null?null:s.edgeKinds.synth)??0)}}function dt(t,n){t&1&&(i(0,"div",104),p(1,"span",105)(2,"span",106),a())}function st(t,n){t&1&&(i(0,"div",84)(1,"div",61),l(2,"Most connected"),a(),D(3,dt,3,0,"div",104,q),a()),t&2&&(o(3),K(de(0,ke)))}function pt(t,n){if(t&1){let e=O();i(0,"button",108),E("click",function(){let d=S(e).$implicit,s=m(4);return M(s.pickHub(d))}),p(1,"span",109),i(2,"span",110),l(3),a(),i(4,"span",111),l(5),a(),p(6,"app-icon",112),a()}if(t&2){let e=n.$implicit,r=m(4);Q("aria-label",e.name+", "+e.degree+" edges"),o(),U("background",r.nodeColor(e.kind))("border-radius",e.kind==="spec"?"2px":"50%"),o(2),_(e.name),o(2),X("",e.degree," edges"),o(),k("size",11)}}function ct(t,n){if(t&1&&(i(0,"div",84)(1,"div",61),l(2,"Most connected"),a(),D(3,pt,7,8,"button",107,ee),a()),t&2){let e=m(3);o(3),K(e.health.state().data.hubs.slice(0,8))}}function mt(t,n){if(t&1&&(i(0,"div",78),p(1,"app-icon",79),i(2,"span",80),l(3,"Graph overview"),a(),p(4,"div",81),C(5,nt,2,1,"span",82),a(),i(6,"div",58)(7,"p",83),l(8," Click any node to inspect its signature, links, callers and callees \u2014 without leaving this view. "),a(),i(9,"div",84)(10,"div",61),l(11,"Nodes by kind"),a(),D(12,it,6,3,"div",85,q),a(),i(14,"div",84)(15,"div",61),l(16,"Spec link health"),a(),C(17,at,7,0,"div",86)(18,ot,10,3,"div",86),a(),i(19,"div",84)(20,"div",61),l(21,"Edge types"),a(),C(22,rt,16,0)(23,lt,28,4),a(),C(24,st,5,1,"div",84)(25,ct,5,0,"div",84),a()),t&2){let e,r,d,s=m(2);o(),k("size",15),o(4),b((e=s.status.state().data)?5:-1,e),o(7),K(s.kindKeys),o(5),b(s.health.state().loading?17:18),o(5),b(s.health.state().loading?22:(r=s.health.state().data)!=null&&r.edgeKinds?23:-1),o(2),b(s.health.state().loading?24:!((d=s.health.state().data)==null||d.hubs==null)&&d.hubs.length?25:-1)}}function ut(t,n){if(t&1){let e=O();i(0,"div",1)(1,"div",2)(2,"div",3)(3,"app-segmented",4),E("change",function(d){S(e);let s=m();return M(s.onLayoutChange(d))}),a(),p(4,"div",5),D(5,Me,5,7,"button",6,q),p(7,"div",7),i(8,"div",8)(9,"div",9),p(10,"app-icon",10),i(11,"input",11),E("input",function(d){S(e);let s=m();return M(s.onSearchInput(d.target.value))}),a(),C(12,Ee,1,0,"span",12),a(),C(13,Ge,3,0,"div",13),a(),i(14,"button",14),E("click",function(){S(e);let d=m();return M(d.recenter())}),p(15,"app-icon",15),l(16," Recenter "),a()(),i(17,"div",16),C(18,ze,3,1)(19,De,3,0,"div",17)(20,Ke,5,1,"div",17)(21,Ne,3,1,"div",17)(22,Re,27,5),a()(),i(23,"aside",18),C(24,tt,25,22)(25,mt,26,5),a()()}if(t&2){let e,r=m();o(3),k("options",r.layoutOptions)("value",r.layoutMode()),o(2),K(r.kindKeys),o(5),k("size",13),o(),k("value",r.searchInput()),o(),b(r.searchResults.state().loading?12:-1),o(),b(r.searchResults.state().data&&r.searchResults.state().data.results.length>0?13:-1),o(2),k("size",13),o(3),b(r.selectedSymbol()?r.nodeDetail.state().loading?19:r.nodeDetail.state().error?20:r.selectedDetail()?22:21:18),o(6),b((e=r.selectedDetail())?24:25,e)}}var ve=class t{api=W(pe);projects=W(ce);router=W(se);status=j(this.api,()=>`/api/status${this.projects.projectQuery()}`);health=j(this.api,()=>`/api/graph/health${this.projects.projectQuery()}`);fullGraph=j(this.api,()=>`/api/graph/full?limit=250${this.projects.projectQuery("&")}`);layoutMode=H("hierarchical");layoutOptions=[{value:"hierarchical",label:"Hierarchical"},{value:"force",label:"Force"},{value:"anchored",label:"Anchored"}];searchInput=H("");searchQuery=H("");searchDebounce=null;searchResults=j(this.api,()=>{let n=this.searchQuery().trim();return n.length>=2?`/api/graph/search?q=${encodeURIComponent(n)}&limit=12${this.projects.projectQuery("&")}`:null});selectedSymbol=H(null);nodeDetail=j(this.api,()=>{let n=this.selectedSymbol();return n?`/api/graph/node?symbol=${encodeURIComponent(n)}${this.projects.projectQuery("&")}`:null});selectedDetail=I(()=>this.nodeDetail.state().data?.matches?.[0]??null);filters=H({code:!0,spec:!0,route:!0,test:!0});fitKey=H(0);canvasData=I(()=>{let n=this.selectedDetail();if(!n)return this.fullGraphData();let e=this.filters(),r=h=>{let y=J(h);return e[y]},d={id:n.id,label:n.name,sub:Z(n.filePath),kind:n.kind,x:0,y:0},s=(n.callers??[]).filter(h=>r(h.kind)),g=(n.callees??[]).filter(h=>r(h.kind)),w=(n.linkedSpecs??[]).filter(()=>e.spec),L=280,T=56,u=[d],z=[];return s.forEach((h,y)=>{let x=(y-(s.length-1)/2)*T;u.push(Ce(h,-L,x)),z.push({from:h.id,to:n.id,kind:"calls"})}),g.forEach((h,y)=>{let x=(y-(g.length-1)/2)*T;u.push(Ce(h,L,x)),z.push({from:n.id,to:h.id,kind:"calls"})}),w.forEach((h,y)=>{let x=(y-(w.length-1)/2)*220,c="spec:"+h.specId;u.push({id:c,label:h.specId,sub:h.specTitle??void 0,kind:"spec",state:h.state,x,y:-160}),z.push({from:c,to:n.id,kind:"implements"})}),{nodes:u,edges:z}});fullGraphData(){let n=this.fullGraph.state().data;if(!n?.nodes?.length)return{nodes:[],edges:[]};let e=this.filters(),r=n.nodes.filter(u=>e[J(u.kind)]),d=new Set(r.map(u=>u.id)),s=n.edges.filter(u=>d.has(u.from)&&d.has(u.to)),g=new Map(r.map(u=>[u.id,u.kind])),w=fe(this.layoutMode(),r.map(u=>({id:u.id,kind:u.kind})),s.map(u=>({from:u.from,to:u.to}))),L=r.map(u=>({id:u.id,label:u.name,sub:Z(u.filePath),kind:u.kind,x:w.get(u.id)?.x??0,y:w.get(u.id)?.y??0})),T=s.map(u=>({from:u.from,to:u.to,kind:u.provenance==="heuristic"?"synth":g.get(u.from)==="spec"||g.get(u.to)==="spec"?"implements":"calls"}));return{nodes:L,edges:T}}fullGraphActive=I(()=>!this.selectedSymbol()&&this.fullGraphData().nodes.length>0);fullGraphLoading=I(()=>!this.selectedSymbol()&&this.fullGraph.state().loading);fullGraphCounts=I(()=>{let n=this.fullGraph.state().data;return n?{shown:n.shown,total:n.total}:{shown:0,total:0}});visibleNodes=I(()=>this.canvasData().nodes);visibleEdges=I(()=>this.canvasData().edges);hiddenIds=I(()=>{let n=this.filters(),e=new Set;for(let r of this.canvasData().nodes)n[J(r.kind)]||e.add(r.id);return e});kindCounts=I(()=>{let n={code:0,spec:0,route:0,test:0};for(let e of this.canvasData().nodes)n[J(e.kind)]++;return n});overviewKindCounts=I(()=>{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){let s=this.fullGraph.state().data?.nodes.find(g=>g.id===n);s&&(this.selectedSymbol.set(s.name),this.fitKey.update(g=>g+1));return}if(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=>ae(ie({},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 Z(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=oe({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"],[3,"nodeClick","nodes","edges","selectedId","fitKey","hiddenIds"],[1,"gp-overview-note"],[1,"gp-stats"],[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&&C(0,Se,1,0,"app-pick-project-empty",0)(1,ut,26,9,"div",1),e&2&&b(r.status.state().noProject?0:1)},dependencies:[ge,_e,me,ue,he,xe],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)}.gp-overview-note[_ngcontent-%COMP%]{position:absolute;bottom:12px;left:50%;transform:translate(-50%);padding:5px 12px;border-radius:999px;background:var(--bg-elevated);border:1px solid var(--border-subtle);color:var(--text-secondary);font-size:11px;white-space:nowrap;pointer-events:none;box-shadow:var(--shadow-pop)}"],changeDetection:0})};function Ce(t,n,e){return{id:t.id,label:t.name,sub:Z(t.filePath),kind:t.kind,x:n,y:e}}function Z(t){return t?t.split("/").slice(-2).join("/"):""}function J(t){return t==="spec"?"spec":t==="route"?"route":t==="test"?"test":"code"}export{ve as Graph};
1
+ import{a as xe}from"./chunk-PZSU53SS.js";import{b as he}from"./chunk-WBJ5VEB5.js";import{a as _e}from"./chunk-SQPYSOV6.js";import{a as ge}from"./chunk-QIZ65CGB.js";import{a as ue}from"./chunk-IOB4JJT4.js";import{c as se}from"./chunk-DOKZOFKM.js";import{c as j}from"./chunk-DTWIJ3GJ.js";import{a as ce}from"./chunk-JGDK6YKG.js";import{a as pe}from"./chunk-TWVVIWKO.js";import{Aa as p,Ga as O,I as W,Ia as E,Ka as m,M as S,N as M,O as P,P as G,Ta as U,Ua as Y,Va as l,W as H,Wa as _,Xa as X,Ya as re,Za as le,bb as de,ea as o,ka as oe,lb as I,qa as Q,ra as C,sa as b,ua as q,va as D,wa as K,xa as k,ya as i,za as a,zb as me}from"./chunk-SYGIPC2P.js";import{a as ie,b as ae}from"./chunk-Q7L6LLAK.js";function fe(t,n,e){if(n.length===0)return new Map;switch(t){case"force":return te(n,e);case"anchored":return ye(n,e);default:return be(n,e)}}function be(t,n){let e=new Set(t.map(c=>c.id)),r=n.filter(c=>e.has(c.from)&&e.has(c.to)),d=new Map,s=new Map;for(let c of t)d.set(c.id,[]),s.set(c.id,0);for(let c of r)d.get(c.from).push(c.to),s.set(c.to,(s.get(c.to)??0)+1);let g=new Map;for(let c of t)g.set(c.id,0);let w=new Map(s),L=t.filter(c=>(s.get(c.id)??0)===0).map(c=>c.id),T=new Set;for(;L.length;){let c=L.shift();if(T.has(c))continue;T.add(c);let v=g.get(c);for(let f of d.get(c))g.set(f,Math.max(g.get(f),v+1)),w.set(f,(w.get(f)??1)-1),(w.get(f)??0)<=0&&L.push(f)}let u=14,z=new Map;for(let c of t){let v=Math.min(g.get(c.id),u),f=z.get(v)??[];f.push(c.id),z.set(v,f)}let h=210,y=48,x=new Map;for(let[c,v]of z)v.forEach((f,N)=>{x.set(f,{x:c*h,y:(N-(v.length-1)/2)*y})});return x}function te(t,n,e,r){let d=t.length,s=Math.max(220,d*9),g=new Map;t.forEach((h,y)=>{let x=r?.get(h.id);if(x){g.set(h.id,{x:x.x,y:x.y});return}let c=y/d*Math.PI*2,v=s*(.35+.65*(y*.6180339887%1));g.set(h.id,{x:Math.cos(c)*v,y:Math.sin(c)*v})});let w=new Set(t.map(h=>h.id)),L=n.filter(h=>w.has(h.from)&&w.has(h.to)),T=s/Math.sqrt(d),u=s/2,z=120;for(let h=0;h<z;h++){let y=new Map;for(let x of t)y.set(x.id,{x:0,y:0});for(let x=0;x<d;x++){let c=g.get(t[x].id),v=y.get(t[x].id);for(let f=x+1;f<d;f++){let N=g.get(t[f].id),V=c.x-N.x,R=c.y-N.y,$=Math.hypot(V,R)||.01,F=T*T/$,B=V/$,A=R/$;v.x+=B*F,v.y+=A*F;let ne=y.get(t[f].id);ne.x-=B*F,ne.y-=A*F}}for(let x of L){let c=g.get(x.from),v=g.get(x.to),f=c.x-v.x,N=c.y-v.y,V=Math.hypot(f,N)||.01,R=V*V/T,$=f/V,F=N/V,B=y.get(x.from),A=y.get(x.to);B.x-=$*R,B.y-=F*R,A.x+=$*R,A.y+=F*R}for(let x of t){if(e?.has(x.id))continue;let c=y.get(x.id),v=Math.hypot(c.x,c.y)||.01,f=g.get(x.id);f.x+=c.x/v*Math.min(v,u),f.y+=c.y/v*Math.min(v,u)}u*=.95}return g}function ye(t,n){let e=t.filter(g=>g.kind==="spec");if(e.length===0)return te(t,n);let r=-Math.max(340,t.length*5),d=new Map;e.forEach((g,w)=>d.set(g.id,{x:r,y:(w-(e.length-1)/2)*64}));let s=new Set(e.map(g=>g.id));return te(t,n,s,d)}var ke=()=>[1,2,3,4],we=(t,n)=>n.node.id,ee=(t,n)=>n.id;function Se(t,n){t&1&&p(0,"app-pick-project-empty",0)}function Me(t,n){if(t&1){let e=O();i(0,"button",19),E("click",function(){let d=S(e).$implicit,s=m(2);return M(s.toggleFilter(d))}),p(1,"span",20),l(2),i(3,"span",21),l(4),a()()}if(t&2){let e=n.$implicit,r=m(2);U("--chip-color",r.chipColor(e)),Y("is-active",r.isFilterActive(e)),o(),Q("data-kind",e),o(),X(" ",r.kindLabel(e)," "),o(2),_(r.countFor(e))}}function Ee(t,n){t&1&&p(0,"span",12)}function Pe(t,n){if(t&1){let e=O();i(0,"button",23),E("click",function(){let d=S(e).$implicit,s=m(3);return M(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=m(3);o(),Y("is-spec",e.node.kind==="spec")("is-route",e.node.kind==="route")("is-test",e.node.kind==="test"),o(2),_(e.node.name),o(2),_(e.node.kind),o(2),_(r.shortPath(e.node.filePath))}}function Ge(t,n){if(t&1&&(i(0,"div",13),D(1,Pe,8,9,"button",22,we),a()),t&2){let e=m(2);o(),K(e.searchResults.state().data.results)}}function Oe(t,n){if(t&1){let e=O();i(0,"app-graph-canvas",28),E("nodeClick",function(d){S(e);let s=m(3);return M(s.pickFromCanvas(d))}),a(),i(1,"div",29),l(2),a()}if(t&2){let e=m(3);k("nodes",e.visibleNodes())("edges",e.visibleEdges())("selectedId","")("fitKey",e.fitKey())("hiddenIds",e.hiddenIds()),o(2),re(" Showing the ",e.fullGraphCounts().shown," most-connected of ",e.fullGraphCounts().total.toLocaleString()," nodes \xB7 search or click a node to drill in ")}}function Te(t,n){t&1&&(i(0,"div",17)(1,"p"),l(2,"Loading graph\u2026"),a()())}function Ie(t,n){if(t&1&&(i(0,"p",30),l(1),a()),t&2){let e=n;o(),le("",e.nodeCount.toLocaleString()," nodes \xB7 ",e.edgeCount.toLocaleString()," edges \xB7 ",e.fileCount.toLocaleString()," files")}}function Le(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(),C(5,Ie,2,3,"p",30),a()),t&2){let e,r=m(3);o(5),b((e=r.status.state().data)?5:-1,e)}}function ze(t,n){if(t&1&&C(0,Oe,3,7)(1,Te,3,0,"div",17)(2,Le,6,1,"div",17),t&2){let e=m(2);b(e.fullGraphActive()?0:e.fullGraphLoading()?1:2)}}function De(t,n){t&1&&(i(0,"div",17)(1,"p"),l(2,"Loading\u2026"),a()())}function Ke(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=m(2);o(4),_(e.nodeDetail.state().error)}}function Ne(t,n){if(t&1&&(i(0,"div",17)(1,"p"),l(2),a()()),t&2){let e=m(2);o(2),X('No match for "',e.selectedSymbol(),'".')}}function Ve(t,n){if(t&1&&(i(0,"div",33),p(1,"span",43),i(2,"span",44),l(3),a()()),t&2){let e=n.$implicit;o(),Q("data-kind",e),o(2),_(e)}}function Re(t,n){if(t&1){let e=O();i(0,"app-graph-canvas",28),E("nodeClick",function(d){S(e);let s=m(2);return M(s.pickFromCanvas(d))}),a(),i(1,"div",31)(2,"div",32),D(3,Ve,4,2,"div",33,q),a(),p(5,"div",34),i(6,"div",35)(7,"div",36),P(),i(8,"svg",37),p(9,"line",38),a(),G(),i(10,"span",39),l(11,"implements"),a()(),i(12,"div",36),P(),i(13,"svg",37),p(14,"line",40),a(),G(),i(15,"span",39),l(16,"tests"),a()(),i(17,"div",36),P(),i(18,"svg",37),p(19,"line",41),a(),G(),i(20,"span",39),l(21,"calls"),a()(),i(22,"div",36),P(),i(23,"svg",37),p(24,"line",42),a(),G(),i(25,"span",39),l(26,"synth"),a()()()()}if(t&2){let e=m(2);k("nodes",e.visibleNodes())("edges",e.visibleEdges())("selectedId",e.selectedDetail().id)("fitKey",e.fitKey())("hiddenIds",e.hiddenIds()),o(3),K(e.kindKeys)}}function Fe(t,n){if(t&1&&(i(0,"span",51),l(1),a()),t&2){let e=m();o(),_(e.startLine?"L"+e.startLine:"")}}function He(t,n){if(t&1&&(i(0,"div",59)(1,"div",61),l(2,"Signature"),a(),i(3,"pre",62),l(4),a()()),t&2){let e=m();o(4),_(e.signature)}}function $e(t,n){if(t&1&&(i(0,"div",59)(1,"div",61),l(2,"Docstring"),a(),i(3,"p",63),l(4),a()()),t&2){let e=m();o(4),_(e.docstring)}}function je(t,n){if(t&1&&(i(0,"span",68),l(1),a()),t&2){let e=m().$implicit;o(),_(e.specTitle)}}function Be(t,n){if(t&1&&(i(0,"div",65),p(1,"app-state-pill",66),i(2,"span",67),l(3),a(),C(4,je,2,1,"span",68),a()),t&2){let e=n.$implicit;o(),k("state",e.state),o(2),_(e.specId),o(),b(e.specTitle?4:-1)}}function Ae(t,n){if(t&1&&(i(0,"div",59)(1,"div",61),l(2,"Linked specs "),i(3,"span",64),l(4),a()(),D(5,Be,5,3,"div",65,ee),a()),t&2){let e=m();o(4),_(e.linkedSpecs.length),o(),K(e.linkedSpecs)}}function Qe(t,n){if(t&1){let e=O();i(0,"button",71),E("click",function(){let d=S(e).$implicit,s=m(5);return M(s.pickResult(d))}),p(1,"app-icon",72),i(2,"span",67),l(3),a(),i(4,"span",73),l(5),a()()}if(t&2){let e=n.$implicit,r=m(5);o(),k("size",12),o(2),_(e.name),o(2),_(r.fileName(e.filePath))}}function qe(t,n){if(t&1&&D(0,Qe,6,3,"button",70,ee),t&2){let e=m(2);K(e.callers)}}function Ue(t,n){t&1&&(i(0,"div",69),l(1,"No callers"),a())}function Xe(t,n){if(t&1){let e=O();i(0,"button",71),E("click",function(){let d=S(e).$implicit,s=m(5);return M(s.pickResult(d))}),p(1,"app-icon",72),i(2,"span",67),l(3),a(),i(4,"span",73),l(5),a()()}if(t&2){let e=n.$implicit,r=m(5);o(),k("size",12),o(2),_(e.name),o(2),_(r.fileName(e.filePath))}}function We(t,n){if(t&1&&D(0,Xe,6,3,"button",70,ee),t&2){let e=m(2);K(e.callees)}}function Ye(t,n){t&1&&(i(0,"div",69),l(1,"No callees"),a())}function Je(t,n){if(t&1&&(i(0,"div",59)(1,"div",61),l(2,"Callers "),i(3,"span",64),l(4),a()(),C(5,qe,2,0)(6,Ue,2,0,"div",69),a(),i(7,"div",59)(8,"div",61),l(9,"Callees "),i(10,"span",64),l(11),a()(),C(12,We,2,0)(13,Ye,2,0,"div",69),a()),t&2){let e=m();o(4),_(e.callers.length),o(),b(e.callers.length?5:6),o(6),_(e.callees.length),o(),b(e.callees.length?12:13)}}function Ze(t,n){if(t&1){let e=O();i(0,"button",74),p(1,"app-icon",75),l(2," Implement "),a(),i(3,"button",14),E("click",function(){S(e);let d=m(3);return M(d.navigateToDrift())}),l(4,"Fix"),a(),i(5,"button",76),l(6,"Relink"),a()}t&2&&(o(),k("size",13))}function et(t,n){if(t&1){let e=O();i(0,"button",74),p(1,"app-icon",77),l(2," Reveal in editor "),a(),i(3,"button",14),E("click",function(){S(e);let d=m(3);return M(d.navigateToSpecs())}),l(4,"Open Specs"),a()}t&2&&(o(),k("size",13))}function tt(t,n){if(t&1){let e=O();i(0,"div",45)(1,"div",46),p(2,"span",47),i(3,"div",48)(4,"div",49),l(5),a(),i(6,"div",50)(7,"span",51),l(8),a(),C(9,Fe,2,1,"span",51),a()(),i(10,"button",52),E("click",function(){S(e);let d=m(2);return M(d.clearSelection())}),p(11,"app-icon",53),a()(),i(12,"div",54),p(13,"app-icon",55),i(14,"span",56),l(15),a(),p(16,"app-copy-btn",57),a()(),i(17,"div",58),C(18,He,5,1,"div",59),C(19,$e,5,1,"div",59),C(20,Ae,7,1,"div",59),C(21,Je,14,4),a(),i(22,"div",60),C(23,Ze,7,1)(24,et,5,1),a()}if(t&2){let e=n,r=e.kind==="spec",d=m(2).detailColor(e);o(2),U("background",d)("box-shadow","0 0 8px "+d),Y("is-rect",r),o(3),_(e.name),o(2),U("color",d)("background","color-mix(in srgb, "+d+" 14%, transparent)"),o(),_(e.kind),o(),b(e.signature?9:-1),o(2),k("size",14),o(2),k("size",12),o(2),_(e.filePath),o(),k("text",e.filePath),o(2),b(e.signature?18:-1),o(),b(e.docstring?19:-1),o(),b(e.linkedSpecs&&e.linkedSpecs.length?20:-1),o(),b(r?-1:21),o(2),b(r?23:24)}}function nt(t,n){t&1&&(i(0,"span",82),l(1),a()),t&2&&(o(),X("",n.nodeCount.toLocaleString()," shown"))}function it(t,n){if(t&1&&(i(0,"div",85),p(1,"span",87),i(2,"span",88),l(3),a(),i(4,"span",89),l(5),a()()),t&2){let e=n.$implicit,r=m(3);o(),Q("data-kind",e),o(2),_(e),o(2),_(r.overviewKindCounts()[e])}}function at(t,n){t&1&&(i(0,"div",86),p(1,"app-state-pill",90)(2,"span",91)(3,"app-state-pill",92)(4,"span",91)(5,"app-state-pill",93)(6,"span",91),a())}function ot(t,n){if(t&1&&(i(0,"div",86),p(1,"app-state-pill",90),i(2,"span",94),l(3),a(),p(4,"app-state-pill",92),i(5,"span",94),l(6),a(),p(7,"app-state-pill",93),i(8,"span",94),l(9),a()()),t&2){let e,r,d,s=m(3);o(3),_(((e=s.health.state().data)==null||e.linkHealth==null?null:e.linkHealth.verified)??0),o(3),_(((r=s.health.state().data)==null||r.linkHealth==null?null:r.linkHealth.drifted)??0),o(3),_((((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 rt(t,n){t&1&&(i(0,"div",95),P(),i(1,"svg",96),p(2,"line",97),a(),G(),p(3,"span",98),a(),i(4,"div",95),P(),i(5,"svg",96),p(6,"line",99),a(),G(),p(7,"span",98),a(),i(8,"div",95),P(),i(9,"svg",96),p(10,"line",100),a(),G(),p(11,"span",98),a(),i(12,"div",95),P(),i(13,"svg",96),p(14,"line",101),a(),G(),p(15,"span",98),a())}function lt(t,n){if(t&1&&(i(0,"div",95),P(),i(1,"svg",96),p(2,"line",97),a(),G(),i(3,"span",102),l(4,"calls"),a(),i(5,"span",103),l(6),a()(),i(7,"div",95),P(),i(8,"svg",96),p(9,"line",99),a(),G(),i(10,"span",102),l(11,"implements / documents"),a(),i(12,"span",103),l(13),a()(),i(14,"div",95),P(),i(15,"svg",96),p(16,"line",100),a(),G(),i(17,"span",102),l(18,"tests"),a(),i(19,"span",103),l(20),a()(),i(21,"div",95),P(),i(22,"svg",96),p(23,"line",101),a(),G(),i(24,"span",102),l(25,"synthesized (heuristic)"),a(),i(26,"span",103),l(27),a()()),t&2){let e,r,d,s,g=m(3);o(6),_(((e=g.health.state().data)==null||e.edgeKinds==null?null:e.edgeKinds.calls)??0),o(7),_(((r=g.health.state().data)==null||r.edgeKinds==null?null:r.edgeKinds.implements)??0),o(7),_(((d=g.health.state().data)==null||d.edgeKinds==null?null:d.edgeKinds.tests)??0),o(7),_(((s=g.health.state().data)==null||s.edgeKinds==null?null:s.edgeKinds.synth)??0)}}function dt(t,n){t&1&&(i(0,"div",104),p(1,"span",105)(2,"span",106),a())}function st(t,n){t&1&&(i(0,"div",84)(1,"div",61),l(2,"Most connected"),a(),D(3,dt,3,0,"div",104,q),a()),t&2&&(o(3),K(de(0,ke)))}function pt(t,n){if(t&1){let e=O();i(0,"button",108),E("click",function(){let d=S(e).$implicit,s=m(4);return M(s.pickHub(d))}),p(1,"span",109),i(2,"span",110),l(3),a(),i(4,"span",111),l(5),a(),p(6,"app-icon",112),a()}if(t&2){let e=n.$implicit,r=m(4);Q("aria-label",e.name+", "+e.degree+" edges"),o(),U("background",r.nodeColor(e.kind))("border-radius",e.kind==="spec"?"2px":"50%"),o(2),_(e.name),o(2),X("",e.degree," edges"),o(),k("size",11)}}function ct(t,n){if(t&1&&(i(0,"div",84)(1,"div",61),l(2,"Most connected"),a(),D(3,pt,7,8,"button",107,ee),a()),t&2){let e=m(3);o(3),K(e.health.state().data.hubs.slice(0,8))}}function mt(t,n){if(t&1&&(i(0,"div",78),p(1,"app-icon",79),i(2,"span",80),l(3,"Graph overview"),a(),p(4,"div",81),C(5,nt,2,1,"span",82),a(),i(6,"div",58)(7,"p",83),l(8," Click any node to inspect its signature, links, callers and callees \u2014 without leaving this view. "),a(),i(9,"div",84)(10,"div",61),l(11,"Nodes by kind"),a(),D(12,it,6,3,"div",85,q),a(),i(14,"div",84)(15,"div",61),l(16,"Spec link health"),a(),C(17,at,7,0,"div",86)(18,ot,10,3,"div",86),a(),i(19,"div",84)(20,"div",61),l(21,"Edge types"),a(),C(22,rt,16,0)(23,lt,28,4),a(),C(24,st,5,1,"div",84)(25,ct,5,0,"div",84),a()),t&2){let e,r,d,s=m(2);o(),k("size",15),o(4),b((e=s.status.state().data)?5:-1,e),o(7),K(s.kindKeys),o(5),b(s.health.state().loading?17:18),o(5),b(s.health.state().loading?22:(r=s.health.state().data)!=null&&r.edgeKinds?23:-1),o(2),b(s.health.state().loading?24:!((d=s.health.state().data)==null||d.hubs==null)&&d.hubs.length?25:-1)}}function ut(t,n){if(t&1){let e=O();i(0,"div",1)(1,"div",2)(2,"div",3)(3,"app-segmented",4),E("change",function(d){S(e);let s=m();return M(s.onLayoutChange(d))}),a(),p(4,"div",5),D(5,Me,5,7,"button",6,q),p(7,"div",7),i(8,"div",8)(9,"div",9),p(10,"app-icon",10),i(11,"input",11),E("input",function(d){S(e);let s=m();return M(s.onSearchInput(d.target.value))}),a(),C(12,Ee,1,0,"span",12),a(),C(13,Ge,3,0,"div",13),a(),i(14,"button",14),E("click",function(){S(e);let d=m();return M(d.recenter())}),p(15,"app-icon",15),l(16," Recenter "),a()(),i(17,"div",16),C(18,ze,3,1)(19,De,3,0,"div",17)(20,Ke,5,1,"div",17)(21,Ne,3,1,"div",17)(22,Re,27,5),a()(),i(23,"aside",18),C(24,tt,25,22)(25,mt,26,5),a()()}if(t&2){let e,r=m();o(3),k("options",r.layoutOptions)("value",r.layoutMode()),o(2),K(r.kindKeys),o(5),k("size",13),o(),k("value",r.searchInput()),o(),b(r.searchResults.state().loading?12:-1),o(),b(r.searchResults.state().data&&r.searchResults.state().data.results.length>0?13:-1),o(2),k("size",13),o(3),b(r.selectedSymbol()?r.nodeDetail.state().loading?19:r.nodeDetail.state().error?20:r.selectedDetail()?22:21:18),o(6),b((e=r.selectedDetail())?24:25,e)}}var ve=class t{api=W(pe);projects=W(ce);router=W(se);status=j(this.api,()=>`/api/status${this.projects.projectQuery()}`);health=j(this.api,()=>`/api/graph/health${this.projects.projectQuery()}`);fullGraph=j(this.api,()=>`/api/graph/full?limit=250${this.projects.projectQuery("&")}`);layoutMode=H("hierarchical");layoutOptions=[{value:"hierarchical",label:"Hierarchical"},{value:"force",label:"Force"},{value:"anchored",label:"Anchored"}];searchInput=H("");searchQuery=H("");searchDebounce=null;searchResults=j(this.api,()=>{let n=this.searchQuery().trim();return n.length>=2?`/api/graph/search?q=${encodeURIComponent(n)}&limit=12${this.projects.projectQuery("&")}`:null});selectedSymbol=H(null);nodeDetail=j(this.api,()=>{let n=this.selectedSymbol();return n?`/api/graph/node?symbol=${encodeURIComponent(n)}${this.projects.projectQuery("&")}`:null});selectedDetail=I(()=>this.nodeDetail.state().data?.matches?.[0]??null);filters=H({code:!0,spec:!0,route:!0,test:!0});fitKey=H(0);canvasData=I(()=>{let n=this.selectedDetail();if(!n)return this.fullGraphData();let e=this.filters(),r=h=>{let y=J(h);return e[y]},d={id:n.id,label:n.name,sub:Z(n.filePath),kind:n.kind,x:0,y:0},s=(n.callers??[]).filter(h=>r(h.kind)),g=(n.callees??[]).filter(h=>r(h.kind)),w=(n.linkedSpecs??[]).filter(()=>e.spec),L=280,T=56,u=[d],z=[];return s.forEach((h,y)=>{let x=(y-(s.length-1)/2)*T;u.push(Ce(h,-L,x)),z.push({from:h.id,to:n.id,kind:"calls"})}),g.forEach((h,y)=>{let x=(y-(g.length-1)/2)*T;u.push(Ce(h,L,x)),z.push({from:n.id,to:h.id,kind:"calls"})}),w.forEach((h,y)=>{let x=(y-(w.length-1)/2)*220,c="spec:"+h.specId;u.push({id:c,label:h.specId,sub:h.specTitle??void 0,kind:"spec",state:h.state,x,y:-160}),z.push({from:c,to:n.id,kind:"implements"})}),{nodes:u,edges:z}});fullGraphData(){let n=this.fullGraph.state().data;if(!n?.nodes?.length)return{nodes:[],edges:[]};let e=this.filters(),r=n.nodes.filter(u=>e[J(u.kind)]),d=new Set(r.map(u=>u.id)),s=n.edges.filter(u=>d.has(u.from)&&d.has(u.to)),g=new Map(r.map(u=>[u.id,u.kind])),w=fe(this.layoutMode(),r.map(u=>({id:u.id,kind:u.kind})),s.map(u=>({from:u.from,to:u.to}))),L=r.map(u=>({id:u.id,label:u.name,sub:Z(u.filePath),kind:u.kind,x:w.get(u.id)?.x??0,y:w.get(u.id)?.y??0})),T=s.map(u=>({from:u.from,to:u.to,kind:u.provenance==="heuristic"?"synth":g.get(u.from)==="spec"||g.get(u.to)==="spec"?"implements":"calls"}));return{nodes:L,edges:T}}fullGraphActive=I(()=>!this.selectedSymbol()&&this.fullGraphData().nodes.length>0);fullGraphLoading=I(()=>!this.selectedSymbol()&&this.fullGraph.state().loading);fullGraphCounts=I(()=>{let n=this.fullGraph.state().data;return n?{shown:n.shown,total:n.total}:{shown:0,total:0}});visibleNodes=I(()=>this.canvasData().nodes);visibleEdges=I(()=>this.canvasData().edges);hiddenIds=I(()=>{let n=this.filters(),e=new Set;for(let r of this.canvasData().nodes)n[J(r.kind)]||e.add(r.id);return e});kindCounts=I(()=>{let n={code:0,spec:0,route:0,test:0};for(let e of this.canvasData().nodes)n[J(e.kind)]++;return n});overviewKindCounts=I(()=>{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){let s=this.fullGraph.state().data?.nodes.find(g=>g.id===n);s&&(this.selectedSymbol.set(s.name),this.fitKey.update(g=>g+1));return}if(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=>ae(ie({},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 Z(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=oe({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"],[3,"nodeClick","nodes","edges","selectedId","fitKey","hiddenIds"],[1,"gp-overview-note"],[1,"gp-stats"],[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&&C(0,Se,1,0,"app-pick-project-empty",0)(1,ut,26,9,"div",1),e&2&&b(r.status.state().noProject?0:1)},dependencies:[ge,_e,me,ue,he,xe],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)}.gp-overview-note[_ngcontent-%COMP%]{position:absolute;bottom:12px;left:50%;transform:translate(-50%);padding:5px 12px;border-radius:999px;background:var(--bg-elevated);border:1px solid var(--border-subtle);color:var(--text-secondary);font-size:11px;white-space:nowrap;pointer-events:none;box-shadow:var(--shadow-pop)}"],changeDetection:0})};function Ce(t,n,e){return{id:t.id,label:t.name,sub:Z(t.filePath),kind:t.kind,x:n,y:e}}function Z(t){return t?t.split("/").slice(-2).join("/"):""}function J(t){return t==="spec"?"spec":t==="route"?"route":t==="test"?"test":"code"}export{ve as Graph};
@@ -1,4 +1,4 @@
1
- import{a as gt}from"./chunk-V74ZPP4B.js";import{a as Z}from"./chunk-NKPK3BR3.js";import{a as ut}from"./chunk-G7VZT5KB.js";import{a as xt}from"./chunk-JLOJCDIY.js";import{a as mt}from"./chunk-P62EJGSF.js";import{a as _t}from"./chunk-PZSU53SS.js";import{a as rt,c as lt,d as st}from"./chunk-DOKZOFKM.js";import{b as dt,c as Y}from"./chunk-PAO2624Y.js";import"./chunk-PBRCKHEQ.js";import{a as pt}from"./chunk-3H2EZLZN.js";import{Aa as d,Ga as N,I as F,Ia as M,Ka as p,M as k,N as S,R as K,Ta as C,Ua as q,Va as l,W as V,Wa as u,X as j,Xa as g,Ya as H,Za as nt,aa as L,bb as it,ea as o,gb as z,ib as $,ka as X,lb as h,qa as U,ra as m,sa as _,ta as tt,ua as et,va as O,vb as ot,wa as D,xa as c,ya as r,yb as at,za as a,zb as ct}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";function Pt(n){return n>=85?{label:"Excellent",color:"var(--success)"}:n>=70?{label:"Good",color:"var(--node-route)"}:n>=50?{label:"Fair",color:"var(--warn)"}:{label:"Needs work",color:"var(--error)"}}function wt(n){let e=(n.input_tokens||0)+(n.cache_creation_tokens||0)+(n.cache_read_tokens||0);return e>0?(n.cache_read_tokens||0)/e:0}function Mt(n,e){let t=n.toLowerCase();return/grep|call site|every/.test(t)?`Use \`specship_search '${e||"<symbol>"}' --kind call-site\` instead of grep \u2014 it returns just the qualified call sites.`:/read|explain|map|where|how |why |walk|boundaries|module/.test(t)?`Use \`specship_explore --symbol ${e||"<symbol>"} --depth 2\` and summarize callers, callees and linked specs \u2014 avoid re-reading the file.`:/implement/.test(t)&&!/REQ-[A-Z]+-\d+/.test(n)?`Reference the requirement id: \`Implement REQ-\u2026: ${n.slice(0,48)}\u2026\` then plan before editing.`:e?null:`${n} \u2014 name the exact symbol, file or REQ id so it can be resolved structurally.`}function Tt(n){return n.is_specship===1||/specship_/.test(n.tool_name)||/^mcp__/.test(n.tool_name)}function Et(n){return(n.tool_name==="Bash"||n.tool_name==="Grep"||n.tool_name==="Read")&&(n.result_length||0)>3e4}function J(n,e){let t=n.text||"",i=(t.match(/[a-z][a-zA-Z]+[A-Z][a-zA-Z]+/)||[])[0],s=(t.match(/[\w/]+\.(ts|tsx|js|md)/)||[])[0],f=(t.match(/REQ-[A-Z]+-\d+/)||[])[0]||i||s,T=!!f,b=/^(read |grep |look |check |explain |tell me|why |what )/i.test(t.trim()),E=t.length>=45&&!b||t.length>=72,B=e.some(Et),A=e.some(Tt),R=wt(n)>=.5,P=62,I=[];I.push({label:"Names a concrete target",ok:T}),P+=T?12:-10,I.push({label:"Scoped & specific",ok:E}),P+=E?10:-9,I.push({label:"Cache-friendly",ok:R}),P+=R?8:-10,I.push({label:"Structural over brute-force",ok:A||!B}),P+=A||!B?9:-13,P=Math.max(14,Math.min(98,Math.round(P)));let w=[];T||w.push({sev:"warn",text:"Name the exact symbol, file or REQ id so the agent doesn\u2019t have to search for it first."}),E||w.push({sev:"warn",text:"Lead with the concrete change you want rather than an open-ended question."}),B&&!A&&w.push({sev:"error",text:"This turn leaned on Read/grep and pulled a lot of tokens. Ask for a structural query instead.",fix:`specship_explore --symbol ${i||"<name>"} --depth 2`}),R||w.push({sev:"warn",text:"Cache hit was low \u2014 keep a stable prompt prefix and avoid reordering context to reuse the 1h cache."}),w.length===0&&w.push({sev:"info",text:"Well-formed prompt \u2014 specific, scoped and cache-friendly. Nothing to change."});let Q=P<72?Mt(t,f):null,G=Pt(P);return{score:P,label:G.label,color:G.color,factors:I,suggestions:w,rewrite:Q}}function vt(n){return`Prompt quality: ${n.label} (${n.score}/100)
1
+ import{a as gt}from"./chunk-V74ZPP4B.js";import{a as Z}from"./chunk-NKPK3BR3.js";import{a as ut}from"./chunk-G7VZT5KB.js";import{a as xt}from"./chunk-JLOJCDIY.js";import{a as mt}from"./chunk-P62EJGSF.js";import{a as _t}from"./chunk-PZSU53SS.js";import{a as rt,c as lt,d as st}from"./chunk-DOKZOFKM.js";import{b as dt,c as Y}from"./chunk-DTWIJ3GJ.js";import"./chunk-JGDK6YKG.js";import{a as pt}from"./chunk-TWVVIWKO.js";import{Aa as d,Ga as N,I as F,Ia as M,Ka as p,M as k,N as S,R as K,Ta as C,Ua as q,Va as l,W as V,Wa as u,X as j,Xa as g,Ya as H,Za as nt,aa as L,bb as it,ea as o,gb as z,ib as $,ka as X,lb as h,qa as U,ra as m,sa as _,ta as tt,ua as et,va as O,vb as ot,wa as D,xa as c,ya as r,yb as at,za as a,zb as ct}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";function Pt(n){return n>=85?{label:"Excellent",color:"var(--success)"}:n>=70?{label:"Good",color:"var(--node-route)"}:n>=50?{label:"Fair",color:"var(--warn)"}:{label:"Needs work",color:"var(--error)"}}function wt(n){let e=(n.input_tokens||0)+(n.cache_creation_tokens||0)+(n.cache_read_tokens||0);return e>0?(n.cache_read_tokens||0)/e:0}function Mt(n,e){let t=n.toLowerCase();return/grep|call site|every/.test(t)?`Use \`specship_search '${e||"<symbol>"}' --kind call-site\` instead of grep \u2014 it returns just the qualified call sites.`:/read|explain|map|where|how |why |walk|boundaries|module/.test(t)?`Use \`specship_explore --symbol ${e||"<symbol>"} --depth 2\` and summarize callers, callees and linked specs \u2014 avoid re-reading the file.`:/implement/.test(t)&&!/REQ-[A-Z]+-\d+/.test(n)?`Reference the requirement id: \`Implement REQ-\u2026: ${n.slice(0,48)}\u2026\` then plan before editing.`:e?null:`${n} \u2014 name the exact symbol, file or REQ id so it can be resolved structurally.`}function Tt(n){return n.is_specship===1||/specship_/.test(n.tool_name)||/^mcp__/.test(n.tool_name)}function Et(n){return(n.tool_name==="Bash"||n.tool_name==="Grep"||n.tool_name==="Read")&&(n.result_length||0)>3e4}function J(n,e){let t=n.text||"",i=(t.match(/[a-z][a-zA-Z]+[A-Z][a-zA-Z]+/)||[])[0],s=(t.match(/[\w/]+\.(ts|tsx|js|md)/)||[])[0],f=(t.match(/REQ-[A-Z]+-\d+/)||[])[0]||i||s,T=!!f,b=/^(read |grep |look |check |explain |tell me|why |what )/i.test(t.trim()),E=t.length>=45&&!b||t.length>=72,B=e.some(Et),A=e.some(Tt),R=wt(n)>=.5,P=62,I=[];I.push({label:"Names a concrete target",ok:T}),P+=T?12:-10,I.push({label:"Scoped & specific",ok:E}),P+=E?10:-9,I.push({label:"Cache-friendly",ok:R}),P+=R?8:-10,I.push({label:"Structural over brute-force",ok:A||!B}),P+=A||!B?9:-13,P=Math.max(14,Math.min(98,Math.round(P)));let w=[];T||w.push({sev:"warn",text:"Name the exact symbol, file or REQ id so the agent doesn\u2019t have to search for it first."}),E||w.push({sev:"warn",text:"Lead with the concrete change you want rather than an open-ended question."}),B&&!A&&w.push({sev:"error",text:"This turn leaned on Read/grep and pulled a lot of tokens. Ask for a structural query instead.",fix:`specship_explore --symbol ${i||"<name>"} --depth 2`}),R||w.push({sev:"warn",text:"Cache hit was low \u2014 keep a stable prompt prefix and avoid reordering context to reuse the 1h cache."}),w.length===0&&w.push({sev:"info",text:"Well-formed prompt \u2014 specific, scoped and cache-friendly. Nothing to change."});let Q=P<72?Mt(t,f):null,G=Pt(P);return{score:P,label:G.label,color:G.color,factors:I,suggestions:w,rewrite:Q}}function vt(n){return`Prompt quality: ${n.label} (${n.score}/100)
2
2
  `+n.suggestions.map(e=>`- ${e.text}${e.fix?` [${e.fix}]`:""}`).join(`
3
3
  `)+(n.rewrite?`
4
4
  Suggested rewrite: ${n.rewrite}`:"")}var Ot=()=>["/sessions"],Dt=(n,e)=>e.label,ht=(n,e)=>e.id,bt=(n,e)=>e.prompt.id,ft=(n,e)=>e.name;function It(n,e){if(n&1&&(r(0,"app-pill",7),l(1),a()),n&2){let t=p();c("color","var(--node-spec)")("bg","var(--node-spec-soft)"),o(),u(t.session().last_model)}}function zt(n,e){if(n&1&&l(0),n&2){let t=p(),i=p();nt(" \xB7 ",i.fmtClock(t.started_at)," \u2013 ",i.fmtClock(t.ended_at)," (",i.fmtDurationSec(t.started_at,t.ended_at),") ")}}function $t(n,e){if(n&1&&(r(0,"div",10),l(1),m(2,zt,1,3),a()),n&2){let t=e;o(),g("",t.project_path," "),o(),_(t.started_at&&t.ended_at?2:-1)}}function Rt(n,e){n&1&&(r(0,"div",14),l(1,"Loading session\u2026"),a())}function Ft(n,e){if(n&1){let t=N();r(0,"div",15)(1,"div",17),l(2,"Couldn't load session"),a(),r(3,"div",18),l(4),a(),r(5,"button",19),M("click",function(){k(t);let s=p();return S(s.forceRefresh())}),l(6,"Retry"),a()()}if(n&2){let t,i=p();o(4),u((t=i.resource.state().error)==null?null:t.message)}}function qt(n,e){if(n&1&&(r(0,"app-pill",25),d(1,"app-icon",56),l(2),a()),n&2){let t=p();o(),c("size",10),o(),u(t.slashCommand)}}function Bt(n,e){n&1&&(r(0,"app-pill",26),d(1,"app-icon",57),l(2,"subagent"),a()),n&2&&(o(),c("size",10))}function Nt(n,e){if(n&1&&(r(0,"span",31),l(1),a()),n&2){let t=p();o(),u(t.prompt.model)}}function At(n,e){if(n&1&&(r(0,"span",31),l(1),a()),n&2){let t=p(),i=p(2);o(),u(i.fmtDurationMs(t.prompt.durationMs))}}function Vt(n,e){if(n&1&&(r(0,"div",68),d(1,"app-icon",72),r(2,"span",73),l(3),a()()),n&2){let t=e.$implicit;o(),C("color",t.ok?"var(--success)":"var(--warn)"),c("name",t.ok?"check":"minus")("size",13),o(),q("bad",!t.ok),o(),u(t.label)}}function Lt(n,e){if(n&1&&(r(0,"div",76)(1,"code",77),l(2),a(),d(3,"app-copy-btn",50),a()),n&2){let t=p().$implicit;o(2),u(t.fix),o(),c("text",t.fix)}}function Ht(n,e){if(n&1&&(r(0,"div",71),d(1,"span",74),r(2,"div",27)(3,"div",75),l(4),a(),m(5,Lt,4,2,"div",76),a()()),n&2){let t=e.$implicit;o(),C("background",t.sev==="error"?"var(--error)":t.sev==="warn"?"var(--warn)":"var(--success)"),o(3),u(t.text),o(),_(t.fix?5:-1)}}function Qt(n,e){if(n&1&&(r(0,"div",69),l(1,"Suggested rewrite"),a(),r(2,"div",78)(3,"span",79),l(4),a(),d(5,"app-copy-btn",50),a()),n&2){let t=p();o(4),u(t.rewrite),o(),c("text",t.rewrite)}}function Gt(n,e){if(n&1&&(r(0,"div",58)(1,"div",59),d(2,"app-icon",60),r(3,"span",61),l(4,"Prompt quality"),a(),d(5,"span",27),r(6,"span",62),l(7),r(8,"span",63),l(9),a()(),d(10,"app-copy-btn",64),a(),r(11,"div",65),d(12,"app-bar",66),a(),r(13,"div",67),O(14,Vt,4,7,"div",68,Dt),a(),r(16,"div",69),l(17,"How to improve"),a(),r(18,"div",70),O(19,Ht,6,4,"div",71,tt),a(),m(21,Qt,6,2),a()),n&2){let t=e,i=p(3);C("border-color","color-mix(in srgb, "+t.color+" 32%, transparent)")("background","color-mix(in srgb, "+t.color+" 6%, var(--bg-canvas))"),o(2),C("color",t.color),c("size",14),o(4),C("color",t.color)("background","color-mix(in srgb, "+t.color+" 15%, transparent)"),o(),g("",t.label," \xB7 "),o(2),g("",t.score,"/100"),o(),c("text",i.qualityShareText()),o(2),c("frac",t.score/100)("color",t.color)("height",6),o(2),D(t.factors),o(5),D(t.suggestions),o(2),_(t.rewrite?21:-1)}}function Wt(n,e){if(n&1&&d(0,"app-copy-btn",50),n&2){let t=p();c("text",t.prompt.text)}}function jt(n,e){if(n&1&&d(0,"div",52),n&2){let t=p(),i=p(2);c("innerHTML",i.renderAssistant(t.prompt.assistant_text),L)}}function Ut(n,e){n&1&&(r(0,"div",53),l(1,"No assistant text captured for this turn."),a())}function Yt(n,e){if(n&1&&(r(0,"details",54)(1,"summary",80),l(2,"Extended thinking"),a(),d(3,"div",81),a()),n&2){let t=p(),i=p(2);o(3),c("innerHTML",i.renderAssistant(t.prompt.thinking_text),L)}}function Zt(n,e){if(n&1&&(r(0,"span",85),l(1),a()),n&2){let t=p().$implicit;o(),u(t.input_summary)}}function Jt(n,e){if(n&1&&(r(0,"span",86),l(1),a()),n&2){let t=p().$implicit,i=p(4);o(),u(i.fmtBytes(t.result_length))}}function Kt(n,e){if(n&1&&(r(0,"div",83)(1,"span",84),l(2),a(),m(3,Zt,2,1,"span",85),d(4,"span",27),m(5,Jt,2,1,"span",86),a()),n&2){let t=e.$implicit,i=p(4);o(),C("color",i.toolColor(t.tool_name)),o(),u(t.tool_name),o(),_(t.input_summary?3:-1),o(2),_(t.result_length?5:-1)}}function Xt(n,e){if(n&1&&(r(0,"div",34),l(1),a(),r(2,"div",82),O(3,Kt,6,5,"div",83,ht),a()),n&2){let t=p(),i=p(2);o(),H("Tools \xB7 ",t.tools.length," \xB7 returned ",i.fmtBytes(t.toolBytes)),o(2),D(t.tools)}}function te(n,e){if(n&1){let t=N();r(0,"div",20)(1,"div",22)(2,"button",23),M("click",function(){k(t);let s=p(2);return S(s.closePrompt())}),d(3,"app-icon",3),l(4," Timeline "),a(),r(5,"span",24),l(6),a(),m(7,qt,3,2,"app-pill",25),m(8,Bt,3,1,"app-pill",26),d(9,"span",27),r(10,"button",28),M("click",function(){k(t);let s=p(2);return S(s.stepPrompt(-1))}),d(11,"app-icon",3),l(12," Prev"),a(),r(13,"button",28),M("click",function(){k(t);let s=p(2);return S(s.stepPrompt(1))}),l(14,"Next "),d(15,"app-icon",29),a()(),r(16,"div",30)(17,"span",31),l(18),a(),r(19,"span",31),l(20),a(),m(21,Nt,2,1,"span",31),r(22,"span",31),d(23,"app-icon",32),l(24),a(),m(25,At,2,1,"span",31),a(),m(26,Gt,22,18,"div",33),r(27,"div",34),l(28,"Token breakdown"),a(),r(29,"div",35),d(30,"div",36)(31,"div",37)(32,"div",38)(33,"div",39),a(),r(34,"div",40)(35,"span",41),d(36,"span",42),l(37),a(),r(38,"span",41),d(39,"span",43),l(40),a(),r(41,"span",41),d(42,"span",44),l(43),a(),r(44,"span",41),d(45,"span",45),l(46),a()(),r(47,"div",46)(48,"div",47)(49,"div",48)(50,"span",49),l(51,"Input"),a(),d(52,"span",27),m(53,Wt,1,1,"app-copy-btn",50),a(),r(54,"pre",51),l(55),a()(),r(56,"div",47)(57,"div",48)(58,"span",49),l(59,"Output"),a()(),m(60,jt,1,1,"div",52)(61,Ut,2,0,"div",53),a()(),m(62,Yt,4,1,"details",54),m(63,Xt,5,2),d(64,"div",55),a()}if(n&2){let t,i=e,s=p(2);o(3),c("size",14),o(3),u(s.fmtClock(i.prompt.ts)),o(),_(i.slashCommand?7:-1),o(),_(i.prompt.is_sidechain===1?8:-1),o(2),c("disabled",!s.hasPrevPrompt()),o(),c("size",13),o(2),c("disabled",!s.hasNextPrompt()),o(2),c("size",13),o(3),g("",s.fmtTokens(i.totalTokens)," tok"),o(),C("color",i.prompt.cost_usd>2.5?"var(--error)":"var(--text-primary)"),o(),g("$",i.prompt.cost_usd.toFixed(2)),o(),_(i.prompt.model?21:-1),o(2),c("size",10),o(),g(" ",i.tools.length," tools"),o(),_(i.prompt.durationMs?25:-1),o(),_((t=s.quality())?26:-1,t),o(4),C("width",s.promptTokPct(i.prompt,"input"),"%"),c("title","Input: "+s.fmtTokens(i.prompt.input_tokens)),o(),C("width",s.promptTokPct(i.prompt,"output"),"%"),c("title","Output: "+s.fmtTokens(i.prompt.output_tokens)),o(),C("width",s.promptTokPct(i.prompt,"cacheWrite"),"%"),c("title","Cache write: "+s.fmtTokens(i.prompt.cache_creation_tokens)),o(),C("width",s.promptTokPct(i.prompt,"cacheRead"),"%"),c("title","Cache read: "+s.fmtTokens(i.prompt.cache_read_tokens)),o(4),g("Input ",s.fmtTokens(i.prompt.input_tokens)),o(3),g("Output ",s.fmtTokens(i.prompt.output_tokens)),o(3),g("Cache write ",s.fmtTokens(i.prompt.cache_creation_tokens)),o(3),g("Cache read ",s.fmtTokens(i.prompt.cache_read_tokens)),o(7),_(i.prompt.text?53:-1),o(2),u(i.prompt.text||"(assistant-only turn)"),o(5),_(i.prompt.assistant_text?60:61),o(2),_(i.prompt.thinking_text?62:-1),o(),_(i.tools.length?63:-1)}}function ee(n,e){n&1&&(r(0,"app-pill",118),d(1,"app-icon",57),l(2,"subagent "),a()),n&2&&(c("color","var(--node-route)")("bg","var(--node-route-soft)"),o(),c("size",10))}function ne(n,e){if(n&1&&d(0,"app-icon",119),n&2){let t=p().$implicit;c("size",12)("title",t.slashCommand)}}function ie(n,e){if(n&1&&l(0),n&2){let t=p().$implicit;g(" ",t.prompt.text.length>140?t.prompt.text.slice(0,140)+"\u2026":t.prompt.text," ")}}function oe(n,e){n&1&&(r(0,"span",121),l(1,"(assistant-only turn)"),a())}function ae(n,e){if(n&1&&(r(0,"span",122),l(1),a()),n&2){let t=p().$implicit;c("title","SpecShip \xB7 spent ~"+t.specshipSpendTokens+" tok \xB7 est. saved ~"+t.specshipSavedTokens+" tok"),o(),g("SS ~",t.specshipSpendTokens," tok")}}function re(n,e){if(n&1&&(r(0,"span",126),l(1),a()),n&2){let t=p().$implicit,i=p(3);o(),u(i.fmtDurationMs(t.prompt.durationMs))}}function le(n,e){if(n&1&&(r(0,"section",134)(1,"div",135),l(2,"User prompt"),a(),r(3,"pre",141),l(4),a()()),n&2){let t=p(2).$implicit;o(4),u(t.prompt.text)}}function se(n,e){if(n&1&&(r(0,"section",134)(1,"div",135),l(2,"Assistant response"),a(),d(3,"div",142),a()),n&2){let t=p(2).$implicit,i=p(3);o(3),c("innerHTML",i.renderAssistant(t.prompt.assistant_text),L)}}function pe(n,e){if(n&1&&(r(0,"section",134)(1,"details",143)(2,"summary",144),l(3," Extended thinking "),r(4,"span",145),l(5,"(click to expand)"),a()(),d(6,"div",146),a()()),n&2){let t=p(2).$implicit,i=p(3);o(6),c("innerHTML",i.renderAssistant(t.prompt.thinking_text),L)}}function de(n,e){if(n&1&&(r(0,"div",137)(1,"div",138),l(2,"Duration"),a(),r(3,"div",139),l(4),a()()),n&2){let t=p(2).$implicit,i=p(3);o(4),u(i.fmtDurationMs(t.prompt.durationMs))}}function ce(n,e){if(n&1&&(r(0,"div",137)(1,"div",138),l(2,"Model"),a(),r(3,"div",139),l(4),a()()),n&2){let t=p(2).$implicit;o(4),u(t.prompt.model)}}function me(n,e){if(n&1&&(r(0,"div",148)(1,"span",149),l(2),a()()),n&2){let t=e.$implicit;c("title",t),o(2),u(t)}}function _e(n,e){if(n&1&&(r(0,"section",134)(1,"div",135),l(2),a(),r(3,"div",147),O(4,me,3,2,"div",148,et),a()()),n&2){let t=p(2).$implicit;o(2),g("Files touched \xB7 ",t.filesTouched.length),o(2),D(t.filesTouched)}}function ue(n,e){n&1&&l(0," \u203A ")}function xe(n,e){if(n&1&&(r(0,"span",155),l(1),a()),n&2){let t=p().$implicit;o(),u(t.input_summary)}}function ge(n,e){if(n&1&&(r(0,"span",156),l(1),a()),n&2){let t=p().$implicit,i=p(6);o(),u(i.fmtBytes(t.result_length))}}function ve(n,e){if(n&1&&(r(0,"pre",157),l(1),a()),n&2){let t=p().$implicit,i=p(6);o(),u(i.formatToolInput(t.input_json))}}function fe(n,e){if(n&1){let t=N();r(0,"div",151)(1,"button",152),M("click",function(){let s=k(t).$implicit,x=p(6);return S(x.toggleToolInput(s.id))}),r(2,"span",153),m(3,ue,1,0),a(),r(4,"span",154),l(5),a(),m(6,xe,2,1,"span",155),d(7,"span",27),m(8,ge,2,1,"span",156),a(),m(9,ve,2,1,"pre",157),a()}if(n&2){let t=e.$implicit,i=p(6);o(),q("has-input",!!t.input_json)("expanded",i.isToolInputExpanded(t.id)),c("disabled",!t.input_json),U("aria-expanded",i.isToolInputExpanded(t.id)),o(),q("open",i.isToolInputExpanded(t.id)),o(),_(t.input_json?3:-1),o(),C("color",i.toolColor(t.tool_name)),o(),u(t.tool_name),o(),_(t.input_summary?6:-1),o(2),_(t.result_length?8:-1),o(),_(t.input_json&&i.isToolInputExpanded(t.id)?9:-1)}}function Ce(n,e){if(n&1&&(r(0,"section",134)(1,"div",135),l(2),a(),r(3,"div",150),O(4,fe,10,15,"div",151,ht),a()()),n&2){let t=p(2).$implicit,i=p(3);o(2),H("Tool calls \xB7 ",t.tools.length," \xB7 returned ",i.fmtBytes(t.toolBytes)),o(2),D(t.tools)}}function he(n,e){if(n&1&&(r(0,"div",133),m(1,le,5,1,"section",134),m(2,se,4,1,"section",134),m(3,pe,7,1,"section",134),r(4,"section",134)(5,"div",135),l(6,"Token breakdown"),a(),r(7,"div",136)(8,"div",137)(9,"div",138),l(10,"Input"),a(),r(11,"div",139),l(12),a()(),r(13,"div",137)(14,"div",138),l(15,"Output"),a(),r(16,"div",139),l(17),a()(),r(18,"div",137)(19,"div",138),l(20,"Cache write"),a(),r(21,"div",139),l(22),a()(),r(23,"div",137)(24,"div",138),l(25,"Cache read"),a(),r(26,"div",139),l(27),a()(),r(28,"div",137)(29,"div",138),l(30,"Cost"),a(),r(31,"div",140),l(32),a()(),m(33,de,5,1,"div",137),m(34,ce,5,1,"div",137),a()(),m(35,_e,6,1,"section",134),m(36,Ce,6,2,"section",134),a()),n&2){let t=p().$implicit,i=p(3);o(),_(t.prompt.text?1:-1),o(),_(t.prompt.assistant_text?2:-1),o(),_(t.prompt.thinking_text?3:-1),o(9),u(i.fmtTokens(t.prompt.input_tokens)),o(5),u(i.fmtTokens(t.prompt.output_tokens)),o(5),u(i.fmtTokens(t.prompt.cache_creation_tokens)),o(5),u(i.fmtTokens(t.prompt.cache_read_tokens)),o(5),g("$",t.prompt.cost_usd.toFixed(4)),o(),_(t.prompt.durationMs?33:-1),o(),_(t.prompt.model?34:-1),o(),_(t.filesTouched.length>0?35:-1),o(),_(t.tools.length>0?36:-1)}}function be(n,e){if(n&1){let t=N();r(0,"div",97)(1,"div",115),M("click",function(){let s=k(t).$implicit,x=p(3);return S(x.toggleExpand(s.prompt.id))})("keydown.enter",function(){let s=k(t).$implicit,x=p(3);return S(x.toggleExpand(s.prompt.id))})("keydown.space",function(s){let x=k(t).$implicit,f=p(3);return s.preventDefault(),S(f.toggleExpand(x.prompt.id))}),r(2,"span",116),l(3),a(),d(4,"span",117),m(5,ee,3,3,"app-pill",118),m(6,ne,1,2,"app-icon",119),r(7,"span",120),m(8,ie,1,1)(9,oe,2,0,"span",121),a(),m(10,ae,2,2,"span",122),r(11,"span",123),d(12,"app-icon",124),r(13,"span",125),l(14),a()(),m(15,re,2,1,"span",126),r(16,"span",127),l(17),a(),r(18,"span",128),l(19),z(20,"number"),a(),r(21,"span",129),l(22),a(),r(23,"button",130),M("click",function(s){let x=k(t).$implicit,f=p(3);return s.stopPropagation(),S(f.openPrompt(x.prompt.id))}),d(24,"app-icon",131),a(),d(25,"app-icon",132),a(),m(26,he,37,12,"div",133),a()}if(n&2){let t=e.$implicit,i=p(3);o(),q("expanded",i.isExpanded(t.prompt.id)),U("aria-expanded",i.isExpanded(t.prompt.id)),o(2),u(i.fmtClock(t.prompt.ts)),o(),C("background",i.promptQualityColor(t)),o(),_(t.prompt.is_sidechain===1?5:-1),o(),_(t.slashCommand?6:-1),o(2),_(t.prompt.text?8:9),o(2),_(t.specshipSpendTokens>0?10:-1),o(2),c("size",11),o(2),u(t.tools.length),o(),_(t.prompt.durationMs?15:-1),o(2),u(i.fmtTokens(t.totalTokens)),o(),C("color",i.cacheColor(t.totalTokens>0?(t.prompt.cache_read_tokens||0)/t.totalTokens:0)),o(),g(" ",t.totalTokens>0?$(20,23,(t.prompt.cache_read_tokens||0)/t.totalTokens*100,"1.0-0"):0,"% "),o(2),C("color",t.prompt.cost_usd>2.5?"var(--error)":"var(--text-primary)"),o(),g("$",t.prompt.cost_usd.toFixed(2)),o(2),c("size",12),o(),c("size",14),o(),_(i.isExpanded(t.prompt.id)?26:-1)}}function ye(n,e){n&1&&(r(0,"div",16),l(1,"No prompts logged for this session yet."),a())}function ke(n,e){if(n&1&&(r(0,"span",163),l(1),a()),n&2){let t=p().$implicit;o(),g("\xD7",t.count)}}function Se(n,e){if(n&1&&(r(0,"span",161),d(1,"app-icon",56),l(2),m(3,ke,2,1,"span",163),a()),n&2){let t=e.$implicit;o(),c("size",10),o(),g("",t.name," "),o(),_(t.count>1?3:-1)}}function Pe(n,e){if(n&1&&(r(0,"span",163),l(1),a()),n&2){let t=p().$implicit;o(),g("\xD7",t.count)}}function we(n,e){if(n&1&&(r(0,"span",162),d(1,"app-icon",60),l(2),m(3,Pe,2,1,"span",163),a()),n&2){let t=e.$implicit;o(),c("size",10),o(),g("",t.name," "),o(),_(t.count>1?3:-1)}}function Me(n,e){if(n&1&&(r(0,"div",158)(1,"div",99),l(2,"Commands & skills"),a(),r(3,"div",160),O(4,Se,4,3,"span",161,ft),O(6,we,4,3,"span",162,ft),a()()),n&2){let t=p();o(4),D(t.slashCommands),o(2),D(t.skills)}}function Te(n,e){if(n&1&&(r(0,"div",99),l(1),a(),d(2,"app-h-bars",164),r(3,"div",165),l(4,"bar = call count"),a()),n&2){let t=p(),i=p(3);o(),g("Tools used \xB7 ",t.byTool.length),o(),c("items",t.byTool)("fmt",i.fmtTokensFn)("color",i.toolBarColor)}}function Ee(n,e){if(n&1&&(r(0,"div",159)(1,"div",166)(2,"span",167),l(3,"SpecShip"),a(),r(4,"span",168),l(5,"est."),a()(),r(6,"div",169)(7,"div",68)(8,"span",170),l(9,"Spent"),a(),r(10,"span",171),l(11),a()(),r(12,"div",68)(13,"span",170),l(14,"Est. saved"),a(),r(15,"span",172),l(16),a()(),r(17,"div",173)(18,"span",170),l(19,"Net"),a(),r(20,"span",174),l(21),a()()()()),n&2){let t=p(),i=p(3);o(11),g("~",i.fmtTokens(t.specship.spendTokens)," tok"),o(5),g("~",i.fmtTokens(t.specship.savedTokens)," tok"),o(4),C("color",t.specship.netTokens>=0?"var(--success)":"var(--warn)"),o(),H("",t.specship.netTokens>0?"+":"","",i.fmtTokens(t.specship.netTokens)," tok")}}function Oe(n,e){if(n&1&&(m(0,Me,8,0,"div",158),m(1,Te,5,4),m(2,Ee,22,6,"div",159)),n&2){let t=e;_(t.slashCommands.length||t.skills.length?0:-1),o(),_(t.byTool.length?1:-1),o(),_(t.specship&&t.specship.spendTokens>0?2:-1)}}function De(n,e){if(n&1&&(r(0,"div",102)(1,"span",177),l(2),a(),r(3,"div",27),d(4,"app-bar",178),a(),r(5,"span",179),l(6),a()()),n&2){let t=e.$implicit,i=p(4);o(2),u(i.fmtClock(t.prompt.ts)),o(2),c("frac",t.prompt.cost_usd/i.maxPromptCost())("color",t.prompt.cost_usd>2.5?"var(--error)":"var(--accent)"),o(2),g("$",t.prompt.cost_usd.toFixed(2))}}function Ie(n,e){if(n&1&&(r(0,"div",175),l(1,"Cost per prompt"),a(),r(2,"div",176),O(3,De,7,4,"div",102,bt),a()),n&2){let t=p(3);o(3),D(t.groups())}}function ze(n,e){if(n&1){let t=N();r(0,"div",21)(1,"div",87)(2,"div",88)(3,"div",89)(4,"div",90),l(5,"Cost"),a(),r(6,"div",91),l(7),a()(),r(8,"div",89)(9,"div",90),l(10,"Prompts"),a(),r(11,"div",92),l(12),a()(),r(13,"div",89)(14,"div",90),l(15,"Window"),a(),r(16,"div",93),l(17),a()(),r(18,"div",89)(19,"div",90),l(20,"Cache hit"),a(),r(21,"div",92),l(22),z(23,"number"),a()(),r(24,"div",89)(25,"div",90),l(26,"Tool calls"),a(),r(27,"div",92),l(28),a()()(),r(29,"div",94)(30,"span",49),l(31),a(),r(32,"span",95),l(33,"click a prompt for full detail"),a(),d(34,"div",27),r(35,"button",23),M("click",function(){k(t);let s=p(2);return S(s.expandAll())}),l(36,"Expand all"),a(),r(37,"button",23),M("click",function(){k(t);let s=p(2);return S(s.collapseAll())}),l(38,"Collapse all"),a()(),r(39,"div",96),O(40,be,27,26,"div",97,bt,!1,ye,2,0,"div",16),a()(),r(43,"div",98)(44,"div",99),l(45,"Token mix"),a(),r(46,"div",100),d(47,"div",36)(48,"div",37)(49,"div",38)(50,"div",39),a(),r(51,"div",101)(52,"div",102),d(53,"span",103),r(54,"span",104),l(55,"Input"),a(),r(56,"span",105),l(57),a(),r(58,"span",106),l(59),z(60,"number"),a()(),r(61,"div",102),d(62,"span",107),r(63,"span",104),l(64,"Output"),a(),r(65,"span",105),l(66),a(),r(67,"span",106),l(68),z(69,"number"),a()(),r(70,"div",102),d(71,"span",108),r(72,"span",104),l(73,"Cache write"),a(),r(74,"span",105),l(75),a(),r(76,"span",106),l(77),z(78,"number"),a()(),r(79,"div",102),d(80,"span",109),r(81,"span",104),l(82,"Cache read"),a(),r(83,"span",105),l(84),a(),r(85,"span",106),l(86),z(87,"number"),a()()(),r(88,"div",110)(89,"div",102),d(90,"app-icon",111),r(91,"span",112),l(92,"Cache effectiveness"),a()(),r(93,"div",113)(94,"span",114),l(95),z(96,"number"),a(),r(97,"span",112),l(98,"of input served from cache"),a()()(),m(99,Oe,3,3),m(100,Ie,5,0),a()()}if(n&2){let t,i=p(),s=p();o(7),g("$",i.total_cost_usd.toFixed(2)),o(5),u(i.prompt_count),o(5),H(" ",s.fmtClock(i.started_at)," \u2013 ",s.fmtClock(i.ended_at).split(" ").pop()," "),o(4),C("color",s.cacheColor(s.cacheReadRate())),o(),g(" ",$(23,34,s.cacheReadRate()*100,"1.0-0"),"% "),o(6),u(s.totalToolCalls()),o(3),g("Prompt timeline \xB7 ",s.groups().length),o(9),D(s.groups()),o(7),C("width",s.tokPct("input"),"%"),c("title","Input: "+s.fmtTokens(i.total_input_tokens)),o(),C("width",s.tokPct("output"),"%"),c("title","Output: "+s.fmtTokens(i.total_output_tokens)),o(),C("width",s.tokPct("cacheWrite"),"%"),c("title","Cache write: "+s.fmtTokens(i.total_cache_creation_tokens)),o(),C("width",s.tokPct("cacheRead"),"%"),c("title","Cache read: "+s.fmtTokens(i.total_cache_read_tokens)),o(7),u(s.fmtTokens(i.total_input_tokens)),o(2),g("",$(60,37,s.tokPct("input"),"1.0-0"),"%"),o(7),u(s.fmtTokens(i.total_output_tokens)),o(2),g("",$(69,40,s.tokPct("output"),"1.0-0"),"%"),o(7),u(s.fmtTokens(i.total_cache_creation_tokens)),o(2),g("",$(78,43,s.tokPct("cacheWrite"),"1.0-0"),"%"),o(7),u(s.fmtTokens(i.total_cache_read_tokens)),o(2),g("",$(87,46,s.tokPct("cacheRead"),"1.0-0"),"%"),o(4),c("size",13),o(5),g("",$(96,49,s.cacheReadRate()*100,"1.0-0"),"%"),o(4),_((t=s.summaryData())?99:-1,t),o(),_(s.groups().length>0?100:-1)}}function $e(n,e){if(n&1&&m(0,te,65,38,"div",20)(1,ze,101,52,"div",21),n&2){let t,i=p();_((t=i.selectedGroup())?0:1,t)}}function Re(n,e){n&1&&(r(0,"div",16),l(1,"Session not found."),a())}var Fe=5e3,qe=/<command-name>([^<]+)<\/command-name>/,Be=new Set(["Read","Edit","Write","NotebookEdit","MultiEdit"]);function Ne(n){if(!n)return[];try{let e=JSON.parse(n);return Array.isArray(e)?e.filter(t=>Array.isArray(t)&&t.length>=2&&typeof t[0]=="string"&&typeof t[1]=="number"):[]}catch{return[]}}var Ct=class n{api=F(pt);route=F(rt);router=F(lt);sanitizer=F(at);destroyRef=F(K);refresh=F(dt);liveMode=V("idle");idSig=Z(this.route.paramMap,{initialValue:this.route.snapshot.paramMap});id=h(()=>this.idSig().get("id")??"");localRefreshing=V(!1);expandedIds=V(new Set);expandedToolInputs=V(new Set);resource=Y(this.api,()=>{let e=this.id();return e?`/api/claude/session/${encodeURIComponent(e)}`:null});summary=Y(this.api,()=>{let e=this.id();return e?`/api/claude/session/${encodeURIComponent(e)}/summary`:null});session=h(()=>this.resource.state().data?.session??null);prompts=h(()=>this.resource.state().data?.prompts??[]);toolCalls=h(()=>this.resource.state().data?.toolCalls??[]);summaryData=h(()=>this.summary.state().data??null);groups=h(()=>{let e=this.prompts(),t=this.toolCalls(),i=new Map;for(let s of t){let x=i.get(s.prompt_id)??[];x.push(s),i.set(s.prompt_id,x)}return e.map(s=>{let x=i.get(s.id)??[],f=(s.input_tokens||0)+(s.output_tokens||0)+(s.cache_creation_tokens||0)+(s.cache_read_tokens||0),T=x.reduce((v,y)=>v+(y.result_length||0),0),b=s.text?qe.exec(s.text):null,E=b?b[1].trim():null,B=x.length>0?Math.max(...x.map(v=>v.ts||0)):0,A=B>s.ts?B-s.ts:0,R=new Map;for(let v of x)R.set(v.tool_name,(R.get(v.tool_name)??0)+1);let P=Array.from(R.entries()).map(([v,y])=>({name:v,count:y,color:this.toolColor(v)})).sort((v,y)=>y.count-v.count),I=new Set;for(let v of x)Be.has(v.tool_name)&&v.input_summary&&I.add(v.input_summary);let w=x.filter(v=>v.is_specship===1),Q=w.reduce((v,y)=>v+(y.result_length||0),0),G=w.length>0?Math.ceil(Q/4):0,W=new Map;for(let v of w)if(v.resolution==="resolved")for(let[y,St]of Ne(v.displaced_files))W.has(y)||W.set(y,St);let yt=Array.from(W.values()).reduce((v,y)=>v+y,0),kt=Math.ceil(Math.max(0,yt-Q)/4);return{prompt:s,tools:x,totalTokens:f,toolBytes:T,slashCommand:E,durationMs:A,toolBreakdown:P,filesTouched:Array.from(I),specshipSpendTokens:G,specshipSavedTokens:kt}})});totalToolCalls=h(()=>this.toolCalls().length);queryMap=Z(this.route.queryParamMap,{initialValue:this.route.snapshot.queryParamMap});selectedPromptId=h(()=>this.queryMap().get("prompt"));selectedIndex=h(()=>{let e=this.selectedPromptId();return e?this.groups().findIndex(t=>t.prompt.id===e):-1});selectedGroup=h(()=>{let e=this.selectedIndex();return e>=0?this.groups()[e]:null});quality=h(()=>{let e=this.selectedGroup();return e?J(e.prompt,e.tools):null});qualityShareText=h(()=>{let e=this.quality();return e?vt(e):""});hasPrevPrompt=h(()=>this.selectedIndex()>0);hasNextPrompt=h(()=>{let e=this.selectedIndex();return e>=0&&e<this.groups().length-1});promptCacheRate(e){let t=(e.input_tokens||0)+(e.cache_creation_tokens||0)+(e.cache_read_tokens||0);return t>0?(e.cache_read_tokens||0)/t:0}promptQualityColor(e){return J(e.prompt,e.tools).color}openPrompt(e){this.router.navigate([],{relativeTo:this.route,queryParams:{prompt:e},queryParamsHandling:"merge"})}closePrompt(){this.router.navigate([],{relativeTo:this.route,queryParams:{prompt:null},queryParamsHandling:"merge"})}stepPrompt(e){let t=this.selectedIndex(),i=this.groups()[t+e];i&&this.openPrompt(i.prompt.id)}promptTok(e,t){return t==="input"?e.input_tokens||0:t==="output"?e.output_tokens||0:t==="cacheWrite"?e.cache_creation_tokens||0:e.cache_read_tokens||0}promptTokPct(e,t){let i=(e.input_tokens||0)+(e.output_tokens||0)+(e.cache_creation_tokens||0)+(e.cache_read_tokens||0)||1;return this.promptTok(e,t)/i*100}totalTokens=h(()=>{let e=this.session();return e&&(e.total_input_tokens||0)+(e.total_output_tokens||0)+(e.total_cache_creation_tokens||0)+(e.total_cache_read_tokens||0)||1});maxPromptCost=h(()=>{let e=this.groups();return Math.max(1e-4,...e.map(t=>t.prompt.cost_usd||0))});toolBarColor=e=>{let t=e.name;return t==="Read"?"var(--node-spec)":t==="Edit"||t==="Write"||t==="MultiEdit"?"var(--accent)":t==="Bash"?"var(--warn)":t==="Grep"||t==="Glob"?"var(--node-test)":t==="Task"?"var(--node-route)":t.startsWith("mcp__")?"var(--success)":"var(--node-code)"};cacheReadRate=h(()=>{let e=this.session();if(!e)return 0;let t=(e.total_input_tokens||0)+(e.total_cache_creation_tokens||0)+(e.total_cache_read_tokens||0);return t>0?(e.total_cache_read_tokens||0)/t:0});constructor(){j(()=>{!this.resource.state().loading&&this.localRefreshing()&&this.localRefreshing.set(!1)});let e=null,t=null,i=()=>{t!==null&&(clearInterval(t),t=null)},s=()=>{t===null&&(t=setInterval(()=>{typeof document<"u"&&document.visibilityState==="visible"&&this.resource.refetch()},Fe))},x=()=>{e&&(e(),e=null)},f=b=>{b&&(x(),e=this.api.openEventStream(`/api/claude/session/${encodeURIComponent(b)}/events`,E=>{E==="prompt_added"||E==="tool_call_added"?this.resource.refetch():E==="snapshot"?(this.liveMode.set("live"),i()):E==="stream_error"&&(this.liveMode.set("polling"),s())},()=>{this.liveMode.set("polling"),s()},["prompt_added","tool_call_added","snapshot","stream_error"]))},T=()=>{if(!(typeof document>"u"))if(document.visibilityState==="visible"){this.resource.refetch();let b=this.id();b&&this.liveMode()==="polling"&&f(b)}else i()};j(()=>{let b=this.id();if(x(),i(),!b){this.liveMode.set("idle");return}f(b)}),typeof document<"u"&&document.addEventListener("visibilitychange",T),this.destroyRef.onDestroy(()=>{x(),i(),this.liveMode.set("idle"),typeof document<"u"&&document.removeEventListener("visibilitychange",T)})}async forceRefresh(){this.localRefreshing.set(!0),await this.refresh.triggerGlobalRefresh()}isExpanded(e){return this.expandedIds().has(e)}toggleExpand(e){this.expandedIds.update(t=>{let i=new Set(t);return i.has(e)?i.delete(e):i.add(e),i})}expandAll(){this.expandedIds.set(new Set(this.prompts().map(e=>e.id)))}collapseAll(){this.expandedIds.set(new Set)}isToolInputExpanded(e){return this.expandedToolInputs().has(e)}toggleToolInput(e){this.expandedToolInputs.update(t=>{let i=new Set(t);return i.has(e)?i.delete(e):i.add(e),i})}renderAssistant(e){return this.sanitizer.bypassSecurityTrustHtml(ut(e??""))}formatToolInput(e){if(!e)return"";try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}}fmtBytes(e){return e?e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} kB`:`${(e/(1024*1024)).toFixed(1)} MB`:"0"}fmtTokens(e){return e<1e3?`${e}`:e<1e6?`${(e/1e3).toFixed(1)}k`:`${(e/1e6).toFixed(2)}M`}fmtTokensFn=e=>this.fmtTokens(e);fmtClock(e){if(!e)return"";try{let t=new Date(e),i=new Date;i.setHours(0,0,0,0);let s=864e5,x=i.getTime()-new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime(),f=t.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"});return x===0?f:x===s?"Yest "+f:t.toLocaleDateString([],{month:"short",day:"numeric"})+" "+f}catch{return String(e)}}fmtDurationSec(e,t){if(!e||!t)return"";let i=Math.round((t-e)/1e3);if(i<60)return`${i}s`;let s=Math.floor(i/60),x=i%60;if(s<60)return`${s}m ${x}s`;let f=Math.floor(s/60),T=s%60;return`${f}h ${T}m`}fmtDurationMs(e){if(!e||e<=0)return"";if(e<1e3)return`${e}ms`;let t=e/1e3;if(t<60)return`${t.toFixed(t<10?1:0)}s`;let i=Math.floor(t/60),s=Math.round(t%60);if(i<60)return`${i}m ${s}s`;let x=Math.floor(i/60),f=i%60;return`${x}h ${f}m`}basename(e){if(!e)return"";if(e.length<=40)return e;let t=e.split("/");return t.length<=2?e:"\u2026/"+t.slice(-2).join("/")}toolColor(e){return e==="Read"?"var(--node-spec)":e==="Edit"||e==="Write"||e==="MultiEdit"||e==="NotebookEdit"?"var(--accent)":e==="Bash"?"var(--warn)":e==="Grep"||e==="Glob"?"var(--node-test)":e==="Task"?"var(--node-route)":e.startsWith("mcp__")?"var(--success)":"var(--text-secondary)"}cacheColor(e){return e>=.7?"var(--success)":e>=.5?"var(--warn)":"var(--error)"}tokPct(e){let t=this.session();if(!t)return 0;let i=this.totalTokens();return(e==="input"?t.total_input_tokens||0:e==="output"?t.total_output_tokens||0:e==="cacheWrite"?t.total_cache_creation_tokens||0:t.total_cache_read_tokens||0)/i*100}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=X({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,"empty"],[1,"error-title"],[1,"error-detail"],[1,"btn","btn-secondary","btn-sm",3,"click"],[1,"scroll-y","pp-page"],[1,"sd-body"],[1,"row","gap-10","pp-head"],["type","button",1,"btn","btn-ghost","btn-sm",3,"click"],[1,"mono","muted","pp-time"],["color","var(--node-code)","bg","var(--node-code-soft)"],["color","var(--node-route)","bg","var(--node-route-soft)"],[1,"grow"],["type","button",1,"btn","btn-ghost","btn-sm",3,"click","disabled"],["name","chevronRight",3,"size"],[1,"row","gap-6","pp-meta"],[1,"pp-chip","mono"],["name","wrench",3,"size"],[1,"pp-quality",3,"border-color","background"],[1,"eyebrow","pp-sec-lbl"],[1,"tok-bar","pp-tokbar"],[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,"row","gap-12","pp-tok-legend"],[1,"pp-tok-li"],[1,"dot",2,"background","var(--node-spec)"],[1,"dot",2,"background","var(--node-code)"],[1,"dot",2,"background","var(--warn)"],[1,"dot",2,"background","var(--node-route)"],[1,"pp-io"],[1,"pp-io-col"],[1,"row","gap-6","pp-io-head"],[1,"eyebrow"],[3,"text"],[1,"pp-io-body","mono"],[1,"pp-io-body","md-content",3,"innerHTML"],[1,"pp-io-body","muted"],[1,"pp-thinking"],[2,"height","24px"],["name","command",3,"size"],["name","bot",3,"size"],[1,"pp-quality"],[1,"row","gap-8","pp-q-head"],["name","sparkles",3,"size"],[1,"pp-q-title"],[1,"pill","pp-q-grade"],[1,"tabular"],["label","Share",3,"text"],[1,"pp-q-bar"],[3,"frac","color","height"],[1,"pp-q-factors"],[1,"row","gap-6"],[1,"eyebrow","pp-q-sub"],[1,"col","gap-8"],[1,"row","gap-8","pp-sug"],[3,"name","size"],[1,"pp-q-factor"],[1,"pp-sug-dot"],[1,"pp-sug-text"],[1,"row","gap-6","pp-sug-fix"],[1,"mono"],[1,"row","gap-8","pp-rewrite"],[1,"grow","pp-rewrite-text"],[1,"eyebrow","pp-thinking-sum"],[1,"md-content","pp-thinking-body",3,"innerHTML"],[1,"col","gap-4","pp-tools"],[1,"row","gap-8","pp-tool"],[1,"mono","pp-tool-name"],[1,"mono","muted","pp-tool-input"],[1,"mono","muted","pp-tool-bytes"],[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,"muted",2,"font-size","11px"],[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,"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)"],["role","button","tabindex","0",1,"prompt-head","row","gap-10",3,"click","keydown.enter","keydown.space"],[1,"mono","muted",2,"font-size","10.5px","width","52px","flex-shrink","0"],["title","Prompt quality",2,"width","8px","height","8px","border-radius","50%","flex-shrink","0"],[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"],["type","button","title","Open full view","aria-label","Open full prompt view",1,"pp-open-btn",3,"click"],["name","maximize",3,"size"],["name","chevronRight",2,"color","var(--text-muted)","flex-shrink","0",3,"size"],[1,"prompt-body"],[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"],[2,"opacity","0.7"],["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,"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(t,i){if(t&1&&(r(0,"div",0)(1,"header",1)(2,"a",2),d(3,"app-icon",3),l(4," Sessions "),a(),r(5,"div",4)(6,"div",5)(7,"span",6),l(8),a(),m(9,It,2,3,"app-pill",7),r(10,"span",8),d(11,"span",9),l(12),a()(),m(13,$t,3,2,"div",10),a(),r(14,"div",11)(15,"button",12),M("click",function(){return i.forceRefresh()}),d(16,"app-icon",13),l(17),a()()(),m(18,Rt,2,0,"div",14)(19,Ft,7,1,"div",15)(20,$e,2,1)(21,Re,2,0,"div",16),a()),t&2){let s,x,f;o(2),c("routerLink",it(19,Ot)),o(),c("size",14),o(5),u(i.id().slice(0,12)),o(),_((s=i.session())!=null&&s.last_model?9:-1),o(),q("live",i.liveMode()==="live")("polling",i.liveMode()==="polling")("idle",i.liveMode()==="idle"),c("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"),o(2),g(" ",i.liveMode()==="live"?"Live":i.liveMode()==="polling"?"Polling":"Idle"," "),o(),_((x=i.session())?13:-1,x),o(2),q("spinning",i.localRefreshing()||i.refresh.loading()),c("disabled",i.refresh.loading()),o(),c("size",13),o(),g(" ",i.localRefreshing()||i.refresh.loading()?"Refreshing\u2026":"Refresh"," "),o(),_(i.resource.state().loading&&!i.session()?18:i.resource.state().error?19:(f=i.session())?20:21,f)}},dependencies:[st,ct,xt,mt,_t,gt,ot],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}.pp-open-btn[_ngcontent-%COMP%]{flex-shrink:0;display:inline-flex;align-items:center;background:transparent;border:0;cursor:pointer;color:var(--text-muted);padding:2px;border-radius:4px;opacity:0;transition:opacity .1s,background .1s,color .1s}.prompt-head[_ngcontent-%COMP%]:hover .pp-open-btn[_ngcontent-%COMP%]{opacity:1}.pp-open-btn[_ngcontent-%COMP%]:hover{background:var(--bg-panel-2);color:var(--text-primary)}.pp-open-btn[_ngcontent-%COMP%]:focus-visible{opacity:1;outline:2px solid var(--accent);outline-offset:1px}.pp-page[_ngcontent-%COMP%]{flex:1;min-height:0;padding:18px}.pp-head[_ngcontent-%COMP%]{align-items:center;margin-bottom:14px}.pp-time[_ngcontent-%COMP%]{font-size:11.5px}.pp-meta[_ngcontent-%COMP%]{flex-wrap:wrap;margin-bottom:16px}.pp-chip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px;font-size:11px;padding:3px 8px;border-radius:6px;background:var(--bg-panel);border:1px solid var(--border-subtle);color:var(--text-secondary)}.pp-quality[_ngcontent-%COMP%]{border:1px solid var(--border-subtle);border-radius:8px;padding:12px;margin-bottom:16px}.pp-q-head[_ngcontent-%COMP%]{align-items:center;margin-bottom:10px}.pp-q-title[_ngcontent-%COMP%]{font-weight:600;font-size:12.5px}.pp-q-grade[_ngcontent-%COMP%]{font-weight:600}.pp-q-bar[_ngcontent-%COMP%]{margin-bottom:12px}.pp-q-factors[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:6px 12px;margin-bottom:12px}.pp-q-factor[_ngcontent-%COMP%]{font-size:11.5px;color:var(--text-secondary)}.pp-q-factor.bad[_ngcontent-%COMP%]{color:var(--text-primary)}.pp-q-sub[_ngcontent-%COMP%]{margin-bottom:7px}.pp-q-sub[_ngcontent-%COMP%] + .col[_ngcontent-%COMP%], .pp-q-sub[_ngcontent-%COMP%] + .pp-rewrite[_ngcontent-%COMP%]{margin-top:0}.col[_ngcontent-%COMP%] + .pp-q-sub[_ngcontent-%COMP%], .pp-q-bar[_ngcontent-%COMP%] + .pp-q-factors[_ngcontent-%COMP%] + .pp-q-sub[_ngcontent-%COMP%]{margin-top:12px}.pp-sug[_ngcontent-%COMP%]{align-items:flex-start}.pp-sug-dot[_ngcontent-%COMP%]{width:6px;height:6px;border-radius:50%;flex-shrink:0;margin-top:5px}.pp-sug-text[_ngcontent-%COMP%]{font-size:12px;line-height:1.5;color:var(--text-secondary);text-wrap:pretty}.pp-sug-fix[_ngcontent-%COMP%]{margin-top:5px;align-items:center}.pp-sug-fix[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{font-size:11px;color:var(--text-primary);background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:5px;padding:2px 7px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pp-rewrite[_ngcontent-%COMP%]{align-items:flex-start;background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:7px;padding:9px 11px}.pp-rewrite-text[_ngcontent-%COMP%]{font-size:12px;line-height:1.5;color:var(--text-primary);text-wrap:pretty}.pp-sec-lbl[_ngcontent-%COMP%]{margin:16px 0 8px}.pp-tokbar[_ngcontent-%COMP%]{margin-bottom:8px}.pp-tok-legend[_ngcontent-%COMP%]{flex-wrap:wrap;margin-bottom:16px}.pp-tok-li[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:5px;font-size:10.5px;color:var(--text-muted)}.pp-tok-li[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:2px}.pp-io[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:16px}.pp-io-col[_ngcontent-%COMP%]{min-width:0;display:flex;flex-direction:column}.pp-io-head[_ngcontent-%COMP%]{margin-bottom:6px;align-items:center}.pp-io-body[_ngcontent-%COMP%]{background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:8px;padding:11px 13px;font-size:12px;line-height:1.6;max-height:460px;overflow:auto;margin:0}pre.pp-io-body[_ngcontent-%COMP%]{white-space:pre-wrap;word-break:break-word}.pp-thinking[_ngcontent-%COMP%]{margin-bottom:16px}.pp-thinking-sum[_ngcontent-%COMP%]{cursor:pointer}.pp-thinking-body[_ngcontent-%COMP%]{margin-top:8px}.pp-tool[_ngcontent-%COMP%]{padding:7px 10px;border-radius:6px;background:var(--bg-panel);border:1px solid var(--border-subtle);align-items:center}.pp-tool-name[_ngcontent-%COMP%]{font-size:12px;font-weight:600}.pp-tool-input[_ngcontent-%COMP%]{font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pp-tool-bytes[_ngcontent-%COMP%]{font-size:11px}@media(max-width:720px){.pp-io[_ngcontent-%COMP%]{grid-template-columns:1fr}}.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{Ct as SessionDetail};
@@ -1 +1 @@
1
- import{a as I}from"./chunk-JLOJCDIY.js";import{a as W}from"./chunk-5NTGUSXJ.js";import{a as z,b as D}from"./chunk-WBJ5VEB5.js";import{a as F}from"./chunk-SQPYSOV6.js";import{a as A}from"./chunk-IOB4JJT4.js";import{c as E}from"./chunk-DOKZOFKM.js";import{c as P}from"./chunk-PAO2624Y.js";import{a as M}from"./chunk-PBRCKHEQ.js";import{a as O}from"./chunk-3H2EZLZN.js";import{Aa as c,Ga as h,I as m,Ia as C,Ka as l,M as _,N as f,Va as a,W as b,Wa as y,Xa as p,ea as s,ka as R,lb as w,ra as x,sa as g,va as k,wa as S,xa as v,ya as r,za as i,zb as T}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var N=(o,e)=>e.id;function V(o,e){o&1&&c(0,"app-pick-project-empty",0)}function $(o,e){o&1&&(r(0,"div",15),a(1,"No runs yet. Start one from the Workflows page."),i())}function H(o,e){if(o&1&&(r(0,"app-pill"),c(1,"app-icon",26),a(2),i()),o&2){let t=l().$implicit,n=l(3);s(),v("size",10),s(),p(" ",n.artifactsOf(t)," ")}}function Q(o,e){if(o&1){let t=h();r(0,"div",17),C("click",function(){let d=_(t).$implicit,u=l(3);return f(u.goToRun(d))})("keydown.enter",function(){let d=_(t).$implicit,u=l(3);return f(u.goToRun(d))}),r(1,"span",9),c(2,"app-state-pill",18),i(),r(3,"div",19)(4,"span",20),a(5),i(),r(6,"span",21),a(7),i(),x(8,H,3,2,"app-pill"),i(),r(9,"span",22),a(10),i(),r(11,"span",23),a(12),i(),r(13,"span",24),a(14),i(),r(15,"span",25),a(16),i()()}if(o&2){let t=e.$implicit,n=l(3);s(2),v("state",t.status)("pulse",t.status==="running"),s(3),y(t.workflowName),s(2),y(t.id.slice(0,8)),s(),g(n.artifactsOf(t)>0?8:-1),s(2),p(" ",n.durationOf(t)," "),s(2),p(" ",n.costOf(t)," "),s(2),p(" ",n.worktreeOf(t)," "),s(2),p(" ",n.timeAgo(t)," ")}}function q(o,e){if(o&1&&k(0,Q,17,9,"div",16,N),o&2){let t=l(2);S(t.runs())}}function B(o,e){if(o&1){let t=h();r(0,"div",1)(1,"div",2),c(2,"app-page-head",3),i(),r(3,"div",4)(4,"app-segmented",5),C("change",function(d){_(t);let u=l();return f(u.setFilter(d))}),i()(),r(5,"div",6)(6,"div",7)(7,"div",8)(8,"span",9),a(9,"Status"),i(),r(10,"span",10),a(11,"Workflow"),i(),r(12,"span",11),a(13,"Duration"),i(),r(14,"span",12),a(15,"Cost"),i(),r(16,"span",13),a(17,"Worktree"),i(),r(18,"span",14),a(19,"When"),i()(),x(20,$,2,0,"div",15)(21,q,2,0),i()()()}if(o&2){let t=l();s(4),v("options",t.filterOptions())("value",t.statusFilter()),s(16),g(t.runs().length===0&&!t.resource.state().loading?20:21)}}var j=class o{api=m(O);projects=m(M);router=m(E);resource=P(this.api,()=>`/api/workflows/runs?limit=100${this.projects.projectQuery("&")}`);allRuns=w(()=>this.resource.state().data?.runs??[]);statusFilter=b("all");filterOptions=w(()=>[{value:"all",label:"All"},...["running","paused","completed","failed","cancelled"].map(t=>({value:t,label:z[t]?.label??t}))]);runs=w(()=>{let e=this.statusFilter(),t=this.allRuns();return e==="all"?t:t.filter(n=>n.status===e)});setFilter(e){this.statusFilter.set(e)}goToRun(e){this.router.navigate(["/runs",e.id])}durationOf(e){if(!e.startedAt)return"\u2014";let n=(e.completedAt??e.lastActivityAt)-e.startedAt;return n>=6e4?Math.round(n/6e4)+"m "+Math.round(n%6e4/1e3)+"s":n>=1e3?Math.round(n/1e3)+"s":n+"ms"}timeAgo(e){let t=e.lastActivityAt;if(!t)return"";let n=Date.now()-t;return n<6e4?"just now":n<36e5?Math.round(n/6e4)+"m ago":n<864e5?Math.round(n/36e5)+"h ago":Math.round(n/864e5)+"d ago"}worktreeOf(e){return e.isolationEnvId??e.metadata?.isolationEnvId??"\u2014"}costOf(e){return"\u2014"}artifactsOf(e){return 0}static \u0275fac=function(t){return new(t||o)};static \u0275cmp=R({type:o,selectors:[["app-runs"]],decls:2,vars:1,consts:[["surface","Runs"],[1,"col","runs-page"],[2,"padding","16px 18px 0"],["icon","play","title","Runs","sub","Recent workflow executions"],[1,"row","gap-6",2,"padding","0 18px 12px"],["size","sm",3,"change","options","value"],[2,"padding","0 18px 18px"],[1,"card","runs-table"],[1,"runs-header","row"],[2,"width","100px"],[1,"grow"],[2,"width","90px"],[2,"width","70px","text-align","right"],[2,"width","130px","text-align","right"],[2,"width","60px","text-align","right"],[1,"runs-empty"],["role","button","tabindex","0",1,"runs-row","row"],["role","button","tabindex","0",1,"runs-row","row",3,"click","keydown.enter"],[3,"state","pulse"],[1,"grow","row","gap-8"],[1,"mono",2,"font-size","12.5px"],[1,"mono","muted",2,"font-size","11px"],[1,"mono","tabular","muted",2,"width","90px","font-size","11.5px"],[1,"mono","tabular",2,"width","70px","text-align","right","font-size","12px"],[1,"mono","muted","runs-worktree",2,"width","130px","text-align","right","font-size","10.5px"],[1,"mono","muted",2,"width","60px","text-align","right","font-size","11px"],["name","box",3,"size"]],template:function(t,n){t&1&&x(0,V,1,0,"app-pick-project-empty",0)(1,B,22,3,"div",1),t&2&&g(n.resource.state().noProject?0:1)},dependencies:[F,W,D,A,I,T],styles:["[_nghost-%COMP%]{display:contents}.runs-page[_ngcontent-%COMP%]{flex:1;min-height:0}.runs-table[_ngcontent-%COMP%]{overflow:hidden}.runs-header[_ngcontent-%COMP%]{padding:8px 14px;border-bottom:1px solid var(--border-subtle);font-size:10.5px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;font-weight:600}.runs-row[_ngcontent-%COMP%]{padding:11px 14px;border-top:1px solid var(--border-subtle);cursor:pointer;transition:background 80ms}.runs-row[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.runs-row[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.runs-worktree[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.runs-empty[_ngcontent-%COMP%]{padding:40px;text-align:center;color:var(--text-muted);font-size:12.5px}"],changeDetection:0})};export{j as Runs};
1
+ import{a as I}from"./chunk-JLOJCDIY.js";import{a as W}from"./chunk-5NTGUSXJ.js";import{a as z,b as D}from"./chunk-WBJ5VEB5.js";import{a as F}from"./chunk-SQPYSOV6.js";import{a as A}from"./chunk-IOB4JJT4.js";import{c as E}from"./chunk-DOKZOFKM.js";import{c as P}from"./chunk-DTWIJ3GJ.js";import{a as M}from"./chunk-JGDK6YKG.js";import{a as O}from"./chunk-TWVVIWKO.js";import{Aa as c,Ga as h,I as m,Ia as C,Ka as l,M as _,N as f,Va as a,W as b,Wa as y,Xa as p,ea as s,ka as R,lb as w,ra as x,sa as g,va as k,wa as S,xa as v,ya as r,za as i,zb as T}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var N=(o,e)=>e.id;function V(o,e){o&1&&c(0,"app-pick-project-empty",0)}function $(o,e){o&1&&(r(0,"div",15),a(1,"No runs yet. Start one from the Workflows page."),i())}function H(o,e){if(o&1&&(r(0,"app-pill"),c(1,"app-icon",26),a(2),i()),o&2){let t=l().$implicit,n=l(3);s(),v("size",10),s(),p(" ",n.artifactsOf(t)," ")}}function Q(o,e){if(o&1){let t=h();r(0,"div",17),C("click",function(){let d=_(t).$implicit,u=l(3);return f(u.goToRun(d))})("keydown.enter",function(){let d=_(t).$implicit,u=l(3);return f(u.goToRun(d))}),r(1,"span",9),c(2,"app-state-pill",18),i(),r(3,"div",19)(4,"span",20),a(5),i(),r(6,"span",21),a(7),i(),x(8,H,3,2,"app-pill"),i(),r(9,"span",22),a(10),i(),r(11,"span",23),a(12),i(),r(13,"span",24),a(14),i(),r(15,"span",25),a(16),i()()}if(o&2){let t=e.$implicit,n=l(3);s(2),v("state",t.status)("pulse",t.status==="running"),s(3),y(t.workflowName),s(2),y(t.id.slice(0,8)),s(),g(n.artifactsOf(t)>0?8:-1),s(2),p(" ",n.durationOf(t)," "),s(2),p(" ",n.costOf(t)," "),s(2),p(" ",n.worktreeOf(t)," "),s(2),p(" ",n.timeAgo(t)," ")}}function q(o,e){if(o&1&&k(0,Q,17,9,"div",16,N),o&2){let t=l(2);S(t.runs())}}function B(o,e){if(o&1){let t=h();r(0,"div",1)(1,"div",2),c(2,"app-page-head",3),i(),r(3,"div",4)(4,"app-segmented",5),C("change",function(d){_(t);let u=l();return f(u.setFilter(d))}),i()(),r(5,"div",6)(6,"div",7)(7,"div",8)(8,"span",9),a(9,"Status"),i(),r(10,"span",10),a(11,"Workflow"),i(),r(12,"span",11),a(13,"Duration"),i(),r(14,"span",12),a(15,"Cost"),i(),r(16,"span",13),a(17,"Worktree"),i(),r(18,"span",14),a(19,"When"),i()(),x(20,$,2,0,"div",15)(21,q,2,0),i()()()}if(o&2){let t=l();s(4),v("options",t.filterOptions())("value",t.statusFilter()),s(16),g(t.runs().length===0&&!t.resource.state().loading?20:21)}}var j=class o{api=m(O);projects=m(M);router=m(E);resource=P(this.api,()=>`/api/workflows/runs?limit=100${this.projects.projectQuery("&")}`);allRuns=w(()=>this.resource.state().data?.runs??[]);statusFilter=b("all");filterOptions=w(()=>[{value:"all",label:"All"},...["running","paused","completed","failed","cancelled"].map(t=>({value:t,label:z[t]?.label??t}))]);runs=w(()=>{let e=this.statusFilter(),t=this.allRuns();return e==="all"?t:t.filter(n=>n.status===e)});setFilter(e){this.statusFilter.set(e)}goToRun(e){this.router.navigate(["/runs",e.id])}durationOf(e){if(!e.startedAt)return"\u2014";let n=(e.completedAt??e.lastActivityAt)-e.startedAt;return n>=6e4?Math.round(n/6e4)+"m "+Math.round(n%6e4/1e3)+"s":n>=1e3?Math.round(n/1e3)+"s":n+"ms"}timeAgo(e){let t=e.lastActivityAt;if(!t)return"";let n=Date.now()-t;return n<6e4?"just now":n<36e5?Math.round(n/6e4)+"m ago":n<864e5?Math.round(n/36e5)+"h ago":Math.round(n/864e5)+"d ago"}worktreeOf(e){return e.isolationEnvId??e.metadata?.isolationEnvId??"\u2014"}costOf(e){return"\u2014"}artifactsOf(e){return 0}static \u0275fac=function(t){return new(t||o)};static \u0275cmp=R({type:o,selectors:[["app-runs"]],decls:2,vars:1,consts:[["surface","Runs"],[1,"col","runs-page"],[2,"padding","16px 18px 0"],["icon","play","title","Runs","sub","Recent workflow executions"],[1,"row","gap-6",2,"padding","0 18px 12px"],["size","sm",3,"change","options","value"],[2,"padding","0 18px 18px"],[1,"card","runs-table"],[1,"runs-header","row"],[2,"width","100px"],[1,"grow"],[2,"width","90px"],[2,"width","70px","text-align","right"],[2,"width","130px","text-align","right"],[2,"width","60px","text-align","right"],[1,"runs-empty"],["role","button","tabindex","0",1,"runs-row","row"],["role","button","tabindex","0",1,"runs-row","row",3,"click","keydown.enter"],[3,"state","pulse"],[1,"grow","row","gap-8"],[1,"mono",2,"font-size","12.5px"],[1,"mono","muted",2,"font-size","11px"],[1,"mono","tabular","muted",2,"width","90px","font-size","11.5px"],[1,"mono","tabular",2,"width","70px","text-align","right","font-size","12px"],[1,"mono","muted","runs-worktree",2,"width","130px","text-align","right","font-size","10.5px"],[1,"mono","muted",2,"width","60px","text-align","right","font-size","11px"],["name","box",3,"size"]],template:function(t,n){t&1&&x(0,V,1,0,"app-pick-project-empty",0)(1,B,22,3,"div",1),t&2&&g(n.resource.state().noProject?0:1)},dependencies:[F,W,D,A,I,T],styles:["[_nghost-%COMP%]{display:contents}.runs-page[_ngcontent-%COMP%]{flex:1;min-height:0}.runs-table[_ngcontent-%COMP%]{overflow:hidden}.runs-header[_ngcontent-%COMP%]{padding:8px 14px;border-bottom:1px solid var(--border-subtle);font-size:10.5px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;font-weight:600}.runs-row[_ngcontent-%COMP%]{padding:11px 14px;border-top:1px solid var(--border-subtle);cursor:pointer;transition:background 80ms}.runs-row[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.runs-row[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.runs-worktree[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.runs-empty[_ngcontent-%COMP%]{padding:40px;text-align:center;color:var(--text-muted);font-size:12.5px}"],changeDetection:0})};export{j as Runs};
@@ -1 +1 @@
1
- import{a as V}from"./chunk-YWIRU745.js";import{a as A}from"./chunk-JLOJCDIY.js";import{a as N}from"./chunk-5NTGUSXJ.js";import{b as B}from"./chunk-WBJ5VEB5.js";import{a as $}from"./chunk-SQPYSOV6.js";import{c as k}from"./chunk-DOKZOFKM.js";import{c as z}from"./chunk-PAO2624Y.js";import{a as I}from"./chunk-PBRCKHEQ.js";import{a as R}from"./chunk-3H2EZLZN.js";import{Aa as m,Ea as P,Fa as M,Ga as E,I as y,Ia as S,Ka as s,M as h,N as w,Va as r,Wa as x,Xa as v,Ya as b,bb as O,ea as i,ka as T,lb as _,ra as d,sa as p,ua as F,va as f,wa as u,xa as l,ya as o,za as a,zb as j}from"./chunk-SYGIPC2P.js";import{a as C,b as D}from"./chunk-Q7L6LLAK.js";var q=()=>[0,1,2],G=(e,t)=>t.type,J=(e,t)=>t.id,K=(e,t)=>t.specId+t.symbol;function L(e,t){e&1&&m(0,"app-pick-project-empty",0)}function U(e,t){e&1&&m(0,"div",7)}function W(e,t){e&1&&f(0,U,1,0,"div",7,F),e&2&&u(O(0,q))}function X(e,t){e&1&&(o(0,"div",5),r(1,"No domain data \u2014 run "),o(2,"code"),r(3,"specship index"),a(),r(4," first."),a())}function Y(e,t){e&1&&(o(0,"app-empty",6)(1,"button",8),m(2,"app-icon",9),r(3," Capture knowledge "),a()()),e&2&&(i(2),l("size",12))}function Z(e,t){if(e&1&&(o(0,"div",16),r(1),a()),e&2){let n=s().$implicit;i(),x(n.body)}}function ee(e,t){if(e&1&&(o(0,"div",24),r(1),a()),e&2){let n=t.$implicit;i(),b("governs ",n.specId," \u2192 ",n.symbol)}}function te(e,t){if(e&1&&(o(0,"div",18),f(1,ee,2,2,"div",24,K),a()),e&2){let n=s().$implicit;i(),u(n.governs)}}function ne(e,t){e&1&&m(0,"app-state-pill",20),e&2&&l("state",t)}function ie(e,t){e&1&&(o(0,"app-pill",4),r(1,"No linked code yet"),a()),e&2&&l("color","var(--text-muted)")("bg","var(--bg-elevated)")}function oe(e,t){if(e&1){let n=E();o(0,"button",25),S("click",function(){h(n);let g=s(5);return w(g.review())}),m(1,"app-icon",26),r(2," Review "),a()}e&2&&(i(),l("size",12))}function ae(e,t){if(e&1&&(o(0,"div",13)(1,"div",14)(2,"div",15),r(3),a(),d(4,Z,2,1,"div",16),o(5,"div",17),r(6),a(),d(7,te,3,0,"div",18),a(),o(8,"div",19),d(9,ne,1,1,"app-state-pill",20)(10,ie,2,2,"app-pill",4),o(11,"div",21),d(12,oe,3,1,"button",22),o(13,"button",23),m(14,"app-icon",9),r(15," Capture "),a()()()()),e&2){let n,c=t.$implicit,g=s(4);i(3),x(c.title),i(),p(c.body?4:-1),i(2),x(c.id),i(),p(c.governs.length?7:-1),i(2),p((n=g.stateOf(c))?9:c.state==="none"&&c.governs.length===0?10:-1,n),i(3),p(g.needsReview(c)?12:-1),i(2),l("size",12)}}function re(e,t){if(e&1&&(o(0,"section",10)(1,"div",11),r(2),o(3,"span",12),r(4),a()(),f(5,ae,16,7,"div",13,J),a()),e&2){let n=t.$implicit;i(2),v("",n.label," "),i(2),x(n.facts.length),i(),u(n.facts)}}function ce(e,t){if(e&1&&f(0,re,7,2,"section",10,G),e&2){let n=s(2);u(n.sections())}}function le(e,t){if(e&1&&(o(0,"div",1)(1,"app-page-head",2),P(2,3),o(3,"app-pill",4),r(4),a(),o(5,"app-pill",4),r(6),a(),M(),a(),d(7,W,2,1)(8,X,5,0,"div",5)(9,Y,4,1,"app-empty",6)(10,ce,2,0),a()),e&2){let n=s();i(3),l("color","var(--success)")("bg","var(--success-soft)"),i(),v("",n.coverage().documented," documented"),i(),l("color","var(--warn)")("bg","var(--warn-soft)"),i(),b("",n.coverage().gaps," gap",n.coverage().gaps===1?"":"s"),i(),p(n.resource.state().loading?7:n.data()?n.isEmpty()?9:10:8)}}var H=[{type:"term",label:"Terms"},{type:"rule",label:"Rules"},{type:"decision",label:"Decisions"},{type:"constraint",label:"Constraints"},{type:"other",label:"Other"}],Q=class e{api=y(R);projects=y(I);router=y(k);resource=z(this.api,()=>`/api/domain${this.projects.projectQuery()}`);data=_(()=>this.resource.state().data);coverage=_(()=>this.data()?.coverage??{documented:0,gaps:0});sections=_(()=>{let t=this.data();return t?H.map(n=>D(C({},n),{facts:t.factsByType[n.type]??[]})).filter(n=>n.facts.length>0):[]});total=_(()=>{let t=this.data();return t?H.reduce((n,c)=>n+(t.factsByType[c.type]?.length??0),0):0});isEmpty=_(()=>{let t=this.resource.state();return!t.loading&&!t.noProject&&t.data!=null&&this.total()===0});stateOf(t){return t.state==="none"?null:t.state}needsReview(t){return t.state==="drifted"}review(){this.router.navigate(["/drift"])}static \u0275fac=function(n){return new(n||e)};static \u0275cmp=T({type:e,selectors:[["app-domain"]],decls:2,vars:1,consts:[["surface","The domain layer"],[1,"page","scroll-y"],["icon","book","title","Domain","sub","Human-confirmed knowledge \u2014 terms, rules, decisions, constraints"],["actions",""],[3,"color","bg"],[1,"empty"],["icon","book","title","No domain knowledge captured yet","body","Document the terms, rules, decisions, and constraints that the code can't tell you. Run /ss-spec domain to capture the first fact."],[1,"skel","card-skel"],["action","","type","button","title","Run /ss-spec domain to capture a domain fact",1,"btn","btn-primary","btn-sm"],["name","plus",3,"size"],[1,"sig","card"],[1,"sig-head"],[1,"n"],[1,"fact"],[1,"fact-main"],[1,"fact-title"],[1,"fact-body"],[1,"fact-id","mono"],[1,"fact-governs"],[1,"fact-side"],[3,"state"],[1,"fact-actions","row","gap-6"],["type","button",1,"btn","btn-secondary","btn-sm"],["type","button","title","Run /ss-spec domain to refine this fact",1,"btn","btn-secondary","btn-sm"],[1,"fact-governs-row","mono"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["name","drift",3,"size"]],template:function(n,c){n&1&&d(0,L,1,0,"app-pick-project-empty",0)(1,le,11,8,"div",1),n&2&&p(c.resource.state().noProject?0:1)},dependencies:[N,A,B,V,j,$],styles:[".page[_ngcontent-%COMP%]{padding:20px 24px 48px}.empty[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;gap:8px;text-align:center;padding:64px 24px;color:var(--text-muted)}.empty[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace);font-size:.92em}.card-skel[_ngcontent-%COMP%]{height:120px;border-radius:12px;margin-bottom:12px}.sig[_ngcontent-%COMP%]{padding:0;margin-bottom:14px;overflow:hidden}.sig-head[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:12px 16px;font-size:13px;font-weight:600;border-bottom:1px solid var(--border, color-mix(in srgb, var(--text) 12%, transparent))}.sig-head[_ngcontent-%COMP%] .n[_ngcontent-%COMP%]{font-size:11px;font-weight:600;color:var(--text-muted);background:var(--bg-elevated, color-mix(in srgb, var(--text) 7%, transparent));border-radius:999px;padding:1px 8px}.fact[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:16px;padding:12px 16px;border-top:1px solid var(--border-subtle, color-mix(in srgb, var(--text) 6%, transparent))}.fact[_ngcontent-%COMP%]:first-of-type{border-top:none}.fact-main[_ngcontent-%COMP%]{min-width:0;flex:1}.fact-title[_ngcontent-%COMP%]{font-size:13px;font-weight:600;color:var(--text)}.fact-body[_ngcontent-%COMP%]{margin-top:3px;font-size:12.5px;line-height:1.5;color:var(--text-secondary, var(--text-muted))}.fact-id[_ngcontent-%COMP%]{margin-top:5px;font-size:11px;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fact-governs[_ngcontent-%COMP%]{margin-top:6px;display:flex;flex-direction:column;gap:2px}.fact-governs-row[_ngcontent-%COMP%]{font-size:11px;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fact-side[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:flex-end;gap:8px;flex:0 0 auto}.fact-actions[_ngcontent-%COMP%]{flex-wrap:wrap;justify-content:flex-end}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono, ui-monospace, monospace)}"],changeDetection:0})};export{Q as Domain};
1
+ import{a as V}from"./chunk-YWIRU745.js";import{a as A}from"./chunk-JLOJCDIY.js";import{a as N}from"./chunk-5NTGUSXJ.js";import{b as B}from"./chunk-WBJ5VEB5.js";import{a as $}from"./chunk-SQPYSOV6.js";import{c as k}from"./chunk-DOKZOFKM.js";import{c as z}from"./chunk-DTWIJ3GJ.js";import{a as I}from"./chunk-JGDK6YKG.js";import{a as R}from"./chunk-TWVVIWKO.js";import{Aa as m,Ea as P,Fa as M,Ga as E,I as y,Ia as S,Ka as s,M as h,N as w,Va as r,Wa as x,Xa as v,Ya as b,bb as O,ea as i,ka as T,lb as _,ra as d,sa as p,ua as F,va as f,wa as u,xa as l,ya as o,za as a,zb as j}from"./chunk-SYGIPC2P.js";import{a as C,b as D}from"./chunk-Q7L6LLAK.js";var q=()=>[0,1,2],G=(e,t)=>t.type,J=(e,t)=>t.id,K=(e,t)=>t.specId+t.symbol;function L(e,t){e&1&&m(0,"app-pick-project-empty",0)}function U(e,t){e&1&&m(0,"div",7)}function W(e,t){e&1&&f(0,U,1,0,"div",7,F),e&2&&u(O(0,q))}function X(e,t){e&1&&(o(0,"div",5),r(1,"No domain data \u2014 run "),o(2,"code"),r(3,"specship index"),a(),r(4," first."),a())}function Y(e,t){e&1&&(o(0,"app-empty",6)(1,"button",8),m(2,"app-icon",9),r(3," Capture knowledge "),a()()),e&2&&(i(2),l("size",12))}function Z(e,t){if(e&1&&(o(0,"div",16),r(1),a()),e&2){let n=s().$implicit;i(),x(n.body)}}function ee(e,t){if(e&1&&(o(0,"div",24),r(1),a()),e&2){let n=t.$implicit;i(),b("governs ",n.specId," \u2192 ",n.symbol)}}function te(e,t){if(e&1&&(o(0,"div",18),f(1,ee,2,2,"div",24,K),a()),e&2){let n=s().$implicit;i(),u(n.governs)}}function ne(e,t){e&1&&m(0,"app-state-pill",20),e&2&&l("state",t)}function ie(e,t){e&1&&(o(0,"app-pill",4),r(1,"No linked code yet"),a()),e&2&&l("color","var(--text-muted)")("bg","var(--bg-elevated)")}function oe(e,t){if(e&1){let n=E();o(0,"button",25),S("click",function(){h(n);let g=s(5);return w(g.review())}),m(1,"app-icon",26),r(2," Review "),a()}e&2&&(i(),l("size",12))}function ae(e,t){if(e&1&&(o(0,"div",13)(1,"div",14)(2,"div",15),r(3),a(),d(4,Z,2,1,"div",16),o(5,"div",17),r(6),a(),d(7,te,3,0,"div",18),a(),o(8,"div",19),d(9,ne,1,1,"app-state-pill",20)(10,ie,2,2,"app-pill",4),o(11,"div",21),d(12,oe,3,1,"button",22),o(13,"button",23),m(14,"app-icon",9),r(15," Capture "),a()()()()),e&2){let n,c=t.$implicit,g=s(4);i(3),x(c.title),i(),p(c.body?4:-1),i(2),x(c.id),i(),p(c.governs.length?7:-1),i(2),p((n=g.stateOf(c))?9:c.state==="none"&&c.governs.length===0?10:-1,n),i(3),p(g.needsReview(c)?12:-1),i(2),l("size",12)}}function re(e,t){if(e&1&&(o(0,"section",10)(1,"div",11),r(2),o(3,"span",12),r(4),a()(),f(5,ae,16,7,"div",13,J),a()),e&2){let n=t.$implicit;i(2),v("",n.label," "),i(2),x(n.facts.length),i(),u(n.facts)}}function ce(e,t){if(e&1&&f(0,re,7,2,"section",10,G),e&2){let n=s(2);u(n.sections())}}function le(e,t){if(e&1&&(o(0,"div",1)(1,"app-page-head",2),P(2,3),o(3,"app-pill",4),r(4),a(),o(5,"app-pill",4),r(6),a(),M(),a(),d(7,W,2,1)(8,X,5,0,"div",5)(9,Y,4,1,"app-empty",6)(10,ce,2,0),a()),e&2){let n=s();i(3),l("color","var(--success)")("bg","var(--success-soft)"),i(),v("",n.coverage().documented," documented"),i(),l("color","var(--warn)")("bg","var(--warn-soft)"),i(),b("",n.coverage().gaps," gap",n.coverage().gaps===1?"":"s"),i(),p(n.resource.state().loading?7:n.data()?n.isEmpty()?9:10:8)}}var H=[{type:"term",label:"Terms"},{type:"rule",label:"Rules"},{type:"decision",label:"Decisions"},{type:"constraint",label:"Constraints"},{type:"other",label:"Other"}],Q=class e{api=y(R);projects=y(I);router=y(k);resource=z(this.api,()=>`/api/domain${this.projects.projectQuery()}`);data=_(()=>this.resource.state().data);coverage=_(()=>this.data()?.coverage??{documented:0,gaps:0});sections=_(()=>{let t=this.data();return t?H.map(n=>D(C({},n),{facts:t.factsByType[n.type]??[]})).filter(n=>n.facts.length>0):[]});total=_(()=>{let t=this.data();return t?H.reduce((n,c)=>n+(t.factsByType[c.type]?.length??0),0):0});isEmpty=_(()=>{let t=this.resource.state();return!t.loading&&!t.noProject&&t.data!=null&&this.total()===0});stateOf(t){return t.state==="none"?null:t.state}needsReview(t){return t.state==="drifted"}review(){this.router.navigate(["/drift"])}static \u0275fac=function(n){return new(n||e)};static \u0275cmp=T({type:e,selectors:[["app-domain"]],decls:2,vars:1,consts:[["surface","The domain layer"],[1,"page","scroll-y"],["icon","book","title","Domain","sub","Human-confirmed knowledge \u2014 terms, rules, decisions, constraints"],["actions",""],[3,"color","bg"],[1,"empty"],["icon","book","title","No domain knowledge captured yet","body","Document the terms, rules, decisions, and constraints that the code can't tell you. Run /ss-spec domain to capture the first fact."],[1,"skel","card-skel"],["action","","type","button","title","Run /ss-spec domain to capture a domain fact",1,"btn","btn-primary","btn-sm"],["name","plus",3,"size"],[1,"sig","card"],[1,"sig-head"],[1,"n"],[1,"fact"],[1,"fact-main"],[1,"fact-title"],[1,"fact-body"],[1,"fact-id","mono"],[1,"fact-governs"],[1,"fact-side"],[3,"state"],[1,"fact-actions","row","gap-6"],["type","button",1,"btn","btn-secondary","btn-sm"],["type","button","title","Run /ss-spec domain to refine this fact",1,"btn","btn-secondary","btn-sm"],[1,"fact-governs-row","mono"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["name","drift",3,"size"]],template:function(n,c){n&1&&d(0,L,1,0,"app-pick-project-empty",0)(1,le,11,8,"div",1),n&2&&p(c.resource.state().noProject?0:1)},dependencies:[N,A,B,V,j,$],styles:[".page[_ngcontent-%COMP%]{padding:20px 24px 48px}.empty[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;gap:8px;text-align:center;padding:64px 24px;color:var(--text-muted)}.empty[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace);font-size:.92em}.card-skel[_ngcontent-%COMP%]{height:120px;border-radius:12px;margin-bottom:12px}.sig[_ngcontent-%COMP%]{padding:0;margin-bottom:14px;overflow:hidden}.sig-head[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:12px 16px;font-size:13px;font-weight:600;border-bottom:1px solid var(--border, color-mix(in srgb, var(--text) 12%, transparent))}.sig-head[_ngcontent-%COMP%] .n[_ngcontent-%COMP%]{font-size:11px;font-weight:600;color:var(--text-muted);background:var(--bg-elevated, color-mix(in srgb, var(--text) 7%, transparent));border-radius:999px;padding:1px 8px}.fact[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:16px;padding:12px 16px;border-top:1px solid var(--border-subtle, color-mix(in srgb, var(--text) 6%, transparent))}.fact[_ngcontent-%COMP%]:first-of-type{border-top:none}.fact-main[_ngcontent-%COMP%]{min-width:0;flex:1}.fact-title[_ngcontent-%COMP%]{font-size:13px;font-weight:600;color:var(--text)}.fact-body[_ngcontent-%COMP%]{margin-top:3px;font-size:12.5px;line-height:1.5;color:var(--text-secondary, var(--text-muted))}.fact-id[_ngcontent-%COMP%]{margin-top:5px;font-size:11px;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fact-governs[_ngcontent-%COMP%]{margin-top:6px;display:flex;flex-direction:column;gap:2px}.fact-governs-row[_ngcontent-%COMP%]{font-size:11px;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fact-side[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:flex-end;gap:8px;flex:0 0 auto}.fact-actions[_ngcontent-%COMP%]{flex-wrap:wrap;justify-content:flex-end}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono, ui-monospace, monospace)}"],changeDetection:0})};export{Q as Domain};
@@ -1 +1 @@
1
- import{a as d}from"./chunk-3H2EZLZN.js";import{E as n,I as i,R as c,W as o,lb as l}from"./chunk-SYGIPC2P.js";var a="specship.activeProjectSlug",u=class s{api=i(d);destroyRef=i(c);_projects=o([]);_claudeRoot=o(null);_loading=o(!0);_error=o(null);_activeSlug=o(p());projects=this._projects.asReadonly();claudeRoot=this._claudeRoot.asReadonly();loading=this._loading.asReadonly();error=this._error.asReadonly();activeSlug=this._activeSlug.asReadonly();active=l(()=>{let e=this._activeSlug();return e?this._projects().find(t=>t.slug===e)??null:null});closeStream=null;constructor(){this.refresh(),this.subscribe(),this.destroyRef.onDestroy(()=>this.closeStream?.())}async refresh(){this._loading.set(!0),this._error.set(null);try{let e=await this.api.get("/api/projects");this._claudeRoot.set(e.claudeRoot),this._projects.set(e.projects),this.reconcileActive(e.projects)}catch(e){this._error.set(e instanceof Error?e.message:String(e))}finally{this._loading.set(!1)}}projectQuery(e="?"){let t=this._activeSlug();return t?`${e}project=${encodeURIComponent(t)}`:""}setActive(e){this._activeSlug.set(e);try{e?localStorage.setItem(a,e):localStorage.removeItem(a)}catch{}}subscribe(){this.closeStream=this.api.openEventStream("/api/projects/events",(e,t)=>{if(e==="snapshot"){let r=t;this._claudeRoot.set(r.claudeRoot),this._projects.set(r.projects??[]),this.reconcileActive(r.projects??[])}else if(e==="change"){let r=t;this._projects.set(r.list),this.reconcileActive(r.list)}else if(e==="refresh"){let r=t;this._projects.set(r.list)}},e=>{},["snapshot","change","refresh"])}reconcileActive(e){let t=this._activeSlug();t&&(e.find(r=>r.slug===t)||this.setActive(null))}static \u0275fac=function(t){return new(t||s)};static \u0275prov=n({token:s,factory:s.\u0275fac,providedIn:"root"})};function p(){try{return localStorage.getItem(a)}catch{return null}}export{u as a};
1
+ import{a as d}from"./chunk-TWVVIWKO.js";import{E as n,I as i,R as c,W as o,lb as l}from"./chunk-SYGIPC2P.js";var a="specship.activeProjectSlug",u=class s{api=i(d);destroyRef=i(c);_projects=o([]);_claudeRoot=o(null);_loading=o(!0);_error=o(null);_activeSlug=o(p());projects=this._projects.asReadonly();claudeRoot=this._claudeRoot.asReadonly();loading=this._loading.asReadonly();error=this._error.asReadonly();activeSlug=this._activeSlug.asReadonly();active=l(()=>{let e=this._activeSlug();return e?this._projects().find(t=>t.slug===e)??null:null});closeStream=null;constructor(){this.refresh(),this.subscribe(),this.destroyRef.onDestroy(()=>this.closeStream?.())}async refresh(){this._loading.set(!0),this._error.set(null);try{let e=await this.api.get("/api/projects");this._claudeRoot.set(e.claudeRoot),this._projects.set(e.projects),this.reconcileActive(e.projects)}catch(e){this._error.set(e instanceof Error?e.message:String(e))}finally{this._loading.set(!1)}}projectQuery(e="?"){let t=this._activeSlug();return t?`${e}project=${encodeURIComponent(t)}`:""}setActive(e){this._activeSlug.set(e);try{e?localStorage.setItem(a,e):localStorage.removeItem(a)}catch{}}subscribe(){this.closeStream=this.api.openEventStream("/api/projects/events",(e,t)=>{if(e==="snapshot"){let r=t;this._claudeRoot.set(r.claudeRoot),this._projects.set(r.projects??[]),this.reconcileActive(r.projects??[])}else if(e==="change"){let r=t;this._projects.set(r.list),this.reconcileActive(r.list)}else if(e==="refresh"){let r=t;this._projects.set(r.list)}},e=>{},["snapshot","change","refresh"])}reconcileActive(e){let t=this._activeSlug();t&&(e.find(r=>r.slug===t)||this.setActive(null))}static \u0275fac=function(t){return new(t||s)};static \u0275prov=n({token:s,factory:s.\u0275fac,providedIn:"root"})};function p(){try{return localStorage.getItem(a)}catch{return null}}export{u as a};