@specship/specship-win32-arm64 0.11.6 → 0.11.8

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 (67) hide show
  1. package/lib/dist/bin/specship.js +7 -7
  2. package/lib/dist/bin/specship.js.map +1 -1
  3. package/lib/dist/commands/{ss-design-implement.md → specship/design-implement.md} +5 -5
  4. package/lib/dist/commands/{ss-design-loop.md → specship/design-loop.md} +6 -6
  5. package/lib/dist/commands/{ss-spec.md → specship/spec.md} +4 -4
  6. package/lib/dist/index.d.ts +1 -1
  7. package/lib/dist/index.js +1 -1
  8. package/lib/dist/installer/instructions-template.js +3 -3
  9. package/lib/dist/installer/instructions-template.js.map +1 -1
  10. package/lib/dist/installer/targets/claude.d.ts +6 -4
  11. package/lib/dist/installer/targets/claude.d.ts.map +1 -1
  12. package/lib/dist/installer/targets/claude.js +69 -17
  13. package/lib/dist/installer/targets/claude.js.map +1 -1
  14. package/lib/dist/mcp/designer-tools.js +1 -1
  15. package/lib/dist/mcp/designer-tools.js.map +1 -1
  16. package/lib/dist/mcp/spec-tools.js +3 -3
  17. package/lib/dist/mcp/spec-tools.js.map +1 -1
  18. package/lib/dist/resolution/domain-gap-seed.d.ts +1 -1
  19. package/lib/dist/resolution/domain-gap-seed.js +1 -1
  20. package/lib/dist/server/chat/classify.js +28 -8
  21. package/lib/dist/server/routes/chat-answer.js +11 -0
  22. package/lib/dist/server/routes/chat.js +2 -3
  23. package/lib/dist/server/routes/claude.js +2 -3
  24. package/lib/dist/server/routes/events.js +2 -3
  25. package/lib/dist/server/routes/projects.js +2 -3
  26. package/lib/dist/server/routes/sse.js +23 -0
  27. package/lib/dist/server/routes/workflow.js +2 -3
  28. package/lib/dist/web/{chunk-H2TR6BKW.js → chunk-7KWBINA7.js} +1 -1
  29. package/lib/dist/web/{chunk-BZ5SMVXG.js → chunk-7MUNFW56.js} +1 -1
  30. package/lib/dist/web/{chunk-Z23KACD6.js → chunk-AZUUBUEJ.js} +1 -1
  31. package/lib/dist/web/{chunk-BDF4LLKR.js → chunk-CYXQILZI.js} +1 -1
  32. package/lib/dist/web/{chunk-PAO2624Y.js → chunk-DTWIJ3GJ.js} +1 -1
  33. package/lib/dist/web/{chunk-G2FTQVMJ.js → chunk-E27QAKAB.js} +1 -1
  34. package/lib/dist/web/{chunk-YPWBUJH7.js → chunk-EXBUKHH2.js} +1 -1
  35. package/lib/dist/web/{chunk-YVAUYHOB.js → chunk-F5TBUYDH.js} +1 -1
  36. package/lib/dist/web/{chunk-C6I5R6UZ.js → chunk-FC3R7YHR.js} +1 -1
  37. package/lib/dist/web/{chunk-IXQIWN6Z.js → chunk-G7RXFHYO.js} +1 -1
  38. package/lib/dist/web/chunk-H723TYYD.js +2 -0
  39. package/lib/dist/web/chunk-HSJNHNOH.js +6 -0
  40. package/lib/dist/web/{chunk-PBRCKHEQ.js → chunk-JGDK6YKG.js} +1 -1
  41. package/lib/dist/web/{chunk-5CR7TMVN.js → chunk-JPSYO24K.js} +1 -1
  42. package/lib/dist/web/{chunk-FYXVIWM2.js → chunk-K7UD24Z4.js} +1 -1
  43. package/lib/dist/web/chunk-KYSTCHAH.js +1 -0
  44. package/lib/dist/web/{chunk-7ALHQYYG.js → chunk-MNFTHCSJ.js} +1 -1
  45. package/lib/dist/web/{chunk-NY5CBIVU.js → chunk-OTQR5VFM.js} +1 -1
  46. package/lib/dist/web/{chunk-G2MHCJUR.js → chunk-PCW6R7OP.js} +1 -1
  47. package/lib/dist/web/{chunk-EAWW6PQJ.js → chunk-POCVU4VK.js} +1 -1
  48. package/lib/dist/web/chunk-PS6HRYQQ.js +3 -0
  49. package/lib/dist/web/chunk-TWVVIWKO.js +1 -0
  50. package/lib/dist/web/{chunk-HZYJAXHL.js → chunk-U67LRNER.js} +1 -1
  51. package/lib/dist/web/{chunk-KXMWAQNB.js → chunk-USVLLFVR.js} +1 -1
  52. package/lib/dist/web/{chunk-7V4MGZCG.js → chunk-XAUQEKZX.js} +1 -1
  53. package/lib/dist/web/{chunk-D7HQMX7C.js → chunk-YXYPTZ6E.js} +1 -1
  54. package/lib/dist/web/index.html +1 -1
  55. package/lib/dist/web/{main-A6QZ3DLK.js → main-FY3HQ4PX.js} +1 -1
  56. package/lib/dist/workflows/defaults/claude-design-implement.yaml +5 -5
  57. package/lib/dist/workflows/defaults/spec-author.yaml +1 -1
  58. package/lib/node_modules/.package-lock.json +1 -1
  59. package/lib/package.json +1 -1
  60. package/package.json +1 -1
  61. package/lib/dist/web/chunk-3H2EZLZN.js +0 -1
  62. package/lib/dist/web/chunk-6FZTSHJS.js +0 -3
  63. package/lib/dist/web/chunk-7ULUC3DC.js +0 -2
  64. package/lib/dist/web/chunk-QJSQ3ORB.js +0 -6
  65. package/lib/dist/web/chunk-U6CWVOZO.js +0 -1
  66. /package/lib/dist/commands/{ss-check.md → specship/check.md} +0 -0
  67. /package/lib/dist/commands/{ss-explore.md → specship/explore.md} +0 -0
@@ -1 +1 @@
1
- import{a as N,b as D}from"./chunk-2IVSOVQZ.js";import{a as z}from"./chunk-5NTGUSXJ.js";import{a as T}from"./chunk-IOB4JJT4.js";import{a as M}from"./chunk-3H2EZLZN.js";import{Aa as a,Ga as C,I as v,Ia as c,Ka as P,M as S,N as E,Ta as u,Ua as g,Va as n,W as f,Wa as b,ea as o,ka as w,qa as m,ra as x,sa as y,ua as k,va as _,wa as h,xa as s,ya as e,za as t,zb as O}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var A=(r,l)=>l.model;function B(r,l){r&1&&n(0," Enabled \u2014 popups fire while the dashboard is open or backgrounded ")}function j(r,l){r&1&&n(0," Blocked \u2014 re-enable notifications for this site in your browser settings ")}function V(r,l){r&1&&n(0," Not supported in this browser ")}function $(r,l){r&1&&n(0," Get a desktop popup when a run needs approval, finishes, or drift appears ")}function F(r,l){if(r&1){let p=C();e(0,"button",50),c("click",function(){S(p);let d=P();return E(d.enableNotifications())}),n(1,"Enable"),t()}}function L(r,l){r&1&&(e(0,"span",24),n(1,"\u25CF On"),t())}function H(r,l){r&1&&(e(0,"span",25),n(1,"\u2014"),t())}function W(r,l){if(r&1&&(e(0,"div",34)(1,"span",51),n(2),t(),a(3,"input",52)(4,"input",52),t()),r&2){let p=l.$implicit;o(2),b(p.model),o(),s("value",p.input),o(),s("value",p.output)}}function q(r,l){if(r&1&&(e(0,"option"),n(1),t()),r&2){let p=l.$implicit;o(),b(p)}}var I=class r{api=v(M);theme=v(N);notify=v(D);setTheme(l){this.theme.setPref(l)}enableNotifications(){this.notify.requestPermission()}ingest=f(!0);watch=f(!0);motion=f(!1);toggleIngest(){this.ingest.update(l=>!l)}toggleWatch(){this.watch.update(l=>!l)}toggleMotion(){this.motion.update(l=>!l)}replayIntro(){try{sessionStorage.removeItem("specship-booted")}catch{}window.location.reload()}themeOptions=[{value:"dark",label:"Dark"},{value:"light",label:"Light"},{value:"system",label:"System"}];editorOptions=["code (VS Code)","subl (Sublime)","cursor","nvim"];pricing=[{model:"claude-opus-4",input:"15.00",output:"75.00"},{model:"claude-sonnet-4",input:"3.00",output:"15.00"},{model:"claude-haiku-4",input:"0.80",output:"4.00"}];static \u0275fac=function(p){return new(p||r)};static \u0275cmp=w({type:r,selectors:[["app-settings"]],decls:183,vars:42,consts:[[1,"settings-page","scroll-y"],["icon","settings","title","Settings"],[1,"settings-body"],[1,"card","card-pad","section-card"],[1,"section-head","row","gap-8"],["name","folder",2,"color","var(--accent)",3,"size"],[1,"section-title"],[1,"field"],[1,"field-label"],["value","~/dev/specship","readonly","",1,"input","mono",2,"width","100%"],[1,"field-hint"],["value","specs/",1,"input","mono",2,"width","100%"],["value","node_modules/, dist/, .cg/wt/",1,"input","mono",2,"width","100%"],["name","sessions",2,"color","var(--accent)",3,"size"],["value","~/.claude/projects/",1,"input","mono",2,"width","100%"],[1,"toggle-row","row"],[1,"grow"],[1,"toggle-label"],[1,"muted",2,"font-size","11px"],["type","button","aria-label","Enable transcript ingest",1,"toggle-btn",3,"click"],[1,"toggle-thumb"],["type","button","aria-label","Real-time watch",1,"toggle-btn",3,"click"],["name","zap",2,"color","var(--accent)",3,"size"],["type","button",2,"height","30px","padding","0 12px","border-radius","6px","border","1px solid var(--accent)","background","var(--accent)","color","#fff","font-size","12px","cursor","pointer"],[2,"font-size","12px","color","var(--accent)"],[1,"muted",2,"font-size","12px"],["type","button","aria-label","Notify when a run needs approval",1,"toggle-btn",3,"click"],["type","button","aria-label","Notify when a run completes or fails",1,"toggle-btn",3,"click"],["type","button","aria-label","Notify when drift is detected",1,"toggle-btn",3,"click"],["type","button","aria-label","Notify when a new improvement is found",1,"toggle-btn",3,"click"],["name","dollar",2,"color","var(--accent)",3,"size"],[1,"muted",2,"font-size","11.5px","margin-bottom","12px"],[1,"pricing-header","row"],[1,"price-col"],[1,"pricing-row","row"],["name","sparkles",2,"color","var(--accent)",3,"size"],[3,"change","value","options"],["type","button","aria-label","Reduced motion",1,"toggle-btn",3,"click"],[1,"toggle-row","row",2,"border-top","1px solid var(--border-subtle)","margin-top","4px","padding-top","8px"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["name","refresh",3,"size"],["name","reveal",2,"color","var(--accent)",3,"size"],[1,"input",2,"width","200px"],["name","graph",2,"color","var(--accent)",3,"size"],[1,"about-grid"],[1,"about-row","row"],[1,"mono",2,"font-size","12px"],[1,"mono",2,"font-size","12px","color","var(--success)"],[1,"status-dot",2,"background","var(--success)"],[2,"height","30px"],["type","button",2,"height","30px","padding","0 12px","border-radius","6px","border","1px solid var(--accent)","background","var(--accent)","color","#fff","font-size","12px","cursor","pointer",3,"click"],[1,"mono","grow",2,"font-size","12px"],[1,"input","mono","tabular","price-input",3,"value"]],template:function(p,i){if(p&1&&(e(0,"div",0),a(1,"app-page-head",1),e(2,"div",2)(3,"section",3)(4,"div",4),a(5,"app-icon",5),e(6,"span",6),n(7,"Project"),t()(),e(8,"div",7)(9,"label",8),n(10,"Project root"),t(),a(11,"input",9),e(12,"div",10),n(13,"Set at app open \xB7 read-only"),t()(),e(14,"div",7)(15,"label",8),n(16,"Spec roots"),t(),a(17,"input",11),t(),e(18,"div",7)(19,"label",8),n(20,"Ignore patterns"),t(),a(21,"input",12),t()(),e(22,"section",3)(23,"div",4),a(24,"app-icon",13),e(25,"span",6),n(26,"Claude Code"),t()(),e(27,"div",7)(28,"label",8),n(29,"Transcripts path"),t(),a(30,"input",14),e(31,"div",10),n(32,"Auto-detected \xB7 overridable"),t()(),e(33,"div",15)(34,"div",16)(35,"div",17),n(36,"Enable transcript ingest"),t(),e(37,"div",18),n(38,"Read JSONL transcripts for analytics"),t()(),e(39,"button",19),c("click",function(){return i.toggleIngest()}),a(40,"span",20),t()(),e(41,"div",15)(42,"div",16)(43,"div",17),n(44,"Real-time watch"),t(),e(45,"div",18),n(46,"Tail new transcript lines as they're written"),t()(),e(47,"button",21),c("click",function(){return i.toggleWatch()}),a(48,"span",20),t()()(),e(49,"section",3)(50,"div",4),a(51,"app-icon",22),e(52,"span",6),n(53,"Notifications"),t()(),e(54,"div",15)(55,"div",16)(56,"div",17),n(57,"Desktop notifications"),t(),e(58,"div",18),x(59,B,1,0)(60,j,1,0)(61,V,1,0)(62,$,1,0),t()(),x(63,F,2,0,"button",23)(64,L,2,0,"span",24)(65,H,2,0,"span",25),t(),e(66,"div",15)(67,"div",16)(68,"div",17),n(69,"Run needs approval"),t(),e(70,"div",18),n(71,"A workflow run paused at an approval gate"),t()(),e(72,"button",26),c("click",function(){return i.notify.toggle("approval")}),a(73,"span",20),t()(),e(74,"div",15)(75,"div",16)(76,"div",17),n(77,"Run completed or failed"),t(),e(78,"div",18),n(79,"A workflow run finished or errored"),t()(),e(80,"button",27),c("click",function(){return i.notify.toggle("runDone")}),a(81,"span",20),t()(),e(82,"div",15)(83,"div",16)(84,"div",17),n(85,"Drift detected"),t(),e(86,"div",18),n(87,"Spec \u2192 code drift appeared"),t()(),e(88,"button",28),c("click",function(){return i.notify.toggle("drift")}),a(89,"span",20),t()(),e(90,"div",15)(91,"div",16)(92,"div",17),n(93,"New improvement"),t(),e(94,"div",18),n(95,"A new high-severity self-improvement proposal was found"),t()(),e(96,"button",29),c("click",function(){return i.notify.toggle("reflect")}),a(97,"span",20),t()()(),e(98,"section",3)(99,"div",4),a(100,"app-icon",30),e(101,"span",6),n(102,"Pricing table"),t()(),e(103,"div",31),n(104,"Per-million-token prices. Bump these when Anthropic publishes new tiers."),t(),e(105,"div",32)(106,"span",16),n(107,"Model"),t(),e(108,"span",33),n(109,"Input $/M"),t(),e(110,"span",33),n(111,"Output $/M"),t()(),_(112,W,5,3,"div",34,A),t(),e(114,"section",3)(115,"div",4),a(116,"app-icon",35),e(117,"span",6),n(118,"Appearance"),t()(),e(119,"div",7)(120,"label",8),n(121,"Theme"),t(),e(122,"app-segmented",36),c("change",function(R){return i.setTheme(R)}),t(),e(123,"div",10),n(124,"Now fully supported \u2014 dark, light, or follow your OS"),t()(),e(125,"div",15)(126,"div",16)(127,"div",17),n(128,"Reduced motion"),t(),e(129,"div",18),n(130,"Honor OS preference \u2014 instant transitions"),t()(),e(131,"button",37),c("click",function(){return i.toggleMotion()}),a(132,"span",20),t()(),e(133,"div",38)(134,"div",16)(135,"div",17),n(136,"Boot animation"),t(),e(137,"div",18),n(138,"The graph-assembly splash on app launch"),t()(),e(139,"button",39),c("click",function(){return i.replayIntro()}),a(140,"app-icon",40),n(141," Replay intro "),t()()(),e(142,"section",3)(143,"div",4),a(144,"app-icon",41),e(145,"span",6),n(146,"Editor"),t()(),e(147,"div",7)(148,"label",8),n(149,"Open files with"),t(),e(150,"select",42),_(151,q,2,1,"option",null,k),t(),e(153,"div",10),n(154,"Detected via code / subl / etc."),t()()(),e(155,"section",3)(156,"div",4),a(157,"app-icon",43),e(158,"span",6),n(159,"About"),t()(),e(160,"div",44)(161,"div",45)(162,"span",25),n(163,"Version"),t(),e(164,"span",46),n(165,"0.4.0"),t()(),e(166,"div",45)(167,"span",25),n(168,"MCP server"),t(),e(169,"span",47),a(170,"span",48),n(171,"running "),t()(),e(172,"div",45)(173,"span",25),n(174,"Backend"),t(),e(175,"span",46),n(176),t()(),e(177,"div",45)(178,"span",25),n(179,"Log path"),t(),e(180,"span",46),n(181,"~/.cg/logs/desktop.log"),t()()()(),a(182,"div",49),t()()),p&2){let d;o(5),s("size",15),o(19),s("size",15),o(15),g("on",i.ingest()),m("aria-pressed",i.ingest()),o(8),g("on",i.watch()),m("aria-pressed",i.watch()),o(4),s("size",15),o(8),y((d=i.notify.permission())==="granted"?59:d==="denied"?60:d==="unsupported"?61:62),o(4),y(i.notify.permission()==="default"?63:i.notify.permission()==="granted"?64:65),o(3),u("opacity",i.notify.granted()?"1":"0.5"),o(6),g("on",i.notify.enabled("approval")),m("aria-pressed",i.notify.enabled("approval")),o(2),u("opacity",i.notify.granted()?"1":"0.5"),o(6),g("on",i.notify.enabled("runDone")),m("aria-pressed",i.notify.enabled("runDone")),o(2),u("opacity",i.notify.granted()?"1":"0.5"),o(6),g("on",i.notify.enabled("drift")),m("aria-pressed",i.notify.enabled("drift")),o(2),u("opacity",i.notify.granted()?"1":"0.5"),o(6),g("on",i.notify.enabled("reflect")),m("aria-pressed",i.notify.enabled("reflect")),o(4),s("size",15),o(12),h(i.pricing),o(4),s("size",15),o(6),s("value",i.theme.pref())("options",i.themeOptions),o(9),g("on",i.motion()),m("aria-pressed",i.motion()),o(9),s("size",13),o(4),s("size",15),o(7),h(i.editorOptions),o(6),s("size",15),o(19),b(i.api.isConfigured?i.api.apiBase:"not configured")}},dependencies:[O,z,T],styles:["[_nghost-%COMP%]{display:flex;flex:1;min-height:0}.settings-page[_ngcontent-%COMP%]{flex:1;padding:18px;overflow-y:auto}.settings-body[_ngcontent-%COMP%]{max-width:720px}.section-card[_ngcontent-%COMP%]{margin-bottom:14px}.section-head[_ngcontent-%COMP%]{align-items:center;margin-bottom:14px;padding-bottom:12px;border-bottom:1px solid var(--border-subtle)}.section-title[_ngcontent-%COMP%]{font-weight:600;font-size:13.5px}.field[_ngcontent-%COMP%]{margin-bottom:16px}.field-label[_ngcontent-%COMP%]{display:block;font-size:12.5px;font-weight:500;margin-bottom:6px;color:var(--text-primary)}.field-hint[_ngcontent-%COMP%]{color:var(--text-muted);font-size:11px;margin-top:5px}.toggle-row[_ngcontent-%COMP%]{align-items:center;padding:8px 0}.toggle-label[_ngcontent-%COMP%]{font-size:12.5px;font-weight:500}.toggle-btn[_ngcontent-%COMP%]{width:36px;height:20px;border-radius:999px;border:none;cursor:pointer;padding:2px;background:var(--bg-elevated);display:flex;justify-content:flex-start;align-items:center;transition:background .12s;flex-shrink:0}.toggle-btn.on[_ngcontent-%COMP%]{background:var(--accent);justify-content:flex-end}.toggle-btn[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.toggle-thumb[_ngcontent-%COMP%]{width:16px;height:16px;border-radius:50%;background:#fff;flex-shrink:0}.pricing-header[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;font-weight:600;margin-bottom:6px}.pricing-row[_ngcontent-%COMP%]{padding:6px 0;border-top:1px solid var(--border-subtle);align-items:center;gap:10px}.price-col[_ngcontent-%COMP%]{width:110px;text-align:right}.price-input[_ngcontent-%COMP%]{width:100px;text-align:right;padding:4px 8px}.about-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:10px 20px}.about-row[_ngcontent-%COMP%]{justify-content:space-between;padding:5px 0;border-bottom:1px solid var(--border-subtle)}.status-dot[_ngcontent-%COMP%]{display:inline-block;width:6px;height:6px;border-radius:50%;margin-right:6px;vertical-align:middle}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono)}.grow[_ngcontent-%COMP%]{flex:1}"],changeDetection:0})};export{I as Settings};
1
+ import{a as N,b as D}from"./chunk-2IVSOVQZ.js";import{a as z}from"./chunk-5NTGUSXJ.js";import{a as T}from"./chunk-IOB4JJT4.js";import{a as M}from"./chunk-TWVVIWKO.js";import{Aa as a,Ga as C,I as v,Ia as c,Ka as P,M as S,N as E,Ta as u,Ua as g,Va as n,W as f,Wa as b,ea as o,ka as w,qa as m,ra as x,sa as y,ua as k,va as _,wa as h,xa as s,ya as e,za as t,zb as O}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var A=(r,l)=>l.model;function B(r,l){r&1&&n(0," Enabled \u2014 popups fire while the dashboard is open or backgrounded ")}function j(r,l){r&1&&n(0," Blocked \u2014 re-enable notifications for this site in your browser settings ")}function V(r,l){r&1&&n(0," Not supported in this browser ")}function $(r,l){r&1&&n(0," Get a desktop popup when a run needs approval, finishes, or drift appears ")}function F(r,l){if(r&1){let p=C();e(0,"button",50),c("click",function(){S(p);let d=P();return E(d.enableNotifications())}),n(1,"Enable"),t()}}function L(r,l){r&1&&(e(0,"span",24),n(1,"\u25CF On"),t())}function H(r,l){r&1&&(e(0,"span",25),n(1,"\u2014"),t())}function W(r,l){if(r&1&&(e(0,"div",34)(1,"span",51),n(2),t(),a(3,"input",52)(4,"input",52),t()),r&2){let p=l.$implicit;o(2),b(p.model),o(),s("value",p.input),o(),s("value",p.output)}}function q(r,l){if(r&1&&(e(0,"option"),n(1),t()),r&2){let p=l.$implicit;o(),b(p)}}var I=class r{api=v(M);theme=v(N);notify=v(D);setTheme(l){this.theme.setPref(l)}enableNotifications(){this.notify.requestPermission()}ingest=f(!0);watch=f(!0);motion=f(!1);toggleIngest(){this.ingest.update(l=>!l)}toggleWatch(){this.watch.update(l=>!l)}toggleMotion(){this.motion.update(l=>!l)}replayIntro(){try{sessionStorage.removeItem("specship-booted")}catch{}window.location.reload()}themeOptions=[{value:"dark",label:"Dark"},{value:"light",label:"Light"},{value:"system",label:"System"}];editorOptions=["code (VS Code)","subl (Sublime)","cursor","nvim"];pricing=[{model:"claude-opus-4",input:"15.00",output:"75.00"},{model:"claude-sonnet-4",input:"3.00",output:"15.00"},{model:"claude-haiku-4",input:"0.80",output:"4.00"}];static \u0275fac=function(p){return new(p||r)};static \u0275cmp=w({type:r,selectors:[["app-settings"]],decls:183,vars:42,consts:[[1,"settings-page","scroll-y"],["icon","settings","title","Settings"],[1,"settings-body"],[1,"card","card-pad","section-card"],[1,"section-head","row","gap-8"],["name","folder",2,"color","var(--accent)",3,"size"],[1,"section-title"],[1,"field"],[1,"field-label"],["value","~/dev/specship","readonly","",1,"input","mono",2,"width","100%"],[1,"field-hint"],["value","specs/",1,"input","mono",2,"width","100%"],["value","node_modules/, dist/, .cg/wt/",1,"input","mono",2,"width","100%"],["name","sessions",2,"color","var(--accent)",3,"size"],["value","~/.claude/projects/",1,"input","mono",2,"width","100%"],[1,"toggle-row","row"],[1,"grow"],[1,"toggle-label"],[1,"muted",2,"font-size","11px"],["type","button","aria-label","Enable transcript ingest",1,"toggle-btn",3,"click"],[1,"toggle-thumb"],["type","button","aria-label","Real-time watch",1,"toggle-btn",3,"click"],["name","zap",2,"color","var(--accent)",3,"size"],["type","button",2,"height","30px","padding","0 12px","border-radius","6px","border","1px solid var(--accent)","background","var(--accent)","color","#fff","font-size","12px","cursor","pointer"],[2,"font-size","12px","color","var(--accent)"],[1,"muted",2,"font-size","12px"],["type","button","aria-label","Notify when a run needs approval",1,"toggle-btn",3,"click"],["type","button","aria-label","Notify when a run completes or fails",1,"toggle-btn",3,"click"],["type","button","aria-label","Notify when drift is detected",1,"toggle-btn",3,"click"],["type","button","aria-label","Notify when a new improvement is found",1,"toggle-btn",3,"click"],["name","dollar",2,"color","var(--accent)",3,"size"],[1,"muted",2,"font-size","11.5px","margin-bottom","12px"],[1,"pricing-header","row"],[1,"price-col"],[1,"pricing-row","row"],["name","sparkles",2,"color","var(--accent)",3,"size"],[3,"change","value","options"],["type","button","aria-label","Reduced motion",1,"toggle-btn",3,"click"],[1,"toggle-row","row",2,"border-top","1px solid var(--border-subtle)","margin-top","4px","padding-top","8px"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["name","refresh",3,"size"],["name","reveal",2,"color","var(--accent)",3,"size"],[1,"input",2,"width","200px"],["name","graph",2,"color","var(--accent)",3,"size"],[1,"about-grid"],[1,"about-row","row"],[1,"mono",2,"font-size","12px"],[1,"mono",2,"font-size","12px","color","var(--success)"],[1,"status-dot",2,"background","var(--success)"],[2,"height","30px"],["type","button",2,"height","30px","padding","0 12px","border-radius","6px","border","1px solid var(--accent)","background","var(--accent)","color","#fff","font-size","12px","cursor","pointer",3,"click"],[1,"mono","grow",2,"font-size","12px"],[1,"input","mono","tabular","price-input",3,"value"]],template:function(p,i){if(p&1&&(e(0,"div",0),a(1,"app-page-head",1),e(2,"div",2)(3,"section",3)(4,"div",4),a(5,"app-icon",5),e(6,"span",6),n(7,"Project"),t()(),e(8,"div",7)(9,"label",8),n(10,"Project root"),t(),a(11,"input",9),e(12,"div",10),n(13,"Set at app open \xB7 read-only"),t()(),e(14,"div",7)(15,"label",8),n(16,"Spec roots"),t(),a(17,"input",11),t(),e(18,"div",7)(19,"label",8),n(20,"Ignore patterns"),t(),a(21,"input",12),t()(),e(22,"section",3)(23,"div",4),a(24,"app-icon",13),e(25,"span",6),n(26,"Claude Code"),t()(),e(27,"div",7)(28,"label",8),n(29,"Transcripts path"),t(),a(30,"input",14),e(31,"div",10),n(32,"Auto-detected \xB7 overridable"),t()(),e(33,"div",15)(34,"div",16)(35,"div",17),n(36,"Enable transcript ingest"),t(),e(37,"div",18),n(38,"Read JSONL transcripts for analytics"),t()(),e(39,"button",19),c("click",function(){return i.toggleIngest()}),a(40,"span",20),t()(),e(41,"div",15)(42,"div",16)(43,"div",17),n(44,"Real-time watch"),t(),e(45,"div",18),n(46,"Tail new transcript lines as they're written"),t()(),e(47,"button",21),c("click",function(){return i.toggleWatch()}),a(48,"span",20),t()()(),e(49,"section",3)(50,"div",4),a(51,"app-icon",22),e(52,"span",6),n(53,"Notifications"),t()(),e(54,"div",15)(55,"div",16)(56,"div",17),n(57,"Desktop notifications"),t(),e(58,"div",18),x(59,B,1,0)(60,j,1,0)(61,V,1,0)(62,$,1,0),t()(),x(63,F,2,0,"button",23)(64,L,2,0,"span",24)(65,H,2,0,"span",25),t(),e(66,"div",15)(67,"div",16)(68,"div",17),n(69,"Run needs approval"),t(),e(70,"div",18),n(71,"A workflow run paused at an approval gate"),t()(),e(72,"button",26),c("click",function(){return i.notify.toggle("approval")}),a(73,"span",20),t()(),e(74,"div",15)(75,"div",16)(76,"div",17),n(77,"Run completed or failed"),t(),e(78,"div",18),n(79,"A workflow run finished or errored"),t()(),e(80,"button",27),c("click",function(){return i.notify.toggle("runDone")}),a(81,"span",20),t()(),e(82,"div",15)(83,"div",16)(84,"div",17),n(85,"Drift detected"),t(),e(86,"div",18),n(87,"Spec \u2192 code drift appeared"),t()(),e(88,"button",28),c("click",function(){return i.notify.toggle("drift")}),a(89,"span",20),t()(),e(90,"div",15)(91,"div",16)(92,"div",17),n(93,"New improvement"),t(),e(94,"div",18),n(95,"A new high-severity self-improvement proposal was found"),t()(),e(96,"button",29),c("click",function(){return i.notify.toggle("reflect")}),a(97,"span",20),t()()(),e(98,"section",3)(99,"div",4),a(100,"app-icon",30),e(101,"span",6),n(102,"Pricing table"),t()(),e(103,"div",31),n(104,"Per-million-token prices. Bump these when Anthropic publishes new tiers."),t(),e(105,"div",32)(106,"span",16),n(107,"Model"),t(),e(108,"span",33),n(109,"Input $/M"),t(),e(110,"span",33),n(111,"Output $/M"),t()(),_(112,W,5,3,"div",34,A),t(),e(114,"section",3)(115,"div",4),a(116,"app-icon",35),e(117,"span",6),n(118,"Appearance"),t()(),e(119,"div",7)(120,"label",8),n(121,"Theme"),t(),e(122,"app-segmented",36),c("change",function(R){return i.setTheme(R)}),t(),e(123,"div",10),n(124,"Now fully supported \u2014 dark, light, or follow your OS"),t()(),e(125,"div",15)(126,"div",16)(127,"div",17),n(128,"Reduced motion"),t(),e(129,"div",18),n(130,"Honor OS preference \u2014 instant transitions"),t()(),e(131,"button",37),c("click",function(){return i.toggleMotion()}),a(132,"span",20),t()(),e(133,"div",38)(134,"div",16)(135,"div",17),n(136,"Boot animation"),t(),e(137,"div",18),n(138,"The graph-assembly splash on app launch"),t()(),e(139,"button",39),c("click",function(){return i.replayIntro()}),a(140,"app-icon",40),n(141," Replay intro "),t()()(),e(142,"section",3)(143,"div",4),a(144,"app-icon",41),e(145,"span",6),n(146,"Editor"),t()(),e(147,"div",7)(148,"label",8),n(149,"Open files with"),t(),e(150,"select",42),_(151,q,2,1,"option",null,k),t(),e(153,"div",10),n(154,"Detected via code / subl / etc."),t()()(),e(155,"section",3)(156,"div",4),a(157,"app-icon",43),e(158,"span",6),n(159,"About"),t()(),e(160,"div",44)(161,"div",45)(162,"span",25),n(163,"Version"),t(),e(164,"span",46),n(165,"0.4.0"),t()(),e(166,"div",45)(167,"span",25),n(168,"MCP server"),t(),e(169,"span",47),a(170,"span",48),n(171,"running "),t()(),e(172,"div",45)(173,"span",25),n(174,"Backend"),t(),e(175,"span",46),n(176),t()(),e(177,"div",45)(178,"span",25),n(179,"Log path"),t(),e(180,"span",46),n(181,"~/.cg/logs/desktop.log"),t()()()(),a(182,"div",49),t()()),p&2){let d;o(5),s("size",15),o(19),s("size",15),o(15),g("on",i.ingest()),m("aria-pressed",i.ingest()),o(8),g("on",i.watch()),m("aria-pressed",i.watch()),o(4),s("size",15),o(8),y((d=i.notify.permission())==="granted"?59:d==="denied"?60:d==="unsupported"?61:62),o(4),y(i.notify.permission()==="default"?63:i.notify.permission()==="granted"?64:65),o(3),u("opacity",i.notify.granted()?"1":"0.5"),o(6),g("on",i.notify.enabled("approval")),m("aria-pressed",i.notify.enabled("approval")),o(2),u("opacity",i.notify.granted()?"1":"0.5"),o(6),g("on",i.notify.enabled("runDone")),m("aria-pressed",i.notify.enabled("runDone")),o(2),u("opacity",i.notify.granted()?"1":"0.5"),o(6),g("on",i.notify.enabled("drift")),m("aria-pressed",i.notify.enabled("drift")),o(2),u("opacity",i.notify.granted()?"1":"0.5"),o(6),g("on",i.notify.enabled("reflect")),m("aria-pressed",i.notify.enabled("reflect")),o(4),s("size",15),o(12),h(i.pricing),o(4),s("size",15),o(6),s("value",i.theme.pref())("options",i.themeOptions),o(9),g("on",i.motion()),m("aria-pressed",i.motion()),o(9),s("size",13),o(4),s("size",15),o(7),h(i.editorOptions),o(6),s("size",15),o(19),b(i.api.isConfigured?i.api.apiBase:"not configured")}},dependencies:[O,z,T],styles:["[_nghost-%COMP%]{display:flex;flex:1;min-height:0}.settings-page[_ngcontent-%COMP%]{flex:1;padding:18px;overflow-y:auto}.settings-body[_ngcontent-%COMP%]{max-width:720px}.section-card[_ngcontent-%COMP%]{margin-bottom:14px}.section-head[_ngcontent-%COMP%]{align-items:center;margin-bottom:14px;padding-bottom:12px;border-bottom:1px solid var(--border-subtle)}.section-title[_ngcontent-%COMP%]{font-weight:600;font-size:13.5px}.field[_ngcontent-%COMP%]{margin-bottom:16px}.field-label[_ngcontent-%COMP%]{display:block;font-size:12.5px;font-weight:500;margin-bottom:6px;color:var(--text-primary)}.field-hint[_ngcontent-%COMP%]{color:var(--text-muted);font-size:11px;margin-top:5px}.toggle-row[_ngcontent-%COMP%]{align-items:center;padding:8px 0}.toggle-label[_ngcontent-%COMP%]{font-size:12.5px;font-weight:500}.toggle-btn[_ngcontent-%COMP%]{width:36px;height:20px;border-radius:999px;border:none;cursor:pointer;padding:2px;background:var(--bg-elevated);display:flex;justify-content:flex-start;align-items:center;transition:background .12s;flex-shrink:0}.toggle-btn.on[_ngcontent-%COMP%]{background:var(--accent);justify-content:flex-end}.toggle-btn[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.toggle-thumb[_ngcontent-%COMP%]{width:16px;height:16px;border-radius:50%;background:#fff;flex-shrink:0}.pricing-header[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;font-weight:600;margin-bottom:6px}.pricing-row[_ngcontent-%COMP%]{padding:6px 0;border-top:1px solid var(--border-subtle);align-items:center;gap:10px}.price-col[_ngcontent-%COMP%]{width:110px;text-align:right}.price-input[_ngcontent-%COMP%]{width:100px;text-align:right;padding:4px 8px}.about-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:10px 20px}.about-row[_ngcontent-%COMP%]{justify-content:space-between;padding:5px 0;border-bottom:1px solid var(--border-subtle)}.status-dot[_ngcontent-%COMP%]{display:inline-block;width:6px;height:6px;border-radius:50%;margin-right:6px;vertical-align:middle}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono)}.grow[_ngcontent-%COMP%]{flex:1}"],changeDetection:0})};export{I as Settings};
@@ -1,2 +1,2 @@
1
- import{a as X}from"./chunk-V74ZPP4B.js";import{a as L,b as J,c as Q}from"./chunk-7656MA24.js";import{a as G}from"./chunk-P62EJGSF.js";import{a as W}from"./chunk-5NTGUSXJ.js";import{a as q}from"./chunk-IOB4JJT4.js";import{c as T}from"./chunk-PAO2624Y.js";import"./chunk-PBRCKHEQ.js";import{a as K}from"./chunk-3H2EZLZN.js";import{Aa as p,Ea as P,Fa as N,Ga as E,I as H,Ia as w,Ka as c,M as C,N as S,Ta as k,Ua as R,Va as o,W as M,Wa as u,Xa as v,Ya as z,bb as f,db as O,ea as a,fb as $,gb as V,hb as j,ka as F,lb as x,ra as _,sa as h,ta as I,va as b,vb as A,wa as y,xa as m,ya as i,za as n,zb as U}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var te=()=>({value:"today",label:"Today"}),ne=()=>({value:"week",label:"This week"}),ie=()=>({value:"month",label:"This month"}),ae=()=>({value:"all",label:"All time"}),oe=(r,e,t,l)=>[r,e,t,l],le=()=>({value:"calls",label:"Calls"}),re=()=>({value:"tokens",label:"Tokens"}),de=(r,e)=>[r,e],se=()=>[],Z=(r,e)=>e.name,ee=(r,e)=>e.session_id;function pe(r,e){r&1&&(i(0,"div",23),o(1,"No file-targeted tool calls in this window."),n())}function me(r,e){if(r&1){let t=E();i(0,"app-treemap",45),w("pick",function(s){C(t);let d=c();return S(d.openFile(s))}),n(),i(1,"div",46)(2,"span",47),o(3,"tokens / call"),n(),p(4,"div",48),i(5,"span",49),o(6,"efficient \u2192 wasteful"),n(),p(7,"div",22),i(8,"span",47),o(9,"click a tile to drill in"),n()()}if(r&2){let t,l=c();m("items",l.treemapItems())("height",268)("selKey",((t=l.drill())==null?null:t.kind)==="file"?l.drill().key:null)}}function ce(r,e){if(r&1){let t=E();i(0,"button",50),w("click",function(){let s=C(t).$implicit,d=c();return S(d.openToolByName(s.name))}),i(1,"span",51),o(2),n(),i(3,"div",52),p(4,"div",53),n(),i(5,"span",54),o(6),n(),i(7,"span",55),o(8),n(),i(9,"span",56),o(10),n(),p(11,"app-icon",57),n()}if(r&2){let t,l,s=e.$implicit,d=c();R("sel",((t=d.drill())==null?null:t.kind)==="tool"&&d.drill().key===s.name),a(),k("color",((l=d.drill())==null?null:l.kind)==="tool"&&d.drill().key===s.name?"var(--accent)":"var(--text-secondary)"),a(),u(s.name),a(2),k("width",s.resultBytes/d.maxToolTokens()*100,"%")("background",d.effColor(s.resultBytes/d.Math.max(1,s.calls))),a(2),v("\xD7",s.calls),a(),k("color",d.effColor(s.resultBytes/d.Math.max(1,s.calls))),a(),v("",d.fmtTokens(d.Math.round(s.resultBytes/d.Math.max(1,s.calls))),"/call"),a(2),u(d.fmtTokens(s.resultBytes)),a(),m("size",12)}}function ue(r,e){r&1&&(i(0,"div",23),o(1,"No Task tool calls \u2014 no subagents dispatched."),n())}function xe(r,e){if(r&1){let t=E();i(0,"app-h-bars",58),w("itemClick",function(s){C(t);let d=c();return S(d.openSubagent(s.name))}),n()}if(r&2){let t,l=c();m("items",l.subagentByName())("fmt",l.fmtTokens)("selectedKey",((t=l.drill())==null?null:t.kind)==="subagent"?l.drill().key:null)}}function ge(r,e){r&1&&(i(0,"div",65),o(1,"Loading\u2026"),n())}function ve(r,e){if(r&1&&(i(0,"div",73)(1,"span",78),o(2),n(),i(3,"div",22),p(4,"app-bar",79),n(),i(5,"span",80),o(6),n(),i(7,"span",81),o(8),n()()),r&2){let t=e.$implicit,l=c(),s=c(2);a(2),u(t.name),a(2),m("frac",t.bytes/s.Math.max(1,l.byTool[0].bytes))("color",t.bytes>4e4?"var(--error)":t.bytes>12e3?"var(--warn)":"var(--node-code)"),a(2),v("\xD7",t.calls),a(2),u(s.fmtTokens(t.bytes))}}function _e(r,e){if(r&1&&(i(0,"div",75)(1,"span",82),o(2),n(),i(3,"span",83),o(4),n(),p(5,"app-icon",84),n()),r&2){let t,l=e.$implicit,s=c(3);a(2),u(s.shortId(l.session_id)),a(2),z(" ",(l.project_path==null||(t=l.project_path.split("/"))==null?null:t.pop())||""," \xB7 ",s.timeAgo(l.lastTs)," "),a(),m("size",12)}}function he(r,e){if(r&1&&(i(0,"div",66)(1,"div",67)(2,"div")(3,"div",47),o(4,"Tool calls"),n(),i(5,"div",68),o(6),n()(),i(7,"div",22)(8,"div",69),o(9,"7-day trend"),n(),p(10,"app-sparkline",70),n()(),i(11,"div",71),o(12,"Tool breakdown"),n(),i(13,"div",72),b(14,ve,9,5,"div",73,Z),n(),i(16,"div",71),o(17),n(),i(18,"div",74),b(19,_e,6,4,"div",75,ee),n(),i(21,"button",76),p(22,"app-icon",77),o(23,"Reveal in editor "),n()()),r&2){let t=e,l=c(),s=c();a(6),u(s.fileTotalCalls(t.sessions)),a(4),m("data",s.fileTrendFor(l.key))("fill",!0)("width",150)("height",30),a(4),y(t.byTool),a(3),z("Touched in ",t.sessions.length," session",t.sessions.length!==1?"s":""),a(2),y(t.sessions),a(3),m("size",13)}}function fe(r,e){if(r&1&&(i(0,"div",60)(1,"span",93),o(2),n(),i(3,"span",94),o(4),n(),i(5,"span",95),o(6),n()()),r&2){let t=e.$implicit,l=c(3);a(2),u(l.truncate(t.input,140)),a(2),v("\xD7",t.calls),a(2),u(l.fmtTokens(t.bytes))}}function be(r,e){r&1&&(i(0,"div",91),o(1,"No inputs captured."),n())}function ye(r,e){if(r&1&&(i(0,"div",75)(1,"span",82),o(2),n(),i(3,"span",83),o(4),n(),p(5,"app-icon",84),n()),r&2){let t,l=e.$implicit,s=c(3);a(2),u(s.shortId(l.session_id)),a(2),z(" ",(l.project_path==null||(t=l.project_path.split("/"))==null?null:t.pop())||""," \xB7 ",s.timeAgo(l.lastTs)," "),a(),m("size",12)}}function we(r,e){if(r&1&&(i(0,"div",66)(1,"div",85)(2,"div")(3,"div",47),o(4,"Calls"),n(),i(5,"div",86),o(6),n()(),i(7,"div")(8,"div",47),o(9,"Result tokens"),n(),i(10,"div",86),o(11),n()(),i(12,"div",22)(13,"div",69),o(14,"7-day"),n(),p(15,"app-sparkline",87),n()(),i(16,"div",88)(17,"span",21),o(18,"avg per call"),n(),i(19,"span",89),o(20),n()(),i(21,"div",71),o(22,"Top inputs"),n(),i(23,"div",90),b(24,fe,7,3,"div",60,I,!1,be,2,0,"div",91),n(),i(27,"div",71),o(28),n(),i(29,"div",92),b(30,ye,6,4,"div",75,ee),n()()),r&2){let t=e,l=c(2);a(6),u(t.totals.calls),a(4),k("color",t.totals.bytes>1e6?"var(--error)":"var(--text-primary)"),a(),u(l.fmtTokens(t.totals.bytes)),a(4),m("data",f(13,se))("fill",!0)("width",110)("height",28),a(4),k("color",t.totals.calls>0&&t.totals.bytes/t.totals.calls>3e4?"var(--error)":t.totals.calls>0&&t.totals.bytes/t.totals.calls>8e3?"var(--warn)":"var(--text-secondary)"),a(),v(" ",l.fmtTokens(t.totals.calls>0?l.Math.round(t.totals.bytes/t.totals.calls):0)," tokens "),a(4),y(t.inputs),a(4),v("Used in ",t.totals.sessions," sessions"),a(2),y(t.recentSessions)}}function ke(r,e){if(r&1&&(i(0,"div",104),o(1),n()),r&2){let t=c().$implicit,l=c(3);a(),u(l.truncate(t.description,160))}}function Ce(r,e){if(r&1&&(i(0,"div",105),o(1),n()),r&2){let t=c().$implicit,l=c(3);a(),u(l.truncate(t.prompt,200))}}function Se(r,e){if(r&1&&(i(0,"div",98)(1,"div",101)(2,"span",102),o(3),n(),i(4,"span",103),o(5),n()(),_(6,ke,2,1,"div",104),_(7,Ce,2,1,"div",105),n()),r&2){let t=e.$implicit,l=c(3);a(3),u(l.shortId(t.session_id)),a(2),u(l.timeAgo(t.ts)),a(),h(t.description?6:-1),a(),h(t.prompt?7:-1)}}function Ee(r,e){r&1&&(i(0,"div",99),o(1,"No invocations in window."),n())}function Te(r,e){if(r&1&&(i(0,"div",66)(1,"div",85)(2,"div")(3,"div",47),o(4,"Invocations"),n(),i(5,"div",96),o(6),n()(),i(7,"div")(8,"div",47),o(9,"Sessions"),n(),i(10,"div",96),o(11),n()()(),i(12,"div",71),o(13,"Invocations"),n(),i(14,"div",97),b(15,Se,8,4,"div",98,I,!1,Ee,2,0,"div",99),n(),i(18,"button",76),p(19,"app-icon",100),o(20,"See related tips "),n()()),r&2){let t=e;a(6),u(t.totals.calls),a(5),u(t.totals.sessions),a(4),y(t.invocations),a(4),m("size",13)}}function Me(r,e){if(r&1){let t=E();i(0,"aside",44)(1,"header",59)(2,"div",60),p(3,"app-icon",61),i(4,"span",62),o(5),n()(),i(6,"button",63),w("click",function(){C(t);let s=c();return S(s.closeDrill())}),p(7,"app-icon",64),n()(),_(8,ge,2,0,"div",65),_(9,he,24,8,"div",66),_(10,we,32,14,"div",66),_(11,Te,21,4,"div",66),n()}if(r&2){let t,l,s,d=e,g=c();a(3),k("color",d.kind==="file"?"var(--warn)":d.kind==="tool"?"var(--node-code)":"var(--node-route)"),m("name",d.kind==="file"?"box":d.kind==="tool"?"wrench":"bot")("size",14),a(2),u(g.drillTitle()),a(2),m("size",14),a(),h(g.drillLoading()?8:-1),a(),h((t=d.kind==="file"&&g.fileDrill.state().data)?9:-1,t),a(),h((l=d.kind==="tool"&&g.toolDrill.state().data)?10:-1,l),a(),h((s=d.kind==="subagent"&&g.subagentDrill.state().data)?11:-1,s)}}var Y=class r{Math=Math;api=H(K);range=M("week");metric=M("calls");resource=T(this.api,()=>`/api/claude/heatmap?range=${this.range()}`);files=x(()=>this.resource.state().data?.files??[]);tools=x(()=>this.resource.state().data?.tools??[]);subagents=x(()=>this.resource.state().data?.subagents??[]);subagentByName=x(()=>this.resource.state().data?.subagentByName??[]);totalCalls=x(()=>this.tools().reduce((e,t)=>e+t.calls,0));totalResultTokens=x(()=>this.tools().reduce((e,t)=>e+(t.resultBytes||0),0));busiestFile=x(()=>[...this.files()].sort((e,t)=>t.calls-e.calls)[0]??null);heaviestTool=x(()=>[...this.tools()].sort((e,t)=>(t.resultBytes||0)-(e.resultBytes||0))[0]??null);toolsByTokens=x(()=>[...this.tools()].sort((e,t)=>(t.resultBytes||0)-(e.resultBytes||0)));maxToolTokens=x(()=>Math.max(1,...this.toolsByTokens().map(e=>e.resultBytes||0)));treemapItems=x(()=>{let e=this.metric(),t=d=>e==="tokens"?d.resultBytes||0:d.calls,l=[...this.files()].sort((d,g)=>t(g)-t(d)).slice(0,48);if(!l.length)return[];let s=Math.max(1,...l.map(d=>(d.resultBytes||0)/Math.max(1,d.calls)));return l.map(d=>{let g=(d.resultBytes||0)/Math.max(1,d.calls);return{key:d.path,label:L(d.path),value:t(d),intensity:g/s,sub:e==="tokens"?this.fmtTokens(d.resultBytes||0):d.calls+" calls",title:`${d.path}
1
+ import{a as X}from"./chunk-V74ZPP4B.js";import{a as L,b as J,c as Q}from"./chunk-7656MA24.js";import{a as G}from"./chunk-P62EJGSF.js";import{a as W}from"./chunk-5NTGUSXJ.js";import{a as q}from"./chunk-IOB4JJT4.js";import{c as T}from"./chunk-DTWIJ3GJ.js";import"./chunk-JGDK6YKG.js";import{a as K}from"./chunk-TWVVIWKO.js";import{Aa as p,Ea as P,Fa as N,Ga as E,I as H,Ia as w,Ka as c,M as C,N as S,Ta as k,Ua as R,Va as o,W as M,Wa as u,Xa as v,Ya as z,bb as f,db as O,ea as a,fb as $,gb as V,hb as j,ka as F,lb as x,ra as _,sa as h,ta as I,va as b,vb as A,wa as y,xa as m,ya as i,za as n,zb as U}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var te=()=>({value:"today",label:"Today"}),ne=()=>({value:"week",label:"This week"}),ie=()=>({value:"month",label:"This month"}),ae=()=>({value:"all",label:"All time"}),oe=(r,e,t,l)=>[r,e,t,l],le=()=>({value:"calls",label:"Calls"}),re=()=>({value:"tokens",label:"Tokens"}),de=(r,e)=>[r,e],se=()=>[],Z=(r,e)=>e.name,ee=(r,e)=>e.session_id;function pe(r,e){r&1&&(i(0,"div",23),o(1,"No file-targeted tool calls in this window."),n())}function me(r,e){if(r&1){let t=E();i(0,"app-treemap",45),w("pick",function(s){C(t);let d=c();return S(d.openFile(s))}),n(),i(1,"div",46)(2,"span",47),o(3,"tokens / call"),n(),p(4,"div",48),i(5,"span",49),o(6,"efficient \u2192 wasteful"),n(),p(7,"div",22),i(8,"span",47),o(9,"click a tile to drill in"),n()()}if(r&2){let t,l=c();m("items",l.treemapItems())("height",268)("selKey",((t=l.drill())==null?null:t.kind)==="file"?l.drill().key:null)}}function ce(r,e){if(r&1){let t=E();i(0,"button",50),w("click",function(){let s=C(t).$implicit,d=c();return S(d.openToolByName(s.name))}),i(1,"span",51),o(2),n(),i(3,"div",52),p(4,"div",53),n(),i(5,"span",54),o(6),n(),i(7,"span",55),o(8),n(),i(9,"span",56),o(10),n(),p(11,"app-icon",57),n()}if(r&2){let t,l,s=e.$implicit,d=c();R("sel",((t=d.drill())==null?null:t.kind)==="tool"&&d.drill().key===s.name),a(),k("color",((l=d.drill())==null?null:l.kind)==="tool"&&d.drill().key===s.name?"var(--accent)":"var(--text-secondary)"),a(),u(s.name),a(2),k("width",s.resultBytes/d.maxToolTokens()*100,"%")("background",d.effColor(s.resultBytes/d.Math.max(1,s.calls))),a(2),v("\xD7",s.calls),a(),k("color",d.effColor(s.resultBytes/d.Math.max(1,s.calls))),a(),v("",d.fmtTokens(d.Math.round(s.resultBytes/d.Math.max(1,s.calls))),"/call"),a(2),u(d.fmtTokens(s.resultBytes)),a(),m("size",12)}}function ue(r,e){r&1&&(i(0,"div",23),o(1,"No Task tool calls \u2014 no subagents dispatched."),n())}function xe(r,e){if(r&1){let t=E();i(0,"app-h-bars",58),w("itemClick",function(s){C(t);let d=c();return S(d.openSubagent(s.name))}),n()}if(r&2){let t,l=c();m("items",l.subagentByName())("fmt",l.fmtTokens)("selectedKey",((t=l.drill())==null?null:t.kind)==="subagent"?l.drill().key:null)}}function ge(r,e){r&1&&(i(0,"div",65),o(1,"Loading\u2026"),n())}function ve(r,e){if(r&1&&(i(0,"div",73)(1,"span",78),o(2),n(),i(3,"div",22),p(4,"app-bar",79),n(),i(5,"span",80),o(6),n(),i(7,"span",81),o(8),n()()),r&2){let t=e.$implicit,l=c(),s=c(2);a(2),u(t.name),a(2),m("frac",t.bytes/s.Math.max(1,l.byTool[0].bytes))("color",t.bytes>4e4?"var(--error)":t.bytes>12e3?"var(--warn)":"var(--node-code)"),a(2),v("\xD7",t.calls),a(2),u(s.fmtTokens(t.bytes))}}function _e(r,e){if(r&1&&(i(0,"div",75)(1,"span",82),o(2),n(),i(3,"span",83),o(4),n(),p(5,"app-icon",84),n()),r&2){let t,l=e.$implicit,s=c(3);a(2),u(s.shortId(l.session_id)),a(2),z(" ",(l.project_path==null||(t=l.project_path.split("/"))==null?null:t.pop())||""," \xB7 ",s.timeAgo(l.lastTs)," "),a(),m("size",12)}}function he(r,e){if(r&1&&(i(0,"div",66)(1,"div",67)(2,"div")(3,"div",47),o(4,"Tool calls"),n(),i(5,"div",68),o(6),n()(),i(7,"div",22)(8,"div",69),o(9,"7-day trend"),n(),p(10,"app-sparkline",70),n()(),i(11,"div",71),o(12,"Tool breakdown"),n(),i(13,"div",72),b(14,ve,9,5,"div",73,Z),n(),i(16,"div",71),o(17),n(),i(18,"div",74),b(19,_e,6,4,"div",75,ee),n(),i(21,"button",76),p(22,"app-icon",77),o(23,"Reveal in editor "),n()()),r&2){let t=e,l=c(),s=c();a(6),u(s.fileTotalCalls(t.sessions)),a(4),m("data",s.fileTrendFor(l.key))("fill",!0)("width",150)("height",30),a(4),y(t.byTool),a(3),z("Touched in ",t.sessions.length," session",t.sessions.length!==1?"s":""),a(2),y(t.sessions),a(3),m("size",13)}}function fe(r,e){if(r&1&&(i(0,"div",60)(1,"span",93),o(2),n(),i(3,"span",94),o(4),n(),i(5,"span",95),o(6),n()()),r&2){let t=e.$implicit,l=c(3);a(2),u(l.truncate(t.input,140)),a(2),v("\xD7",t.calls),a(2),u(l.fmtTokens(t.bytes))}}function be(r,e){r&1&&(i(0,"div",91),o(1,"No inputs captured."),n())}function ye(r,e){if(r&1&&(i(0,"div",75)(1,"span",82),o(2),n(),i(3,"span",83),o(4),n(),p(5,"app-icon",84),n()),r&2){let t,l=e.$implicit,s=c(3);a(2),u(s.shortId(l.session_id)),a(2),z(" ",(l.project_path==null||(t=l.project_path.split("/"))==null?null:t.pop())||""," \xB7 ",s.timeAgo(l.lastTs)," "),a(),m("size",12)}}function we(r,e){if(r&1&&(i(0,"div",66)(1,"div",85)(2,"div")(3,"div",47),o(4,"Calls"),n(),i(5,"div",86),o(6),n()(),i(7,"div")(8,"div",47),o(9,"Result tokens"),n(),i(10,"div",86),o(11),n()(),i(12,"div",22)(13,"div",69),o(14,"7-day"),n(),p(15,"app-sparkline",87),n()(),i(16,"div",88)(17,"span",21),o(18,"avg per call"),n(),i(19,"span",89),o(20),n()(),i(21,"div",71),o(22,"Top inputs"),n(),i(23,"div",90),b(24,fe,7,3,"div",60,I,!1,be,2,0,"div",91),n(),i(27,"div",71),o(28),n(),i(29,"div",92),b(30,ye,6,4,"div",75,ee),n()()),r&2){let t=e,l=c(2);a(6),u(t.totals.calls),a(4),k("color",t.totals.bytes>1e6?"var(--error)":"var(--text-primary)"),a(),u(l.fmtTokens(t.totals.bytes)),a(4),m("data",f(13,se))("fill",!0)("width",110)("height",28),a(4),k("color",t.totals.calls>0&&t.totals.bytes/t.totals.calls>3e4?"var(--error)":t.totals.calls>0&&t.totals.bytes/t.totals.calls>8e3?"var(--warn)":"var(--text-secondary)"),a(),v(" ",l.fmtTokens(t.totals.calls>0?l.Math.round(t.totals.bytes/t.totals.calls):0)," tokens "),a(4),y(t.inputs),a(4),v("Used in ",t.totals.sessions," sessions"),a(2),y(t.recentSessions)}}function ke(r,e){if(r&1&&(i(0,"div",104),o(1),n()),r&2){let t=c().$implicit,l=c(3);a(),u(l.truncate(t.description,160))}}function Ce(r,e){if(r&1&&(i(0,"div",105),o(1),n()),r&2){let t=c().$implicit,l=c(3);a(),u(l.truncate(t.prompt,200))}}function Se(r,e){if(r&1&&(i(0,"div",98)(1,"div",101)(2,"span",102),o(3),n(),i(4,"span",103),o(5),n()(),_(6,ke,2,1,"div",104),_(7,Ce,2,1,"div",105),n()),r&2){let t=e.$implicit,l=c(3);a(3),u(l.shortId(t.session_id)),a(2),u(l.timeAgo(t.ts)),a(),h(t.description?6:-1),a(),h(t.prompt?7:-1)}}function Ee(r,e){r&1&&(i(0,"div",99),o(1,"No invocations in window."),n())}function Te(r,e){if(r&1&&(i(0,"div",66)(1,"div",85)(2,"div")(3,"div",47),o(4,"Invocations"),n(),i(5,"div",96),o(6),n()(),i(7,"div")(8,"div",47),o(9,"Sessions"),n(),i(10,"div",96),o(11),n()()(),i(12,"div",71),o(13,"Invocations"),n(),i(14,"div",97),b(15,Se,8,4,"div",98,I,!1,Ee,2,0,"div",99),n(),i(18,"button",76),p(19,"app-icon",100),o(20,"See related tips "),n()()),r&2){let t=e;a(6),u(t.totals.calls),a(5),u(t.totals.sessions),a(4),y(t.invocations),a(4),m("size",13)}}function Me(r,e){if(r&1){let t=E();i(0,"aside",44)(1,"header",59)(2,"div",60),p(3,"app-icon",61),i(4,"span",62),o(5),n()(),i(6,"button",63),w("click",function(){C(t);let s=c();return S(s.closeDrill())}),p(7,"app-icon",64),n()(),_(8,ge,2,0,"div",65),_(9,he,24,8,"div",66),_(10,we,32,14,"div",66),_(11,Te,21,4,"div",66),n()}if(r&2){let t,l,s,d=e,g=c();a(3),k("color",d.kind==="file"?"var(--warn)":d.kind==="tool"?"var(--node-code)":"var(--node-route)"),m("name",d.kind==="file"?"box":d.kind==="tool"?"wrench":"bot")("size",14),a(2),u(g.drillTitle()),a(2),m("size",14),a(),h(g.drillLoading()?8:-1),a(),h((t=d.kind==="file"&&g.fileDrill.state().data)?9:-1,t),a(),h((l=d.kind==="tool"&&g.toolDrill.state().data)?10:-1,l),a(),h((s=d.kind==="subagent"&&g.subagentDrill.state().data)?11:-1,s)}}var Y=class r{Math=Math;api=H(K);range=M("week");metric=M("calls");resource=T(this.api,()=>`/api/claude/heatmap?range=${this.range()}`);files=x(()=>this.resource.state().data?.files??[]);tools=x(()=>this.resource.state().data?.tools??[]);subagents=x(()=>this.resource.state().data?.subagents??[]);subagentByName=x(()=>this.resource.state().data?.subagentByName??[]);totalCalls=x(()=>this.tools().reduce((e,t)=>e+t.calls,0));totalResultTokens=x(()=>this.tools().reduce((e,t)=>e+(t.resultBytes||0),0));busiestFile=x(()=>[...this.files()].sort((e,t)=>t.calls-e.calls)[0]??null);heaviestTool=x(()=>[...this.tools()].sort((e,t)=>(t.resultBytes||0)-(e.resultBytes||0))[0]??null);toolsByTokens=x(()=>[...this.tools()].sort((e,t)=>(t.resultBytes||0)-(e.resultBytes||0)));maxToolTokens=x(()=>Math.max(1,...this.toolsByTokens().map(e=>e.resultBytes||0)));treemapItems=x(()=>{let e=this.metric(),t=d=>e==="tokens"?d.resultBytes||0:d.calls,l=[...this.files()].sort((d,g)=>t(g)-t(d)).slice(0,48);if(!l.length)return[];let s=Math.max(1,...l.map(d=>(d.resultBytes||0)/Math.max(1,d.calls)));return l.map(d=>{let g=(d.resultBytes||0)/Math.max(1,d.calls);return{key:d.path,label:L(d.path),value:t(d),intensity:g/s,sub:e==="tokens"?this.fmtTokens(d.resultBytes||0):d.calls+" calls",title:`${d.path}
2
2
  ${d.calls} calls \xB7 ${this.fmtTokens(d.resultBytes||0)} result tokens \xB7 ${this.fmtTokens(Math.round(g))}/call`}})});drill=M(null);fileDrill=T(this.api,()=>{let e=this.drill();return e?.kind==="file"?`/api/claude/heatmap/file?path=${encodeURIComponent(e.key)}&range=${this.range()}`:null});toolDrill=T(this.api,()=>{let e=this.drill();return e?.kind==="tool"?`/api/claude/heatmap/tool?name=${encodeURIComponent(e.key)}&range=${this.range()}`:null});subagentDrill=T(this.api,()=>{let e=this.drill();return e?.kind==="subagent"?`/api/claude/heatmap/subagent?type=${encodeURIComponent(e.key)}&range=${this.range()}`:null});drillTitle=x(()=>{let e=this.drill();return e?e.key:""});drillLoading=x(()=>{let e=this.drill();return e?e.kind==="file"?this.fileDrill.state().loading:e.kind==="tool"?this.toolDrill.state().loading:this.subagentDrill.state().loading:!1});setRange(e){this.range.set(e)}setMetric(e){this.metric.set(e)}openFile(e){this.drill.set({kind:"file",key:e})}openToolByName(e){this.drill.set({kind:"tool",key:e})}openSubagent(e){this.drill.set({kind:"subagent",key:e})}closeDrill(){this.drill.set(null)}fileTrendFor(e){return this.files().find(t=>t.path===e)?.trend??[]}fileTotalCalls(e){return e.reduce((t,l)=>t+l.calls,0)}effColor(e){return e>2e4?"var(--error)":e>8e3?"var(--warn)":"var(--success)"}fmtTokens=e=>e>=1e6?(e/1e6).toFixed(1)+"M":e>=1e3?(e/1e3).toFixed(0)+"k":String(e);fmtBytes(e){return e>=1e6?(e/1e6).toFixed(1)+"MB":e>=1e3?(e/1e3).toFixed(0)+"kB":e+"B"}timeAgo(e){let t=Date.now()-e;return t<6e4?"just now":t<36e5?Math.round(t/6e4)+"m ago":t<864e5?Math.round(t/36e5)+"h ago":Math.round(t/864e5)+"d ago"}shortId(e){return e.slice(0,8)}shortFile(e){return e?e.split("/").filter(Boolean).slice(-2).join("/")||e:"\u2014"}truncate(e,t=120){return e.length>t?e.slice(0,t)+"\u2026":e}static \u0275fac=function(t){return new(t||r)};static \u0275cmp=F({type:r,selectors:[["app-heatmap"]],decls:98,vars:38,consts:[[1,"hm-root"],[1,"page","scroll-y"],[2,"margin-bottom","18px"],["icon","heatmap","title","Heatmap","sub","Where tool calls land \u2014 files, tools, subagents"],["actions",""],["size","sm",3,"change","value","options"],[1,"sum-grid",2,"margin-bottom","14px"],[1,"card","sum-card"],[1,"row","gap-6",2,"color","var(--text-muted)","white-space","nowrap","margin-bottom","3px"],["name","wrench",2,"color","var(--node-spec)","flex-shrink","0",3,"size"],[1,"eyebrow"],[1,"mono","tabular",2,"font-size","18px","font-weight","650","letter-spacing","-0.01em"],[1,"mono","muted",2,"font-size","10px"],["name","database",2,"color","var(--node-route)","flex-shrink","0",3,"size"],["name","box",2,"color","var(--warn)","flex-shrink","0",3,"size"],[1,"mono","tabular",2,"font-size","18px","font-weight","650","letter-spacing","-0.01em","overflow","hidden","text-overflow","ellipsis","white-space","nowrap"],["name","flame",2,"color","var(--error)","flex-shrink","0",3,"size"],[1,"card","card-pad",2,"margin-bottom","14px"],[1,"row","gap-8",2,"margin-bottom","12px"],["name","box",2,"color","var(--warn)",3,"size"],[2,"font-weight","600","font-size","12.5px"],[1,"muted",2,"font-size","11px"],[1,"grow"],[1,"empty"],[1,"bottom-grid"],[1,"card","card-pad"],[1,"row","gap-8",2,"margin-bottom","4px"],["name","wrench",2,"color","var(--node-code)",3,"size"],[1,"row",2,"padding","8px 0 4px","font-size","9.5px","color","var(--text-muted)","text-transform","uppercase","letter-spacing","0.05em","font-weight","600"],[2,"width","116px"],[2,"width","36px","text-align","right"],[2,"width","64px","text-align","right"],[2,"width","48px","text-align","right"],[2,"width","14px"],[1,"col","gap-2"],["type","button",1,"tool-eff-row","row","gap-8",3,"sel"],[1,"muted","row","gap-12",2,"font-size","10.5px","margin-top","10px"],[1,"row","gap-4"],[2,"width","8px","height","8px","border-radius","2px","background","var(--error)"],[2,"width","8px","height","8px","border-radius","2px","background","var(--warn)"],[2,"width","8px","height","8px","border-radius","2px","background","var(--success)"],[1,"row","gap-8",2,"margin-bottom","14px"],["name","bot",2,"color","var(--node-route)",3,"size"],["valueKey","calls","color","var(--node-route)",3,"items","fmt","selectedKey"],[1,"hm-drawer"],["variant","detailed",3,"pick","items","height","selKey"],[1,"row","gap-12",2,"margin-top","10px","align-items","center"],[1,"muted",2,"font-size","10.5px"],[1,"row",2,"width","120px","height","7px","border-radius","999px","overflow","hidden","background","linear-gradient(90deg, var(--node-route), var(--warn), var(--error))"],[1,"muted",2,"font-size","10px"],["type","button",1,"tool-eff-row","row","gap-8",3,"click"],[1,"mono",2,"width","116px","flex-shrink","0","font-size","11.5px","overflow","hidden","text-overflow","ellipsis","white-space","nowrap"],[1,"grow",2,"height","16px","background","var(--bg-hover)","border-radius","4px","overflow","hidden"],[2,"height","100%","border-radius","4px"],[1,"mono","tabular","muted",2,"width","36px","text-align","right","font-size","10.5px","flex-shrink","0"],[1,"mono","tabular",2,"width","64px","text-align","right","font-size","10.5px","flex-shrink","0"],[1,"mono","tabular",2,"width","48px","text-align","right","font-size","11.5px","font-weight","600","flex-shrink","0"],["name","chevronRight",2,"color","var(--text-faint)","flex-shrink","0",3,"size"],["valueKey","calls","color","var(--node-route)",3,"itemClick","items","fmt","selectedKey"],[1,"hm-drawer-head"],[1,"row","gap-8"],[3,"name","size"],[1,"mono","grow",2,"font-size","13px","font-weight","600","overflow","hidden","text-overflow","ellipsis","white-space","nowrap"],["type","button","aria-label","Close",1,"btn","btn-ghost","btn-xs",3,"click"],["name","x",3,"size"],[1,"muted","hm-pad"],[1,"scroll-y",2,"flex","1","padding","14px"],[1,"row",2,"gap","20px","margin-bottom","16px"],[1,"tabular",2,"font-size","26px","font-weight","700","line-height","1"],[1,"muted",2,"font-size","10.5px","margin-bottom","4px"],["color","var(--warn)",3,"data","fill","width","height"],[1,"eyebrow",2,"margin-bottom","8px"],[1,"col","gap-8",2,"margin-bottom","18px"],[1,"row","gap-10"],[1,"col","gap-6",2,"margin-bottom","18px"],[1,"session-link","row","gap-8"],[1,"btn","btn-secondary","btn-sm",2,"width","100%","justify-content","center"],["name","reveal",3,"size"],[1,"mono",2,"font-size","11.5px","width","92px","flex-shrink","0","overflow","hidden","text-overflow","ellipsis","white-space","nowrap"],[3,"frac","color"],[1,"mono","tabular","muted",2,"font-size","10.5px","width","22px","text-align","right"],[1,"mono","tabular",2,"font-size","10.5px","width","44px","text-align","right"],[1,"mono",2,"font-size","11.5px","flex-shrink","0"],[1,"muted","grow",2,"font-size","10.5px","overflow","hidden","text-overflow","ellipsis","white-space","nowrap"],["name","chevronRight",2,"color","var(--text-muted)","flex-shrink","0",3,"size"],[1,"row",2,"gap","16px","margin-bottom","16px"],[1,"tabular",2,"font-size","24px","font-weight","700","line-height","1"],["color","var(--node-code)",3,"data","fill","width","height"],[1,"row","gap-8",2,"margin-bottom","16px"],[1,"mono","tabular",2,"font-size","12px"],[1,"col","gap-7",2,"margin-bottom","18px"],[1,"muted",2,"padding","8px 0","font-size","11.5px"],[1,"col","gap-6"],[1,"mono",2,"font-size","11px","flex","1","min-width","0","overflow","hidden","text-overflow","ellipsis","white-space","nowrap","color","var(--text-secondary)"],[1,"mono","tabular","muted",2,"font-size","10px","width","20px","text-align","right"],[1,"mono","tabular",2,"font-size","10px","width","40px","text-align","right"],[1,"tabular",2,"font-size","22px","font-weight","700","line-height","1"],[1,"col","gap-6",2,"margin-bottom","16px"],[1,"inv-card"],[1,"muted",2,"font-size","11.5px","padding","8px 0"],["name","tips",3,"size"],[1,"row","gap-8",2,"margin-bottom","4px","font-size","11px"],[1,"mono"],[1,"muted"],[2,"font-size","12px","line-height","1.45"],[1,"muted","mono",2,"font-size","11px","line-height","1.45","margin-top","4px","overflow-wrap","anywhere"]],template:function(t,l){if(t&1&&(i(0,"div",0)(1,"div",1)(2,"div",2)(3,"app-page-head",3),P(4,4),i(5,"app-segmented",5),w("change",function(d){return l.setRange(d)}),n(),N(),n()(),i(6,"div",6)(7,"div",7)(8,"div",8),p(9,"app-icon",9),i(10,"span",10),o(11,"Tool calls"),n()(),i(12,"div",11),o(13),V(14,"number"),n(),i(15,"div",12),o(16),n()(),i(17,"div",7)(18,"div",8),p(19,"app-icon",13),i(20,"span",10),o(21,"Result tokens"),n()(),i(22,"div",11),o(23),n(),i(24,"div",12),o(25,"returned to context"),n()(),i(26,"div",7)(27,"div",8),p(28,"app-icon",14),i(29,"span",10),o(30,"Busiest file"),n()(),i(31,"div",15),o(32),n(),i(33,"div",12),o(34),n()(),i(35,"div",7)(36,"div",8),p(37,"app-icon",16),i(38,"span",10),o(39,"Heaviest tool"),n()(),i(40,"div",11),o(41),n(),i(42,"div",12),o(43),n()()(),i(44,"div",17)(45,"div",18),p(46,"app-icon",19),i(47,"span",20),o(48,"Files"),n(),i(49,"span",21),o(50),n(),p(51,"div",22),i(52,"app-segmented",5),w("change",function(d){return l.setMetric(d)}),n()(),_(53,pe,2,0,"div",23)(54,me,10,3),n(),i(55,"div",24)(56,"div",25)(57,"div",26),p(58,"app-icon",27),i(59,"span",20),o(60,"Tools"),n(),i(61,"span",21),o(62,"\xB7 by result tokens, ranked"),n()(),i(63,"div",28)(64,"span",29),o(65,"Tool"),n(),i(66,"span",22),o(67,"Result tokens"),n(),i(68,"span",30),o(69,"Calls"),n(),i(70,"span",31),o(71,"Per call"),n(),i(72,"span",32),o(73,"Total"),n(),p(74,"span",33),n(),i(75,"div",34),b(76,ce,12,15,"button",35,Z),n(),i(78,"div",36)(79,"span",37),p(80,"span",38),o(81,">20k / call"),n(),i(82,"span",37),p(83,"span",39),o(84,">8k"),n(),i(85,"span",37),p(86,"span",40),o(87,"lean"),n()()(),i(88,"div",25)(89,"div",41),p(90,"app-icon",42),i(91,"span",20),o(92,"Subagents"),n(),i(93,"span",21),o(94,"\xB7 by sidechain attribution"),n()(),_(95,ue,2,0,"div",23)(96,xe,1,3,"app-h-bars",43),n()()(),_(97,Me,12,10,"aside",44),n()),t&2){let s,d,g,B,D;a(5),m("value",l.range())("options",$(28,oe,f(24,te),f(25,ne),f(26,ie),f(27,ae))),a(4),m("size",12),a(4),u(j(14,22,l.totalCalls())),a(3),v("this ",l.range()),a(3),m("size",12),a(4),u(l.fmtTokens(l.totalResultTokens())),a(5),m("size",12),a(4),v(" ",l.shortFile((s=l.busiestFile())==null?null:s.path)," "),a(2),v("",((d=l.busiestFile())==null?null:d.calls)||0," calls"),a(3),m("size",12),a(4),u(((g=l.heaviestTool())==null?null:g.name)||"\u2014"),a(2),v("",l.fmtTokens(((B=l.heaviestTool())==null?null:B.resultBytes)||0)," tokens"),a(3),m("size",14),a(4),v("\xB7 area = ",l.metric()==="tokens"?"result tokens":"tool calls",", color = tokens / call"),a(2),m("value",l.metric())("options",O(35,de,f(33,le),f(34,re))),a(),h(l.files().length===0?53:54),a(5),m("size",14),a(18),y(l.toolsByTokens()),a(14),m("size",14),a(5),h(l.subagentByName().length===0?95:96),a(2),h((D=l.drill())?97:-1,D)}},dependencies:[W,q,G,X,Q,J,U,A],styles:["[_nghost-%COMP%]{display:contents}.hm-root[_ngcontent-%COMP%]{flex:1;display:flex;min-height:0;min-width:0}.page[_ngcontent-%COMP%]{flex:1;min-width:0;padding:18px}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono)}.tabular[_ngcontent-%COMP%]{font-variant-numeric:tabular-nums}.empty[_ngcontent-%COMP%]{color:var(--text-muted);padding:18px;text-align:center;font-size:12.5px}.card[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:var(--r-lg)}.card-pad[_ngcontent-%COMP%]{padding:14px}.sum-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.sum-card[_ngcontent-%COMP%]{padding:10px 13px;display:flex;flex-direction:column;gap:3px;min-width:0}.bottom-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:14px}@media(max-width:1100px){.bottom-grid[_ngcontent-%COMP%]{grid-template-columns:1fr}}.tool-eff-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:6px 8px;margin:0 -8px;border-radius:6px;cursor:pointer;background:transparent;border:none;color:inherit;font-family:inherit;text-align:left}.tool-eff-row[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.tool-eff-row.sel[_ngcontent-%COMP%]{background:var(--accent-soft)}.hm-drawer[_ngcontent-%COMP%]{width:360px;flex-shrink:0;border-left:1px solid var(--border-subtle);background:var(--bg-panel);display:flex;flex-direction:column;height:100%;overflow:hidden;animation:_ngcontent-%COMP%_hm-slide-in .16s ease-out}@keyframes _ngcontent-%COMP%_hm-slide-in{0%{transform:translate(20px);opacity:0}to{transform:translate(0);opacity:1}}.hm-drawer-head[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:12px 14px;border-bottom:1px solid var(--border-subtle);flex-shrink:0;position:sticky;top:0;background:var(--bg-panel);z-index:1}.hm-pad[_ngcontent-%COMP%]{padding:16px}.session-link[_ngcontent-%COMP%]{padding:7px 9px;border-radius:7px;border:1px solid var(--border-subtle);cursor:pointer}.session-link[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.inv-card[_ngcontent-%COMP%]{background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:6px;padding:8px 10px;margin-bottom:8px}.inv-card[_ngcontent-%COMP%]:last-child{margin-bottom:0}"],changeDetection:0})};export{Y as Heatmap};
@@ -0,0 +1,3 @@
1
+ import{a as W}from"./chunk-JLOJCDIY.js";import{a as G}from"./chunk-YV5LB22R.js";import{b as U}from"./chunk-WBJ5VEB5.js";import{a as Q}from"./chunk-IOB4JJT4.js";import{a as K}from"./chunk-TWVVIWKO.js";import{Aa as x,Ga as k,I as O,Ia as h,Ka as s,M as v,N as y,Ra as N,Sa as H,Ta as R,Ua as B,Va as l,W as w,Wa as u,Xa as g,Ya as $,aa as z,ea as i,ka as V,lb as D,qa as T,qb as L,ra as p,sa as _,ta as F,ua as A,va as C,wa as f,xa as m,ya as o,yb as j,za as a,zb as q}from"./chunk-SYGIPC2P.js";import{a as S,b as M}from"./chunk-Q7L6LLAK.js";var te=["listEl"],ne=(t,n)=>n.name,Z=(t,n)=>n.qualifiedName,ie=(t,n)=>n.target,oe=(t,n)=>n.cmd;function ae(t,n){if(t&1&&(o(0,"div",22),x(1,"div",24),a()),t&2){let e=s().$implicit,r=s();i(),m("innerHTML",r.renderMd(e.text),z)}}function re(t,n){if(t&1&&(o(0,"div",39)(1,"div",40),l(2,"output"),a(),o(3,"div",41),l(4),a()()),t&2){let e=s().$implicit;i(4),u(e.output)}}function le(t,n){if(t&1){let e=k();o(0,"div",31)(1,"button",32),h("click",function(){let d=v(e).$implicit,c=s(3).$implicit,b=s();return y(b.toggleToolCall(c,d))}),x(2,"app-icon",33)(3,"app-icon",34),o(4,"span",35),l(5),o(6,"span",36),l(7),a()(),o(8,"span",37),x(9,"app-icon",38),l(10),a()(),p(11,re,5,1,"div",39),a()}if(t&2){let e=n.$implicit;i(),T("aria-expanded",e.open),i(),m("name",e.open?"chevronDown":"chevronRight")("size",12),i(),m("size",12),i(2),g(" ",e.name),i(2),g("(",e.input,")"),i(2),m("size",9),i(),g(" ",e.status," "),i(),_(e.open?11:-1)}}function de(t,n){if(t&1&&C(0,le,12,9,"div",31,ne),t&2){let e=s(2).$implicit;f(e.tools)}}function se(t,n){if(t&1&&l(0),t&2){let e=s(2).$implicit;g(":",e.line)}}function ce(t,n){if(t&1&&(l(0),p(1,se,1,1)),t&2){let e=s().$implicit;g(" \xB7 ",e.filePath),i(),_(e.line?1:-1)}}function pe(t,n){if(t&1&&l(0),t&2){let e=s().$implicit;g(" \xB7 ",e.ref," ")}}function _e(t,n){if(t&1&&(o(0,"div",47),l(1),a()),t&2){let e=s(3).$implicit;i(),u(e.detail.signature)}}function me(t,n){if(t&1&&(o(0,"pre",48),l(1),a()),t&2){let e=s(3).$implicit;i(),u(e.detail.body)}}function xe(t,n){if(t&1&&(o(0,"div",51),l(1),o(2,"span",36),l(3),a()()),t&2){let e=n.$implicit;i(),g("",e.name," "),i(2),$("",e.filePath,":",e.line)}}function ue(t,n){if(t&1&&(o(0,"div",49)(1,"div",50),l(2,"callers"),a(),C(3,xe,4,3,"div",51,Z),a()),t&2){let e=s(3).$implicit;i(3),f(e.detail.callers)}}function ge(t,n){if(t&1&&(o(0,"div",51),l(1),o(2,"span",36),l(3),a()()),t&2){let e=n.$implicit;i(),g("",e.name," "),i(2),$("",e.filePath,":",e.line)}}function he(t,n){if(t&1&&(o(0,"div",49)(1,"div",50),l(2,"callees"),a(),C(3,ge,4,3,"div",51,Z),a()),t&2){let e=s(3).$implicit;i(3),f(e.detail.callees)}}function Ce(t,n){if(t&1&&(p(0,_e,2,1,"div",47),p(1,me,2,1,"pre",48),p(2,ue,5,0,"div",49),p(3,he,5,0,"div",49)),t&2){let e=s(2).$implicit;_(e.detail!=null&&e.detail.signature?0:-1),i(),_(e.detail!=null&&e.detail.body?1:-1),i(),_(!(e.detail==null||e.detail.callers==null)&&e.detail.callers.length?2:-1),i(),_(!(e.detail==null||e.detail.callees==null)&&e.detail.callees.length?3:-1)}}function fe(t,n){if(t&1&&(o(0,"pre",48),l(1),a()),t&2){let e=s(3).$implicit;i(),u(e.detail.body)}}function be(t,n){if(t&1&&(o(0,"div",52)(1,"span",53),l(2),a(),x(3,"app-state-pill",54),a()),t&2){let e=n.$implicit;i(2),u(e.target),i(),m("state",e.state)}}function ve(t,n){if(t&1&&(o(0,"div",49)(1,"div",50),l(2,"links"),a(),C(3,be,4,2,"div",52,ie),a()),t&2){let e=s(3).$implicit;i(3),f(e.detail.links)}}function ye(t,n){if(t&1&&(p(0,fe,2,1,"pre",48),p(1,ve,5,0,"div",49)),t&2){let e=s(2).$implicit;_(e.detail!=null&&e.detail.body?0:-1),i(),_(!(e.detail==null||e.detail.links==null)&&e.detail.links.length?1:-1)}}function we(t,n){if(t&1&&(o(0,"pre",48),l(1),a()),t&2){let e=s(3).$implicit;i(),u(e.detail.body)}}function ke(t,n){if(t&1&&p(0,we,2,1,"pre",48),t&2){let e=s(2).$implicit;_(e.detail!=null&&e.detail.body?0:-1)}}function Se(t,n){if(t&1&&(o(0,"div",46),p(1,Ce,4,4)(2,ye,2,2)(3,ke,1,1),a()),t&2){let e=s().$implicit;i(),_(e.kind==="symbol"?1:e.kind==="spec"?2:3)}}function Me(t,n){if(t&1){let e=k();o(0,"div",43)(1,"button",44),h("click",function(){let d=v(e).$index,c=s(3).$index,b=s();return y(b.toggleDetail(c,d))}),x(2,"app-icon",33),o(3,"span",35),l(4),o(5,"span",36),p(6,ce,2,2)(7,pe,1,1),a()(),o(8,"span",45),l(9),a()(),p(10,Se,4,1,"div",46),a()}if(t&2){let e=n.$implicit,r=n.$index,d=s(3).$index,c=s();i(),T("aria-expanded",c.isDetailOpen(d,r)),i(),m("name",c.isDetailOpen(d,r)?"chevronDown":"chevronRight")("size",12),i(2),g(" ",e.label),i(2),_(e.filePath?6:7),i(3),u(e.kind),i(),_(c.isDetailOpen(d,r)?10:-1)}}function Te(t,n){if(t&1&&(o(0,"div",30)(1,"div",42),l(2),a(),C(3,Me,11,7,"div",43,F),a()),t&2){let e=s(2).$implicit;i(2),g("Retrieved detail \xB7 ",e.sources.length),i(),f(e.sources)}}function Ee(t,n){if(t&1&&(o(0,"div",23)(1,"div",25),x(2,"app-logo-mark",26),o(3,"span",27),l(4,"specship"),a()(),o(5,"div",28),x(6,"div",29),p(7,de,2,0),p(8,Te,5,1,"div",30),a()()),t&2){let e=s().$implicit,r=s();i(2),m("size",22)("glow",!1),i(4),m("innerHTML",r.renderMd(e.text),z),i(),_(e.tools!=null&&e.tools.length?7:-1),i(),_(e.sources!=null&&e.sources.length?8:-1)}}function Pe(t,n){if(t&1&&p(0,ae,2,1,"div",22)(1,Ee,9,5,"div",23),t&2){let e=n.$implicit;_(e.role==="user"?0:1)}}function Oe(t,n){t&1&&(o(0,"div",5),x(1,"span",55),l(2," thinking with specship context\u2026 "),a())}function ze(t,n){if(t&1&&(o(0,"span",59),l(1),a()),t&2){let e=s().$implicit;i(),u(e.arg)}}function Fe(t,n){if(t&1){let e=k();o(0,"button",57),h("click",function(){let d=v(e).$implicit,c=s(2);return y(c.pickSlash(d.cmd))}),o(1,"span",58),l(2),a(),p(3,ze,2,1,"span",59),o(4,"span",60),l(5),a()()}if(t&2){let e=n.$implicit;i(2),u(e.cmd),i(),_(e.arg?3:-1),i(2),u(e.desc)}}function $e(t,n){if(t&1&&(o(0,"div",8),C(1,Fe,6,3,"button",56,oe),a()),t&2){let e=s();i(),f(e.filteredSlash())}}function De(t,n){if(t&1){let e=k();o(0,"div",20)(1,"button",61),h("click",function(){v(e);let d=s();return y(d.toggleContext())}),x(2,"app-icon",62),a()()}t&2&&(i(2),m("size",14))}function Ie(t,n){if(t&1){let e=k();o(0,"div",77)(1,"button",81),h("click",function(){let d=v(e).$implicit,c=s(2);return y(c.toggleTool(d))}),x(2,"span",82),a(),o(3,"span",83),l(4),a()()}if(t&2){let e=n.$implicit,r=s(2);i(),B("on",r.enabledTools().has(e)),T("aria-pressed",r.enabledTools().has(e))("aria-label",e+(r.enabledTools().has(e)?" enabled":" disabled")),i(2),R("color",r.enabledTools().has(e)?"var(--text-primary)":"var(--text-muted)"),i(),u(e)}}function Ve(t,n){if(t&1){let e=k();o(0,"aside",21)(1,"div",63)(2,"span",64),l(3,"Context"),a(),o(4,"button",65),h("click",function(){v(e);let d=s();return y(d.toggleContext())}),x(5,"app-icon",66),a()(),o(6,"div",67)(7,"div",68),x(8,"app-icon",69),o(9,"div",70)(10,"div",71),l(11,"Project"),a(),o(12,"div",72),l(13,"~/dev/specship"),a()()(),o(14,"div",68),x(15,"app-icon",73),o(16,"div",70)(17,"div",71),l(18,"Indexed files"),a(),o(19,"div",74),l(20),a()()(),o(21,"div",68),x(22,"app-icon",75),o(23,"div",70)(24,"div",71),l(25,"Drift queue"),a(),o(26,"div",74),l(27,"\u2013 links"),a()()(),o(28,"div",76),l(29,"MCP tools"),a(),C(30,Ie,5,7,"div",77,A),a(),o(32,"div",78)(33,"div",79),l(34,"Tool access"),a(),o(35,"app-segmented",80),h("change",function(d){v(e);let c=s();return y(c.setToolAccess(d))}),a()()()}if(t&2){let e=s();i(5),m("size",13),i(3),m("size",13),i(7),m("size",13),i(5),u(e.api.isConfigured?"\u2013":"offline"),i(2),m("size",13),i(8),f(e.mcpTools),i(5),m("value",e.toolAccess())("options",e.toolAccessOptions)}}var J=[{cmd:"/specship:spec",arg:"REQ-ID | new <desc>",desc:"Intent door \u2014 view, author, implement, or review a spec"},{cmd:"/specship:explore",arg:"symbols | from\u2192to",desc:"Reads door \u2014 explore an area, trace a flow, or get impact"},{cmd:"/specship:check",arg:"(gate) | drifted | health",desc:"Gate & health door \u2014 run the gate, review drift, or see health"}],X=["specship_explore","specship_search","specship_spec","specship_link_verify"],Y=class t{sanitizer=O(j);api=O(K);listEl=L("listEl");closeStream;messages=w([{role:"assistant",text:`Hi \u2014 ask anything about your specs, code, or recent Claude Code sessions.
2
+
3
+ Try **/specship:spec REQ-AUTH-005** to inspect a requirement, or **/specship:explore validateSession** to walk its callers.`}]);draft=w("");thinking=w(!1);contextCollapsed=w(!1);enabledTools=w(new Set(X));toolAccess=w("safe");slashCommands=J;mcpTools=X;toolAccessOptions=[{value:"ask",label:"Ask"},{value:"safe",label:"Auto-safe"},{value:"all",label:"All"}];showSlash=D(()=>{let n=this.draft();return n.startsWith("/")&&!n.includes(" ")});filteredSlash=D(()=>{let n=this.draft();return J.filter(e=>e.cmd.startsWith(n))});setDraft(n){this.draft.set(n)}onKey(n){n.key==="Enter"&&!n.shiftKey&&(n.preventDefault(),this.send())}send(){let n=this.draft().trim();if(!n)return;this.draft.set(""),this.messages.update(d=>[...d,{role:"user",text:n}]),this.thinking.set(!0),this.scrollToBottom();let e=this.messages().length;this.messages.update(d=>[...d,{role:"assistant",text:"",tools:[]}]),this.closeStream?.();let r="/api/chat/stream?question="+encodeURIComponent(n);this.closeStream=this.api.openEventStream(r,(d,c)=>this.onStreamEvent(e,d,c),()=>this.endStream(),["thinking","tool","result_summary","chunk","done"])}onStreamEvent(n,e,r){switch(e){case"tool":{let d=r??{};this.patchMsg(n,c=>M(S({},c),{tools:[...c.tools??[],{name:d.name??"",input:d.input??"",output:"",status:"ok"}]}));break}case"result_summary":{let d=r??{},c=d.sourceCount??0,b=d.found?`${c} source${c===1?"":"s"} returned`:"no matches in the index";this.patchMsg(n,E=>{let P=E.tools??[];return P.length===0?E:M(S({},E),{tools:P.map((I,ee)=>ee===P.length-1?M(S({},I),{output:b}):I)})});break}case"chunk":{let c=(r??{}).text??"";this.patchMsg(n,b=>M(S({},b),{text:b.text+c})),this.scrollToBottom();break}case"done":{let d=r??{};d.sources?.length&&this.patchMsg(n,c=>M(S({},c),{sources:d.sources})),this.endStream();break}}}patchMsg(n,e){this.messages.update(r=>r.map((d,c)=>c===n?e(d):d))}endStream(){this.thinking.set(!1),this.closeStream?.(),this.closeStream=void 0,this.scrollToBottom()}ngOnDestroy(){this.closeStream?.(),this.closeStream=void 0}pickSlash(n){this.draft.set(n+" ")}toggleTool(n){this.enabledTools.update(e=>{let r=new Set(e);return r.has(n)?r.delete(n):r.add(n),r})}setToolAccess(n){this.toolAccess.set(n)}toggleContext(){this.contextCollapsed.update(n=>!n)}toggleToolCall(n,e){e.open=!e.open,this.messages.update(r=>[...r])}openDetails=w(new Set);detailKey(n,e){return`${n}:${e}`}isDetailOpen(n,e){return this.openDetails().has(this.detailKey(n,e))}toggleDetail(n,e){let r=this.detailKey(n,e);this.openDetails.update(d=>{let c=new Set(d);return c.has(r)?c.delete(r):c.add(r),c})}renderMd(n){let e=n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\*\*(.+?)\*\*/g,'<strong style="color:var(--text-primary)">$1</strong>').replace(/`(.+?)`/g,'<code class="mono" style="font-size:12px;background:var(--bg-canvas);padding:1px 5px;border-radius:4px;border:1px solid var(--border-subtle);color:var(--node-spec)">$1</code>').replace(/\n\n/g,"<br/><br/>").replace(/\n/g,"<br/>");return this.sanitizer.bypassSecurityTrustHtml(e)}scrollToBottom(){setTimeout(()=>{let n=this.listEl()?.nativeElement;n&&(n.scrollTop=n.scrollHeight)},0)}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=V({type:t,selectors:[["app-chat"]],viewQuery:function(e,r){e&1&&N(r.listEl,te,5),e&2&&H()},decls:29,vars:8,consts:[["listEl",""],[1,"chat-page"],[1,"chat-col"],[1,"thread","scroll-y"],[1,"thread-inner"],[1,"row","gap-8","muted","thinking"],[1,"composer"],[1,"composer-inner"],["role","listbox","aria-label","Slash commands",1,"slash-menu"],[1,"composer-box","row"],["type","button","title","Attach files or spec IDs",1,"btn","btn-ghost","btn-sm","attach-btn"],["name","paperclip",3,"size"],["placeholder","Ask with specship context\u2026 / for commands, Tab to complete spec IDs","rows","1",1,"composer-ta",3,"input","keydown","value"],["type","button","aria-label","Send message",1,"btn","btn-primary","btn-sm","send-btn",3,"click","disabled"],["name","send",3,"size"],[1,"composer-footer","row","gap-8"],[1,"row","gap-6"],["name","bot",3,"size"],[1,"muted",2,"font-size","10.5px"],[1,"grow"],[1,"ctx-collapsed"],["aria-label","Context panel",1,"ctx-panel","col"],[1,"msg-user"],[1,"msg-assistant"],[1,"bubble-user",3,"innerHTML"],[1,"row","gap-8","asst-meta"],["aria-hidden","true",3,"size","glow"],[2,"font-size","12px","font-weight","600"],[1,"asst-body"],[1,"bubble-asst",3,"innerHTML"],[1,"detail-list"],[1,"tool-call"],["type","button",1,"tool-header","row","gap-8",3,"click"],[2,"color","var(--text-muted)",3,"name","size"],["name","wrench",2,"color","var(--node-code)",3,"size"],[1,"mono","grow",2,"font-size","11.5px"],[1,"muted"],[1,"pill",2,"font-size","9.5px","color","var(--success)","background","var(--success-soft)"],["name","check",3,"size"],[1,"tool-output"],[1,"mono","muted",2,"font-size","10.5px","margin-bottom","3px"],[1,"mono",2,"font-size","11.5px","color","var(--text-secondary)"],[1,"eyebrow",2,"margin","4px 0 2px"],[1,"source-detail"],["type","button",1,"detail-header","row","gap-8",3,"click"],[1,"pill",2,"font-size","9.5px","color","var(--text-muted)","background","var(--bg-canvas)"],[1,"detail-body"],[1,"mono","detail-sig"],[1,"mono","detail-src"],[1,"detail-rel"],[1,"mono","muted","detail-rel-label"],[1,"mono","detail-rel-item"],[1,"row","gap-8","detail-rel-item"],[1,"mono","grow"],[3,"state"],[1,"thinking-dot"],["type","button","role","option",1,"slash-item","row","gap-8"],["type","button","role","option",1,"slash-item","row","gap-8",3,"click"],[1,"mono",2,"font-size","12px","color","var(--accent)"],[1,"mono","muted",2,"font-size","11px"],[1,"muted","grow",2,"font-size","11px","text-align","right"],["type","button","title","Show context",1,"btn","btn-ghost","btn-xs",3,"click"],["name","chevronLeft",3,"size"],[1,"ctx-header","row"],[1,"eyebrow","grow"],["type","button",1,"btn","btn-ghost","btn-xs",3,"click"],["name","chevronRight",3,"size"],[1,"ctx-body","scroll-y"],[1,"ctx-row","row","gap-8"],["name","folder",2,"color","var(--text-muted)","flex-shrink","0",3,"size"],[2,"min-width","0"],[1,"muted",2,"font-size","10px"],[1,"mono",2,"font-size","11.5px","overflow","hidden","text-overflow","ellipsis","white-space","nowrap"],["name","box",2,"color","var(--text-muted)","flex-shrink","0",3,"size"],[1,"mono",2,"font-size","11.5px"],["name","drift",2,"color","var(--warn)","flex-shrink","0",3,"size"],[1,"eyebrow",2,"margin","16px 0 8px"],[1,"row","gap-8",2,"padding","5px 0"],[1,"ctx-footer"],[1,"eyebrow",2,"margin-bottom","6px"],["size","sm",3,"change","value","options"],["type","button",1,"toggle-btn",3,"click"],[1,"toggle-thumb"],[1,"mono",2,"font-size","11px"]],template:function(e,r){e&1&&(o(0,"div",1)(1,"div",2)(2,"div",3,0)(4,"div",4),C(5,Pe,2,1,null,null,F),p(7,Oe,3,0,"div",5),a()(),o(8,"div",6)(9,"div",7),p(10,$e,3,0,"div",8),o(11,"div",9)(12,"button",10),x(13,"app-icon",11),a(),o(14,"textarea",12),h("input",function(c){return r.setDraft(c.target.value)})("keydown",function(c){return r.onKey(c)}),a(),o(15,"button",13),h("click",function(){return r.send()}),x(16,"app-icon",14),a()(),o(17,"div",15)(18,"div",16)(19,"app-pill"),x(20,"app-icon",17),l(21," Opus 4 "),a(),o(22,"span",18),l(23,"single thread \xB7 this project"),a()(),x(24,"span",19),o(25,"span",18),l(26,"Enter to send \xB7 Shift+Enter for newline"),a()()()()(),p(27,De,3,1,"div",20)(28,Ve,36,7,"aside",21),a()),e&2&&(i(5),f(r.messages()),i(2),_(r.thinking()?7:-1),i(3),_(r.showSlash()&&r.filteredSlash().length>0?10:-1),i(3),m("size",15),i(),m("value",r.draft()),i(),m("disabled",!r.draft().trim()),i(),m("size",14),i(4),m("size",10),i(7),_(r.contextCollapsed()?27:28))},dependencies:[q,W,Q,U,G],styles:["[_nghost-%COMP%]{display:flex;flex:1;min-height:0}.chat-page[_ngcontent-%COMP%]{display:flex;flex:1;min-height:0;min-width:0}.chat-col[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;min-width:0;min-height:0}.thread[_ngcontent-%COMP%]{flex:1;padding:20px 24px;overflow-y:auto}.thread-inner[_ngcontent-%COMP%]{max-width:760px;margin:0 auto}.msg-user[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;margin-bottom:18px}.bubble-user[_ngcontent-%COMP%]{max-width:76%;background:var(--bg-elevated);border:1px solid var(--border-subtle);border-radius:12px 12px 4px;padding:9px 13px;font-size:13.5px;line-height:1.55}.msg-assistant[_ngcontent-%COMP%]{margin-bottom:22px}.asst-meta[_ngcontent-%COMP%]{align-items:center;margin-bottom:8px}.asst-logo[_ngcontent-%COMP%]{display:inline-grid;place-items:center;width:22px;height:22px;border-radius:50%;background:var(--accent);color:#fff;font-size:11px;font-weight:700;flex-shrink:0}.asst-body[_ngcontent-%COMP%]{padding-left:30px}.bubble-asst[_ngcontent-%COMP%]{font-size:13.5px;line-height:1.62;color:var(--text-secondary);text-wrap:pretty;margin-bottom:4px}.tool-call[_ngcontent-%COMP%]{border:1px solid var(--border-subtle);border-radius:7px;margin-top:8px;overflow:hidden;background:var(--bg-canvas)}.tool-header[_ngcontent-%COMP%]{width:100%;background:transparent;border:none;cursor:pointer;padding:6px 10px;text-align:left;color:inherit;font-family:var(--font-ui)}.tool-header[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.tool-header[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.tool-output[_ngcontent-%COMP%]{padding:8px 10px 10px 30px;border-top:1px solid var(--border-subtle)}.detail-list[_ngcontent-%COMP%]{margin-top:10px;display:flex;flex-direction:column;gap:6px}.source-detail[_ngcontent-%COMP%]{border:1px solid var(--border-subtle);border-radius:7px;overflow:hidden;background:var(--bg-canvas)}.detail-header[_ngcontent-%COMP%]{width:100%;background:transparent;border:none;cursor:pointer;padding:6px 10px;text-align:left;color:inherit;font-family:var(--font-ui)}.detail-header[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.detail-header[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.detail-body[_ngcontent-%COMP%]{padding:8px 10px 10px;border-top:1px solid var(--border-subtle);display:flex;flex-direction:column;gap:8px}.detail-sig[_ngcontent-%COMP%]{font-size:11.5px;color:var(--node-code);white-space:pre-wrap;word-break:break-word}.detail-src[_ngcontent-%COMP%]{margin:0;padding:8px 10px;font-size:11.5px;line-height:1.5;color:var(--text-secondary);background:var(--bg-base);border:1px solid var(--border-subtle);border-radius:5px;overflow-x:auto;white-space:pre;max-height:320px;overflow-y:auto}.detail-rel-label[_ngcontent-%COMP%]{font-size:10.5px;margin-bottom:3px}.detail-rel-item[_ngcontent-%COMP%]{font-size:11.5px;color:var(--text-secondary);padding:1px 0}.thinking[_ngcontent-%COMP%]{padding-left:30px;font-size:12px}.thinking-dot[_ngcontent-%COMP%]{width:6px;height:6px;border-radius:50%;background:var(--accent);animation:skeleton 1s infinite;flex-shrink:0}.composer[_ngcontent-%COMP%]{padding:12px 24px 18px;border-top:1px solid var(--border-subtle);flex-shrink:0}.composer-inner[_ngcontent-%COMP%]{max-width:760px;margin:0 auto;position:relative}.composer-box[_ngcontent-%COMP%]{align-items:flex-end;background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:12px;padding:8px;gap:8px}.attach-btn[_ngcontent-%COMP%]{padding:7px;flex-shrink:0}.send-btn[_ngcontent-%COMP%]{padding:7px 10px;flex-shrink:0}.composer-ta[_ngcontent-%COMP%]{flex:1;resize:none;background:transparent;border:none;outline:none;color:var(--text-primary);font-size:13.5px;font-family:var(--font-ui);line-height:1.5;padding:5px 2px;max-height:120px}.composer-ta[_ngcontent-%COMP%]::placeholder{color:var(--text-muted)}.composer-footer[_ngcontent-%COMP%]{margin-top:8px;align-items:center}.slash-menu[_ngcontent-%COMP%]{position:absolute;bottom:100%;left:0;margin-bottom:8px;background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:8px;box-shadow:var(--shadow-pop);padding:5px;width:320px;z-index:10}.slash-item[_ngcontent-%COMP%]{width:100%;background:transparent;border:none;cursor:pointer;padding:6px 9px;border-radius:5px;text-align:left;color:inherit;font-family:var(--font-ui)}.slash-item[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.slash-item[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.ctx-collapsed[_ngcontent-%COMP%]{width:40px;flex-shrink:0;border-left:1px solid var(--border-subtle);display:flex;justify-content:center;padding-top:12px}.ctx-panel[_ngcontent-%COMP%]{width:264px;flex-shrink:0;border-left:1px solid var(--border-subtle);background:var(--bg-panel);display:flex;flex-direction:column;min-height:0}.ctx-header[_ngcontent-%COMP%]{padding:11px 13px;border-bottom:1px solid var(--border-subtle);align-items:center}.ctx-body[_ngcontent-%COMP%]{flex:1;padding:13px;overflow-y:auto;min-height:0}.ctx-row[_ngcontent-%COMP%]{padding:5px 0;align-items:flex-start}.ctx-footer[_ngcontent-%COMP%]{padding:12px;border-top:1px solid var(--border-subtle)}.toggle-btn[_ngcontent-%COMP%]{width:30px;height:17px;border-radius:999px;border:none;cursor:pointer;padding:2px;background:var(--bg-elevated);display:flex;justify-content:flex-start;align-items:center;transition:background .12s,justify-content .12s;flex-shrink:0}.toggle-btn.on[_ngcontent-%COMP%]{background:var(--accent);justify-content:flex-end}.toggle-btn[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.toggle-thumb[_ngcontent-%COMP%]{width:13px;height:13px;border-radius:50%;background:#fff;flex-shrink:0}.eyebrow[_ngcontent-%COMP%]{color:var(--text-muted);font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono)}.pill[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;padding:3px 9px;border-radius:999px;line-height:1.4;white-space:nowrap}.grow[_ngcontent-%COMP%]{flex:1}"],changeDetection:0})};export{Y as Chat};
@@ -0,0 +1 @@
1
+ import{E as f}from"./chunk-SYGIPC2P.js";var g="specship.api",w=class i{base;constructor(){this.base=this.resolveBase()}resolveBase(){if(typeof window>"u")return null;try{let e=new URLSearchParams(window.location.search).get("api");if(e){try{window.localStorage.setItem(g,e)}catch{}return e.replace(/\/$/,"")}}catch{}try{let e=window.localStorage.getItem(g);if(e)return e.replace(/\/$/,"")}catch{}let t=window.SPECSHIP_API_URL;if(typeof t=="string")return t.replace(/\/$/,"");let n=window.location.hostname;if(n==="localhost"||n==="127.0.0.1"){let e=window.location.port;return e==="4200"||e==="4201"?"http://localhost:4242":window.location.origin.replace(/\/$/,"")}return null}get apiBase(){return this.base}get isConfigured(){return this.base!==null}async get(t,n){if(!this.base)throw new Error("no API base configured");let e=this.base+(t.startsWith("/")?t:"/"+t),r=await fetch(e,{method:"GET",headers:{Accept:"application/json"},signal:n});if(!r.ok)throw await l("GET",t,r);return r.json()}async post(t,n,e){if(!this.base)throw new Error("no API base configured");let r=this.base+(t.startsWith("/")?t:"/"+t),s=await fetch(r,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:n==null?void 0:JSON.stringify(n),signal:e});if(!s.ok)throw await l("POST",t,s);return s.json()}async put(t,n,e){if(!this.base)throw new Error("no API base configured");let r=this.base+(t.startsWith("/")?t:"/"+t),s=await fetch(r,{method:"PUT",headers:{Accept:"application/json","Content-Type":"application/json"},body:n==null?void 0:JSON.stringify(n),signal:e});if(!s.ok)throw await l("PUT",t,s);return s.json()}openEventStream(t,n,e,r){if(!this.base)return e?.(new Error("no API base configured")),()=>{};let s=this.base+(t.startsWith("/")?t:"/"+t),a=new EventSource(s),h=r??b,d=o=>{try{return JSON.parse(o.data)}catch{return o.data}},p=[];for(let o of h){let c=y=>n(o,d(y));a.addEventListener(o,c),p.push([o,c])}return a.onmessage=o=>n("message",d(o)),a.onerror=o=>{e?.(o)},()=>{for(let[o,c]of p)a.removeEventListener(o,c);a.close()}}static \u0275fac=function(n){return new(n||i)};static \u0275prov=f({token:i,factory:i.\u0275fac,providedIn:"root"})},u=class extends Error{constructor(n,e,r,s,a){super(a);this.status=n;this.code=e;this.path=r;this.payload=s}status;code;path;payload;name="ApiError"};async function l(i,t,n){let e=await n.text().catch(()=>""),r=null,s=null;if(e)try{if(r=JSON.parse(e),r&&typeof r=="object"&&"code"in r){let a=r.code;typeof a=="string"&&(s=a)}}catch{r=e}return new u(n.status,s,t,r,`${i} ${t} \u2192 ${n.status} ${e.slice(0,200)}`)}var b=["run_started","run_completed","run_failed","run_cancelled","run_paused","step_started","step_completed","step_failed","step_skipped","tool_called","artifact_created","approval_requested","approval_granted","approval_rejected","done"];export{w as a,u as b};
@@ -1 +1 @@
1
- import{a as Q}from"./chunk-G7VZT5KB.js";import{a as q}from"./chunk-PZSU53SS.js";import{b as G}from"./chunk-WBJ5VEB5.js";import{a as B,c as V}from"./chunk-DOKZOFKM.js";import{a as L}from"./chunk-PBRCKHEQ.js";import{a as W}from"./chunk-3H2EZLZN.js";import{Aa as p,Ga as M,I as w,Ia as y,Ka as c,M as h,N as C,O,P as N,R as z,Ta as T,Ua as R,Va as s,W as g,Wa as v,X as A,Xa as E,aa as $,ea as r,ka as F,lb as b,qa as P,ra as u,sa as m,va as k,wa as D,xa as f,ya as d,yb as j,za as o,zb as H}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var K=(i,t)=>t.from+t.to,I=(i,t)=>t.id,X=(i,t)=>t.nodeId;function Y(i,t){if(i&1){let e=M();d(0,"button",23),y("click",function(){h(e);let a=c(2);return C(a.cancel())}),p(1,"app-icon",24),s(2," Cancel "),o()}if(i&2){let e=c(2);f("disabled",e.actionPending()!==null),r(),f("size",12)}}function Z(i,t){if(i&1&&(d(0,"span",16),s(1),o(),d(2,"span",17),s(3),o(),p(4,"app-state-pill",18)(5,"span",19),d(6,"span",20),p(7,"app-icon",21),s(8),o(),u(9,Y,3,2,"button",22)),i&2){let e=t,n=c();r(),v(e.workflowName),r(2),v(e.id.slice(0,8)),r(),f("state",e.status)("pulse",e.status==="running"),r(3),f("size",11),r(),E(" ",n.fmtDuration(e.startedAt,e.completedAt)," "),r(),m(e.status==="running"||e.status==="paused"?9:-1)}}function ee(i,t){i&1&&(d(0,"span",25),s(1,"Loading\u2026"),o(),p(2,"span",19))}function te(i,t){if(i&1&&(d(0,"span",26),s(1),o(),p(2,"span",19)),i&2){let e=c();r(),v(e.error())}}function ne(i,t){if(i&1&&(d(0,"div",4),s(1),o()),i&2){let e=c();r(),E("Action failed: ",e.actionError())}}function ie(i,t){i&1&&(d(0,"div",4),s(1),o()),i&2&&(r(),v(t))}function re(i,t){if(i&1){let e=M();d(0,"div",5)(1,"span",27),p(2,"app-icon",28),o(),d(3,"div",19)(4,"div",29),s(5,"Approval required \u2014 review diff before merge"),o(),d(6,"div",30),s(7," Review the artifacts carefully before approving. "),o()(),d(8,"button",31),y("click",function(){h(e);let a=c();return C(a.activeTab.set("artifacts"))}),s(9," Inspect artifacts "),o(),d(10,"button",23),y("click",function(){h(e);let a=c();return C(a.reject())}),s(11," Reject "),o(),d(12,"button",32),y("click",function(){h(e);let a=c();return C(a.approve())}),p(13,"app-icon",33),s(14," Approve "),o()()}if(i&2){let e=c();r(2),f("size",18),r(8),f("disabled",e.actionPending()!==null),r(2),f("disabled",e.actionPending()!==null),r(),f("size",13)}}function ae(i,t){if(i&1&&(O(),p(0,"path",34)),i&2){let e=c(),n=c(2);P("d",n.edgePath(e,t))("stroke",e.status==="completed"?"var(--success)":"rgba(150,160,180,0.4)")("opacity",e.status==="completed"?"0.7":"0.5")}}function oe(i,t){if(i&1&&u(0,ae,1,3,":svg:path",34),i&2){let e,n=c().$implicit,a=c();m((e=a.nodeMap()[n.to])?0:-1,e)}}function de(i,t){if(i&1&&u(0,oe,1,1),i&2){let e,n=t.$implicit,a=c();m((e=a.nodeMap()[n.from])?0:-1,e)}}function se(i,t){i&1&&p(0,"app-icon",37),i&2&&f("size",11)}function le(i,t){i&1&&p(0,"app-icon",38),i&2&&f("size",11)}function ce(i,t){i&1&&p(0,"app-icon",39),i&2&&f("size",10)}function pe(i,t){if(i&1){let e=M();d(0,"div",35),y("click",function(){let a=h(e).$implicit,l=c();return C(l.selectedNode.set(a.id))}),d(1,"span",36),u(2,se,1,1,"app-icon",37)(3,le,1,1,"app-icon",38)(4,ce,1,1,"app-icon",39),o(),d(5,"div",40)(6,"div",41),s(7),o(),d(8,"div",42),s(9),o()()()}if(i&2){let e=t.$implicit,n=c();T("left",e.x/n.DAG_W*100,"%")("top",e.y,"px")("border-color",n.nodeBorderColor(e))("box-shadow",n.nodeBoxShadow(e)),R("rd-node-running",e.status==="running")("rd-node-selected",n.selectedNode()===e.id)("rd-node-pending",e.status==="pending")("rd-node-skipped",e.status==="skipped"),P("aria-label",e.id),r(),T("background",n.nodeDotBg(e))("border",n.nodeDotBorder(e)),R("rd-dot-spin",e.status==="running"),r(),m(e.status==="completed"?2:e.status==="failed"?3:e.status==="paused"?4:-1),r(5),v(e.label),r(2),v(e.kind)}}function ue(i,t){i&1&&(d(0,"span",44),s(1,"live"),o())}function me(i,t){if(i&1){let e=M();d(0,"button",43),y("click",function(){let a=h(e).$implicit,l=c();return C(l.activeTab.set(a.id))}),s(1),u(2,ue,2,0,"span",44),o()}if(i&2){let e=t.$implicit,n=c();R("rd-tab-active",n.activeTab()===e.id),r(),E(" ",e.label," "),r(),m(e.id==="events"&&n.streamStatus()==="live"?2:-1)}}function fe(i,t){if(i&1&&(d(0,"div",45)(1,"span",47),s(2),o(),d(3,"span",48),s(4),o(),d(5,"span",49),s(6),o(),d(7,"span",50),s(8),o()()),i&2){let e=t.$implicit,n=c(2);P("data-event-type",e.eventType),r(2),v(n.fmtTime(e.createdAt)),r(),T("color",n.evColor(e.eventType)),r(),v(e.eventType),r(2),v(n.stepIdOf(e)),r(2),v(n.eventDetail(e))}}function ge(i,t){i&1&&(d(0,"div",46),p(1,"span",51),s(2," streaming\u2026 "),o())}function ve(i,t){if(i&1&&(d(0,"div",14),k(1,fe,9,7,"div",45,I),u(3,ge,3,0,"div",46),o()),i&2){let e=c();r(),D(e.events()),r(2),m(e.streamStatus()==="live"||e.streamStatus()==="connecting"?3:-1)}}function _e(i,t){i&1&&(d(0,"div",52)(1,"div",53),s(2,"Loading artifacts\u2026"),o()())}function xe(i,t){if(i&1&&(d(0,"div",52)(1,"div",53),s(2),o()()),i&2){let e=c(2);r(2),E("Couldn\u2019t load artifacts: ",e.artifactsError())}}function be(i,t){i&1&&(d(0,"div",52)(1,"div",53),s(2,"No artifacts yet \u2014 nodes write their output here as they complete."),o()())}function ye(i,t){if(i&1){let e=M();d(0,"button",57),y("click",function(){let a=h(e).$implicit,l=c(3);return C(l.selectArtifact(a.nodeId))}),p(1,"app-icon",58),d(2,"span",59)(3,"span",60),s(4),o(),d(5,"span",61),s(6),o()()()}if(i&2){let e,n=t.$implicit,a=c(3);R("active",((e=a.selectedArtifact())==null?null:e.nodeId)===n.nodeId),r(),f("size",13),r(3),v(n.name),r(2),v(n.nodeId)}}function he(i,t){if(i&1&&(d(0,"span",64),s(1),o()),i&2){let e=c();r(),v(e.kind)}}function Ce(i,t){if(i&1&&(d(0,"div",62)(1,"span",63),s(2),o(),u(3,he,2,1,"span",64),p(4,"span",19),d(5,"span",65),s(6),o(),p(7,"app-copy-btn",66),o(),p(8,"div",67)),i&2){let e=t,n=c(3);r(2),v(e.name),r(),m(e.kind?3:-1),r(3),v(n.fmtArtifactBytes(e.length)),r(),f("text",e.body),r(),f("innerHTML",n.artifactBodyHtml(),$)}}function we(i,t){if(i&1&&(d(0,"div",52)(1,"div",54),k(2,ye,7,5,"button",55,X),o(),d(4,"div",56),u(5,Ce,9,5),o()()),i&2){let e,n=c(2);r(2),D(n.artifacts()),r(3),m((e=n.selectedArtifact())?5:-1,e)}}function ke(i,t){if(i&1&&u(0,_e,3,0,"div",52)(1,xe,3,1,"div",52)(2,be,3,0,"div",52)(3,we,6,1,"div",52),i&2){let e=c();m(e.artifactsLoading()&&e.artifacts().length===0?0:e.artifactsError()?1:e.artifacts().length===0?2:3)}}function De(i,t){i&1&&(d(0,"div",15)(1,"div",68),p(2,"app-icon",69),d(3,"div",70),s(4,"Cost isn\u2019t tracked for workflow runs yet"),o(),d(5,"div",71),s(6," Per-node and per-run cost require capturing model token-usage as each node executes \u2014 that instrumentation isn\u2019t wired into the workflow engine. The Claude-analytics pages (Sessions, Costs) track cost for interactive sessions today. "),o()()()),i&2&&(r(2),f("size",18))}var Me={step_started:"var(--info)",step_completed:"var(--success)",tool_called:"var(--node-code)",agent_message:"var(--node-spec)",artifact_created:"var(--node-route)",approval_requested:"var(--warn)",run_started:"var(--info)",run_completed:"var(--success)",run_failed:"var(--error)",run_cancelled:"var(--text-muted)",run_paused:"var(--warn)"},U=class i{api=w(W);projects=w(L);route=w(B);router=w(V);destroyRef=w(z);sanitizer=w(j);constructor(){A(()=>{let t=this.events().filter(e=>e.eventType==="step_completed").length;this.activeTab()==="artifacts"&&this.runId()&&t!==this.artifactsFor()&&this.loadArtifacts(t)})}runId=g("");run=g(null);events=g([]);loading=g(!0);error=g(null);streamStatus=g("connecting");actionPending=g(null);actionError=g(null);closeStream=null;status=b(()=>this.run()?.status??null);isTerminal=b(()=>{let t=this.status();return t==="completed"||t==="failed"||t==="cancelled"});approvalPending=b(()=>[...this.events()].reverse().find(e=>e.eventType==="approval_requested"||e.eventType==="approval_granted"||e.eventType==="approval_rejected")?.eventType==="approval_requested");TABS=[{id:"events",label:"Events"},{id:"artifacts",label:"Artifacts"},{id:"cost",label:"Cost"}];activeTab=g("events");artifacts=g([]);artifactsLoading=g(!1);artifactsError=g(null);artifactsFor=g(-1);selectedArtifactId=g("");selectedArtifact=b(()=>{let t=this.artifacts();return t.length?t.find(e=>e.nodeId===this.selectedArtifactId())??t[0]:null});artifactBodyHtml=b(()=>{let t=this.selectedArtifact();return this.sanitizer.bypassSecurityTrustHtml(Q(t?.body??""))});async loadArtifacts(t){let e=this.runId();if(e){this.artifactsFor.set(t),this.artifactsLoading.set(!0),this.artifactsError.set(null);try{let n=await this.api.get(`/api/workflows/runs/${encodeURIComponent(e)}/artifacts${this.projects.projectQuery()}`);this.artifacts.set(n.artifacts??[]),!this.selectedArtifactId()&&n.artifacts?.length&&this.selectedArtifactId.set(n.artifacts[0].nodeId)}catch(n){this.artifactsError.set(n instanceof Error?n.message:String(n)),this.artifactsFor.set(-1)}finally{this.artifactsLoading.set(!1)}}}selectArtifact(t){this.selectedArtifactId.set(t)}fmtArtifactBytes(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} kB`:`${(t/(1024*1024)).toFixed(1)} MB`}DAG_W=920;DAG_H=180;dagNodes=b(()=>{let t=this.run(),e=this.stepStatusMap(),n=t?.metadata?.nodes;if(n?.length){let _=this.layoutCols(n.map(x=>x.id));return n.map((x,S)=>{let J=_[S]??S;return{id:x.id,label:x.id,kind:x.kind??"agent",status:e[x.id]??"pending",x:J*160+20,y:72}})}let a=[...new Set(this.events().map(_=>_.data?.stepId??_.stepId??"").filter(Boolean))];if(!a.length)return[];let l=Math.min(160,(this.DAG_W-40)/Math.max(a.length,1));return a.map((_,x)=>({id:_,label:_,kind:this.events().find(S=>(S.data?.stepId??S.stepId)===_)?.stepKind??"step",status:e[_]??"pending",x:x*l+20,y:72}))});dagEdges=b(()=>{let e=this.run()?.metadata?.edges;if(e?.length)return e;let n=this.dagNodes();return n.slice(0,-1).map((a,l)=>({from:a.id,to:n[l+1].id}))});nodeMap=b(()=>{let t={};for(let e of this.dagNodes())t[e.id]=e;return t});selectedNode=g("");stepStatusMap=b(()=>{let t={};for(let e of this.events()){let n=e.data?.stepId??e.stepId??"";if(n)switch(e.eventType){case"step_started":t[n]="running";break;case"step_completed":t[n]="completed";break;case"step_failed":t[n]="failed";break;case"step_skipped":t[n]="skipped";break}}if(this.status()==="paused")for(let e of Object.keys(t))t[e]==="running"&&(t[e]="paused");return t});ngOnInit(){let t=this.route.snapshot.paramMap.get("id")??"";if(!t){this.error.set("No run id"),this.loading.set(!1);return}this.runId.set(t),this.bootstrap(t)}ngOnDestroy(){this.closeStream?.(),this.closeStream=null}async bootstrap(t){try{let e=await this.api.get(`/api/workflows/runs/${encodeURIComponent(t)}${this.projects.projectQuery()}`);this.run.set(e.run),this.events.set(e.events??[]),this.loading.set(!1),this.isTerminal()?this.streamStatus.set("closed"):this.openStream(t)}catch(e){this.error.set(e instanceof Error?e.message:String(e)),this.loading.set(!1)}}openStream(t){this.streamStatus.set("connecting");let e=this.api.openEventStream(`/api/workflows/runs/${encodeURIComponent(t)}/events${this.projects.projectQuery()}`,(n,a)=>{if(n==="done"){this.streamStatus.set("closed"),this.refreshRun();return}let l=a;!l||typeof l!="object"||l.id==null||(this.streamStatus.set("live"),this.appendEvent(l),n.startsWith("run_")&&this.refreshRun())},()=>{this.streamStatus.set("error")});this.closeStream=e,this.destroyRef.onDestroy(()=>e())}appendEvent(t){this.events.update(e=>{if(e.some(a=>a.id===t.id))return e;let n=[...e,t];return n.sort((a,l)=>a.id-l.id),n})}async refreshRun(){try{let t=this.runId();if(!t)return;let e=await this.api.get(`/api/workflows/runs/${encodeURIComponent(t)}${this.projects.projectQuery()}`);this.run.set(e.run)}catch{}}async approve(){await this.action("approve")}async reject(){let t=prompt("Reason for rejecting?")??void 0;await this.action("reject",t?{reason:t}:void 0)}async cancel(){confirm("Cancel this run?")&&await this.action("cancel")}async resume(){await this.action("resume")}async action(t,e){this.actionPending.set(t),this.actionError.set(null);try{await this.api.post(`/api/workflows/runs/${encodeURIComponent(this.runId())}/${t}${this.projects.projectQuery()}`,e??{}),await this.refreshRun(),(t==="resume"||t==="approve")&&!this.isTerminal()&&!this.closeStream&&this.openStream(this.runId())}catch(n){this.actionError.set(n instanceof Error?n.message:String(n))}finally{this.actionPending.set(null)}}fmtTime(t){return t?new Date(t).toLocaleTimeString():"\u2014"}fmtDuration(t,e){if(!t)return"\u2014";let a=(e??Date.now())-t;return a>=6e4?Math.round(a/6e4)+"m "+Math.round(a%6e4/1e3)+"s":a>=1e3?(a/1e3).toFixed(1)+"s":a+"ms"}eventDetail(t){let e=t.data;if(!e)return"";let n=l=>l.length>200?l.slice(0,200)+"\u2026":l;if(typeof e.error=="string")return e.error;if(typeof e.text=="string")return n(e.text);if(typeof e.name=="string"){let l=typeof e.input=="string"?e.input:"";return n(l?`${e.name} ${l}`:e.name)}let a=e.output;if(typeof a=="string")return n(a);if(a!=null)try{return n(JSON.stringify(a))}catch{return""}return""}stepIdOf(t){return t.data?.stepId??t.stepId??""}evColor(t){return Me[t]??"var(--text-secondary)"}back(){this.router.navigate(["/runs"])}edgePath(t,e){let n=t.x+150,a=t.y+18,l=e.x,_=e.y+18,x=(n+l)/2;return`M ${n} ${a} C ${x} ${a}, ${x} ${_}, ${l} ${_}`}nodeBorderColor(t){return this.selectedNode()===t.id?"var(--accent)":t.status==="pending"||t.status==="skipped"?"var(--border-subtle)":{running:"var(--info)",completed:"var(--success)",failed:"var(--error)",paused:"var(--warn)"}[t.status]??"var(--border-subtle)"}nodeBoxShadow(t){return t.status==="running"?"0 0 0 3px var(--info-soft)":this.selectedNode()===t.id?"0 4px 14px rgba(0,0,0,0.4)":"none"}nodeDotBg(t){return t.status==="completed"?"var(--success)":t.status==="failed"?"var(--error)":t.status==="paused"?"var(--warn)":"transparent"}nodeDotBorder(t){return t.status==="pending"||t.status==="running"||t.status==="skipped"?`1.5px solid ${{pending:"var(--text-muted)",running:"var(--info)",skipped:"var(--text-muted)"}[t.status]}`:"none"}layoutCols(t){return t.map((e,n)=>n)}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=F({type:i,selectors:[["app-run-detail"]],decls:27,vars:10,consts:[[1,"col","rd-root"],[1,"row","gap-10","rd-head"],["type","button",1,"btn","btn-ghost","btn-sm",3,"click"],["name","chevronLeft",3,"size"],[1,"rd-banner","rd-banner-error"],[1,"row","gap-12","rd-approval"],[1,"rd-dag"],["width","100%",1,"rd-dag-svg"],["id","rarrow","viewBox","0 0 10 10","refX","8","refY","5","markerWidth","6","markerHeight","6","orient","auto-start-reverse"],["d","M0 0 L10 5 L0 10 z","fill","rgba(160,170,190,0.6)"],["role","button",1,"rd-node",3,"rd-node-running","rd-node-selected","rd-node-pending","rd-node-skipped","left","top","border-color","box-shadow"],[1,"col","rd-panel"],[1,"row","gap-2","rd-tabs"],["type","button",1,"rd-tab",3,"rd-tab-active"],["aria-live","polite",1,"scroll-y","rd-events"],[1,"rd-cost-wrap"],[1,"mono","rd-wf-name"],[1,"mono","muted",2,"font-size","11.5px"],[3,"state","pulse"],[1,"grow"],[1,"mono","muted","row","gap-4",2,"font-size","11.5px"],["name","clock",3,"size"],["type","button",1,"btn","btn-destructive","btn-sm",3,"disabled"],["type","button",1,"btn","btn-destructive","btn-sm",3,"click","disabled"],["name","cancel",3,"size"],[1,"muted",2,"font-size","12px"],[1,"rd-error"],[2,"color","var(--warn)","flex-shrink","0"],["name","pause",3,"size"],[2,"font-weight","600","font-size","13px"],[1,"secondary",2,"font-size","12px","margin-top","1px"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["type","button",1,"btn","btn-primary","btn-sm",3,"click","disabled"],["name","check",3,"size"],["fill","none","stroke-width","1.6","marker-end","url(#rarrow)"],["role","button",1,"rd-node",3,"click"],[1,"rd-node-dot"],["name","check",2,"color","#fff",3,"size"],["name","x",2,"color","#fff",3,"size"],["name","pause",2,"color","#fff",3,"size"],[1,"grow",2,"min-width","0"],[1,"rd-node-label"],[1,"mono","muted","rd-node-type"],["type","button",1,"rd-tab",3,"click"],[1,"pill","rd-live-pill"],[1,"row","gap-10","rd-event-row"],[1,"row","gap-6","muted",2,"padding","6px 0"],[1,"muted","tabular","rd-event-time"],[1,"rd-event-kind"],[1,"muted","rd-event-node"],[1,"secondary","rd-event-text"],[1,"rd-stream-dot"],[1,"rd-artifacts"],[1,"muted","rd-art-empty"],[1,"rd-art-list"],["type","button",1,"rd-art-item",3,"active"],[1,"rd-art-body","scroll-y"],["type","button",1,"rd-art-item",3,"click"],["name","box",2,"color","var(--node-route)","flex-shrink","0",3,"size"],[1,"rd-art-meta"],[1,"mono","rd-art-name"],[1,"muted","rd-art-node"],[1,"row","gap-8","rd-art-bodyhead"],[1,"mono","rd-art-bodyname"],[1,"pill","rd-art-kind"],[1,"mono","muted","rd-art-bytes"],[3,"text"],[1,"md-content","rd-art-md",3,"innerHTML"],[1,"rd-cost-empty"],["name","dollar",2,"color","var(--text-muted)",3,"size"],[1,"rd-cost-empty-title"],[1,"muted","rd-cost-empty-body"]],template:function(e,n){if(e&1&&(d(0,"div",0)(1,"div",1)(2,"button",2),y("click",function(){return n.back()}),p(3,"app-icon",3),s(4," Runs "),o(),u(5,Z,10,7)(6,ee,3,0)(7,te,3,1),o(),u(8,ne,2,1,"div",4),u(9,ie,2,1,"div",4),u(10,re,15,4,"div",5),d(11,"div",6),O(),d(12,"svg",7)(13,"defs")(14,"marker",8),p(15,"path",9),o()(),k(16,de,1,1,null,null,K),o(),k(18,pe,10,26,"div",10,I),o(),N(),d(20,"div",11)(21,"div",12),k(22,me,3,4,"button",13,I),o(),u(24,ve,4,1,"div",14),u(25,ke,4,1),u(26,De,7,1,"div",15),o()()),e&2){let a,l;r(3),f("size",14),r(2),m((a=n.run())?5:n.loading()?6:n.error()?7:-1,a),r(3),m(n.actionError()?8:-1),r(),m((l=(l=n.run())==null?null:l.errorMessage)?9:-1,l),r(),m(n.approvalPending()?10:-1),r(2),P("height",n.DAG_H)("viewBox","0 0 "+n.DAG_W+" "+n.DAG_H),r(4),D(n.dagEdges()),r(2),D(n.dagNodes()),r(4),D(n.TABS),r(2),m(n.activeTab()==="events"?24:-1),r(),m(n.activeTab()==="artifacts"?25:-1),r(),m(n.activeTab()==="cost"?26:-1)}},dependencies:[G,q,H],styles:["[_nghost-%COMP%]{display:contents}.rd-root[_ngcontent-%COMP%]{flex:1;min-height:0}.rd-head[_ngcontent-%COMP%]{padding:12px 16px;border-bottom:1px solid var(--border-subtle);flex-shrink:0}.rd-wf-name[_ngcontent-%COMP%]{font-weight:600;font-size:14px}.rd-error[_ngcontent-%COMP%]{color:var(--error);font-size:12px}.rd-banner[_ngcontent-%COMP%]{padding:10px 16px;font-size:12.5px;flex-shrink:0}.rd-banner-error[_ngcontent-%COMP%]{background:var(--error-soft);color:var(--error);border-bottom:1px solid color-mix(in srgb,var(--error) 30%,transparent)}.rd-approval[_ngcontent-%COMP%]{padding:12px 16px;background:var(--warn-soft);border-bottom:1px solid rgba(229,165,10,.3);flex-shrink:0}.rd-dag[_ngcontent-%COMP%]{position:relative;height:180px;background:var(--bg-canvas-2, var(--bg-canvas));background-image:radial-gradient(circle,var(--dot-grid, rgba(255, 255, 255, .07)) 1px,transparent 1px);background-size:20px 20px;border-bottom:1px solid var(--border-subtle);overflow:hidden;flex-shrink:0}.rd-dag-svg[_ngcontent-%COMP%]{position:absolute;inset:0;pointer-events:none}.rd-node[_ngcontent-%COMP%]{position:absolute;width:150px;height:36px;display:flex;align-items:center;gap:8px;padding:0 11px;border-radius:8px;background:var(--bg-panel);border:1.5px solid var(--border-subtle);cursor:pointer;transition:border-color .12s,box-shadow .12s}.rd-node[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.rd-node-running[_ngcontent-%COMP%]{background:var(--info-soft)}.rd-node-pending[_ngcontent-%COMP%]{opacity:.6}.rd-node-skipped[_ngcontent-%COMP%]{border-style:dotted}.rd-node-dot[_ngcontent-%COMP%]{width:18px;height:18px;border-radius:50%;display:grid;place-items:center;flex-shrink:0}.rd-dot-spin[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_rd-spin 1.4s linear infinite;border-top-color:transparent!important}@keyframes _ngcontent-%COMP%_rd-spin{to{transform:rotate(360deg)}}.rd-node-label[_ngcontent-%COMP%]{font-size:12px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rd-node-type[_ngcontent-%COMP%]{font-size:9px}.rd-panel[_ngcontent-%COMP%]{flex:1;min-height:0}.rd-tabs[_ngcontent-%COMP%]{padding:8px 14px 0;border-bottom:1px solid var(--border-subtle);flex-shrink:0}.rd-tab[_ngcontent-%COMP%]{padding:7px 13px;border:none;background:transparent;cursor:pointer;font-size:12.5px;font-weight:500;font-family:var(--font-ui);text-transform:capitalize;color:var(--text-muted);border-bottom:2px solid transparent;margin-bottom:-1px;display:inline-flex;align-items:center;gap:6px;transition:color .1s}.rd-tab[_ngcontent-%COMP%]:hover{color:var(--text-secondary)}.rd-tab-active[_ngcontent-%COMP%]{color:var(--text-primary);border-bottom-color:var(--accent)}.rd-live-pill[_ngcontent-%COMP%]{font-size:9px;background:var(--info-soft);color:var(--info)}.rd-events[_ngcontent-%COMP%]{flex:1;padding:8px 14px;font-family:var(--font-mono);font-size:11.5px;min-height:0}.rd-event-row[_ngcontent-%COMP%]{padding:4px 0;border-bottom:1px solid rgba(255,255,255,.03)}.rd-event-time[_ngcontent-%COMP%]{flex-shrink:0;width:80px;font-size:11px}.rd-event-kind[_ngcontent-%COMP%]{width:132px;flex-shrink:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rd-event-node[_ngcontent-%COMP%]{flex-shrink:0;width:80px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px}.rd-event-text[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.rd-stream-dot[_ngcontent-%COMP%]{width:6px;height:6px;border-radius:50%;background:var(--info);animation:_ngcontent-%COMP%_rd-pulse 1s infinite}@keyframes _ngcontent-%COMP%_rd-pulse{0%,to{opacity:1}50%{opacity:.3}}.rd-artifacts[_ngcontent-%COMP%]{flex:1;min-height:0;display:flex}.rd-art-empty[_ngcontent-%COMP%]{margin:auto;padding:40px;text-align:center;font-size:12.5px}.rd-art-list[_ngcontent-%COMP%]{width:180px;flex-shrink:0;border-right:1px solid var(--border-subtle);padding:8px;overflow-y:auto;display:flex;flex-direction:column;gap:2px}.rd-art-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;width:100%;padding:7px 9px;border-radius:6px;background:transparent;border:0;cursor:pointer;text-align:left;color:inherit}.rd-art-item[_ngcontent-%COMP%]:hover, .rd-art-item.active[_ngcontent-%COMP%]{background:var(--bg-hover)}.rd-art-item[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.rd-art-meta[_ngcontent-%COMP%]{min-width:0;display:flex;flex-direction:column}.rd-art-name[_ngcontent-%COMP%]{font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rd-art-node[_ngcontent-%COMP%]{font-size:9.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rd-art-body[_ngcontent-%COMP%]{flex:1;min-width:0;padding:14px 16px}.rd-art-bodyhead[_ngcontent-%COMP%]{align-items:center;margin-bottom:10px}.rd-art-bodyname[_ngcontent-%COMP%]{font-size:12.5px;font-weight:600}.rd-art-kind[_ngcontent-%COMP%]{font-size:10px;color:var(--text-secondary);background:var(--bg-canvas);border:1px solid var(--border-subtle)}.rd-art-bytes[_ngcontent-%COMP%]{font-size:10.5px}.rd-art-md[_ngcontent-%COMP%]{font-size:12.5px;line-height:1.65}.rd-cost-wrap[_ngcontent-%COMP%]{flex:1;min-height:0;display:flex;padding:16px}.rd-cost-empty[_ngcontent-%COMP%]{margin:auto;max-width:420px;text-align:center;display:flex;flex-direction:column;align-items:center;gap:8px}.rd-cost-empty-title[_ngcontent-%COMP%]{font-size:13px;font-weight:600}.rd-cost-empty-body[_ngcontent-%COMP%]{font-size:12px;line-height:1.55}"],changeDetection:0})};export{U as RunDetail};
1
+ import{a as Q}from"./chunk-G7VZT5KB.js";import{a as q}from"./chunk-PZSU53SS.js";import{b as G}from"./chunk-WBJ5VEB5.js";import{a as B,c as V}from"./chunk-DOKZOFKM.js";import{a as L}from"./chunk-JGDK6YKG.js";import{a as W}from"./chunk-TWVVIWKO.js";import{Aa as p,Ga as M,I as w,Ia as y,Ka as c,M as h,N as C,O,P as N,R as z,Ta as T,Ua as R,Va as s,W as g,Wa as v,X as A,Xa as E,aa as $,ea as r,ka as F,lb as b,qa as P,ra as u,sa as m,va as k,wa as D,xa as f,ya as d,yb as j,za as o,zb as H}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var K=(i,t)=>t.from+t.to,I=(i,t)=>t.id,X=(i,t)=>t.nodeId;function Y(i,t){if(i&1){let e=M();d(0,"button",23),y("click",function(){h(e);let a=c(2);return C(a.cancel())}),p(1,"app-icon",24),s(2," Cancel "),o()}if(i&2){let e=c(2);f("disabled",e.actionPending()!==null),r(),f("size",12)}}function Z(i,t){if(i&1&&(d(0,"span",16),s(1),o(),d(2,"span",17),s(3),o(),p(4,"app-state-pill",18)(5,"span",19),d(6,"span",20),p(7,"app-icon",21),s(8),o(),u(9,Y,3,2,"button",22)),i&2){let e=t,n=c();r(),v(e.workflowName),r(2),v(e.id.slice(0,8)),r(),f("state",e.status)("pulse",e.status==="running"),r(3),f("size",11),r(),E(" ",n.fmtDuration(e.startedAt,e.completedAt)," "),r(),m(e.status==="running"||e.status==="paused"?9:-1)}}function ee(i,t){i&1&&(d(0,"span",25),s(1,"Loading\u2026"),o(),p(2,"span",19))}function te(i,t){if(i&1&&(d(0,"span",26),s(1),o(),p(2,"span",19)),i&2){let e=c();r(),v(e.error())}}function ne(i,t){if(i&1&&(d(0,"div",4),s(1),o()),i&2){let e=c();r(),E("Action failed: ",e.actionError())}}function ie(i,t){i&1&&(d(0,"div",4),s(1),o()),i&2&&(r(),v(t))}function re(i,t){if(i&1){let e=M();d(0,"div",5)(1,"span",27),p(2,"app-icon",28),o(),d(3,"div",19)(4,"div",29),s(5,"Approval required \u2014 review diff before merge"),o(),d(6,"div",30),s(7," Review the artifacts carefully before approving. "),o()(),d(8,"button",31),y("click",function(){h(e);let a=c();return C(a.activeTab.set("artifacts"))}),s(9," Inspect artifacts "),o(),d(10,"button",23),y("click",function(){h(e);let a=c();return C(a.reject())}),s(11," Reject "),o(),d(12,"button",32),y("click",function(){h(e);let a=c();return C(a.approve())}),p(13,"app-icon",33),s(14," Approve "),o()()}if(i&2){let e=c();r(2),f("size",18),r(8),f("disabled",e.actionPending()!==null),r(2),f("disabled",e.actionPending()!==null),r(),f("size",13)}}function ae(i,t){if(i&1&&(O(),p(0,"path",34)),i&2){let e=c(),n=c(2);P("d",n.edgePath(e,t))("stroke",e.status==="completed"?"var(--success)":"rgba(150,160,180,0.4)")("opacity",e.status==="completed"?"0.7":"0.5")}}function oe(i,t){if(i&1&&u(0,ae,1,3,":svg:path",34),i&2){let e,n=c().$implicit,a=c();m((e=a.nodeMap()[n.to])?0:-1,e)}}function de(i,t){if(i&1&&u(0,oe,1,1),i&2){let e,n=t.$implicit,a=c();m((e=a.nodeMap()[n.from])?0:-1,e)}}function se(i,t){i&1&&p(0,"app-icon",37),i&2&&f("size",11)}function le(i,t){i&1&&p(0,"app-icon",38),i&2&&f("size",11)}function ce(i,t){i&1&&p(0,"app-icon",39),i&2&&f("size",10)}function pe(i,t){if(i&1){let e=M();d(0,"div",35),y("click",function(){let a=h(e).$implicit,l=c();return C(l.selectedNode.set(a.id))}),d(1,"span",36),u(2,se,1,1,"app-icon",37)(3,le,1,1,"app-icon",38)(4,ce,1,1,"app-icon",39),o(),d(5,"div",40)(6,"div",41),s(7),o(),d(8,"div",42),s(9),o()()()}if(i&2){let e=t.$implicit,n=c();T("left",e.x/n.DAG_W*100,"%")("top",e.y,"px")("border-color",n.nodeBorderColor(e))("box-shadow",n.nodeBoxShadow(e)),R("rd-node-running",e.status==="running")("rd-node-selected",n.selectedNode()===e.id)("rd-node-pending",e.status==="pending")("rd-node-skipped",e.status==="skipped"),P("aria-label",e.id),r(),T("background",n.nodeDotBg(e))("border",n.nodeDotBorder(e)),R("rd-dot-spin",e.status==="running"),r(),m(e.status==="completed"?2:e.status==="failed"?3:e.status==="paused"?4:-1),r(5),v(e.label),r(2),v(e.kind)}}function ue(i,t){i&1&&(d(0,"span",44),s(1,"live"),o())}function me(i,t){if(i&1){let e=M();d(0,"button",43),y("click",function(){let a=h(e).$implicit,l=c();return C(l.activeTab.set(a.id))}),s(1),u(2,ue,2,0,"span",44),o()}if(i&2){let e=t.$implicit,n=c();R("rd-tab-active",n.activeTab()===e.id),r(),E(" ",e.label," "),r(),m(e.id==="events"&&n.streamStatus()==="live"?2:-1)}}function fe(i,t){if(i&1&&(d(0,"div",45)(1,"span",47),s(2),o(),d(3,"span",48),s(4),o(),d(5,"span",49),s(6),o(),d(7,"span",50),s(8),o()()),i&2){let e=t.$implicit,n=c(2);P("data-event-type",e.eventType),r(2),v(n.fmtTime(e.createdAt)),r(),T("color",n.evColor(e.eventType)),r(),v(e.eventType),r(2),v(n.stepIdOf(e)),r(2),v(n.eventDetail(e))}}function ge(i,t){i&1&&(d(0,"div",46),p(1,"span",51),s(2," streaming\u2026 "),o())}function ve(i,t){if(i&1&&(d(0,"div",14),k(1,fe,9,7,"div",45,I),u(3,ge,3,0,"div",46),o()),i&2){let e=c();r(),D(e.events()),r(2),m(e.streamStatus()==="live"||e.streamStatus()==="connecting"?3:-1)}}function _e(i,t){i&1&&(d(0,"div",52)(1,"div",53),s(2,"Loading artifacts\u2026"),o()())}function xe(i,t){if(i&1&&(d(0,"div",52)(1,"div",53),s(2),o()()),i&2){let e=c(2);r(2),E("Couldn\u2019t load artifacts: ",e.artifactsError())}}function be(i,t){i&1&&(d(0,"div",52)(1,"div",53),s(2,"No artifacts yet \u2014 nodes write their output here as they complete."),o()())}function ye(i,t){if(i&1){let e=M();d(0,"button",57),y("click",function(){let a=h(e).$implicit,l=c(3);return C(l.selectArtifact(a.nodeId))}),p(1,"app-icon",58),d(2,"span",59)(3,"span",60),s(4),o(),d(5,"span",61),s(6),o()()()}if(i&2){let e,n=t.$implicit,a=c(3);R("active",((e=a.selectedArtifact())==null?null:e.nodeId)===n.nodeId),r(),f("size",13),r(3),v(n.name),r(2),v(n.nodeId)}}function he(i,t){if(i&1&&(d(0,"span",64),s(1),o()),i&2){let e=c();r(),v(e.kind)}}function Ce(i,t){if(i&1&&(d(0,"div",62)(1,"span",63),s(2),o(),u(3,he,2,1,"span",64),p(4,"span",19),d(5,"span",65),s(6),o(),p(7,"app-copy-btn",66),o(),p(8,"div",67)),i&2){let e=t,n=c(3);r(2),v(e.name),r(),m(e.kind?3:-1),r(3),v(n.fmtArtifactBytes(e.length)),r(),f("text",e.body),r(),f("innerHTML",n.artifactBodyHtml(),$)}}function we(i,t){if(i&1&&(d(0,"div",52)(1,"div",54),k(2,ye,7,5,"button",55,X),o(),d(4,"div",56),u(5,Ce,9,5),o()()),i&2){let e,n=c(2);r(2),D(n.artifacts()),r(3),m((e=n.selectedArtifact())?5:-1,e)}}function ke(i,t){if(i&1&&u(0,_e,3,0,"div",52)(1,xe,3,1,"div",52)(2,be,3,0,"div",52)(3,we,6,1,"div",52),i&2){let e=c();m(e.artifactsLoading()&&e.artifacts().length===0?0:e.artifactsError()?1:e.artifacts().length===0?2:3)}}function De(i,t){i&1&&(d(0,"div",15)(1,"div",68),p(2,"app-icon",69),d(3,"div",70),s(4,"Cost isn\u2019t tracked for workflow runs yet"),o(),d(5,"div",71),s(6," Per-node and per-run cost require capturing model token-usage as each node executes \u2014 that instrumentation isn\u2019t wired into the workflow engine. The Claude-analytics pages (Sessions, Costs) track cost for interactive sessions today. "),o()()()),i&2&&(r(2),f("size",18))}var Me={step_started:"var(--info)",step_completed:"var(--success)",tool_called:"var(--node-code)",agent_message:"var(--node-spec)",artifact_created:"var(--node-route)",approval_requested:"var(--warn)",run_started:"var(--info)",run_completed:"var(--success)",run_failed:"var(--error)",run_cancelled:"var(--text-muted)",run_paused:"var(--warn)"},U=class i{api=w(W);projects=w(L);route=w(B);router=w(V);destroyRef=w(z);sanitizer=w(j);constructor(){A(()=>{let t=this.events().filter(e=>e.eventType==="step_completed").length;this.activeTab()==="artifacts"&&this.runId()&&t!==this.artifactsFor()&&this.loadArtifacts(t)})}runId=g("");run=g(null);events=g([]);loading=g(!0);error=g(null);streamStatus=g("connecting");actionPending=g(null);actionError=g(null);closeStream=null;status=b(()=>this.run()?.status??null);isTerminal=b(()=>{let t=this.status();return t==="completed"||t==="failed"||t==="cancelled"});approvalPending=b(()=>[...this.events()].reverse().find(e=>e.eventType==="approval_requested"||e.eventType==="approval_granted"||e.eventType==="approval_rejected")?.eventType==="approval_requested");TABS=[{id:"events",label:"Events"},{id:"artifacts",label:"Artifacts"},{id:"cost",label:"Cost"}];activeTab=g("events");artifacts=g([]);artifactsLoading=g(!1);artifactsError=g(null);artifactsFor=g(-1);selectedArtifactId=g("");selectedArtifact=b(()=>{let t=this.artifacts();return t.length?t.find(e=>e.nodeId===this.selectedArtifactId())??t[0]:null});artifactBodyHtml=b(()=>{let t=this.selectedArtifact();return this.sanitizer.bypassSecurityTrustHtml(Q(t?.body??""))});async loadArtifacts(t){let e=this.runId();if(e){this.artifactsFor.set(t),this.artifactsLoading.set(!0),this.artifactsError.set(null);try{let n=await this.api.get(`/api/workflows/runs/${encodeURIComponent(e)}/artifacts${this.projects.projectQuery()}`);this.artifacts.set(n.artifacts??[]),!this.selectedArtifactId()&&n.artifacts?.length&&this.selectedArtifactId.set(n.artifacts[0].nodeId)}catch(n){this.artifactsError.set(n instanceof Error?n.message:String(n)),this.artifactsFor.set(-1)}finally{this.artifactsLoading.set(!1)}}}selectArtifact(t){this.selectedArtifactId.set(t)}fmtArtifactBytes(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} kB`:`${(t/(1024*1024)).toFixed(1)} MB`}DAG_W=920;DAG_H=180;dagNodes=b(()=>{let t=this.run(),e=this.stepStatusMap(),n=t?.metadata?.nodes;if(n?.length){let _=this.layoutCols(n.map(x=>x.id));return n.map((x,S)=>{let J=_[S]??S;return{id:x.id,label:x.id,kind:x.kind??"agent",status:e[x.id]??"pending",x:J*160+20,y:72}})}let a=[...new Set(this.events().map(_=>_.data?.stepId??_.stepId??"").filter(Boolean))];if(!a.length)return[];let l=Math.min(160,(this.DAG_W-40)/Math.max(a.length,1));return a.map((_,x)=>({id:_,label:_,kind:this.events().find(S=>(S.data?.stepId??S.stepId)===_)?.stepKind??"step",status:e[_]??"pending",x:x*l+20,y:72}))});dagEdges=b(()=>{let e=this.run()?.metadata?.edges;if(e?.length)return e;let n=this.dagNodes();return n.slice(0,-1).map((a,l)=>({from:a.id,to:n[l+1].id}))});nodeMap=b(()=>{let t={};for(let e of this.dagNodes())t[e.id]=e;return t});selectedNode=g("");stepStatusMap=b(()=>{let t={};for(let e of this.events()){let n=e.data?.stepId??e.stepId??"";if(n)switch(e.eventType){case"step_started":t[n]="running";break;case"step_completed":t[n]="completed";break;case"step_failed":t[n]="failed";break;case"step_skipped":t[n]="skipped";break}}if(this.status()==="paused")for(let e of Object.keys(t))t[e]==="running"&&(t[e]="paused");return t});ngOnInit(){let t=this.route.snapshot.paramMap.get("id")??"";if(!t){this.error.set("No run id"),this.loading.set(!1);return}this.runId.set(t),this.bootstrap(t)}ngOnDestroy(){this.closeStream?.(),this.closeStream=null}async bootstrap(t){try{let e=await this.api.get(`/api/workflows/runs/${encodeURIComponent(t)}${this.projects.projectQuery()}`);this.run.set(e.run),this.events.set(e.events??[]),this.loading.set(!1),this.isTerminal()?this.streamStatus.set("closed"):this.openStream(t)}catch(e){this.error.set(e instanceof Error?e.message:String(e)),this.loading.set(!1)}}openStream(t){this.streamStatus.set("connecting");let e=this.api.openEventStream(`/api/workflows/runs/${encodeURIComponent(t)}/events${this.projects.projectQuery()}`,(n,a)=>{if(n==="done"){this.streamStatus.set("closed"),this.refreshRun();return}let l=a;!l||typeof l!="object"||l.id==null||(this.streamStatus.set("live"),this.appendEvent(l),n.startsWith("run_")&&this.refreshRun())},()=>{this.streamStatus.set("error")});this.closeStream=e,this.destroyRef.onDestroy(()=>e())}appendEvent(t){this.events.update(e=>{if(e.some(a=>a.id===t.id))return e;let n=[...e,t];return n.sort((a,l)=>a.id-l.id),n})}async refreshRun(){try{let t=this.runId();if(!t)return;let e=await this.api.get(`/api/workflows/runs/${encodeURIComponent(t)}${this.projects.projectQuery()}`);this.run.set(e.run)}catch{}}async approve(){await this.action("approve")}async reject(){let t=prompt("Reason for rejecting?")??void 0;await this.action("reject",t?{reason:t}:void 0)}async cancel(){confirm("Cancel this run?")&&await this.action("cancel")}async resume(){await this.action("resume")}async action(t,e){this.actionPending.set(t),this.actionError.set(null);try{await this.api.post(`/api/workflows/runs/${encodeURIComponent(this.runId())}/${t}${this.projects.projectQuery()}`,e??{}),await this.refreshRun(),(t==="resume"||t==="approve")&&!this.isTerminal()&&!this.closeStream&&this.openStream(this.runId())}catch(n){this.actionError.set(n instanceof Error?n.message:String(n))}finally{this.actionPending.set(null)}}fmtTime(t){return t?new Date(t).toLocaleTimeString():"\u2014"}fmtDuration(t,e){if(!t)return"\u2014";let a=(e??Date.now())-t;return a>=6e4?Math.round(a/6e4)+"m "+Math.round(a%6e4/1e3)+"s":a>=1e3?(a/1e3).toFixed(1)+"s":a+"ms"}eventDetail(t){let e=t.data;if(!e)return"";let n=l=>l.length>200?l.slice(0,200)+"\u2026":l;if(typeof e.error=="string")return e.error;if(typeof e.text=="string")return n(e.text);if(typeof e.name=="string"){let l=typeof e.input=="string"?e.input:"";return n(l?`${e.name} ${l}`:e.name)}let a=e.output;if(typeof a=="string")return n(a);if(a!=null)try{return n(JSON.stringify(a))}catch{return""}return""}stepIdOf(t){return t.data?.stepId??t.stepId??""}evColor(t){return Me[t]??"var(--text-secondary)"}back(){this.router.navigate(["/runs"])}edgePath(t,e){let n=t.x+150,a=t.y+18,l=e.x,_=e.y+18,x=(n+l)/2;return`M ${n} ${a} C ${x} ${a}, ${x} ${_}, ${l} ${_}`}nodeBorderColor(t){return this.selectedNode()===t.id?"var(--accent)":t.status==="pending"||t.status==="skipped"?"var(--border-subtle)":{running:"var(--info)",completed:"var(--success)",failed:"var(--error)",paused:"var(--warn)"}[t.status]??"var(--border-subtle)"}nodeBoxShadow(t){return t.status==="running"?"0 0 0 3px var(--info-soft)":this.selectedNode()===t.id?"0 4px 14px rgba(0,0,0,0.4)":"none"}nodeDotBg(t){return t.status==="completed"?"var(--success)":t.status==="failed"?"var(--error)":t.status==="paused"?"var(--warn)":"transparent"}nodeDotBorder(t){return t.status==="pending"||t.status==="running"||t.status==="skipped"?`1.5px solid ${{pending:"var(--text-muted)",running:"var(--info)",skipped:"var(--text-muted)"}[t.status]}`:"none"}layoutCols(t){return t.map((e,n)=>n)}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=F({type:i,selectors:[["app-run-detail"]],decls:27,vars:10,consts:[[1,"col","rd-root"],[1,"row","gap-10","rd-head"],["type","button",1,"btn","btn-ghost","btn-sm",3,"click"],["name","chevronLeft",3,"size"],[1,"rd-banner","rd-banner-error"],[1,"row","gap-12","rd-approval"],[1,"rd-dag"],["width","100%",1,"rd-dag-svg"],["id","rarrow","viewBox","0 0 10 10","refX","8","refY","5","markerWidth","6","markerHeight","6","orient","auto-start-reverse"],["d","M0 0 L10 5 L0 10 z","fill","rgba(160,170,190,0.6)"],["role","button",1,"rd-node",3,"rd-node-running","rd-node-selected","rd-node-pending","rd-node-skipped","left","top","border-color","box-shadow"],[1,"col","rd-panel"],[1,"row","gap-2","rd-tabs"],["type","button",1,"rd-tab",3,"rd-tab-active"],["aria-live","polite",1,"scroll-y","rd-events"],[1,"rd-cost-wrap"],[1,"mono","rd-wf-name"],[1,"mono","muted",2,"font-size","11.5px"],[3,"state","pulse"],[1,"grow"],[1,"mono","muted","row","gap-4",2,"font-size","11.5px"],["name","clock",3,"size"],["type","button",1,"btn","btn-destructive","btn-sm",3,"disabled"],["type","button",1,"btn","btn-destructive","btn-sm",3,"click","disabled"],["name","cancel",3,"size"],[1,"muted",2,"font-size","12px"],[1,"rd-error"],[2,"color","var(--warn)","flex-shrink","0"],["name","pause",3,"size"],[2,"font-weight","600","font-size","13px"],[1,"secondary",2,"font-size","12px","margin-top","1px"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["type","button",1,"btn","btn-primary","btn-sm",3,"click","disabled"],["name","check",3,"size"],["fill","none","stroke-width","1.6","marker-end","url(#rarrow)"],["role","button",1,"rd-node",3,"click"],[1,"rd-node-dot"],["name","check",2,"color","#fff",3,"size"],["name","x",2,"color","#fff",3,"size"],["name","pause",2,"color","#fff",3,"size"],[1,"grow",2,"min-width","0"],[1,"rd-node-label"],[1,"mono","muted","rd-node-type"],["type","button",1,"rd-tab",3,"click"],[1,"pill","rd-live-pill"],[1,"row","gap-10","rd-event-row"],[1,"row","gap-6","muted",2,"padding","6px 0"],[1,"muted","tabular","rd-event-time"],[1,"rd-event-kind"],[1,"muted","rd-event-node"],[1,"secondary","rd-event-text"],[1,"rd-stream-dot"],[1,"rd-artifacts"],[1,"muted","rd-art-empty"],[1,"rd-art-list"],["type","button",1,"rd-art-item",3,"active"],[1,"rd-art-body","scroll-y"],["type","button",1,"rd-art-item",3,"click"],["name","box",2,"color","var(--node-route)","flex-shrink","0",3,"size"],[1,"rd-art-meta"],[1,"mono","rd-art-name"],[1,"muted","rd-art-node"],[1,"row","gap-8","rd-art-bodyhead"],[1,"mono","rd-art-bodyname"],[1,"pill","rd-art-kind"],[1,"mono","muted","rd-art-bytes"],[3,"text"],[1,"md-content","rd-art-md",3,"innerHTML"],[1,"rd-cost-empty"],["name","dollar",2,"color","var(--text-muted)",3,"size"],[1,"rd-cost-empty-title"],[1,"muted","rd-cost-empty-body"]],template:function(e,n){if(e&1&&(d(0,"div",0)(1,"div",1)(2,"button",2),y("click",function(){return n.back()}),p(3,"app-icon",3),s(4," Runs "),o(),u(5,Z,10,7)(6,ee,3,0)(7,te,3,1),o(),u(8,ne,2,1,"div",4),u(9,ie,2,1,"div",4),u(10,re,15,4,"div",5),d(11,"div",6),O(),d(12,"svg",7)(13,"defs")(14,"marker",8),p(15,"path",9),o()(),k(16,de,1,1,null,null,K),o(),k(18,pe,10,26,"div",10,I),o(),N(),d(20,"div",11)(21,"div",12),k(22,me,3,4,"button",13,I),o(),u(24,ve,4,1,"div",14),u(25,ke,4,1),u(26,De,7,1,"div",15),o()()),e&2){let a,l;r(3),f("size",14),r(2),m((a=n.run())?5:n.loading()?6:n.error()?7:-1,a),r(3),m(n.actionError()?8:-1),r(),m((l=(l=n.run())==null?null:l.errorMessage)?9:-1,l),r(),m(n.approvalPending()?10:-1),r(2),P("height",n.DAG_H)("viewBox","0 0 "+n.DAG_W+" "+n.DAG_H),r(4),D(n.dagEdges()),r(2),D(n.dagNodes()),r(4),D(n.TABS),r(2),m(n.activeTab()==="events"?24:-1),r(),m(n.activeTab()==="artifacts"?25:-1),r(),m(n.activeTab()==="cost"?26:-1)}},dependencies:[G,q,H],styles:["[_nghost-%COMP%]{display:contents}.rd-root[_ngcontent-%COMP%]{flex:1;min-height:0}.rd-head[_ngcontent-%COMP%]{padding:12px 16px;border-bottom:1px solid var(--border-subtle);flex-shrink:0}.rd-wf-name[_ngcontent-%COMP%]{font-weight:600;font-size:14px}.rd-error[_ngcontent-%COMP%]{color:var(--error);font-size:12px}.rd-banner[_ngcontent-%COMP%]{padding:10px 16px;font-size:12.5px;flex-shrink:0}.rd-banner-error[_ngcontent-%COMP%]{background:var(--error-soft);color:var(--error);border-bottom:1px solid color-mix(in srgb,var(--error) 30%,transparent)}.rd-approval[_ngcontent-%COMP%]{padding:12px 16px;background:var(--warn-soft);border-bottom:1px solid rgba(229,165,10,.3);flex-shrink:0}.rd-dag[_ngcontent-%COMP%]{position:relative;height:180px;background:var(--bg-canvas-2, var(--bg-canvas));background-image:radial-gradient(circle,var(--dot-grid, rgba(255, 255, 255, .07)) 1px,transparent 1px);background-size:20px 20px;border-bottom:1px solid var(--border-subtle);overflow:hidden;flex-shrink:0}.rd-dag-svg[_ngcontent-%COMP%]{position:absolute;inset:0;pointer-events:none}.rd-node[_ngcontent-%COMP%]{position:absolute;width:150px;height:36px;display:flex;align-items:center;gap:8px;padding:0 11px;border-radius:8px;background:var(--bg-panel);border:1.5px solid var(--border-subtle);cursor:pointer;transition:border-color .12s,box-shadow .12s}.rd-node[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.rd-node-running[_ngcontent-%COMP%]{background:var(--info-soft)}.rd-node-pending[_ngcontent-%COMP%]{opacity:.6}.rd-node-skipped[_ngcontent-%COMP%]{border-style:dotted}.rd-node-dot[_ngcontent-%COMP%]{width:18px;height:18px;border-radius:50%;display:grid;place-items:center;flex-shrink:0}.rd-dot-spin[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_rd-spin 1.4s linear infinite;border-top-color:transparent!important}@keyframes _ngcontent-%COMP%_rd-spin{to{transform:rotate(360deg)}}.rd-node-label[_ngcontent-%COMP%]{font-size:12px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rd-node-type[_ngcontent-%COMP%]{font-size:9px}.rd-panel[_ngcontent-%COMP%]{flex:1;min-height:0}.rd-tabs[_ngcontent-%COMP%]{padding:8px 14px 0;border-bottom:1px solid var(--border-subtle);flex-shrink:0}.rd-tab[_ngcontent-%COMP%]{padding:7px 13px;border:none;background:transparent;cursor:pointer;font-size:12.5px;font-weight:500;font-family:var(--font-ui);text-transform:capitalize;color:var(--text-muted);border-bottom:2px solid transparent;margin-bottom:-1px;display:inline-flex;align-items:center;gap:6px;transition:color .1s}.rd-tab[_ngcontent-%COMP%]:hover{color:var(--text-secondary)}.rd-tab-active[_ngcontent-%COMP%]{color:var(--text-primary);border-bottom-color:var(--accent)}.rd-live-pill[_ngcontent-%COMP%]{font-size:9px;background:var(--info-soft);color:var(--info)}.rd-events[_ngcontent-%COMP%]{flex:1;padding:8px 14px;font-family:var(--font-mono);font-size:11.5px;min-height:0}.rd-event-row[_ngcontent-%COMP%]{padding:4px 0;border-bottom:1px solid rgba(255,255,255,.03)}.rd-event-time[_ngcontent-%COMP%]{flex-shrink:0;width:80px;font-size:11px}.rd-event-kind[_ngcontent-%COMP%]{width:132px;flex-shrink:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rd-event-node[_ngcontent-%COMP%]{flex-shrink:0;width:80px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px}.rd-event-text[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.rd-stream-dot[_ngcontent-%COMP%]{width:6px;height:6px;border-radius:50%;background:var(--info);animation:_ngcontent-%COMP%_rd-pulse 1s infinite}@keyframes _ngcontent-%COMP%_rd-pulse{0%,to{opacity:1}50%{opacity:.3}}.rd-artifacts[_ngcontent-%COMP%]{flex:1;min-height:0;display:flex}.rd-art-empty[_ngcontent-%COMP%]{margin:auto;padding:40px;text-align:center;font-size:12.5px}.rd-art-list[_ngcontent-%COMP%]{width:180px;flex-shrink:0;border-right:1px solid var(--border-subtle);padding:8px;overflow-y:auto;display:flex;flex-direction:column;gap:2px}.rd-art-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;width:100%;padding:7px 9px;border-radius:6px;background:transparent;border:0;cursor:pointer;text-align:left;color:inherit}.rd-art-item[_ngcontent-%COMP%]:hover, .rd-art-item.active[_ngcontent-%COMP%]{background:var(--bg-hover)}.rd-art-item[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.rd-art-meta[_ngcontent-%COMP%]{min-width:0;display:flex;flex-direction:column}.rd-art-name[_ngcontent-%COMP%]{font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rd-art-node[_ngcontent-%COMP%]{font-size:9.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rd-art-body[_ngcontent-%COMP%]{flex:1;min-width:0;padding:14px 16px}.rd-art-bodyhead[_ngcontent-%COMP%]{align-items:center;margin-bottom:10px}.rd-art-bodyname[_ngcontent-%COMP%]{font-size:12.5px;font-weight:600}.rd-art-kind[_ngcontent-%COMP%]{font-size:10px;color:var(--text-secondary);background:var(--bg-canvas);border:1px solid var(--border-subtle)}.rd-art-bytes[_ngcontent-%COMP%]{font-size:10.5px}.rd-art-md[_ngcontent-%COMP%]{font-size:12.5px;line-height:1.65}.rd-cost-wrap[_ngcontent-%COMP%]{flex:1;min-height:0;display:flex;padding:16px}.rd-cost-empty[_ngcontent-%COMP%]{margin:auto;max-width:420px;text-align:center;display:flex;flex-direction:column;align-items:center;gap:8px}.rd-cost-empty-title[_ngcontent-%COMP%]{font-size:13px;font-weight:600}.rd-cost-empty-body[_ngcontent-%COMP%]{font-size:12px;line-height:1.55}"],changeDetection:0})};export{U as RunDetail};
@@ -1 +1 @@
1
- import{a as W}from"./chunk-JLOJCDIY.js";import{a as H}from"./chunk-5NTGUSXJ.js";import{a as L}from"./chunk-SQPYSOV6.js";import{c as B}from"./chunk-DOKZOFKM.js";import{c as A}from"./chunk-PAO2624Y.js";import{a as O}from"./chunk-PBRCKHEQ.js";import{a as E}from"./chunk-3H2EZLZN.js";import{Aa as s,Ga as M,I as w,Ia as m,Ka as d,M as v,N as x,Va as l,W as k,Wa as g,Xa as C,bb as S,da as $,ea as o,ka as R,lb as P,ob as V,pb as N,qa as h,ra as u,sa as f,ua as T,va as b,wa as y,xa as p,ya as r,za as a,zb as D}from"./chunk-SYGIPC2P.js";import{a as j,b as q}from"./chunk-Q7L6LLAK.js";var Y=(t,n)=>n.name;function J(t,n){if(t&1&&(r(0,"div",8),l(1),a()),t&2){let e=d();o(),g(e.workflow().description)}}function K(t,n){t&1&&(r(0,"span",18),l(1,"*"),a())}function X(t,n){if(t&1){let e=M();r(0,"div",16)(1,"label",17),l(2),u(3,K,2,0,"span",18),a(),r(4,"input",19),m("input",function(c){let _=v(e).$implicit,F=d(2);return x(F.setVal(_.name,c.target.value))}),a()()}if(t&2){let e=n.$implicit,i=d(2);o(),h("for","rm-"+e.name),o(),C(" ",e.name),o(),f(e.required?3:-1),o(),p("id","rm-"+e.name)("placeholder",i.placeholderFor(e.name))("value",i.vals()[e.name]||"")}}function Z(t,n){if(t&1&&b(0,X,5,6,"div",16,Y),t&2){let e=d();y(e.inputs())}}function ee(t,n){t&1&&(r(0,"div",9),l(1,"No inputs required."),a())}function te(t,n){if(t&1&&(r(0,"app-pill"),s(1,"app-icon",20),l(2),a()),t&2){let e=n.$implicit;o(),p("size",10),o(),C(" ",e)}}function ne(t,n){if(t&1&&(r(0,"div",10),b(1,te,3,2,"app-pill",null,T),a()),t&2){let e=d();o(),y(e.requires())}}function oe(t,n){if(t&1&&(r(0,"div",11),s(1,"app-icon",21),r(2,"span"),l(3),a()()),t&2){let e=d();o(),p("size",13),o(2),g(e.error())}}var z=class t{workflow=N.required();close=V();api=w(E);projects=w(O);router=w(B);vals=k({});launching=k(!1);error=k(null);inputs=P(()=>this.workflow().inputs??[]);requires=P(()=>this.workflow().requires??[]);placeholderFor(n){return n==="SPEC_ID"?"REQ-AUTH-005":"value\u2026"}setVal(n,e){this.vals.update(i=>q(j({},i),{[n]:e}))}onEscape(){this.launching()||this.close.emit()}onBackdrop(){this.launching()||this.close.emit()}async launch(){if(!this.launching()){this.launching.set(!0),this.error.set(null);try{let n=await this.api.post(`/api/workflows/runs${this.projects.projectQuery()}`,{workflowName:this.workflow().name,inputs:this.vals()});if(n?.runId){this.close.emit(),this.router.navigate(["/runs",n.runId]);return}this.error.set("The server did not return a run id."),this.launching.set(!1)}catch(n){this.error.set(n instanceof Error?n.message:"Failed to launch run."),this.launching.set(!1)}}}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=R({type:t,selectors:[["app-run-modal"]],hostBindings:function(e,i){e&1&&m("keydown.escape",function(){return i.onEscape()},$)},inputs:{workflow:[1,"workflow"]},outputs:{close:"close"},decls:20,vars:11,consts:[[1,"rm-backdrop",3,"mousedown"],["role","dialog","aria-modal","true",1,"rm-panel",3,"mousedown"],[1,"row","gap-10","rm-head"],["name","workflow",2,"color","var(--accent)",3,"size"],[1,"mono","grow","rm-name"],["type","button","aria-label","Close",1,"btn","btn-ghost","btn-xs",3,"click"],["name","x",3,"size"],[1,"rm-body"],[1,"secondary","rm-desc"],[1,"muted","rm-noinputs"],[1,"row","gap-6","rm-requires"],[1,"row","gap-8","rm-error"],[1,"row","gap-8","rm-foot"],["type","button",1,"btn","btn-ghost","btn-sm",3,"click"],["type","button",1,"btn","btn-primary","btn-sm",3,"click","disabled"],["name","play",3,"size"],[1,"rm-field"],[1,"eyebrow","rm-label"],[1,"rm-req"],[1,"input","mono",3,"input","id","placeholder","value"],["name","check",3,"size"],["name","drift",2,"color","var(--error)","flex-shrink","0",3,"size"]],template:function(e,i){e&1&&(r(0,"div",0),m("mousedown",function(){return i.onBackdrop()}),r(1,"div",1),m("mousedown",function(_){return _.stopPropagation()}),r(2,"div",2),s(3,"app-icon",3),r(4,"span",4),l(5),a(),r(6,"button",5),m("click",function(){return i.close.emit()}),s(7,"app-icon",6),a()(),r(8,"div",7),u(9,J,2,1,"div",8),u(10,Z,2,0)(11,ee,2,0,"div",9),u(12,ne,3,0,"div",10),u(13,oe,4,2,"div",11),a(),r(14,"div",12)(15,"button",13),m("click",function(){return i.close.emit()}),l(16,"Cancel"),a(),r(17,"button",14),m("click",function(){return i.launch()}),s(18,"app-icon",15),l(19),a()()()()),e&2&&(o(),h("aria-label","Launch "+i.workflow().name),o(2),p("size",16),o(2),g(i.workflow().name),o(2),p("size",14),o(2),f(i.workflow().description?9:-1),o(),f(i.inputs().length?10:11),o(2),f(i.requires().length?12:-1),o(),f(i.error()?13:-1),o(4),p("disabled",i.launching()),o(),p("size",13),o(),C(" ",i.launching()?"Launching\u2026":"Launch run"," "))},dependencies:[W,D],styles:["[_nghost-%COMP%]{display:contents}.rm-backdrop[_ngcontent-%COMP%]{position:fixed;inset:0;background:#00000080;z-index:90;display:grid;place-items:center}.rm-panel[_ngcontent-%COMP%]{width:460px;max-width:calc(100vw - 32px);background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:12px;box-shadow:var(--shadow-pop)}.rm-head[_ngcontent-%COMP%]{padding:14px 16px;border-bottom:1px solid var(--border-subtle)}.rm-head[_ngcontent-%COMP%] .rm-name[_ngcontent-%COMP%]{font-weight:600}.rm-body[_ngcontent-%COMP%]{padding:16px}.rm-desc[_ngcontent-%COMP%]{font-size:12.5px;margin-bottom:16px;line-height:1.55}.rm-field[_ngcontent-%COMP%]{margin-bottom:12px}.rm-label[_ngcontent-%COMP%]{display:block;margin-bottom:5px}.rm-label[_ngcontent-%COMP%] .rm-req[_ngcontent-%COMP%]{color:var(--error)}.rm-field[_ngcontent-%COMP%] .input[_ngcontent-%COMP%]{width:100%}.rm-noinputs[_ngcontent-%COMP%]{font-size:12px;padding:8px 0}.rm-requires[_ngcontent-%COMP%]{margin-top:6px;margin-bottom:4px;flex-wrap:wrap}.rm-error[_ngcontent-%COMP%]{margin-top:12px;padding:8px 11px;background:var(--error-soft);border:1px solid rgba(242,85,90,.25);border-radius:7px;font-size:12px;color:var(--text-secondary);align-items:center}.rm-foot[_ngcontent-%COMP%]{padding:12px 16px;border-top:1px solid var(--border-subtle);justify-content:flex-end}"],changeDetection:0})};var I=()=>[],ie=(t,n)=>n.workflow.name,re=(t,n)=>n.name;function ae(t,n){t&1&&s(0,"app-pick-project-empty",0)}function le(t,n){if(t&1&&(r(0,"code",16),l(1),a()),t&2){let e=n.$implicit;o(),g(e)}}function ce(t,n){if(t&1&&(r(0,"code",18),l(1),a()),t&2){let e=n.$implicit;o(),C("$",e.name)}}function de(t,n){if(t&1&&(r(0,"span",17),l(1,"inputs"),a(),b(2,ce,2,1,"code",18,re)),t&2){let e=d().$implicit;o(2),y(e.workflow.inputs??S(0,I))}}function pe(t,n){if(t&1){let e=M();r(0,"div",6),m("click",function(){let c=v(e).$implicit,_=d(2);return x(_.openRun(c.workflow))})("keydown.enter",function(){let c=v(e).$implicit,_=d(2);return x(_.openRun(c.workflow))})("keydown.space",function(c){let _=v(e).$implicit,F=d(2);return c.preventDefault(),x(F.openRun(_.workflow))}),r(1,"div",7)(2,"span",8),l(3),a(),r(4,"app-pill",9),l(5),a(),s(6,"span",10),r(7,"span",11),s(8,"app-icon",12),l(9," Run"),a()(),r(10,"div",13),l(11),a(),r(12,"div",14)(13,"span",15),l(14,"requires"),a(),b(15,le,2,1,"code",16,T),u(17,de,4,1),a()()}if(t&2){let e=n.$implicit,i=d(2);h("aria-label","Launch workflow "+e.workflow.name),o(3),g(e.workflow.name),o(),p("color",i.scopeColor[e.scope])("bg",i.scopeBg[e.scope]),o(),g(e.scope),o(3),p("size",11),o(3),g(e.workflow.description||"\u2014"),o(4),y(e.workflow.requires??S(8,I)),o(2),f((e.workflow.inputs??S(9,I)).length>0?17:-1)}}function se(t,n){if(t&1){let e=M();r(0,"app-run-modal",19),m("close",function(){v(e);let c=d(2);return x(c.closeRun())}),a()}t&2&&p("workflow",n)}function me(t,n){if(t&1&&(r(0,"div",1),s(1,"app-page-head",2),r(2,"div",3),b(3,pe,18,10,"div",4,ie),a(),u(5,se,1,1,"app-run-modal",5),a()),t&2){let e,i=d();o(3),y(i.entries()),o(2),f((e=i.runTarget())?5:-1,e)}}var Q=class t{api=w(E);projects=w(O);resource=A(this.api,()=>`/api/workflows${this.projects.projectQuery()}`);entries=P(()=>this.resource.state().data?.workflows??[]);runTarget=k(null);openRun(n){this.runTarget.set(n)}closeRun(){this.runTarget.set(null)}scopeColor={bundled:"var(--node-spec)",global:"var(--node-code)",project:"var(--node-route)"};scopeBg={bundled:"color-mix(in srgb, var(--node-spec) 14%, transparent)",global:"color-mix(in srgb, var(--node-code) 14%, transparent)",project:"color-mix(in srgb, var(--node-route) 14%, transparent)"};static \u0275fac=function(e){return new(e||t)};static \u0275cmp=R({type:t,selectors:[["app-workflows"]],decls:2,vars:1,consts:[["surface","Workflows"],[1,"scroll-y","wf-page"],["icon","workflow","title","Workflows","sub","Run a YAML-defined DAG of agent, shell and approval steps"],[1,"wf-grid"],["role","button","tabindex","0",1,"card","card-pad","wf-card"],[3,"workflow"],["role","button","tabindex","0",1,"card","card-pad","wf-card",3,"click","keydown.enter","keydown.space"],[1,"row","gap-8"],[1,"mono","wf-name"],[3,"color","bg"],[1,"grow"],[1,"wf-run-hint","row","gap-4"],["name","play",3,"size"],[1,"secondary","wf-desc"],[1,"row","gap-6","wf-footer"],[1,"muted",2,"font-size","10.5px"],[1,"mono","wf-req-chip"],[1,"muted",2,"font-size","10.5px","margin-left","6px"],[1,"mono","wf-inp-chip"],[3,"close","workflow"]],template:function(e,i){e&1&&u(0,ae,1,0,"app-pick-project-empty",0)(1,me,6,1,"div",1),e&2&&f(i.resource.state().noProject?0:1)},dependencies:[L,H,W,D,z],styles:["[_nghost-%COMP%]{display:contents}.wf-page[_ngcontent-%COMP%]{flex:1;padding:18px}.wf-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:12px}.wf-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:10px;cursor:pointer;transition:background .1s,border-color .1s}.wf-card[_ngcontent-%COMP%]:hover{background:var(--bg-panel-2);border-color:var(--border-strong)}.wf-card[_ngcontent-%COMP%]:hover .wf-run-hint[_ngcontent-%COMP%]{opacity:1}.wf-card[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.wf-run-hint[_ngcontent-%COMP%]{align-items:center;font-size:11px;font-weight:500;color:var(--accent);opacity:0;transition:opacity .1s;flex-shrink:0}.wf-name[_ngcontent-%COMP%]{font-size:13.5px;font-weight:600}.wf-desc[_ngcontent-%COMP%]{font-size:12.5px;line-height:1.5;min-height:36px}.wf-footer[_ngcontent-%COMP%]{flex-wrap:wrap;border-top:1px solid var(--border-subtle);padding-top:10px}.wf-req-chip[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-secondary);background:var(--bg-canvas);padding:1px 6px;border-radius:4px;font-family:var(--font-mono)}.wf-inp-chip[_ngcontent-%COMP%]{font-size:10.5px;color:var(--node-spec);background:var(--node-spec-soft);padding:1px 6px;border-radius:4px;font-family:var(--font-mono)}"],changeDetection:0})};export{Q as Workflows};
1
+ import{a as W}from"./chunk-JLOJCDIY.js";import{a as H}from"./chunk-5NTGUSXJ.js";import{a as L}from"./chunk-SQPYSOV6.js";import{c as B}from"./chunk-DOKZOFKM.js";import{c as A}from"./chunk-DTWIJ3GJ.js";import{a as O}from"./chunk-JGDK6YKG.js";import{a as E}from"./chunk-TWVVIWKO.js";import{Aa as s,Ga as M,I as w,Ia as m,Ka as d,M as v,N as x,Va as l,W as k,Wa as g,Xa as C,bb as S,da as $,ea as o,ka as R,lb as P,ob as V,pb as N,qa as h,ra as u,sa as f,ua as T,va as b,wa as y,xa as p,ya as r,za as a,zb as D}from"./chunk-SYGIPC2P.js";import{a as j,b as q}from"./chunk-Q7L6LLAK.js";var Y=(t,n)=>n.name;function J(t,n){if(t&1&&(r(0,"div",8),l(1),a()),t&2){let e=d();o(),g(e.workflow().description)}}function K(t,n){t&1&&(r(0,"span",18),l(1,"*"),a())}function X(t,n){if(t&1){let e=M();r(0,"div",16)(1,"label",17),l(2),u(3,K,2,0,"span",18),a(),r(4,"input",19),m("input",function(c){let _=v(e).$implicit,F=d(2);return x(F.setVal(_.name,c.target.value))}),a()()}if(t&2){let e=n.$implicit,i=d(2);o(),h("for","rm-"+e.name),o(),C(" ",e.name),o(),f(e.required?3:-1),o(),p("id","rm-"+e.name)("placeholder",i.placeholderFor(e.name))("value",i.vals()[e.name]||"")}}function Z(t,n){if(t&1&&b(0,X,5,6,"div",16,Y),t&2){let e=d();y(e.inputs())}}function ee(t,n){t&1&&(r(0,"div",9),l(1,"No inputs required."),a())}function te(t,n){if(t&1&&(r(0,"app-pill"),s(1,"app-icon",20),l(2),a()),t&2){let e=n.$implicit;o(),p("size",10),o(),C(" ",e)}}function ne(t,n){if(t&1&&(r(0,"div",10),b(1,te,3,2,"app-pill",null,T),a()),t&2){let e=d();o(),y(e.requires())}}function oe(t,n){if(t&1&&(r(0,"div",11),s(1,"app-icon",21),r(2,"span"),l(3),a()()),t&2){let e=d();o(),p("size",13),o(2),g(e.error())}}var z=class t{workflow=N.required();close=V();api=w(E);projects=w(O);router=w(B);vals=k({});launching=k(!1);error=k(null);inputs=P(()=>this.workflow().inputs??[]);requires=P(()=>this.workflow().requires??[]);placeholderFor(n){return n==="SPEC_ID"?"REQ-AUTH-005":"value\u2026"}setVal(n,e){this.vals.update(i=>q(j({},i),{[n]:e}))}onEscape(){this.launching()||this.close.emit()}onBackdrop(){this.launching()||this.close.emit()}async launch(){if(!this.launching()){this.launching.set(!0),this.error.set(null);try{let n=await this.api.post(`/api/workflows/runs${this.projects.projectQuery()}`,{workflowName:this.workflow().name,inputs:this.vals()});if(n?.runId){this.close.emit(),this.router.navigate(["/runs",n.runId]);return}this.error.set("The server did not return a run id."),this.launching.set(!1)}catch(n){this.error.set(n instanceof Error?n.message:"Failed to launch run."),this.launching.set(!1)}}}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=R({type:t,selectors:[["app-run-modal"]],hostBindings:function(e,i){e&1&&m("keydown.escape",function(){return i.onEscape()},$)},inputs:{workflow:[1,"workflow"]},outputs:{close:"close"},decls:20,vars:11,consts:[[1,"rm-backdrop",3,"mousedown"],["role","dialog","aria-modal","true",1,"rm-panel",3,"mousedown"],[1,"row","gap-10","rm-head"],["name","workflow",2,"color","var(--accent)",3,"size"],[1,"mono","grow","rm-name"],["type","button","aria-label","Close",1,"btn","btn-ghost","btn-xs",3,"click"],["name","x",3,"size"],[1,"rm-body"],[1,"secondary","rm-desc"],[1,"muted","rm-noinputs"],[1,"row","gap-6","rm-requires"],[1,"row","gap-8","rm-error"],[1,"row","gap-8","rm-foot"],["type","button",1,"btn","btn-ghost","btn-sm",3,"click"],["type","button",1,"btn","btn-primary","btn-sm",3,"click","disabled"],["name","play",3,"size"],[1,"rm-field"],[1,"eyebrow","rm-label"],[1,"rm-req"],[1,"input","mono",3,"input","id","placeholder","value"],["name","check",3,"size"],["name","drift",2,"color","var(--error)","flex-shrink","0",3,"size"]],template:function(e,i){e&1&&(r(0,"div",0),m("mousedown",function(){return i.onBackdrop()}),r(1,"div",1),m("mousedown",function(_){return _.stopPropagation()}),r(2,"div",2),s(3,"app-icon",3),r(4,"span",4),l(5),a(),r(6,"button",5),m("click",function(){return i.close.emit()}),s(7,"app-icon",6),a()(),r(8,"div",7),u(9,J,2,1,"div",8),u(10,Z,2,0)(11,ee,2,0,"div",9),u(12,ne,3,0,"div",10),u(13,oe,4,2,"div",11),a(),r(14,"div",12)(15,"button",13),m("click",function(){return i.close.emit()}),l(16,"Cancel"),a(),r(17,"button",14),m("click",function(){return i.launch()}),s(18,"app-icon",15),l(19),a()()()()),e&2&&(o(),h("aria-label","Launch "+i.workflow().name),o(2),p("size",16),o(2),g(i.workflow().name),o(2),p("size",14),o(2),f(i.workflow().description?9:-1),o(),f(i.inputs().length?10:11),o(2),f(i.requires().length?12:-1),o(),f(i.error()?13:-1),o(4),p("disabled",i.launching()),o(),p("size",13),o(),C(" ",i.launching()?"Launching\u2026":"Launch run"," "))},dependencies:[W,D],styles:["[_nghost-%COMP%]{display:contents}.rm-backdrop[_ngcontent-%COMP%]{position:fixed;inset:0;background:#00000080;z-index:90;display:grid;place-items:center}.rm-panel[_ngcontent-%COMP%]{width:460px;max-width:calc(100vw - 32px);background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:12px;box-shadow:var(--shadow-pop)}.rm-head[_ngcontent-%COMP%]{padding:14px 16px;border-bottom:1px solid var(--border-subtle)}.rm-head[_ngcontent-%COMP%] .rm-name[_ngcontent-%COMP%]{font-weight:600}.rm-body[_ngcontent-%COMP%]{padding:16px}.rm-desc[_ngcontent-%COMP%]{font-size:12.5px;margin-bottom:16px;line-height:1.55}.rm-field[_ngcontent-%COMP%]{margin-bottom:12px}.rm-label[_ngcontent-%COMP%]{display:block;margin-bottom:5px}.rm-label[_ngcontent-%COMP%] .rm-req[_ngcontent-%COMP%]{color:var(--error)}.rm-field[_ngcontent-%COMP%] .input[_ngcontent-%COMP%]{width:100%}.rm-noinputs[_ngcontent-%COMP%]{font-size:12px;padding:8px 0}.rm-requires[_ngcontent-%COMP%]{margin-top:6px;margin-bottom:4px;flex-wrap:wrap}.rm-error[_ngcontent-%COMP%]{margin-top:12px;padding:8px 11px;background:var(--error-soft);border:1px solid rgba(242,85,90,.25);border-radius:7px;font-size:12px;color:var(--text-secondary);align-items:center}.rm-foot[_ngcontent-%COMP%]{padding:12px 16px;border-top:1px solid var(--border-subtle);justify-content:flex-end}"],changeDetection:0})};var I=()=>[],ie=(t,n)=>n.workflow.name,re=(t,n)=>n.name;function ae(t,n){t&1&&s(0,"app-pick-project-empty",0)}function le(t,n){if(t&1&&(r(0,"code",16),l(1),a()),t&2){let e=n.$implicit;o(),g(e)}}function ce(t,n){if(t&1&&(r(0,"code",18),l(1),a()),t&2){let e=n.$implicit;o(),C("$",e.name)}}function de(t,n){if(t&1&&(r(0,"span",17),l(1,"inputs"),a(),b(2,ce,2,1,"code",18,re)),t&2){let e=d().$implicit;o(2),y(e.workflow.inputs??S(0,I))}}function pe(t,n){if(t&1){let e=M();r(0,"div",6),m("click",function(){let c=v(e).$implicit,_=d(2);return x(_.openRun(c.workflow))})("keydown.enter",function(){let c=v(e).$implicit,_=d(2);return x(_.openRun(c.workflow))})("keydown.space",function(c){let _=v(e).$implicit,F=d(2);return c.preventDefault(),x(F.openRun(_.workflow))}),r(1,"div",7)(2,"span",8),l(3),a(),r(4,"app-pill",9),l(5),a(),s(6,"span",10),r(7,"span",11),s(8,"app-icon",12),l(9," Run"),a()(),r(10,"div",13),l(11),a(),r(12,"div",14)(13,"span",15),l(14,"requires"),a(),b(15,le,2,1,"code",16,T),u(17,de,4,1),a()()}if(t&2){let e=n.$implicit,i=d(2);h("aria-label","Launch workflow "+e.workflow.name),o(3),g(e.workflow.name),o(),p("color",i.scopeColor[e.scope])("bg",i.scopeBg[e.scope]),o(),g(e.scope),o(3),p("size",11),o(3),g(e.workflow.description||"\u2014"),o(4),y(e.workflow.requires??S(8,I)),o(2),f((e.workflow.inputs??S(9,I)).length>0?17:-1)}}function se(t,n){if(t&1){let e=M();r(0,"app-run-modal",19),m("close",function(){v(e);let c=d(2);return x(c.closeRun())}),a()}t&2&&p("workflow",n)}function me(t,n){if(t&1&&(r(0,"div",1),s(1,"app-page-head",2),r(2,"div",3),b(3,pe,18,10,"div",4,ie),a(),u(5,se,1,1,"app-run-modal",5),a()),t&2){let e,i=d();o(3),y(i.entries()),o(2),f((e=i.runTarget())?5:-1,e)}}var Q=class t{api=w(E);projects=w(O);resource=A(this.api,()=>`/api/workflows${this.projects.projectQuery()}`);entries=P(()=>this.resource.state().data?.workflows??[]);runTarget=k(null);openRun(n){this.runTarget.set(n)}closeRun(){this.runTarget.set(null)}scopeColor={bundled:"var(--node-spec)",global:"var(--node-code)",project:"var(--node-route)"};scopeBg={bundled:"color-mix(in srgb, var(--node-spec) 14%, transparent)",global:"color-mix(in srgb, var(--node-code) 14%, transparent)",project:"color-mix(in srgb, var(--node-route) 14%, transparent)"};static \u0275fac=function(e){return new(e||t)};static \u0275cmp=R({type:t,selectors:[["app-workflows"]],decls:2,vars:1,consts:[["surface","Workflows"],[1,"scroll-y","wf-page"],["icon","workflow","title","Workflows","sub","Run a YAML-defined DAG of agent, shell and approval steps"],[1,"wf-grid"],["role","button","tabindex","0",1,"card","card-pad","wf-card"],[3,"workflow"],["role","button","tabindex","0",1,"card","card-pad","wf-card",3,"click","keydown.enter","keydown.space"],[1,"row","gap-8"],[1,"mono","wf-name"],[3,"color","bg"],[1,"grow"],[1,"wf-run-hint","row","gap-4"],["name","play",3,"size"],[1,"secondary","wf-desc"],[1,"row","gap-6","wf-footer"],[1,"muted",2,"font-size","10.5px"],[1,"mono","wf-req-chip"],[1,"muted",2,"font-size","10.5px","margin-left","6px"],[1,"mono","wf-inp-chip"],[3,"close","workflow"]],template:function(e,i){e&1&&u(0,ae,1,0,"app-pick-project-empty",0)(1,me,6,1,"div",1),e&2&&f(i.resource.state().noProject?0:1)},dependencies:[L,H,W,D,z],styles:["[_nghost-%COMP%]{display:contents}.wf-page[_ngcontent-%COMP%]{flex:1;padding:18px}.wf-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:12px}.wf-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:10px;cursor:pointer;transition:background .1s,border-color .1s}.wf-card[_ngcontent-%COMP%]:hover{background:var(--bg-panel-2);border-color:var(--border-strong)}.wf-card[_ngcontent-%COMP%]:hover .wf-run-hint[_ngcontent-%COMP%]{opacity:1}.wf-card[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.wf-run-hint[_ngcontent-%COMP%]{align-items:center;font-size:11px;font-weight:500;color:var(--accent);opacity:0;transition:opacity .1s;flex-shrink:0}.wf-name[_ngcontent-%COMP%]{font-size:13.5px;font-weight:600}.wf-desc[_ngcontent-%COMP%]{font-size:12.5px;line-height:1.5;min-height:36px}.wf-footer[_ngcontent-%COMP%]{flex-wrap:wrap;border-top:1px solid var(--border-subtle);padding-top:10px}.wf-req-chip[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-secondary);background:var(--bg-canvas);padding:1px 6px;border-radius:4px;font-family:var(--font-mono)}.wf-inp-chip[_ngcontent-%COMP%]{font-size:10.5px;color:var(--node-spec);background:var(--node-spec-soft);padding:1px 6px;border-radius:4px;font-family:var(--font-mono)}"],changeDetection:0})};export{Q as Workflows};
@@ -1 +1 @@
1
- import{a as L}from"./chunk-5NTGUSXJ.js";import{c as R}from"./chunk-PAO2624Y.js";import"./chunk-PBRCKHEQ.js";import{a as j}from"./chunk-3H2EZLZN.js";import{Aa as x,Ga as D,I as S,Ia as $,Ka as p,M as E,N as P,Ta as u,Ua as C,Va as s,W as k,Wa as l,X as O,Xa as h,Ya as I,ea as a,gb as w,ib as y,ka as T,lb as f,ra as v,sa as _,ua as z,va as m,vb as F,wa as g,xa as b,ya as i,za as r,zb as H}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var M=(n,t)=>t.id,V=(n,t)=>t.label,U=(n,t)=>t.model;function W(n,t){if(n&1){let e=D();i(0,"button",20),$("click",function(){let c=E(e).$implicit,d=p();return P(d.toggle(c.id))}),s(1),r()}if(n&2){let e=t.$implicit,o=p();C("active",o.sel().has(e.id)),a(),l(e.name)}}function q(n,t){if(n&1&&s(0),n&2){let e=p(2);h(", just ",e.best().drift," drifted links")}}function G(n,t){if(n&1&&(i(0,"div",4)(1,"div",21),x(2,"app-icon",22),r(),i(3,"div",7)(4,"span",23),s(5,"Most efficient: "),r(),i(6,"span",24),s(7),r(),i(8,"span",25),s(9),w(10,"number"),v(11,q,1,1),r()(),i(12,"button",26),x(13,"app-icon",27),s(14,"Export report "),r()()),n&2){let e=p();a(2),b("size",18),a(5),l(e.best().name),a(2),I(" \u2014 ",y(10,6,e.best().cacheHit*100,"1.0-0"),"% cache hit, ",e.fmt$(e.best().avgCost)," avg/session"),a(2),_(e.best().drift>0?11:-1),a(2),b("size",12)}}function J(n,t){if(n&1&&(i(0,"code",34),s(1),r()),n&2){let e=t.$implicit;a(),l(e)}}function K(n,t){if(n&1&&m(0,J,2,1,"code",34,z),n&2){let e=p().$implicit;g(e.topTools)}}function Q(n,t){n&1&&(i(0,"span",33),s(1,"\u2014"),r())}function X(n,t){if(n&1&&(i(0,"div",28)(1,"span",29),s(2),r(),i(3,"span",30),s(4),r(),i(5,"span",30),s(6),r(),i(7,"span",30),s(8),r(),i(9,"span",30),s(10),w(11,"number"),r(),i(12,"span",31),s(13),r(),i(14,"span",32),v(15,K,2,0)(16,Q,2,0,"span",33),r()()),n&2){let e,o,c=t.$implicit,d=p();C("best-row",((e=d.best())==null?null:e.id)===c.id),a(),u("color",((o=d.best())==null?null:o.id)===c.id?"var(--success)":"var(--text-primary)"),a(),l(c.name),a(2),l(d.fmt$(c.cost)),a(2),l(c.sessions),a(2),l(d.fmt$(c.avgCost)),a(),u("color",d.cacheColor(c.cacheHit)),a(),h("",y(11,15,c.cacheHit*100,"1.0-0"),"%"),a(2),u("color",c.drift>10?"var(--warn)":"var(--text-secondary)"),a(),l(c.drift),a(2),_(c.topTools.length>0?15:16)}}function Y(n,t){if(n&1&&(i(0,"span",18),x(1,"span",35),s(2),r()),n&2){let e=t.$implicit;a(),u("background",e.color),a(),h(" ",e.label," ")}}function Z(n,t){if(n&1&&x(0,"div",40),n&2){let e=t.$implicit,o=p(2);u("width",e.widthPct,"%")("background",e.color),b("title",e.label+": "+o.fmt$(e.cost))}}function ee(n,t){if(n&1&&(i(0,"div",19)(1,"span",36),s(2),r(),i(3,"div",37),m(4,Z,1,5,"div",38,U),r(),i(6,"span",39),s(7),r()()),n&2){let e=t.$implicit,o=p();a(2),l(e.name),a(2),g(o.segments(e)),a(3),l(o.fmt$(e.cost))}}var te=[[/opus/i,"#A586F5"],[/sonnet/i,"#5B93F2"],[/haiku/i,"#29D2BE"]],ne="#5C6573";function N(n){for(let[t,e]of te)if(t.test(n))return e;return ne}function B(n){return/opus/i.test(n)?"Opus":/sonnet/i.test(n)?"Sonnet":/haiku/i.test(n)?"Haiku":n.replace(/^claude-/i,"")}var A=class n{api=S(j);resource=R(this.api,()=>"/api/claude/compare");all=f(()=>(this.resource.state().data?.projects??[]).map(e=>({id:e.path||e.name,name:(e.name||"").split("/").filter(Boolean).pop()||e.name||"?",sessions:e.sessions||0,cost:e.cost||0,avgCost:e.avgCost||0,cacheHit:e.cacheHit||0,prompts:e.prompts||0,drift:e.drift??0,byModel:e.byModel??[],topTools:e.topTools??[]})));sel=k(new Set);constructor(){O(()=>{let t=this.all();t.length>0&&this.sel().size===0&&this.sel.set(new Set(t.map(e=>e.id)))})}rows=f(()=>{let t=this.sel();return this.all().filter(e=>t.has(e.id))});best=f(()=>[...this.rows()].sort((e,o)=>o.cacheHit-o.avgCost/100-(e.cacheHit-e.avgCost/100))[0]??null);maxCost=f(()=>{let t=this.rows().map(e=>e.cost);return t.length?Math.max(...t):1});segments(t){let e=this.maxCost();return t.byModel.map(o=>({model:o.model,label:B(o.model),color:N(o.model),cost:o.cost,widthPct:e>0?o.cost/e*100:0}))}legend=f(()=>{let t=new Map;for(let e of this.rows())for(let o of e.byModel){let c=B(o.model);t.has(c)||t.set(c,{label:c,color:N(o.model)})}return[...t.values()]});toggle(t){this.sel.update(e=>{let o=new Set(e);return o.has(t)?o.delete(t):o.add(t),o})}cacheColor(t){return t>=.7?"var(--success)":t>=.5?"var(--warn)":"var(--error)"}fmt$(t){return"$"+t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=T({type:n,selectors:[["app-compare"]],decls:35,vars:2,consts:[[1,"page","scroll-y"],["icon","compare","title","Compare projects","sub","Which projects are cost-efficient vs hungry"],[1,"chip-row"],["type","button",1,"chip",3,"active"],[1,"best-card","card","card-pad",2,"margin-bottom","14px","border-color","rgba(70,194,107,0.3)","background","var(--success-soft)","display","flex","gap","12px","align-items","center"],[1,"card",2,"overflow","hidden","margin-bottom","14px"],[1,"row","header-row"],[1,"grow"],[1,"num"],[1,"num",2,"width","60px"],[2,"width","150px","text-align","right","font-size","10.5px","color","var(--text-muted)","text-transform","uppercase","letter-spacing","0.05em","font-weight","600"],[1,"row","data-row",3,"best-row"],[1,"card","card-pad"],[1,"row",2,"justify-content","space-between","margin-bottom","14px"],[1,"row","gap-8"],["name","dollar",2,"color","var(--accent)",3,"size"],[2,"font-weight","600","font-size","12.5px"],[1,"row","gap-12"],[1,"row","gap-4","muted",2,"font-size","10.5px"],[1,"stacked-row"],["type","button",1,"chip",3,"click"],[2,"color","var(--success)"],["name","sparkles",3,"size"],[2,"font-weight","600","font-size","13px"],[1,"mono",2,"color","var(--success)"],[1,"secondary",2,"font-size","12.5px"],[1,"btn","btn-secondary","btn-sm"],["name","external",3,"size"],[1,"row","data-row"],[1,"mono","grow","project-name"],[1,"mono","tabular","num"],[1,"mono","tabular",2,"width","60px","text-align","right","font-size","12px"],[1,"row","gap-4",2,"width","150px","justify-content","flex-end","flex-wrap","wrap"],[1,"mono",2,"font-size","12px","color","var(--text-secondary)"],[1,"tool-chip","mono"],[2,"width","9px","height","9px","border-radius","3px"],[1,"mono","stacked-lbl"],[1,"stacked-bars"],[1,"stacked-seg",3,"width","background","title"],[1,"mono","tabular","muted","stacked-total",2,"font-size","11px"],[1,"stacked-seg",3,"title"]],template:function(e,o){e&1&&(i(0,"div",0),x(1,"app-page-head",1),i(2,"div",2),m(3,W,2,3,"button",3,M),r(),v(5,G,15,9,"div",4),i(6,"div",5)(7,"div",6)(8,"span",7),s(9,"Project"),r(),i(10,"span",8),s(11,"Cost"),r(),i(12,"span",8),s(13,"Sessions"),r(),i(14,"span",8),s(15,"Avg"),r(),i(16,"span",8),s(17,"Cache"),r(),i(18,"span",9),s(19,"Drift"),r(),i(20,"span",10),s(21,"Top tools"),r()(),m(22,X,17,18,"div",11,M),r(),i(24,"div",12)(25,"div",13)(26,"div",14),x(27,"app-icon",15),i(28,"span",16),s(29,"Cost by model per project"),r()(),i(30,"div",17),m(31,Y,3,3,"span",18,V),r()(),m(33,ee,8,2,"div",19,M),r()()),e&2&&(a(3),g(o.all()),a(2),_(o.best()?5:-1),a(17),g(o.rows()),a(5),b("size",14),a(4),g(o.legend()),a(2),g(o.rows()))},dependencies:[L,H,F],styles:["[_nghost-%COMP%]{display:contents}.page[_ngcontent-%COMP%]{flex:1;padding:18px}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono)}.grow[_ngcontent-%COMP%]{flex:1}.secondary[_ngcontent-%COMP%]{color:var(--text-secondary)}.chip-row[_ngcontent-%COMP%]{display:flex;gap:6px;margin-bottom:14px;flex-wrap:wrap}.chip[_ngcontent-%COMP%]{height:28px;padding:0 12px;border-radius:999px;font-size:12px;font-family:var(--font-mono);cursor:pointer;border:1px solid var(--border-subtle);background:var(--bg-panel);color:var(--text-muted)}.chip.active[_ngcontent-%COMP%]{background:var(--accent-soft);color:var(--accent);border-color:transparent}.card[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:var(--r-lg)}.card-pad[_ngcontent-%COMP%]{padding:14px}.row[_ngcontent-%COMP%]{display:flex;align-items:center}.header-row[_ngcontent-%COMP%]{padding:9px 14px;gap:14px;font-size:10.5px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;font-weight:600;border-bottom:1px solid var(--border-subtle)}.data-row[_ngcontent-%COMP%]{display:flex;gap:14px;padding:11px 14px;align-items:center;border-top:1px solid var(--border-subtle)}.data-row[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.project-name[_ngcontent-%COMP%]{font-size:12.5px}.num[_ngcontent-%COMP%]{width:70px;text-align:right;font-size:12px;font-variant-numeric:tabular-nums}.stacked-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:140px 1fr 70px;gap:12px;align-items:center;padding:6px 0;border-top:1px solid var(--border-subtle)}.stacked-row[_ngcontent-%COMP%]:first-of-type{border-top:none}.stacked-lbl[_ngcontent-%COMP%]{font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.stacked-bars[_ngcontent-%COMP%]{display:flex;height:18px;border-radius:4px;overflow:hidden;gap:2px}.stacked-seg[_ngcontent-%COMP%]{height:100%;border-radius:3px}.stacked-total[_ngcontent-%COMP%]{text-align:right}.tool-chip[_ngcontent-%COMP%]{font-size:9.5px;background:var(--bg-canvas);color:var(--text-secondary);padding:1px 5px;border-radius:3px;white-space:nowrap}"],changeDetection:0})};export{A as Compare};
1
+ import{a as L}from"./chunk-5NTGUSXJ.js";import{c as R}from"./chunk-DTWIJ3GJ.js";import"./chunk-JGDK6YKG.js";import{a as j}from"./chunk-TWVVIWKO.js";import{Aa as x,Ga as D,I as S,Ia as $,Ka as p,M as E,N as P,Ta as u,Ua as C,Va as s,W as k,Wa as l,X as O,Xa as h,Ya as I,ea as a,gb as w,ib as y,ka as T,lb as f,ra as v,sa as _,ua as z,va as m,vb as F,wa as g,xa as b,ya as i,za as r,zb as H}from"./chunk-SYGIPC2P.js";import"./chunk-Q7L6LLAK.js";var M=(n,t)=>t.id,V=(n,t)=>t.label,U=(n,t)=>t.model;function W(n,t){if(n&1){let e=D();i(0,"button",20),$("click",function(){let c=E(e).$implicit,d=p();return P(d.toggle(c.id))}),s(1),r()}if(n&2){let e=t.$implicit,o=p();C("active",o.sel().has(e.id)),a(),l(e.name)}}function q(n,t){if(n&1&&s(0),n&2){let e=p(2);h(", just ",e.best().drift," drifted links")}}function G(n,t){if(n&1&&(i(0,"div",4)(1,"div",21),x(2,"app-icon",22),r(),i(3,"div",7)(4,"span",23),s(5,"Most efficient: "),r(),i(6,"span",24),s(7),r(),i(8,"span",25),s(9),w(10,"number"),v(11,q,1,1),r()(),i(12,"button",26),x(13,"app-icon",27),s(14,"Export report "),r()()),n&2){let e=p();a(2),b("size",18),a(5),l(e.best().name),a(2),I(" \u2014 ",y(10,6,e.best().cacheHit*100,"1.0-0"),"% cache hit, ",e.fmt$(e.best().avgCost)," avg/session"),a(2),_(e.best().drift>0?11:-1),a(2),b("size",12)}}function J(n,t){if(n&1&&(i(0,"code",34),s(1),r()),n&2){let e=t.$implicit;a(),l(e)}}function K(n,t){if(n&1&&m(0,J,2,1,"code",34,z),n&2){let e=p().$implicit;g(e.topTools)}}function Q(n,t){n&1&&(i(0,"span",33),s(1,"\u2014"),r())}function X(n,t){if(n&1&&(i(0,"div",28)(1,"span",29),s(2),r(),i(3,"span",30),s(4),r(),i(5,"span",30),s(6),r(),i(7,"span",30),s(8),r(),i(9,"span",30),s(10),w(11,"number"),r(),i(12,"span",31),s(13),r(),i(14,"span",32),v(15,K,2,0)(16,Q,2,0,"span",33),r()()),n&2){let e,o,c=t.$implicit,d=p();C("best-row",((e=d.best())==null?null:e.id)===c.id),a(),u("color",((o=d.best())==null?null:o.id)===c.id?"var(--success)":"var(--text-primary)"),a(),l(c.name),a(2),l(d.fmt$(c.cost)),a(2),l(c.sessions),a(2),l(d.fmt$(c.avgCost)),a(),u("color",d.cacheColor(c.cacheHit)),a(),h("",y(11,15,c.cacheHit*100,"1.0-0"),"%"),a(2),u("color",c.drift>10?"var(--warn)":"var(--text-secondary)"),a(),l(c.drift),a(2),_(c.topTools.length>0?15:16)}}function Y(n,t){if(n&1&&(i(0,"span",18),x(1,"span",35),s(2),r()),n&2){let e=t.$implicit;a(),u("background",e.color),a(),h(" ",e.label," ")}}function Z(n,t){if(n&1&&x(0,"div",40),n&2){let e=t.$implicit,o=p(2);u("width",e.widthPct,"%")("background",e.color),b("title",e.label+": "+o.fmt$(e.cost))}}function ee(n,t){if(n&1&&(i(0,"div",19)(1,"span",36),s(2),r(),i(3,"div",37),m(4,Z,1,5,"div",38,U),r(),i(6,"span",39),s(7),r()()),n&2){let e=t.$implicit,o=p();a(2),l(e.name),a(2),g(o.segments(e)),a(3),l(o.fmt$(e.cost))}}var te=[[/opus/i,"#A586F5"],[/sonnet/i,"#5B93F2"],[/haiku/i,"#29D2BE"]],ne="#5C6573";function N(n){for(let[t,e]of te)if(t.test(n))return e;return ne}function B(n){return/opus/i.test(n)?"Opus":/sonnet/i.test(n)?"Sonnet":/haiku/i.test(n)?"Haiku":n.replace(/^claude-/i,"")}var A=class n{api=S(j);resource=R(this.api,()=>"/api/claude/compare");all=f(()=>(this.resource.state().data?.projects??[]).map(e=>({id:e.path||e.name,name:(e.name||"").split("/").filter(Boolean).pop()||e.name||"?",sessions:e.sessions||0,cost:e.cost||0,avgCost:e.avgCost||0,cacheHit:e.cacheHit||0,prompts:e.prompts||0,drift:e.drift??0,byModel:e.byModel??[],topTools:e.topTools??[]})));sel=k(new Set);constructor(){O(()=>{let t=this.all();t.length>0&&this.sel().size===0&&this.sel.set(new Set(t.map(e=>e.id)))})}rows=f(()=>{let t=this.sel();return this.all().filter(e=>t.has(e.id))});best=f(()=>[...this.rows()].sort((e,o)=>o.cacheHit-o.avgCost/100-(e.cacheHit-e.avgCost/100))[0]??null);maxCost=f(()=>{let t=this.rows().map(e=>e.cost);return t.length?Math.max(...t):1});segments(t){let e=this.maxCost();return t.byModel.map(o=>({model:o.model,label:B(o.model),color:N(o.model),cost:o.cost,widthPct:e>0?o.cost/e*100:0}))}legend=f(()=>{let t=new Map;for(let e of this.rows())for(let o of e.byModel){let c=B(o.model);t.has(c)||t.set(c,{label:c,color:N(o.model)})}return[...t.values()]});toggle(t){this.sel.update(e=>{let o=new Set(e);return o.has(t)?o.delete(t):o.add(t),o})}cacheColor(t){return t>=.7?"var(--success)":t>=.5?"var(--warn)":"var(--error)"}fmt$(t){return"$"+t.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=T({type:n,selectors:[["app-compare"]],decls:35,vars:2,consts:[[1,"page","scroll-y"],["icon","compare","title","Compare projects","sub","Which projects are cost-efficient vs hungry"],[1,"chip-row"],["type","button",1,"chip",3,"active"],[1,"best-card","card","card-pad",2,"margin-bottom","14px","border-color","rgba(70,194,107,0.3)","background","var(--success-soft)","display","flex","gap","12px","align-items","center"],[1,"card",2,"overflow","hidden","margin-bottom","14px"],[1,"row","header-row"],[1,"grow"],[1,"num"],[1,"num",2,"width","60px"],[2,"width","150px","text-align","right","font-size","10.5px","color","var(--text-muted)","text-transform","uppercase","letter-spacing","0.05em","font-weight","600"],[1,"row","data-row",3,"best-row"],[1,"card","card-pad"],[1,"row",2,"justify-content","space-between","margin-bottom","14px"],[1,"row","gap-8"],["name","dollar",2,"color","var(--accent)",3,"size"],[2,"font-weight","600","font-size","12.5px"],[1,"row","gap-12"],[1,"row","gap-4","muted",2,"font-size","10.5px"],[1,"stacked-row"],["type","button",1,"chip",3,"click"],[2,"color","var(--success)"],["name","sparkles",3,"size"],[2,"font-weight","600","font-size","13px"],[1,"mono",2,"color","var(--success)"],[1,"secondary",2,"font-size","12.5px"],[1,"btn","btn-secondary","btn-sm"],["name","external",3,"size"],[1,"row","data-row"],[1,"mono","grow","project-name"],[1,"mono","tabular","num"],[1,"mono","tabular",2,"width","60px","text-align","right","font-size","12px"],[1,"row","gap-4",2,"width","150px","justify-content","flex-end","flex-wrap","wrap"],[1,"mono",2,"font-size","12px","color","var(--text-secondary)"],[1,"tool-chip","mono"],[2,"width","9px","height","9px","border-radius","3px"],[1,"mono","stacked-lbl"],[1,"stacked-bars"],[1,"stacked-seg",3,"width","background","title"],[1,"mono","tabular","muted","stacked-total",2,"font-size","11px"],[1,"stacked-seg",3,"title"]],template:function(e,o){e&1&&(i(0,"div",0),x(1,"app-page-head",1),i(2,"div",2),m(3,W,2,3,"button",3,M),r(),v(5,G,15,9,"div",4),i(6,"div",5)(7,"div",6)(8,"span",7),s(9,"Project"),r(),i(10,"span",8),s(11,"Cost"),r(),i(12,"span",8),s(13,"Sessions"),r(),i(14,"span",8),s(15,"Avg"),r(),i(16,"span",8),s(17,"Cache"),r(),i(18,"span",9),s(19,"Drift"),r(),i(20,"span",10),s(21,"Top tools"),r()(),m(22,X,17,18,"div",11,M),r(),i(24,"div",12)(25,"div",13)(26,"div",14),x(27,"app-icon",15),i(28,"span",16),s(29,"Cost by model per project"),r()(),i(30,"div",17),m(31,Y,3,3,"span",18,V),r()(),m(33,ee,8,2,"div",19,M),r()()),e&2&&(a(3),g(o.all()),a(2),_(o.best()?5:-1),a(17),g(o.rows()),a(5),b("size",14),a(4),g(o.legend()),a(2),g(o.rows()))},dependencies:[L,H,F],styles:["[_nghost-%COMP%]{display:contents}.page[_ngcontent-%COMP%]{flex:1;padding:18px}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono)}.grow[_ngcontent-%COMP%]{flex:1}.secondary[_ngcontent-%COMP%]{color:var(--text-secondary)}.chip-row[_ngcontent-%COMP%]{display:flex;gap:6px;margin-bottom:14px;flex-wrap:wrap}.chip[_ngcontent-%COMP%]{height:28px;padding:0 12px;border-radius:999px;font-size:12px;font-family:var(--font-mono);cursor:pointer;border:1px solid var(--border-subtle);background:var(--bg-panel);color:var(--text-muted)}.chip.active[_ngcontent-%COMP%]{background:var(--accent-soft);color:var(--accent);border-color:transparent}.card[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:var(--r-lg)}.card-pad[_ngcontent-%COMP%]{padding:14px}.row[_ngcontent-%COMP%]{display:flex;align-items:center}.header-row[_ngcontent-%COMP%]{padding:9px 14px;gap:14px;font-size:10.5px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;font-weight:600;border-bottom:1px solid var(--border-subtle)}.data-row[_ngcontent-%COMP%]{display:flex;gap:14px;padding:11px 14px;align-items:center;border-top:1px solid var(--border-subtle)}.data-row[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.project-name[_ngcontent-%COMP%]{font-size:12.5px}.num[_ngcontent-%COMP%]{width:70px;text-align:right;font-size:12px;font-variant-numeric:tabular-nums}.stacked-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:140px 1fr 70px;gap:12px;align-items:center;padding:6px 0;border-top:1px solid var(--border-subtle)}.stacked-row[_ngcontent-%COMP%]:first-of-type{border-top:none}.stacked-lbl[_ngcontent-%COMP%]{font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.stacked-bars[_ngcontent-%COMP%]{display:flex;height:18px;border-radius:4px;overflow:hidden;gap:2px}.stacked-seg[_ngcontent-%COMP%]{height:100%;border-radius:3px}.stacked-total[_ngcontent-%COMP%]{text-align:right}.tool-chip[_ngcontent-%COMP%]{font-size:9.5px;background:var(--bg-canvas);color:var(--text-secondary);padding:1px 5px;border-radius:3px;white-space:nowrap}"],changeDetection:0})};export{A as Compare};