agent-relay-server 0.32.1 → 0.32.2

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 (64) hide show
  1. package/docs/openapi.json +57 -127
  2. package/package.json +1 -1
  3. package/public/assets/{activity-C6nbfryG.js → activity-DT1JGHnp.js} +2 -2
  4. package/public/assets/{activity-C6nbfryG.js.map → activity-DT1JGHnp.js.map} +1 -1
  5. package/public/assets/{agent-profiles-FEITAgHs.js → agent-profiles-CrMemMkZ.js} +2 -2
  6. package/public/assets/{agent-profiles-FEITAgHs.js.map → agent-profiles-CrMemMkZ.js.map} +1 -1
  7. package/public/assets/{agents-D4S0yIbe.js → agents-Bl-rrgOy.js} +2 -2
  8. package/public/assets/{agents-D4S0yIbe.js.map → agents-Bl-rrgOy.js.map} +1 -1
  9. package/public/assets/{analytics-DM2g62T_.js → analytics-a663ak56.js} +2 -2
  10. package/public/assets/{analytics-DM2g62T_.js.map → analytics-a663ak56.js.map} +1 -1
  11. package/public/assets/{automation-3D2pQa1C.js → automation-CiaLThdO.js} +2 -2
  12. package/public/assets/{automation-3D2pQa1C.js.map → automation-CiaLThdO.js.map} +1 -1
  13. package/public/assets/{branch-state-badge-Bi4IbkOZ.js → branch-state-badge-D4ur3m3_.js} +2 -2
  14. package/public/assets/{branch-state-badge-Bi4IbkOZ.js.map → branch-state-badge-D4ur3m3_.js.map} +1 -1
  15. package/public/assets/{channels-QNp7zmA_.js → channels-o9KLTHoK.js} +2 -2
  16. package/public/assets/{channels-QNp7zmA_.js.map → channels-o9KLTHoK.js.map} +1 -1
  17. package/public/assets/{chat-jeXt_SFs.js → chat-5hvHZcAe.js} +2 -2
  18. package/public/assets/{chat-jeXt_SFs.js.map → chat-5hvHZcAe.js.map} +1 -1
  19. package/public/assets/{connectors-BGJARDui.js → connectors-CdC806mA.js} +2 -2
  20. package/public/assets/{connectors-BGJARDui.js.map → connectors-CdC806mA.js.map} +1 -1
  21. package/public/assets/{formatted-body-impl-B7FgqkYL.js → formatted-body-impl-Ca74OAEH.js} +2 -2
  22. package/public/assets/{formatted-body-impl-B7FgqkYL.js.map → formatted-body-impl-Ca74OAEH.js.map} +1 -1
  23. package/public/assets/{index-2m9mT8kV.js → index-C_33ymaw.js} +6 -6
  24. package/public/assets/{index-2m9mT8kV.js.map → index-C_33ymaw.js.map} +1 -1
  25. package/public/assets/{integrations-CJm8-FcG.js → integrations-1nxMizDY.js} +2 -2
  26. package/public/assets/{integrations-CJm8-FcG.js.map → integrations-1nxMizDY.js.map} +1 -1
  27. package/public/assets/{maintenance-CBvZrVAG.js → maintenance-DiFNzNPN.js} +2 -2
  28. package/public/assets/{maintenance-CBvZrVAG.js.map → maintenance-DiFNzNPN.js.map} +1 -1
  29. package/public/assets/{managed-agents-Dcmm8YKt.js → managed-agents-Do3dKvfj.js} +2 -2
  30. package/public/assets/{managed-agents-Dcmm8YKt.js.map → managed-agents-Do3dKvfj.js.map} +1 -1
  31. package/public/assets/{markdown-preview-impl-7xjqdiEu.js → markdown-preview-impl-CLA0J255.js} +2 -2
  32. package/public/assets/{markdown-preview-impl-7xjqdiEu.js.map → markdown-preview-impl-CLA0J255.js.map} +1 -1
  33. package/public/assets/{memory-BmGNW61h.js → memory-IjwqFzBd.js} +2 -2
  34. package/public/assets/{memory-BmGNW61h.js.map → memory-IjwqFzBd.js.map} +1 -1
  35. package/public/assets/{messages-BvMMhoy-.js → messages-DjvWqHyn.js} +2 -2
  36. package/public/assets/{messages-BvMMhoy-.js.map → messages-DjvWqHyn.js.map} +1 -1
  37. package/public/assets/{orchestrators-DsstaupT.js → orchestrators-D2IqDxDT.js} +2 -2
  38. package/public/assets/{orchestrators-DsstaupT.js.map → orchestrators-D2IqDxDT.js.map} +1 -1
  39. package/public/assets/{overview-kK6PTce3.js → overview-DKC3TbAh.js} +2 -2
  40. package/public/assets/{overview-kK6PTce3.js.map → overview-DKC3TbAh.js.map} +1 -1
  41. package/public/assets/{pairs-BEFvTW6X.js → pairs-WpKCPE1n.js} +2 -2
  42. package/public/assets/{pairs-BEFvTW6X.js.map → pairs-WpKCPE1n.js.map} +1 -1
  43. package/public/assets/{security-Dc5wZwv0.js → security-BF7ZtPQe.js} +2 -2
  44. package/public/assets/{security-Dc5wZwv0.js.map → security-BF7ZtPQe.js.map} +1 -1
  45. package/public/assets/{settings-CEtJrORa.js → settings-CQnjrTa-.js} +2 -2
  46. package/public/assets/{settings-CEtJrORa.js.map → settings-CQnjrTa-.js.map} +1 -1
  47. package/public/assets/{store-DkmReBlH.js → store-C9VcSo05.js} +2 -2
  48. package/public/assets/{store-DkmReBlH.js.map → store-C9VcSo05.js.map} +1 -1
  49. package/public/assets/{tasks-pQKtxqeV.js → tasks-CbN_GSSb.js} +2 -2
  50. package/public/assets/{tasks-pQKtxqeV.js.map → tasks-CbN_GSSb.js.map} +1 -1
  51. package/public/assets/{terminal-viewer-impl-Cc769mYy.js → terminal-viewer-impl-BJRohThT.js} +2 -2
  52. package/public/assets/{terminal-viewer-impl-Cc769mYy.js.map → terminal-viewer-impl-BJRohThT.js.map} +1 -1
  53. package/public/assets/{work-queue-DjAanr02.js → work-queue-C5xLBLmm.js} +2 -2
  54. package/public/assets/{work-queue-DjAanr02.js.map → work-queue-C5xLBLmm.js.map} +1 -1
  55. package/public/assets/{workspaces-DLBNyR4k.js → workspaces-D91H3wDX.js} +2 -2
  56. package/public/assets/{workspaces-DLBNyR4k.js.map → workspaces-D91H3wDX.js.map} +1 -1
  57. package/public/index.html +2 -2
  58. package/scripts/orchestrator-spawn-smoke.ts +2 -1
  59. package/src/automations.ts +2 -4
  60. package/src/managed-policy.ts +2 -4
  61. package/src/mcp.ts +3 -3
  62. package/src/routes.ts +69 -139
  63. package/src/runtime-tokens.ts +17 -8
  64. package/src/security.ts +0 -2
package/docs/openapi.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
4
  "title": "Agent Relay API",
5
- "version": "0.27.2",
5
+ "version": "0.32.1",
6
6
  "description": "Real-time message bus for inter-agent communication. Agent-first: this spec is designed for machine consumption — agents can self-discover the full API surface via GET /api/spec.",
7
7
  "license": {
8
8
  "name": "MIT",
@@ -785,12 +785,15 @@
785
785
  "provider": {
786
786
  "type": "string"
787
787
  },
788
- "approvalMode": {
788
+ "orchestratorId": {
789
789
  "type": "string"
790
790
  },
791
791
  "cwd": {
792
792
  "type": "string"
793
793
  },
794
+ "approvalMode": {
795
+ "type": "string"
796
+ },
794
797
  "label": {
795
798
  "type": "string"
796
799
  },
@@ -799,6 +802,27 @@
799
802
  },
800
803
  "profile": {
801
804
  "type": "string"
805
+ },
806
+ "prompt": {
807
+ "type": "string"
808
+ },
809
+ "systemPromptAppend": {
810
+ "type": "string"
811
+ },
812
+ "tags": {
813
+ "type": "string"
814
+ },
815
+ "capabilities": {
816
+ "type": "string"
817
+ },
818
+ "providerArgs": {
819
+ "type": "string"
820
+ },
821
+ "policyName": {
822
+ "type": "string"
823
+ },
824
+ "spawnRequestId": {
825
+ "type": "string"
802
826
  }
803
827
  }
804
828
  }
@@ -827,6 +851,16 @@
827
851
  }
828
852
  }
829
853
  }
854
+ },
855
+ "404": {
856
+ "description": "Not found",
857
+ "content": {
858
+ "application/json": {
859
+ "schema": {
860
+ "$ref": "#/components/schemas/Error"
861
+ }
862
+ }
863
+ }
830
864
  }
831
865
  },
832
866
  "security": [
@@ -1687,6 +1721,9 @@
1687
1721
  "properties": {
1688
1722
  "action": {
1689
1723
  "type": "string"
1724
+ },
1725
+ "surface": {
1726
+ "type": "string"
1690
1727
  }
1691
1728
  }
1692
1729
  }
@@ -2619,131 +2656,6 @@
2619
2656
  ]
2620
2657
  }
2621
2658
  },
2622
- "/api/orchestrators/{id}/spawn": {
2623
- "post": {
2624
- "operationId": "postOrchestratorSpawn",
2625
- "summary": "Post Orchestrator Spawn",
2626
- "tags": [
2627
- "Orchestrators"
2628
- ],
2629
- "parameters": [
2630
- {
2631
- "name": "id",
2632
- "in": "path",
2633
- "required": true,
2634
- "schema": {
2635
- "type": "string"
2636
- }
2637
- }
2638
- ],
2639
- "requestBody": {
2640
- "required": true,
2641
- "content": {
2642
- "application/json": {
2643
- "schema": {
2644
- "type": "object",
2645
- "properties": {
2646
- "provider": {
2647
- "type": "string"
2648
- },
2649
- "cwd": {
2650
- "type": "string"
2651
- },
2652
- "label": {
2653
- "type": "string"
2654
- },
2655
- "approvalMode": {
2656
- "type": "string"
2657
- },
2658
- "prompt": {
2659
- "type": "string"
2660
- },
2661
- "systemPromptAppend": {
2662
- "type": "string"
2663
- },
2664
- "tags": {
2665
- "type": "string"
2666
- },
2667
- "capabilities": {
2668
- "type": "string"
2669
- },
2670
- "providerArgs": {
2671
- "type": "string"
2672
- },
2673
- "profile": {
2674
- "type": "string"
2675
- },
2676
- "workspaceMode": {
2677
- "type": "string"
2678
- },
2679
- "policyName": {
2680
- "type": "string"
2681
- },
2682
- "spawnRequestId": {
2683
- "type": "string"
2684
- }
2685
- }
2686
- }
2687
- }
2688
- }
2689
- },
2690
- "responses": {
2691
- "200": {
2692
- "description": "Success",
2693
- "content": {
2694
- "application/json": {}
2695
- }
2696
- },
2697
- "202": {
2698
- "description": "HTTP 202",
2699
- "content": {
2700
- "application/json": {}
2701
- }
2702
- },
2703
- "400": {
2704
- "description": "Bad request",
2705
- "content": {
2706
- "application/json": {
2707
- "schema": {
2708
- "$ref": "#/components/schemas/Error"
2709
- }
2710
- }
2711
- }
2712
- },
2713
- "404": {
2714
- "description": "Not found",
2715
- "content": {
2716
- "application/json": {
2717
- "schema": {
2718
- "$ref": "#/components/schemas/Error"
2719
- }
2720
- }
2721
- }
2722
- },
2723
- "409": {
2724
- "description": "Conflict",
2725
- "content": {
2726
- "application/json": {
2727
- "schema": {
2728
- "$ref": "#/components/schemas/Error"
2729
- }
2730
- }
2731
- }
2732
- }
2733
- },
2734
- "security": [
2735
- {
2736
- "bearerAuth": []
2737
- },
2738
- {
2739
- "tokenHeader": []
2740
- },
2741
- {
2742
- "tokenQuery": []
2743
- }
2744
- ]
2745
- }
2746
- },
2747
2659
  "/api/orchestrators/{id}/runner-token": {
2748
2660
  "post": {
2749
2661
  "operationId": "postOrchestratorRunnerToken",
@@ -6913,6 +6825,12 @@
6913
6825
  }
6914
6826
  ],
6915
6827
  "responses": {
6828
+ "200": {
6829
+ "description": "Success",
6830
+ "content": {
6831
+ "application/json": {}
6832
+ }
6833
+ },
6916
6834
  "202": {
6917
6835
  "description": "HTTP 202",
6918
6836
  "content": {
@@ -6951,6 +6869,12 @@
6951
6869
  }
6952
6870
  ],
6953
6871
  "responses": {
6872
+ "200": {
6873
+ "description": "Success",
6874
+ "content": {
6875
+ "application/json": {}
6876
+ }
6877
+ },
6954
6878
  "202": {
6955
6879
  "description": "HTTP 202",
6956
6880
  "content": {
@@ -6989,6 +6913,12 @@
6989
6913
  }
6990
6914
  ],
6991
6915
  "responses": {
6916
+ "200": {
6917
+ "description": "Success",
6918
+ "content": {
6919
+ "application/json": {}
6920
+ }
6921
+ },
6992
6922
  "202": {
6993
6923
  "description": "HTTP 202",
6994
6924
  "content": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-relay-server",
3
- "version": "0.32.1",
3
+ "version": "0.32.2",
4
4
  "description": "Lightweight HTTP message relay for inter-agent communication across machines",
5
5
  "module": "src/index.ts",
6
6
  "type": "module",
@@ -1,2 +1,2 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{En as t,Kt as n,N as r,Vn as i,X as a,Y as o,Yt as s,jt as c,kn as l,ot as u,pn as d,u as f}from"./lucide-react-CD8Xl2U3.js";import{i as p,t as m}from"./store-DkmReBlH.js";import{R as h,m as g}from"./display-JI19Vc7L.js";import{t as _}from"./badge-t8zAwHW9.js";import{t as v}from"./button-DDA5P2YQ.js";import{s as y}from"./index-2m9mT8kV.js";import{n as b,t as x}from"./card-CggxP1h9.js";var S=e(i(),1),C=l(),w={question:s,reply:o,message:a,operator:f,pair:u,task:n,state:r},T={question:`bg-blue-500/10 text-blue-400 border-blue-500/20`,reply:`bg-emerald-500/10 text-emerald-400 border-emerald-500/20`,message:`bg-zinc-500/10 text-zinc-400 border-zinc-500/20`,operator:`bg-purple-500/10 text-purple-400 border-purple-500/20`,pair:`bg-yellow-500/10 text-yellow-400 border-yellow-500/20`,task:`bg-orange-500/10 text-orange-400 border-orange-500/20`,state:`bg-cyan-500/10 text-cyan-400 border-cyan-500/20`},E=[`question`,`reply`,`message`,`operator`,`pair`,`task`,`state`];function D(e){let t=e?.surface;if(!t||typeof t!=`object`)return null;let n=t,r=[];return typeof n.component==`string`&&r.push(n.component),typeof n.view==`string`&&n.view!==n.component&&r.push(n.view),typeof n.session==`string`&&r.push(`tab ${n.session.slice(0,6)}`),typeof n.client==`string`&&r.push(`client ${n.client.slice(0,6)}`),r.length?r.join(` · `):null}function O(){let e=p(),n=m(e=>e.activityFilter),r=m(e=>e.activityEvents),i=m(e=>e.operatorActivity),a=m(e=>e.set),o=m(e=>e.openActivityItem),s=m(e=>e.exportActivity),l=(0,S.useMemo)(()=>{let e=[...r,...i],t=new Set,n=[];for(let r of e){let e=r.clientId||String(r.id);t.has(e)||(t.add(e),n.push(r))}return n.map(e=>({...e,ts:e.ts??new Date(e.createdAt).getTime()})).sort((e,t)=>(t.ts??0)-(e.ts??0))},[r,i]),u=(0,S.useMemo)(()=>n?l.filter(e=>e.kind===n):l,[l,n]);return(0,C.jsxs)(`div`,{className:`space-y-4`,children:[(0,C.jsxs)(`div`,{className:`flex items-center justify-between flex-wrap gap-2`,children:[(0,C.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,C.jsx)(t,{className:`w-5 h-5 text-muted-foreground`}),(0,C.jsx)(`h2`,{className:`text-lg font-semibold`,children:`Activity`}),(0,C.jsx)(_,{variant:`secondary`,children:u.length})]}),(0,C.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,C.jsxs)(`select`,{className:`rounded-md border border-input bg-background px-3 py-1.5 text-sm`,value:n,onChange:e=>a({activityFilter:e.target.value}),children:[(0,C.jsx)(`option`,{value:``,children:`All types`}),E.map(e=>(0,C.jsx)(`option`,{value:e,children:e},e))]}),(0,C.jsxs)(v,{size:`sm`,variant:`outline`,onClick:()=>s(`markdown`),children:[(0,C.jsx)(c,{className:`w-4 h-4 mr-1`}),` Markdown`]}),(0,C.jsxs)(v,{size:`sm`,variant:`outline`,onClick:()=>s(`json`),children:[(0,C.jsx)(d,{className:`w-4 h-4 mr-1`}),` JSON`]})]})]}),(0,C.jsx)(y,{className:`h-[calc(100dvh-11rem)]`,children:(0,C.jsxs)(`div`,{className:`space-y-2 pr-2`,children:[u.length===0&&(0,C.jsx)(`div`,{className:`text-center text-muted-foreground py-16 text-sm`,children:`No activity yet`}),u.map(n=>{let r=w[n.kind]||t,i=T[n.kind]||T.message,a=D(n.metadata);return(0,C.jsx)(x,{className:`cursor-pointer hover:bg-accent/40 transition-colors`,onClick:()=>o(n),children:(0,C.jsxs)(b,{className:`p-3 flex gap-3`,children:[(0,C.jsx)(`span`,{className:`inline-flex items-center justify-center w-7 h-7 rounded-md border shrink-0 mt-0.5 ${i}`,children:(0,C.jsx)(r,{className:`w-3.5 h-3.5`})}),(0,C.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,C.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,C.jsx)(`span`,{className:`font-medium text-sm truncate`,children:n.title}),(0,C.jsx)(_,{variant:`outline`,className:`text-xs px-1.5 py-0 border ${i}`,children:n.kind}),(0,C.jsx)(`span`,{className:`text-xs text-muted-foreground ml-auto shrink-0`,title:g(n.ts??n.createdAt),children:h(e,n.ts??n.createdAt)})]}),n.body&&(0,C.jsx)(`p`,{className:`text-xs text-muted-foreground mt-0.5 line-clamp-2`,children:n.body}),n.meta&&(0,C.jsx)(`p`,{className:`text-xs text-muted-foreground/60 mt-0.5 font-mono truncate`,children:n.meta}),a&&(0,C.jsxs)(`p`,{className:`text-xs text-muted-foreground/60 mt-0.5 truncate`,title:a,children:[(0,C.jsx)(`span`,{className:`opacity-70`,children:`via`}),` `,a]})]})]})},n.clientId||n.id)})]})})]})}export{O as ActivityView};
2
- //# sourceMappingURL=activity-C6nbfryG.js.map
1
+ import{r as e}from"./chunk-CilyBKbf.js";import{En as t,Kt as n,N as r,Vn as i,X as a,Y as o,Yt as s,jt as c,kn as l,ot as u,pn as d,u as f}from"./lucide-react-CD8Xl2U3.js";import{i as p,t as m}from"./store-C9VcSo05.js";import{R as h,m as g}from"./display-JI19Vc7L.js";import{t as _}from"./badge-t8zAwHW9.js";import{t as v}from"./button-DDA5P2YQ.js";import{s as y}from"./index-C_33ymaw.js";import{n as b,t as x}from"./card-CggxP1h9.js";var S=e(i(),1),C=l(),w={question:s,reply:o,message:a,operator:f,pair:u,task:n,state:r},T={question:`bg-blue-500/10 text-blue-400 border-blue-500/20`,reply:`bg-emerald-500/10 text-emerald-400 border-emerald-500/20`,message:`bg-zinc-500/10 text-zinc-400 border-zinc-500/20`,operator:`bg-purple-500/10 text-purple-400 border-purple-500/20`,pair:`bg-yellow-500/10 text-yellow-400 border-yellow-500/20`,task:`bg-orange-500/10 text-orange-400 border-orange-500/20`,state:`bg-cyan-500/10 text-cyan-400 border-cyan-500/20`},E=[`question`,`reply`,`message`,`operator`,`pair`,`task`,`state`];function D(e){let t=e?.surface;if(!t||typeof t!=`object`)return null;let n=t,r=[];return typeof n.component==`string`&&r.push(n.component),typeof n.view==`string`&&n.view!==n.component&&r.push(n.view),typeof n.session==`string`&&r.push(`tab ${n.session.slice(0,6)}`),typeof n.client==`string`&&r.push(`client ${n.client.slice(0,6)}`),r.length?r.join(` · `):null}function O(){let e=p(),n=m(e=>e.activityFilter),r=m(e=>e.activityEvents),i=m(e=>e.operatorActivity),a=m(e=>e.set),o=m(e=>e.openActivityItem),s=m(e=>e.exportActivity),l=(0,S.useMemo)(()=>{let e=[...r,...i],t=new Set,n=[];for(let r of e){let e=r.clientId||String(r.id);t.has(e)||(t.add(e),n.push(r))}return n.map(e=>({...e,ts:e.ts??new Date(e.createdAt).getTime()})).sort((e,t)=>(t.ts??0)-(e.ts??0))},[r,i]),u=(0,S.useMemo)(()=>n?l.filter(e=>e.kind===n):l,[l,n]);return(0,C.jsxs)(`div`,{className:`space-y-4`,children:[(0,C.jsxs)(`div`,{className:`flex items-center justify-between flex-wrap gap-2`,children:[(0,C.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,C.jsx)(t,{className:`w-5 h-5 text-muted-foreground`}),(0,C.jsx)(`h2`,{className:`text-lg font-semibold`,children:`Activity`}),(0,C.jsx)(_,{variant:`secondary`,children:u.length})]}),(0,C.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,C.jsxs)(`select`,{className:`rounded-md border border-input bg-background px-3 py-1.5 text-sm`,value:n,onChange:e=>a({activityFilter:e.target.value}),children:[(0,C.jsx)(`option`,{value:``,children:`All types`}),E.map(e=>(0,C.jsx)(`option`,{value:e,children:e},e))]}),(0,C.jsxs)(v,{size:`sm`,variant:`outline`,onClick:()=>s(`markdown`),children:[(0,C.jsx)(c,{className:`w-4 h-4 mr-1`}),` Markdown`]}),(0,C.jsxs)(v,{size:`sm`,variant:`outline`,onClick:()=>s(`json`),children:[(0,C.jsx)(d,{className:`w-4 h-4 mr-1`}),` JSON`]})]})]}),(0,C.jsx)(y,{className:`h-[calc(100dvh-11rem)]`,children:(0,C.jsxs)(`div`,{className:`space-y-2 pr-2`,children:[u.length===0&&(0,C.jsx)(`div`,{className:`text-center text-muted-foreground py-16 text-sm`,children:`No activity yet`}),u.map(n=>{let r=w[n.kind]||t,i=T[n.kind]||T.message,a=D(n.metadata);return(0,C.jsx)(x,{className:`cursor-pointer hover:bg-accent/40 transition-colors`,onClick:()=>o(n),children:(0,C.jsxs)(b,{className:`p-3 flex gap-3`,children:[(0,C.jsx)(`span`,{className:`inline-flex items-center justify-center w-7 h-7 rounded-md border shrink-0 mt-0.5 ${i}`,children:(0,C.jsx)(r,{className:`w-3.5 h-3.5`})}),(0,C.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,C.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,C.jsx)(`span`,{className:`font-medium text-sm truncate`,children:n.title}),(0,C.jsx)(_,{variant:`outline`,className:`text-xs px-1.5 py-0 border ${i}`,children:n.kind}),(0,C.jsx)(`span`,{className:`text-xs text-muted-foreground ml-auto shrink-0`,title:g(n.ts??n.createdAt),children:h(e,n.ts??n.createdAt)})]}),n.body&&(0,C.jsx)(`p`,{className:`text-xs text-muted-foreground mt-0.5 line-clamp-2`,children:n.body}),n.meta&&(0,C.jsx)(`p`,{className:`text-xs text-muted-foreground/60 mt-0.5 font-mono truncate`,children:n.meta}),a&&(0,C.jsxs)(`p`,{className:`text-xs text-muted-foreground/60 mt-0.5 truncate`,title:a,children:[(0,C.jsx)(`span`,{className:`opacity-70`,children:`via`}),` `,a]})]})]})},n.clientId||n.id)})]})})]})}export{O as ActivityView};
2
+ //# sourceMappingURL=activity-DT1JGHnp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"activity-C6nbfryG.js","names":[],"sources":["../../dashboard/src/components/views/activity.tsx"],"sourcesContent":["import { useRelayStore, useNow } from '@/store'\nimport { useComposeAgents } from '@/hooks/use-selectors'\nimport { Card, CardContent } from '@/components/ui/card'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { ScrollArea } from '@/components/ui/scroll-area'\nimport {\n Activity, MessageCircle, MessageSquareReply, HelpCircle, User,\n Link, ClipboardList, Radio, FileDown, Braces,\n} from 'lucide-react'\nimport { timeAgo, fmtTime } from '@/lib/display'\nimport type { ActivityEvent } from '@/types'\nimport { useMemo } from 'react'\n\nconst KIND_ICONS: Record<string, React.ElementType> = {\n question: HelpCircle,\n reply: MessageSquareReply,\n message: MessageCircle,\n operator: User,\n pair: Link,\n task: ClipboardList,\n state: Radio,\n}\n\nconst KIND_COLORS: Record<string, string> = {\n question: 'bg-blue-500/10 text-blue-400 border-blue-500/20',\n reply: 'bg-emerald-500/10 text-emerald-400 border-emerald-500/20',\n message: 'bg-zinc-500/10 text-zinc-400 border-zinc-500/20',\n operator: 'bg-purple-500/10 text-purple-400 border-purple-500/20',\n pair: 'bg-yellow-500/10 text-yellow-400 border-yellow-500/20',\n task: 'bg-orange-500/10 text-orange-400 border-orange-500/20',\n state: 'bg-cyan-500/10 text-cyan-400 border-cyan-500/20',\n}\n\nconst KIND_LABELS = ['question', 'reply', 'message', 'operator', 'pair', 'task', 'state'] as const\n\n// Compact attribution line for dashboard-initiated lifecycle commands (#172): identifies the\n// surface that issued a restart/shutdown/reconnect — component, SPA view, tab session, browser.\nfunction formatSurface(metadata: Record<string, unknown> | undefined): string | null {\n const surface = metadata?.surface\n if (!surface || typeof surface !== 'object') return null\n const s = surface as Record<string, unknown>\n const parts: string[] = []\n if (typeof s.component === 'string') parts.push(s.component)\n if (typeof s.view === 'string' && s.view !== s.component) parts.push(s.view)\n if (typeof s.session === 'string') parts.push(`tab ${s.session.slice(0, 6)}`)\n if (typeof s.client === 'string') parts.push(`client ${s.client.slice(0, 6)}`)\n return parts.length ? parts.join(' · ') : null\n}\n\nexport function ActivityView() {\n const now = useNow()\n const activityFilter = useRelayStore((s) => s.activityFilter)\n const activityEvents = useRelayStore((s) => s.activityEvents)\n const operatorActivity = useRelayStore((s) => s.operatorActivity)\n const set = useRelayStore((s) => s.set)\n const openActivityItem = useRelayStore((s) => s.openActivityItem)\n const exportActivity = useRelayStore((s) => s.exportActivity)\n\n const allItems = useMemo(() => {\n const merged = [...activityEvents, ...operatorActivity]\n const seen = new Set<string>()\n const deduped: ActivityEvent[] = []\n for (const item of merged) {\n const key = item.clientId || String(item.id)\n if (!seen.has(key)) { seen.add(key); deduped.push(item) }\n }\n return deduped\n .map((e) => ({ ...e, ts: e.ts ?? new Date(e.createdAt as string).getTime() }))\n .sort((a, b) => (b.ts ?? 0) - (a.ts ?? 0))\n }, [activityEvents, operatorActivity])\n\n const filtered = useMemo(() => {\n if (!activityFilter) return allItems\n return allItems.filter((e) => e.kind === activityFilter)\n }, [allItems, activityFilter])\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-2\">\n <Activity className=\"w-5 h-5 text-muted-foreground\" />\n <h2 className=\"text-lg font-semibold\">Activity</h2>\n <Badge variant=\"secondary\">{filtered.length}</Badge>\n </div>\n <div className=\"flex items-center gap-2\">\n <select\n className=\"rounded-md border border-input bg-background px-3 py-1.5 text-sm\"\n value={activityFilter}\n onChange={(e) => set({ activityFilter: e.target.value })}\n >\n <option value=\"\">All types</option>\n {KIND_LABELS.map((k) => <option key={k} value={k}>{k}</option>)}\n </select>\n <Button size=\"sm\" variant=\"outline\" onClick={() => exportActivity('markdown')}>\n <FileDown className=\"w-4 h-4 mr-1\" /> Markdown\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => exportActivity('json')}>\n <Braces className=\"w-4 h-4 mr-1\" /> JSON\n </Button>\n </div>\n </div>\n\n <ScrollArea className=\"h-[calc(100dvh-11rem)]\">\n <div className=\"space-y-2 pr-2\">\n {filtered.length === 0 && (\n <div className=\"text-center text-muted-foreground py-16 text-sm\">No activity yet</div>\n )}\n {filtered.map((item) => {\n const Icon = KIND_ICONS[item.kind] || Activity\n const colorClass = KIND_COLORS[item.kind] || KIND_COLORS.message\n const surface = formatSurface(item.metadata)\n return (\n <Card\n key={item.clientId || item.id}\n className=\"cursor-pointer hover:bg-accent/40 transition-colors\"\n onClick={() => openActivityItem(item)}\n >\n <CardContent className=\"p-3 flex gap-3\">\n <span className={`inline-flex items-center justify-center w-7 h-7 rounded-md border shrink-0 mt-0.5 ${colorClass}`}>\n <Icon className=\"w-3.5 h-3.5\" />\n </span>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-medium text-sm truncate\">{item.title}</span>\n <Badge variant=\"outline\" className={`text-xs px-1.5 py-0 border ${colorClass}`}>{item.kind}</Badge>\n <span className=\"text-xs text-muted-foreground ml-auto shrink-0\" title={fmtTime(item.ts ?? item.createdAt)}>\n {timeAgo(now, item.ts ?? item.createdAt)}\n </span>\n </div>\n {item.body && (\n <p className=\"text-xs text-muted-foreground mt-0.5 line-clamp-2\">{item.body}</p>\n )}\n {item.meta && (\n <p className=\"text-xs text-muted-foreground/60 mt-0.5 font-mono truncate\">{item.meta}</p>\n )}\n {surface && (\n <p className=\"text-xs text-muted-foreground/60 mt-0.5 truncate\" title={surface}>\n <span className=\"opacity-70\">via</span> {surface}\n </p>\n )}\n </div>\n </CardContent>\n </Card>\n )\n })}\n </div>\n </ScrollArea>\n </div>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"activity-DT1JGHnp.js","names":[],"sources":["../../dashboard/src/components/views/activity.tsx"],"sourcesContent":["import { useRelayStore, useNow } from '@/store'\nimport { useComposeAgents } from '@/hooks/use-selectors'\nimport { Card, CardContent } from '@/components/ui/card'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { ScrollArea } from '@/components/ui/scroll-area'\nimport {\n Activity, MessageCircle, MessageSquareReply, HelpCircle, User,\n Link, ClipboardList, Radio, FileDown, Braces,\n} from 'lucide-react'\nimport { timeAgo, fmtTime } from '@/lib/display'\nimport type { ActivityEvent } from '@/types'\nimport { useMemo } from 'react'\n\nconst KIND_ICONS: Record<string, React.ElementType> = {\n question: HelpCircle,\n reply: MessageSquareReply,\n message: MessageCircle,\n operator: User,\n pair: Link,\n task: ClipboardList,\n state: Radio,\n}\n\nconst KIND_COLORS: Record<string, string> = {\n question: 'bg-blue-500/10 text-blue-400 border-blue-500/20',\n reply: 'bg-emerald-500/10 text-emerald-400 border-emerald-500/20',\n message: 'bg-zinc-500/10 text-zinc-400 border-zinc-500/20',\n operator: 'bg-purple-500/10 text-purple-400 border-purple-500/20',\n pair: 'bg-yellow-500/10 text-yellow-400 border-yellow-500/20',\n task: 'bg-orange-500/10 text-orange-400 border-orange-500/20',\n state: 'bg-cyan-500/10 text-cyan-400 border-cyan-500/20',\n}\n\nconst KIND_LABELS = ['question', 'reply', 'message', 'operator', 'pair', 'task', 'state'] as const\n\n// Compact attribution line for dashboard-initiated lifecycle commands (#172): identifies the\n// surface that issued a restart/shutdown/reconnect — component, SPA view, tab session, browser.\nfunction formatSurface(metadata: Record<string, unknown> | undefined): string | null {\n const surface = metadata?.surface\n if (!surface || typeof surface !== 'object') return null\n const s = surface as Record<string, unknown>\n const parts: string[] = []\n if (typeof s.component === 'string') parts.push(s.component)\n if (typeof s.view === 'string' && s.view !== s.component) parts.push(s.view)\n if (typeof s.session === 'string') parts.push(`tab ${s.session.slice(0, 6)}`)\n if (typeof s.client === 'string') parts.push(`client ${s.client.slice(0, 6)}`)\n return parts.length ? parts.join(' · ') : null\n}\n\nexport function ActivityView() {\n const now = useNow()\n const activityFilter = useRelayStore((s) => s.activityFilter)\n const activityEvents = useRelayStore((s) => s.activityEvents)\n const operatorActivity = useRelayStore((s) => s.operatorActivity)\n const set = useRelayStore((s) => s.set)\n const openActivityItem = useRelayStore((s) => s.openActivityItem)\n const exportActivity = useRelayStore((s) => s.exportActivity)\n\n const allItems = useMemo(() => {\n const merged = [...activityEvents, ...operatorActivity]\n const seen = new Set<string>()\n const deduped: ActivityEvent[] = []\n for (const item of merged) {\n const key = item.clientId || String(item.id)\n if (!seen.has(key)) { seen.add(key); deduped.push(item) }\n }\n return deduped\n .map((e) => ({ ...e, ts: e.ts ?? new Date(e.createdAt as string).getTime() }))\n .sort((a, b) => (b.ts ?? 0) - (a.ts ?? 0))\n }, [activityEvents, operatorActivity])\n\n const filtered = useMemo(() => {\n if (!activityFilter) return allItems\n return allItems.filter((e) => e.kind === activityFilter)\n }, [allItems, activityFilter])\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-2\">\n <Activity className=\"w-5 h-5 text-muted-foreground\" />\n <h2 className=\"text-lg font-semibold\">Activity</h2>\n <Badge variant=\"secondary\">{filtered.length}</Badge>\n </div>\n <div className=\"flex items-center gap-2\">\n <select\n className=\"rounded-md border border-input bg-background px-3 py-1.5 text-sm\"\n value={activityFilter}\n onChange={(e) => set({ activityFilter: e.target.value })}\n >\n <option value=\"\">All types</option>\n {KIND_LABELS.map((k) => <option key={k} value={k}>{k}</option>)}\n </select>\n <Button size=\"sm\" variant=\"outline\" onClick={() => exportActivity('markdown')}>\n <FileDown className=\"w-4 h-4 mr-1\" /> Markdown\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => exportActivity('json')}>\n <Braces className=\"w-4 h-4 mr-1\" /> JSON\n </Button>\n </div>\n </div>\n\n <ScrollArea className=\"h-[calc(100dvh-11rem)]\">\n <div className=\"space-y-2 pr-2\">\n {filtered.length === 0 && (\n <div className=\"text-center text-muted-foreground py-16 text-sm\">No activity yet</div>\n )}\n {filtered.map((item) => {\n const Icon = KIND_ICONS[item.kind] || Activity\n const colorClass = KIND_COLORS[item.kind] || KIND_COLORS.message\n const surface = formatSurface(item.metadata)\n return (\n <Card\n key={item.clientId || item.id}\n className=\"cursor-pointer hover:bg-accent/40 transition-colors\"\n onClick={() => openActivityItem(item)}\n >\n <CardContent className=\"p-3 flex gap-3\">\n <span className={`inline-flex items-center justify-center w-7 h-7 rounded-md border shrink-0 mt-0.5 ${colorClass}`}>\n <Icon className=\"w-3.5 h-3.5\" />\n </span>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-medium text-sm truncate\">{item.title}</span>\n <Badge variant=\"outline\" className={`text-xs px-1.5 py-0 border ${colorClass}`}>{item.kind}</Badge>\n <span className=\"text-xs text-muted-foreground ml-auto shrink-0\" title={fmtTime(item.ts ?? item.createdAt)}>\n {timeAgo(now, item.ts ?? item.createdAt)}\n </span>\n </div>\n {item.body && (\n <p className=\"text-xs text-muted-foreground mt-0.5 line-clamp-2\">{item.body}</p>\n )}\n {item.meta && (\n <p className=\"text-xs text-muted-foreground/60 mt-0.5 font-mono truncate\">{item.meta}</p>\n )}\n {surface && (\n <p className=\"text-xs text-muted-foreground/60 mt-0.5 truncate\" title={surface}>\n <span className=\"opacity-70\">via</span> {surface}\n </p>\n )}\n </div>\n </CardContent>\n </Card>\n )\n })}\n </div>\n </ScrollArea>\n </div>\n )\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{I as e,Nt as t,Vt as n,f as r,kn as i,m as a,z as o}from"./lucide-react-CD8Xl2U3.js";import{t as s}from"./store-DkmReBlH.js";import{t as c}from"./badge-t8zAwHW9.js";import{t as l}from"./button-DDA5P2YQ.js";var u=i(),d={host:`text-emerald-400 bg-emerald-500/10`,minimal:`text-amber-400 bg-amber-500/10`,isolated:`text-red-400 bg-red-500/10`};function f({relay:e}){return(0,u.jsx)(`div`,{className:`flex items-center gap-1`,children:[{key:`ctx`,on:e.context},{key:`skl`,on:e.skills},{key:`plg`,on:e.plugins},{key:`stl`,on:e.statusLine}].map(e=>(0,u.jsx)(`span`,{className:`inline-block h-1.5 w-1.5 rounded-full ${e.on?`bg-emerald-400`:`bg-muted-foreground/30`}`,title:`${e.key}: ${e.on?`on`:`off`}`},e.key))})}function p({profile:e}){let r=s(e=>e.openProfileModal),i=s(e=>e.deleteProfile),p=e.builtIn===!0;return(0,u.jsxs)(`div`,{className:`group flex flex-col gap-3 rounded-lg border border-border bg-card p-4`,children:[(0,u.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,u.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,u.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,u.jsx)(`span`,{className:`font-mono text-sm font-medium`,children:e.name}),p&&(0,u.jsx)(c,{variant:`secondary`,className:`text-[10px]`,children:`Built-in`})]}),e.description&&(0,u.jsx)(`p`,{className:`mt-0.5 text-xs text-muted-foreground line-clamp-2`,children:e.description})]}),(0,u.jsxs)(`div`,{className:`flex shrink-0 items-center gap-0.5 opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-opacity`,children:[(0,u.jsx)(l,{variant:`ghost`,size:`icon-sm`,className:`h-7 w-7`,title:`View`,onClick:()=>r(`view`,e),children:(0,u.jsx)(t,{className:`h-3.5 w-3.5`})}),!p&&(0,u.jsx)(l,{variant:`ghost`,size:`icon-sm`,className:`h-7 w-7`,title:`Edit`,onClick:()=>r(`edit`,e),children:(0,u.jsx)(o,{className:`h-3.5 w-3.5`})}),(0,u.jsx)(l,{variant:`ghost`,size:`icon-sm`,className:`h-7 w-7`,title:`Duplicate`,onClick:()=>r(`duplicate`,e),children:(0,u.jsx)(n,{className:`h-3.5 w-3.5`})}),!p&&(0,u.jsx)(l,{variant:`ghost`,size:`icon-sm`,className:`h-7 w-7 text-destructive`,title:`Delete`,onClick:()=>i(e.name),children:(0,u.jsx)(a,{className:`h-3.5 w-3.5`})})]})]}),(0,u.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5 text-[10px]`,children:[(0,u.jsx)(c,{variant:`outline`,className:d[e.base]||``,children:e.base}),(0,u.jsx)(c,{variant:`outline`,children:e.provider||`any`}),(0,u.jsxs)(c,{variant:`outline`,children:[`fs: `,e.permissions.filesystem]}),e.permissions.mode&&(0,u.jsx)(c,{variant:`outline`,children:e.permissions.mode})]}),(0,u.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-4 gap-y-1 text-[10px] text-muted-foreground`,children:[(0,u.jsxs)(`span`,{className:`flex items-center gap-1`,children:[`Relay `,(0,u.jsx)(f,{relay:e.relay})]}),(0,u.jsxs)(`span`,{children:[`MCP: `,e.mcp.mode]}),(0,u.jsxs)(`span`,{children:[`Hooks: `,e.hooks.mode]}),e.instructions.globalInstructions===`ignore`&&(0,u.jsx)(`span`,{className:`text-amber-400`,children:`global: ignore`}),Object.keys(e.env||{}).length>0&&(0,u.jsxs)(`span`,{children:[Object.keys(e.env).length,` env vars`]})]})]})}function m(){let t=s(e=>e.agentProfiles),n=s(e=>e.openProfileModal),i=t.filter(e=>e.builtIn),a=t.filter(e=>!e.builtIn);return(0,u.jsxs)(`div`,{className:`space-y-4`,children:[(0,u.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,u.jsxs)(`div`,{className:`flex items-center gap-2 text-lg font-semibold`,children:[(0,u.jsx)(r,{className:`h-5 w-5 text-primary`}),`Agent Profiles`]}),(0,u.jsx)(c,{variant:`outline`,children:t.length}),(0,u.jsx)(`div`,{className:`flex-1`}),(0,u.jsxs)(l,{size:`sm`,className:`gap-1`,onClick:()=>n(`create`),children:[(0,u.jsx)(e,{className:`h-3.5 w-3.5`}),`Create Profile`]})]}),i.length>0&&(0,u.jsxs)(`div`,{children:[(0,u.jsx)(`h3`,{className:`mb-2 text-xs font-medium text-muted-foreground uppercase tracking-wider`,children:`Built-in`}),(0,u.jsx)(`div`,{className:`grid gap-3 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3`,children:i.map(e=>(0,u.jsx)(p,{profile:e},e.name))})]}),a.length>0&&(0,u.jsxs)(`div`,{children:[(0,u.jsx)(`h3`,{className:`mb-2 text-xs font-medium text-muted-foreground uppercase tracking-wider`,children:`Custom`}),(0,u.jsx)(`div`,{className:`grid gap-3 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3`,children:a.map(e=>(0,u.jsx)(p,{profile:e},e.name))})]}),t.length===0&&(0,u.jsx)(`div`,{className:`py-12 text-center text-sm text-muted-foreground`,children:`No agent profiles found. Create one to configure agent behavior.`})]})}export{m as AgentProfilesView};
2
- //# sourceMappingURL=agent-profiles-FEITAgHs.js.map
1
+ import{I as e,Nt as t,Vt as n,f as r,kn as i,m as a,z as o}from"./lucide-react-CD8Xl2U3.js";import{t as s}from"./store-C9VcSo05.js";import{t as c}from"./badge-t8zAwHW9.js";import{t as l}from"./button-DDA5P2YQ.js";var u=i(),d={host:`text-emerald-400 bg-emerald-500/10`,minimal:`text-amber-400 bg-amber-500/10`,isolated:`text-red-400 bg-red-500/10`};function f({relay:e}){return(0,u.jsx)(`div`,{className:`flex items-center gap-1`,children:[{key:`ctx`,on:e.context},{key:`skl`,on:e.skills},{key:`plg`,on:e.plugins},{key:`stl`,on:e.statusLine}].map(e=>(0,u.jsx)(`span`,{className:`inline-block h-1.5 w-1.5 rounded-full ${e.on?`bg-emerald-400`:`bg-muted-foreground/30`}`,title:`${e.key}: ${e.on?`on`:`off`}`},e.key))})}function p({profile:e}){let r=s(e=>e.openProfileModal),i=s(e=>e.deleteProfile),p=e.builtIn===!0;return(0,u.jsxs)(`div`,{className:`group flex flex-col gap-3 rounded-lg border border-border bg-card p-4`,children:[(0,u.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,u.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,u.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,u.jsx)(`span`,{className:`font-mono text-sm font-medium`,children:e.name}),p&&(0,u.jsx)(c,{variant:`secondary`,className:`text-[10px]`,children:`Built-in`})]}),e.description&&(0,u.jsx)(`p`,{className:`mt-0.5 text-xs text-muted-foreground line-clamp-2`,children:e.description})]}),(0,u.jsxs)(`div`,{className:`flex shrink-0 items-center gap-0.5 opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-opacity`,children:[(0,u.jsx)(l,{variant:`ghost`,size:`icon-sm`,className:`h-7 w-7`,title:`View`,onClick:()=>r(`view`,e),children:(0,u.jsx)(t,{className:`h-3.5 w-3.5`})}),!p&&(0,u.jsx)(l,{variant:`ghost`,size:`icon-sm`,className:`h-7 w-7`,title:`Edit`,onClick:()=>r(`edit`,e),children:(0,u.jsx)(o,{className:`h-3.5 w-3.5`})}),(0,u.jsx)(l,{variant:`ghost`,size:`icon-sm`,className:`h-7 w-7`,title:`Duplicate`,onClick:()=>r(`duplicate`,e),children:(0,u.jsx)(n,{className:`h-3.5 w-3.5`})}),!p&&(0,u.jsx)(l,{variant:`ghost`,size:`icon-sm`,className:`h-7 w-7 text-destructive`,title:`Delete`,onClick:()=>i(e.name),children:(0,u.jsx)(a,{className:`h-3.5 w-3.5`})})]})]}),(0,u.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5 text-[10px]`,children:[(0,u.jsx)(c,{variant:`outline`,className:d[e.base]||``,children:e.base}),(0,u.jsx)(c,{variant:`outline`,children:e.provider||`any`}),(0,u.jsxs)(c,{variant:`outline`,children:[`fs: `,e.permissions.filesystem]}),e.permissions.mode&&(0,u.jsx)(c,{variant:`outline`,children:e.permissions.mode})]}),(0,u.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-4 gap-y-1 text-[10px] text-muted-foreground`,children:[(0,u.jsxs)(`span`,{className:`flex items-center gap-1`,children:[`Relay `,(0,u.jsx)(f,{relay:e.relay})]}),(0,u.jsxs)(`span`,{children:[`MCP: `,e.mcp.mode]}),(0,u.jsxs)(`span`,{children:[`Hooks: `,e.hooks.mode]}),e.instructions.globalInstructions===`ignore`&&(0,u.jsx)(`span`,{className:`text-amber-400`,children:`global: ignore`}),Object.keys(e.env||{}).length>0&&(0,u.jsxs)(`span`,{children:[Object.keys(e.env).length,` env vars`]})]})]})}function m(){let t=s(e=>e.agentProfiles),n=s(e=>e.openProfileModal),i=t.filter(e=>e.builtIn),a=t.filter(e=>!e.builtIn);return(0,u.jsxs)(`div`,{className:`space-y-4`,children:[(0,u.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,u.jsxs)(`div`,{className:`flex items-center gap-2 text-lg font-semibold`,children:[(0,u.jsx)(r,{className:`h-5 w-5 text-primary`}),`Agent Profiles`]}),(0,u.jsx)(c,{variant:`outline`,children:t.length}),(0,u.jsx)(`div`,{className:`flex-1`}),(0,u.jsxs)(l,{size:`sm`,className:`gap-1`,onClick:()=>n(`create`),children:[(0,u.jsx)(e,{className:`h-3.5 w-3.5`}),`Create Profile`]})]}),i.length>0&&(0,u.jsxs)(`div`,{children:[(0,u.jsx)(`h3`,{className:`mb-2 text-xs font-medium text-muted-foreground uppercase tracking-wider`,children:`Built-in`}),(0,u.jsx)(`div`,{className:`grid gap-3 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3`,children:i.map(e=>(0,u.jsx)(p,{profile:e},e.name))})]}),a.length>0&&(0,u.jsxs)(`div`,{children:[(0,u.jsx)(`h3`,{className:`mb-2 text-xs font-medium text-muted-foreground uppercase tracking-wider`,children:`Custom`}),(0,u.jsx)(`div`,{className:`grid gap-3 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3`,children:a.map(e=>(0,u.jsx)(p,{profile:e},e.name))})]}),t.length===0&&(0,u.jsx)(`div`,{className:`py-12 text-center text-sm text-muted-foreground`,children:`No agent profiles found. Create one to configure agent behavior.`})]})}export{m as AgentProfilesView};
2
+ //# sourceMappingURL=agent-profiles-CrMemMkZ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-profiles-FEITAgHs.js","names":[],"sources":["../../dashboard/src/components/views/agent-profiles.tsx"],"sourcesContent":["import { useRelayStore } from '@/store'\nimport { Button } from '@/components/ui/button'\nimport { Badge } from '@/components/ui/badge'\nimport { Copy, Eye, Pencil, Plus, Trash2, UserCog } from 'lucide-react'\nimport type { AgentProfile } from '@/types'\n\nconst BASE_COLORS: Record<string, string> = {\n host: 'text-emerald-400 bg-emerald-500/10',\n minimal: 'text-amber-400 bg-amber-500/10',\n isolated: 'text-red-400 bg-red-500/10',\n}\n\nfunction RelayDots({ relay }: { relay: AgentProfile['relay'] }) {\n const items = [\n { key: 'ctx', on: relay.context },\n { key: 'skl', on: relay.skills },\n { key: 'plg', on: relay.plugins },\n { key: 'stl', on: relay.statusLine },\n ]\n return (\n <div className=\"flex items-center gap-1\">\n {items.map((item) => (\n <span key={item.key} className={`inline-block h-1.5 w-1.5 rounded-full ${item.on ? 'bg-emerald-400' : 'bg-muted-foreground/30'}`} title={`${item.key}: ${item.on ? 'on' : 'off'}`} />\n ))}\n </div>\n )\n}\n\nfunction ProfileCard({ profile }: { profile: AgentProfile }) {\n const openProfileModal = useRelayStore((s) => s.openProfileModal)\n const deleteProfile = useRelayStore((s) => s.deleteProfile)\n const isBuiltIn = profile.builtIn === true\n\n return (\n <div className=\"group flex flex-col gap-3 rounded-lg border border-border bg-card p-4\">\n <div className=\"flex items-start gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-sm font-medium\">{profile.name}</span>\n {isBuiltIn && <Badge variant=\"secondary\" className=\"text-[10px]\">Built-in</Badge>}\n </div>\n {profile.description && (\n <p className=\"mt-0.5 text-xs text-muted-foreground line-clamp-2\">{profile.description}</p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-0.5 opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-opacity\">\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"h-7 w-7\" title=\"View\" onClick={() => openProfileModal('view', profile)}>\n <Eye className=\"h-3.5 w-3.5\" />\n </Button>\n {!isBuiltIn && (\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"h-7 w-7\" title=\"Edit\" onClick={() => openProfileModal('edit', profile)}>\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"h-7 w-7\" title=\"Duplicate\" onClick={() => openProfileModal('duplicate', profile)}>\n <Copy className=\"h-3.5 w-3.5\" />\n </Button>\n {!isBuiltIn && (\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"h-7 w-7 text-destructive\" title=\"Delete\" onClick={() => deleteProfile(profile.name)}>\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-1.5 text-[10px]\">\n <Badge variant=\"outline\" className={BASE_COLORS[profile.base] || ''}>{profile.base}</Badge>\n <Badge variant=\"outline\">{profile.provider || 'any'}</Badge>\n <Badge variant=\"outline\">fs: {profile.permissions.filesystem}</Badge>\n {profile.permissions.mode && <Badge variant=\"outline\">{profile.permissions.mode}</Badge>}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-[10px] text-muted-foreground\">\n <span className=\"flex items-center gap-1\">\n Relay <RelayDots relay={profile.relay} />\n </span>\n <span>MCP: {profile.mcp.mode}</span>\n <span>Hooks: {profile.hooks.mode}</span>\n {profile.instructions.globalInstructions === 'ignore' && <span className=\"text-amber-400\">global: ignore</span>}\n {Object.keys(profile.env || {}).length > 0 && <span>{Object.keys(profile.env).length} env vars</span>}\n </div>\n </div>\n )\n}\n\nexport function AgentProfilesView() {\n const profiles = useRelayStore((s) => s.agentProfiles)\n const openProfileModal = useRelayStore((s) => s.openProfileModal)\n\n const builtIn = profiles.filter((p) => p.builtIn)\n const custom = profiles.filter((p) => !p.builtIn)\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"flex items-center gap-2 text-lg font-semibold\">\n <UserCog className=\"h-5 w-5 text-primary\" />\n Agent Profiles\n </div>\n <Badge variant=\"outline\">{profiles.length}</Badge>\n <div className=\"flex-1\" />\n <Button size=\"sm\" className=\"gap-1\" onClick={() => openProfileModal('create')}>\n <Plus className=\"h-3.5 w-3.5\" />\n Create Profile\n </Button>\n </div>\n\n {builtIn.length > 0 && (\n <div>\n <h3 className=\"mb-2 text-xs font-medium text-muted-foreground uppercase tracking-wider\">Built-in</h3>\n <div className=\"grid gap-3 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\">\n {builtIn.map((p) => <ProfileCard key={p.name} profile={p} />)}\n </div>\n </div>\n )}\n\n {custom.length > 0 && (\n <div>\n <h3 className=\"mb-2 text-xs font-medium text-muted-foreground uppercase tracking-wider\">Custom</h3>\n <div className=\"grid gap-3 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\">\n {custom.map((p) => <ProfileCard key={p.name} profile={p} />)}\n </div>\n </div>\n )}\n\n {profiles.length === 0 && (\n <div className=\"py-12 text-center text-sm text-muted-foreground\">\n No agent profiles found. Create one to configure agent behavior.\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"agent-profiles-CrMemMkZ.js","names":[],"sources":["../../dashboard/src/components/views/agent-profiles.tsx"],"sourcesContent":["import { useRelayStore } from '@/store'\nimport { Button } from '@/components/ui/button'\nimport { Badge } from '@/components/ui/badge'\nimport { Copy, Eye, Pencil, Plus, Trash2, UserCog } from 'lucide-react'\nimport type { AgentProfile } from '@/types'\n\nconst BASE_COLORS: Record<string, string> = {\n host: 'text-emerald-400 bg-emerald-500/10',\n minimal: 'text-amber-400 bg-amber-500/10',\n isolated: 'text-red-400 bg-red-500/10',\n}\n\nfunction RelayDots({ relay }: { relay: AgentProfile['relay'] }) {\n const items = [\n { key: 'ctx', on: relay.context },\n { key: 'skl', on: relay.skills },\n { key: 'plg', on: relay.plugins },\n { key: 'stl', on: relay.statusLine },\n ]\n return (\n <div className=\"flex items-center gap-1\">\n {items.map((item) => (\n <span key={item.key} className={`inline-block h-1.5 w-1.5 rounded-full ${item.on ? 'bg-emerald-400' : 'bg-muted-foreground/30'}`} title={`${item.key}: ${item.on ? 'on' : 'off'}`} />\n ))}\n </div>\n )\n}\n\nfunction ProfileCard({ profile }: { profile: AgentProfile }) {\n const openProfileModal = useRelayStore((s) => s.openProfileModal)\n const deleteProfile = useRelayStore((s) => s.deleteProfile)\n const isBuiltIn = profile.builtIn === true\n\n return (\n <div className=\"group flex flex-col gap-3 rounded-lg border border-border bg-card p-4\">\n <div className=\"flex items-start gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-sm font-medium\">{profile.name}</span>\n {isBuiltIn && <Badge variant=\"secondary\" className=\"text-[10px]\">Built-in</Badge>}\n </div>\n {profile.description && (\n <p className=\"mt-0.5 text-xs text-muted-foreground line-clamp-2\">{profile.description}</p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-0.5 opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-opacity\">\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"h-7 w-7\" title=\"View\" onClick={() => openProfileModal('view', profile)}>\n <Eye className=\"h-3.5 w-3.5\" />\n </Button>\n {!isBuiltIn && (\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"h-7 w-7\" title=\"Edit\" onClick={() => openProfileModal('edit', profile)}>\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"h-7 w-7\" title=\"Duplicate\" onClick={() => openProfileModal('duplicate', profile)}>\n <Copy className=\"h-3.5 w-3.5\" />\n </Button>\n {!isBuiltIn && (\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"h-7 w-7 text-destructive\" title=\"Delete\" onClick={() => deleteProfile(profile.name)}>\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-1.5 text-[10px]\">\n <Badge variant=\"outline\" className={BASE_COLORS[profile.base] || ''}>{profile.base}</Badge>\n <Badge variant=\"outline\">{profile.provider || 'any'}</Badge>\n <Badge variant=\"outline\">fs: {profile.permissions.filesystem}</Badge>\n {profile.permissions.mode && <Badge variant=\"outline\">{profile.permissions.mode}</Badge>}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-[10px] text-muted-foreground\">\n <span className=\"flex items-center gap-1\">\n Relay <RelayDots relay={profile.relay} />\n </span>\n <span>MCP: {profile.mcp.mode}</span>\n <span>Hooks: {profile.hooks.mode}</span>\n {profile.instructions.globalInstructions === 'ignore' && <span className=\"text-amber-400\">global: ignore</span>}\n {Object.keys(profile.env || {}).length > 0 && <span>{Object.keys(profile.env).length} env vars</span>}\n </div>\n </div>\n )\n}\n\nexport function AgentProfilesView() {\n const profiles = useRelayStore((s) => s.agentProfiles)\n const openProfileModal = useRelayStore((s) => s.openProfileModal)\n\n const builtIn = profiles.filter((p) => p.builtIn)\n const custom = profiles.filter((p) => !p.builtIn)\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"flex items-center gap-2 text-lg font-semibold\">\n <UserCog className=\"h-5 w-5 text-primary\" />\n Agent Profiles\n </div>\n <Badge variant=\"outline\">{profiles.length}</Badge>\n <div className=\"flex-1\" />\n <Button size=\"sm\" className=\"gap-1\" onClick={() => openProfileModal('create')}>\n <Plus className=\"h-3.5 w-3.5\" />\n Create Profile\n </Button>\n </div>\n\n {builtIn.length > 0 && (\n <div>\n <h3 className=\"mb-2 text-xs font-medium text-muted-foreground uppercase tracking-wider\">Built-in</h3>\n <div className=\"grid gap-3 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\">\n {builtIn.map((p) => <ProfileCard key={p.name} profile={p} />)}\n </div>\n </div>\n )}\n\n {custom.length > 0 && (\n <div>\n <h3 className=\"mb-2 text-xs font-medium text-muted-foreground uppercase tracking-wider\">Custom</h3>\n <div className=\"grid gap-3 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\">\n {custom.map((p) => <ProfileCard key={p.name} profile={p} />)}\n </div>\n </div>\n )}\n\n {profiles.length === 0 && (\n <div className=\"py-12 text-center text-sm text-muted-foreground\">\n No agent profiles found. Create one to configure agent behavior.\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{B as e,Dt as t,Ft as n,G as r,I as i,J as a,P as o,g as s,i as c,kn as l,m as u,ot as d,wn as f,yn as p}from"./lucide-react-CD8Xl2U3.js";import{i as m,t as h}from"./store-DkmReBlH.js";import{B as g,I as _,R as v,V as y,i as b,n as x,r as S,u as C}from"./display-JI19Vc7L.js";import{t as w}from"./badge-t8zAwHW9.js";import{t as T}from"./button-DDA5P2YQ.js";import{t as E}from"./copy-button-CE8e2c-F.js";import{F as D,I as O,L as k,O as A,P as j,_ as ee,d as M,f as N,g as P,l as F,u as I}from"./index-2m9mT8kV.js";import{n as L,t as R}from"./card-CggxP1h9.js";import{n as z,t as B}from"./branch-state-badge-Bi4IbkOZ.js";var V=l();function H({agent:i}){let c=m();h(e=>e.set);let l=h(e=>e.switchView),f=h(e=>e.openInboxThread),p=h(e=>e.openAgentDetail),D=h(e=>e.openPairInvite),O=h(e=>e.openRename),k=h(e=>e.openConfirm),H=h(e=>e.doAgentAction),U=h(e=>e.doDeleteAgent),W=h(e=>e.openFilesForAgent),G=h(e=>e.workspaceAction),K=h(e=>e.openWorkspaceFocus),{terminalOpen:q,terminalTarget:J,terminalOpening:Y,openTerminal:X,closeTerminal:Z}=z(i.id),Q=j(),te=A(i),ne=Q[i.id]||null,$=S(c,i,{...te,needsHumanResponse:!1},ne),re=b(i,`shutdown`),ie=b(i,`compact`),ae=b(i,`clearContext`),oe=!!(i.providerCapabilities?.terminal?.live?.read||i.providerCapabilities?.terminal?.attach?.create),se=!!(i.providerCapabilities?.terminal?.live?.write||i.providerCapabilities?.model?.provider===`claude`),ce=x(i);return(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(R,{className:`group hover:border-zinc-600 transition-colors cursor-pointer`,onClick:()=>p(i),children:(0,V.jsxs)(L,{className:`p-4`,children:[(0,V.jsxs)(`div`,{className:`flex items-start gap-2.5 mb-2.5`,children:[(0,V.jsx)(ee,{agent:i,now:c,className:`mt-0.5`}),(0,V.jsx)(P,{agent:i}),(0,V.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,V.jsx)(`div`,{className:`text-sm font-medium truncate`,children:C(i)}),(0,V.jsx)(`div`,{className:`text-xs mt-0.5 ${g($.tone)}`,children:$.label}),typeof i.meta?.cwd==`string`&&i.meta.cwd&&(0,V.jsx)(`button`,{type:`button`,className:`mt-0.5 block max-w-full truncate font-mono text-[10px] text-muted-foreground hover:text-foreground`,title:`Open ${i.meta.cwd} in Files`,onClick:e=>{e.stopPropagation(),W(i)},children:_(i.meta.cwd)})]}),i.branchState&&i.branchWorkspaceId&&(0,V.jsx)(B,{state:i.branchState,className:`mt-0.5 shrink-0`,onClick:e=>{e.stopPropagation(),K(i.branchWorkspaceId)}})]}),$.badges.length>0&&(0,V.jsx)(`div`,{className:`flex flex-wrap gap-1 mb-2`,children:$.badges.map(e=>(0,V.jsx)(`span`,{className:`text-[10px] px-1.5 py-0.5 rounded-full font-medium ${e.className}`,children:e.label},e.label))}),(i.tags.length>0||y(i.capabilities).length>0)&&(0,V.jsxs)(`div`,{className:`flex flex-wrap gap-1 mb-2`,children:[i.tags.slice(0,3).map(e=>(0,V.jsx)(w,{variant:`outline`,className:`text-[9px] px-1 py-0 h-4`,children:e},e)),y(i.capabilities).slice(0,2).map(e=>(0,V.jsx)(w,{variant:`secondary`,className:`text-[9px] px-1 py-0 h-4`,children:e},e))]}),(0,V.jsxs)(`div`,{className:`space-y-2 mb-2`,children:[(0,V.jsx)(M,{agent:i}),(0,V.jsx)(I,{agent:i,compact:!0}),(0,V.jsx)(N,{agent:i})]}),(0,V.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:i.id!==`user`&&i.id!==`system`&&v(c,i.lastSeen)}),(0,V.jsxs)(`div`,{className:`flex gap-1 mt-2.5 opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-opacity`,onClick:e=>e.stopPropagation(),children:[(0,V.jsx)(E,{value:i.id,label:`Copy agent ID`,size:`icon`,className:`h-7 w-7`,iconClassName:`w-3 h-3`}),(0,V.jsx)(T,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,title:`Chat`,onClick:()=>{f(i.id),l(`chat`)},children:(0,V.jsx)(a,{className:`w-3 h-3`})}),(0,V.jsx)(T,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,title:`Pair`,onClick:()=>D(i.id),children:(0,V.jsx)(d,{className:`w-3 h-3`})}),(0,V.jsx)(T,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,title:`Rename`,onClick:()=>O(i),children:(0,V.jsx)(e,{className:`w-3 h-3`})}),oe&&(0,V.jsx)(T,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,title:`Terminal`,disabled:Y,onClick:()=>void X(),children:(0,V.jsx)(s,{className:`w-3 h-3`})}),(i.branchState===`changes`||i.branchState===`idle`)&&i.branchWorkspaceId&&(0,V.jsx)(T,{size:`icon`,variant:`ghost`,className:`h-7 w-7 text-amber-400 hover:text-amber-300`,title:`Mark workspace ready — hand off to the auto-merge`,onClick:()=>k(`Mark Workspace Ready`,`Mark ${C(i)}'s branch ready to land? The relay auto-merge will rebase and land it.`,()=>G(i.branchWorkspaceId,`ready`)),children:(0,V.jsx)(t,{className:`w-3 h-3`})}),ie&&(0,V.jsx)(T,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,title:`Compact`,onClick:()=>k(`Compact Agent`,`Compact context for ${C(i)}?`,()=>H(i,`compact`,`agents-grid`)),children:(0,V.jsx)(r,{className:`w-3 h-3`})}),ae&&(0,V.jsx)(T,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,title:`Clear Context`,onClick:()=>k(`Clear Context`,`Clear context for ${C(i)}?`,()=>H(i,`clearContext`,`agents-grid`)),children:(0,V.jsx)(n,{className:`w-3 h-3`})}),re&&(0,V.jsx)(T,{size:`icon`,variant:`ghost`,className:`h-7 w-7 text-red-400 hover:text-red-300`,title:`Shutdown`,onClick:()=>k(`Shutdown Agent`,`Shutdown ${C(i)}?`,()=>H(i,`shutdown`,`agents-grid`)),children:(0,V.jsx)(o,{className:`w-3 h-3`})}),ce&&(0,V.jsx)(T,{size:`icon`,variant:`ghost`,className:`h-7 w-7 text-red-400 hover:text-red-300`,title:`Forget stale agent`,onClick:()=>k(`Forget Agent`,`Forget ${C(i)}?`,()=>U(i.id)),children:(0,V.jsx)(u,{className:`w-3 h-3`})})]})]})}),J&&(0,V.jsx)(F,{open:q,onOpenChange:Z,orchestratorId:J.orchestratorId,session:J.session,interactive:J.interactive||se})]})}function U(){let e=h(e=>e.agentPresetFilter),t=h(e=>e.agentStatusFilter),n=h(e=>e.agentTagFilter),r=h(e=>e.agentHostFilter),a=h(e=>e.agentSort),o=h(e=>e.agentSortDir),s=h(e=>e.showOffline),l=h(e=>e.set),u=h(e=>e.openAgentSpawn),d=D(),m=k(),g=O(),_=e||t||n||r;function v(){l({agentPresetFilter:``,agentStatusFilter:``,agentTagFilter:``,agentHostFilter:``})}function y(){l({agentSortDir:o===`asc`?`desc`:`asc`})}return(0,V.jsxs)(`div`,{className:`space-y-4`,children:[(0,V.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,V.jsxs)(`select`,{value:e,onChange:e=>l({agentPresetFilter:e.target.value}),className:`h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground`,children:[(0,V.jsx)(`option`,{value:``,children:`All agents`}),(0,V.jsx)(`option`,{value:`active`,children:`Active`}),(0,V.jsx)(`option`,{value:`claude`,children:`Claude`}),(0,V.jsx)(`option`,{value:`codex`,children:`Codex`}),(0,V.jsx)(`option`,{value:`paired`,children:`Paired`}),(0,V.jsx)(`option`,{value:`unpaired`,children:`Unpaired`}),(0,V.jsx)(`option`,{value:`offline_stale`,children:`Offline / Stale`})]}),(0,V.jsxs)(`select`,{value:t,onChange:e=>l({agentStatusFilter:e.target.value}),className:`h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground`,children:[(0,V.jsx)(`option`,{value:``,children:`Any status`}),(0,V.jsx)(`option`,{value:`online`,children:`Online`}),(0,V.jsx)(`option`,{value:`idle`,children:`Idle`}),(0,V.jsx)(`option`,{value:`busy`,children:`Busy`}),(0,V.jsx)(`option`,{value:`offline`,children:`Offline`}),(0,V.jsx)(`option`,{value:`starting`,children:`Starting`})]}),m.length>0&&(0,V.jsxs)(`select`,{value:n,onChange:e=>l({agentTagFilter:e.target.value}),className:`h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground`,children:[(0,V.jsx)(`option`,{value:``,children:`Any tag`}),m.map(e=>(0,V.jsx)(`option`,{value:e,children:e},e))]}),g.length>1&&(0,V.jsxs)(`select`,{value:r,onChange:e=>l({agentHostFilter:e.target.value}),className:`h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground`,children:[(0,V.jsx)(`option`,{value:``,children:`Any host`}),g.map(e=>(0,V.jsx)(`option`,{value:e,children:e},e))]}),(0,V.jsxs)(`select`,{value:a,onChange:e=>l({agentSort:e.target.value}),className:`h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground`,children:[(0,V.jsx)(`option`,{value:`status`,children:`Sort: Status`}),(0,V.jsx)(`option`,{value:`name`,children:`Sort: Name`}),(0,V.jsx)(`option`,{value:`lastSeen`,children:`Sort: Last seen`}),(0,V.jsx)(`option`,{value:`created`,children:`Sort: Created`})]}),(0,V.jsx)(T,{size:`icon`,variant:`outline`,className:`h-8 w-8`,title:`Toggle sort direction`,onClick:y,children:o===`asc`?(0,V.jsx)(p,{className:`w-3.5 h-3.5`}):(0,V.jsx)(f,{className:`w-3.5 h-3.5`})}),(0,V.jsxs)(`label`,{className:`flex items-center gap-1.5 text-sm text-muted-foreground cursor-pointer select-none`,children:[(0,V.jsx)(`input`,{type:`checkbox`,checked:s,onChange:e=>l({showOffline:e.target.checked}),className:`rounded`}),`Show offline`]}),_&&(0,V.jsxs)(T,{size:`sm`,variant:`ghost`,className:`h-8 text-muted-foreground hover:text-foreground gap-1`,onClick:v,children:[(0,V.jsx)(c,{className:`w-3 h-3`}),`Clear filters`]}),(0,V.jsx)(`div`,{className:`ml-auto`,children:(0,V.jsxs)(T,{size:`sm`,onClick:u,className:`gap-1`,children:[(0,V.jsx)(i,{className:`w-3.5 h-3.5`}),`Spawn`]})})]}),d.length===0?(0,V.jsx)(`div`,{className:`text-center py-16 text-muted-foreground text-sm`,children:`No agents match the current filters.`}):(0,V.jsx)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 xl:grid-cols-4 gap-3`,children:d.map(e=>(0,V.jsx)(H,{agent:e},e.id))})]})}export{U as AgentsView};
2
- //# sourceMappingURL=agents-D4S0yIbe.js.map
1
+ import{B as e,Dt as t,Ft as n,G as r,I as i,J as a,P as o,g as s,i as c,kn as l,m as u,ot as d,wn as f,yn as p}from"./lucide-react-CD8Xl2U3.js";import{i as m,t as h}from"./store-C9VcSo05.js";import{B as g,I as _,R as v,V as y,i as b,n as x,r as S,u as C}from"./display-JI19Vc7L.js";import{t as w}from"./badge-t8zAwHW9.js";import{t as T}from"./button-DDA5P2YQ.js";import{t as E}from"./copy-button-CE8e2c-F.js";import{F as D,I as O,L as k,O as A,P as j,_ as ee,d as M,f as N,g as P,l as F,u as I}from"./index-C_33ymaw.js";import{n as L,t as R}from"./card-CggxP1h9.js";import{n as z,t as B}from"./branch-state-badge-D4ur3m3_.js";var V=l();function H({agent:i}){let c=m();h(e=>e.set);let l=h(e=>e.switchView),f=h(e=>e.openInboxThread),p=h(e=>e.openAgentDetail),D=h(e=>e.openPairInvite),O=h(e=>e.openRename),k=h(e=>e.openConfirm),H=h(e=>e.doAgentAction),U=h(e=>e.doDeleteAgent),W=h(e=>e.openFilesForAgent),G=h(e=>e.workspaceAction),K=h(e=>e.openWorkspaceFocus),{terminalOpen:q,terminalTarget:J,terminalOpening:Y,openTerminal:X,closeTerminal:Z}=z(i.id),Q=j(),te=A(i),ne=Q[i.id]||null,$=S(c,i,{...te,needsHumanResponse:!1},ne),re=b(i,`shutdown`),ie=b(i,`compact`),ae=b(i,`clearContext`),oe=!!(i.providerCapabilities?.terminal?.live?.read||i.providerCapabilities?.terminal?.attach?.create),se=!!(i.providerCapabilities?.terminal?.live?.write||i.providerCapabilities?.model?.provider===`claude`),ce=x(i);return(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(R,{className:`group hover:border-zinc-600 transition-colors cursor-pointer`,onClick:()=>p(i),children:(0,V.jsxs)(L,{className:`p-4`,children:[(0,V.jsxs)(`div`,{className:`flex items-start gap-2.5 mb-2.5`,children:[(0,V.jsx)(ee,{agent:i,now:c,className:`mt-0.5`}),(0,V.jsx)(P,{agent:i}),(0,V.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,V.jsx)(`div`,{className:`text-sm font-medium truncate`,children:C(i)}),(0,V.jsx)(`div`,{className:`text-xs mt-0.5 ${g($.tone)}`,children:$.label}),typeof i.meta?.cwd==`string`&&i.meta.cwd&&(0,V.jsx)(`button`,{type:`button`,className:`mt-0.5 block max-w-full truncate font-mono text-[10px] text-muted-foreground hover:text-foreground`,title:`Open ${i.meta.cwd} in Files`,onClick:e=>{e.stopPropagation(),W(i)},children:_(i.meta.cwd)})]}),i.branchState&&i.branchWorkspaceId&&(0,V.jsx)(B,{state:i.branchState,className:`mt-0.5 shrink-0`,onClick:e=>{e.stopPropagation(),K(i.branchWorkspaceId)}})]}),$.badges.length>0&&(0,V.jsx)(`div`,{className:`flex flex-wrap gap-1 mb-2`,children:$.badges.map(e=>(0,V.jsx)(`span`,{className:`text-[10px] px-1.5 py-0.5 rounded-full font-medium ${e.className}`,children:e.label},e.label))}),(i.tags.length>0||y(i.capabilities).length>0)&&(0,V.jsxs)(`div`,{className:`flex flex-wrap gap-1 mb-2`,children:[i.tags.slice(0,3).map(e=>(0,V.jsx)(w,{variant:`outline`,className:`text-[9px] px-1 py-0 h-4`,children:e},e)),y(i.capabilities).slice(0,2).map(e=>(0,V.jsx)(w,{variant:`secondary`,className:`text-[9px] px-1 py-0 h-4`,children:e},e))]}),(0,V.jsxs)(`div`,{className:`space-y-2 mb-2`,children:[(0,V.jsx)(M,{agent:i}),(0,V.jsx)(I,{agent:i,compact:!0}),(0,V.jsx)(N,{agent:i})]}),(0,V.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:i.id!==`user`&&i.id!==`system`&&v(c,i.lastSeen)}),(0,V.jsxs)(`div`,{className:`flex gap-1 mt-2.5 opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-opacity`,onClick:e=>e.stopPropagation(),children:[(0,V.jsx)(E,{value:i.id,label:`Copy agent ID`,size:`icon`,className:`h-7 w-7`,iconClassName:`w-3 h-3`}),(0,V.jsx)(T,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,title:`Chat`,onClick:()=>{f(i.id),l(`chat`)},children:(0,V.jsx)(a,{className:`w-3 h-3`})}),(0,V.jsx)(T,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,title:`Pair`,onClick:()=>D(i.id),children:(0,V.jsx)(d,{className:`w-3 h-3`})}),(0,V.jsx)(T,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,title:`Rename`,onClick:()=>O(i),children:(0,V.jsx)(e,{className:`w-3 h-3`})}),oe&&(0,V.jsx)(T,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,title:`Terminal`,disabled:Y,onClick:()=>void X(),children:(0,V.jsx)(s,{className:`w-3 h-3`})}),(i.branchState===`changes`||i.branchState===`idle`)&&i.branchWorkspaceId&&(0,V.jsx)(T,{size:`icon`,variant:`ghost`,className:`h-7 w-7 text-amber-400 hover:text-amber-300`,title:`Mark workspace ready — hand off to the auto-merge`,onClick:()=>k(`Mark Workspace Ready`,`Mark ${C(i)}'s branch ready to land? The relay auto-merge will rebase and land it.`,()=>G(i.branchWorkspaceId,`ready`)),children:(0,V.jsx)(t,{className:`w-3 h-3`})}),ie&&(0,V.jsx)(T,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,title:`Compact`,onClick:()=>k(`Compact Agent`,`Compact context for ${C(i)}?`,()=>H(i,`compact`,`agents-grid`)),children:(0,V.jsx)(r,{className:`w-3 h-3`})}),ae&&(0,V.jsx)(T,{size:`icon`,variant:`ghost`,className:`h-7 w-7`,title:`Clear Context`,onClick:()=>k(`Clear Context`,`Clear context for ${C(i)}?`,()=>H(i,`clearContext`,`agents-grid`)),children:(0,V.jsx)(n,{className:`w-3 h-3`})}),re&&(0,V.jsx)(T,{size:`icon`,variant:`ghost`,className:`h-7 w-7 text-red-400 hover:text-red-300`,title:`Shutdown`,onClick:()=>k(`Shutdown Agent`,`Shutdown ${C(i)}?`,()=>H(i,`shutdown`,`agents-grid`)),children:(0,V.jsx)(o,{className:`w-3 h-3`})}),ce&&(0,V.jsx)(T,{size:`icon`,variant:`ghost`,className:`h-7 w-7 text-red-400 hover:text-red-300`,title:`Forget stale agent`,onClick:()=>k(`Forget Agent`,`Forget ${C(i)}?`,()=>U(i.id)),children:(0,V.jsx)(u,{className:`w-3 h-3`})})]})]})}),J&&(0,V.jsx)(F,{open:q,onOpenChange:Z,orchestratorId:J.orchestratorId,session:J.session,interactive:J.interactive||se})]})}function U(){let e=h(e=>e.agentPresetFilter),t=h(e=>e.agentStatusFilter),n=h(e=>e.agentTagFilter),r=h(e=>e.agentHostFilter),a=h(e=>e.agentSort),o=h(e=>e.agentSortDir),s=h(e=>e.showOffline),l=h(e=>e.set),u=h(e=>e.openAgentSpawn),d=D(),m=k(),g=O(),_=e||t||n||r;function v(){l({agentPresetFilter:``,agentStatusFilter:``,agentTagFilter:``,agentHostFilter:``})}function y(){l({agentSortDir:o===`asc`?`desc`:`asc`})}return(0,V.jsxs)(`div`,{className:`space-y-4`,children:[(0,V.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,V.jsxs)(`select`,{value:e,onChange:e=>l({agentPresetFilter:e.target.value}),className:`h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground`,children:[(0,V.jsx)(`option`,{value:``,children:`All agents`}),(0,V.jsx)(`option`,{value:`active`,children:`Active`}),(0,V.jsx)(`option`,{value:`claude`,children:`Claude`}),(0,V.jsx)(`option`,{value:`codex`,children:`Codex`}),(0,V.jsx)(`option`,{value:`paired`,children:`Paired`}),(0,V.jsx)(`option`,{value:`unpaired`,children:`Unpaired`}),(0,V.jsx)(`option`,{value:`offline_stale`,children:`Offline / Stale`})]}),(0,V.jsxs)(`select`,{value:t,onChange:e=>l({agentStatusFilter:e.target.value}),className:`h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground`,children:[(0,V.jsx)(`option`,{value:``,children:`Any status`}),(0,V.jsx)(`option`,{value:`online`,children:`Online`}),(0,V.jsx)(`option`,{value:`idle`,children:`Idle`}),(0,V.jsx)(`option`,{value:`busy`,children:`Busy`}),(0,V.jsx)(`option`,{value:`offline`,children:`Offline`}),(0,V.jsx)(`option`,{value:`starting`,children:`Starting`})]}),m.length>0&&(0,V.jsxs)(`select`,{value:n,onChange:e=>l({agentTagFilter:e.target.value}),className:`h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground`,children:[(0,V.jsx)(`option`,{value:``,children:`Any tag`}),m.map(e=>(0,V.jsx)(`option`,{value:e,children:e},e))]}),g.length>1&&(0,V.jsxs)(`select`,{value:r,onChange:e=>l({agentHostFilter:e.target.value}),className:`h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground`,children:[(0,V.jsx)(`option`,{value:``,children:`Any host`}),g.map(e=>(0,V.jsx)(`option`,{value:e,children:e},e))]}),(0,V.jsxs)(`select`,{value:a,onChange:e=>l({agentSort:e.target.value}),className:`h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground`,children:[(0,V.jsx)(`option`,{value:`status`,children:`Sort: Status`}),(0,V.jsx)(`option`,{value:`name`,children:`Sort: Name`}),(0,V.jsx)(`option`,{value:`lastSeen`,children:`Sort: Last seen`}),(0,V.jsx)(`option`,{value:`created`,children:`Sort: Created`})]}),(0,V.jsx)(T,{size:`icon`,variant:`outline`,className:`h-8 w-8`,title:`Toggle sort direction`,onClick:y,children:o===`asc`?(0,V.jsx)(p,{className:`w-3.5 h-3.5`}):(0,V.jsx)(f,{className:`w-3.5 h-3.5`})}),(0,V.jsxs)(`label`,{className:`flex items-center gap-1.5 text-sm text-muted-foreground cursor-pointer select-none`,children:[(0,V.jsx)(`input`,{type:`checkbox`,checked:s,onChange:e=>l({showOffline:e.target.checked}),className:`rounded`}),`Show offline`]}),_&&(0,V.jsxs)(T,{size:`sm`,variant:`ghost`,className:`h-8 text-muted-foreground hover:text-foreground gap-1`,onClick:v,children:[(0,V.jsx)(c,{className:`w-3 h-3`}),`Clear filters`]}),(0,V.jsx)(`div`,{className:`ml-auto`,children:(0,V.jsxs)(T,{size:`sm`,onClick:u,className:`gap-1`,children:[(0,V.jsx)(i,{className:`w-3.5 h-3.5`}),`Spawn`]})})]}),d.length===0?(0,V.jsx)(`div`,{className:`text-center py-16 text-muted-foreground text-sm`,children:`No agents match the current filters.`}):(0,V.jsx)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 xl:grid-cols-4 gap-3`,children:d.map(e=>(0,V.jsx)(H,{agent:e},e.id))})]})}export{U as AgentsView};
2
+ //# sourceMappingURL=agents-Bl-rrgOy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agents-D4S0yIbe.js","names":[],"sources":["../../dashboard/src/components/views/agents.tsx"],"sourcesContent":["import { useAgentTerminal } from '@/hooks/use-agent-terminal'\nimport { useRelayStore, useNow } from '@/store'\nimport {\n useSortedAgents, useUniqueTags, useUniqueHosts, usePairsByAgentId, useAgentAttention,\n} from '@/hooks/use-selectors'\nimport { Card, CardContent } from '@/components/ui/card'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { StatusDot } from '@/components/shared/status-dot'\nimport { AgentTypeIcon } from '@/components/shared/agent-type-icon'\nimport { BranchStateBadge } from '@/components/shared/branch-state-badge'\nimport { AgentRuntimeBadges, AgentRuntimeChips, ContextMeter } from '@/components/shared/agent-runtime-summary'\nimport { TerminalDialog } from '@/components/shared/terminal-viewer'\nimport { CopyButton } from '@/components/shared/copy-button'\nimport {\n displayName, timeAgo, agentPresence, toneToColor, agentSupportsControlAction, agentCanBeForgotten, userFacingCapabilities, shortPath,\n} from '@/lib/display'\nimport {\n MessageSquare, Link, Edit3, Power, Terminal, Minimize2, Eraser, Trash2, Plus, SortAsc, SortDesc, X, Flag,\n} from 'lucide-react'\nimport type { Agent } from '@/types'\n\nfunction AgentCard({ agent }: { agent: Agent }) {\n const now = useNow()\n const set = useRelayStore((s) => s.set)\n const switchView = useRelayStore((s) => s.switchView)\n const openInboxThread = useRelayStore((s) => s.openInboxThread)\n const openAgentDetail = useRelayStore((s) => s.openAgentDetail)\n const openPairInvite = useRelayStore((s) => s.openPairInvite)\n const openRename = useRelayStore((s) => s.openRename)\n const openConfirm = useRelayStore((s) => s.openConfirm)\n const doAgentAction = useRelayStore((s) => s.doAgentAction)\n const doDeleteAgent = useRelayStore((s) => s.doDeleteAgent)\n const openFilesForAgent = useRelayStore((s) => s.openFilesForAgent)\n const workspaceAction = useRelayStore((s) => s.workspaceAction)\n const openWorkspaceFocus = useRelayStore((s) => s.openWorkspaceFocus)\n\n const { terminalOpen, terminalTarget, terminalOpening, openTerminal: handleOpenTerminal, closeTerminal: handleCloseTerminal } = useAgentTerminal(agent.id)\n\n const pairsMap = usePairsByAgentId()\n const rawAttention = useAgentAttention(agent)\n const pair = pairsMap[agent.id] || null\n const attention = { ...rawAttention, needsHumanResponse: false }\n const presence = agentPresence(now, agent, attention, pair)\n\n const canShutdown = agentSupportsControlAction(agent, 'shutdown')\n const canCompact = agentSupportsControlAction(agent, 'compact')\n const canClearContext = agentSupportsControlAction(agent, 'clearContext')\n const canOpenTerminal = Boolean(agent.providerCapabilities?.terminal?.live?.read || agent.providerCapabilities?.terminal?.attach?.create)\n const canWriteTerminal = Boolean(agent.providerCapabilities?.terminal?.live?.write || agent.providerCapabilities?.model?.provider === 'claude')\n const canForget = agentCanBeForgotten(agent)\n\n return (\n <>\n <Card\n className=\"group hover:border-zinc-600 transition-colors cursor-pointer\"\n onClick={() => openAgentDetail(agent)}\n >\n <CardContent className=\"p-4\">\n <div className=\"flex items-start gap-2.5 mb-2.5\">\n <StatusDot agent={agent} now={now} className=\"mt-0.5\" />\n <AgentTypeIcon agent={agent} />\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium truncate\">{displayName(agent)}</div>\n <div className={`text-xs mt-0.5 ${toneToColor(presence.tone)}`}>{presence.label}</div>\n {typeof agent.meta?.cwd === 'string' && agent.meta.cwd && (\n <button\n type=\"button\"\n className=\"mt-0.5 block max-w-full truncate font-mono text-[10px] text-muted-foreground hover:text-foreground\"\n title={`Open ${agent.meta.cwd as string} in Files`}\n onClick={(e) => { e.stopPropagation(); void openFilesForAgent(agent) }}\n >\n {shortPath(agent.meta.cwd as string)}\n </button>\n )}\n </div>\n {agent.branchState && agent.branchWorkspaceId && (\n <BranchStateBadge\n state={agent.branchState}\n className=\"mt-0.5 shrink-0\"\n onClick={(e) => { e.stopPropagation(); void openWorkspaceFocus(agent.branchWorkspaceId!) }}\n />\n )}\n </div>\n\n {/* Presence badges */}\n {presence.badges.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mb-2\">\n {presence.badges.map((b) => (\n <span key={b.label} className={`text-[10px] px-1.5 py-0.5 rounded-full font-medium ${b.className}`}>\n {b.label}\n </span>\n ))}\n </div>\n )}\n\n {/* Tags + caps */}\n {(agent.tags.length > 0 || userFacingCapabilities(agent.capabilities).length > 0) && (\n <div className=\"flex flex-wrap gap-1 mb-2\">\n {agent.tags.slice(0, 3).map((t) => (\n <Badge key={t} variant=\"outline\" className=\"text-[9px] px-1 py-0 h-4\">{t}</Badge>\n ))}\n {userFacingCapabilities(agent.capabilities).slice(0, 2).map((c) => (\n <Badge key={c} variant=\"secondary\" className=\"text-[9px] px-1 py-0 h-4\">{c}</Badge>\n ))}\n </div>\n )}\n\n <div className=\"space-y-2 mb-2\">\n <AgentRuntimeChips agent={agent} />\n <AgentRuntimeBadges agent={agent} compact />\n <ContextMeter agent={agent} />\n </div>\n\n <div className=\"text-xs text-muted-foreground\">\n {agent.id !== 'user' && agent.id !== 'system' && timeAgo(now, agent.lastSeen)}\n </div>\n\n {/* Action buttons – always visible on mobile, hover on desktop */}\n <div\n className=\"flex gap-1 mt-2.5 opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-opacity\"\n onClick={(e) => e.stopPropagation()}\n >\n <CopyButton value={agent.id} label=\"Copy agent ID\" size=\"icon\" className=\"h-7 w-7\" iconClassName=\"w-3 h-3\" />\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Chat\" onClick={() => { openInboxThread(agent.id); switchView('chat') }}>\n <MessageSquare className=\"w-3 h-3\" />\n </Button>\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Pair\" onClick={() => openPairInvite(agent.id)}>\n <Link className=\"w-3 h-3\" />\n </Button>\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Rename\" onClick={() => openRename(agent)}>\n <Edit3 className=\"w-3 h-3\" />\n </Button>\n {canOpenTerminal && (\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Terminal\" disabled={terminalOpening} onClick={() => void handleOpenTerminal()}>\n <Terminal className=\"w-3 h-3\" />\n </Button>\n )}\n {(agent.branchState === 'changes' || agent.branchState === 'idle') && agent.branchWorkspaceId && (\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7 text-amber-400 hover:text-amber-300\" title=\"Mark workspace ready — hand off to the auto-merge\" onClick={() => openConfirm('Mark Workspace Ready', `Mark ${displayName(agent)}'s branch ready to land? The relay auto-merge will rebase and land it.`, () => workspaceAction(agent.branchWorkspaceId!, 'ready'))}>\n <Flag className=\"w-3 h-3\" />\n </Button>\n )}\n {canCompact && (\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Compact\" onClick={() => openConfirm('Compact Agent', `Compact context for ${displayName(agent)}?`, () => doAgentAction(agent, 'compact', 'agents-grid'))}>\n <Minimize2 className=\"w-3 h-3\" />\n </Button>\n )}\n {canClearContext && (\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Clear Context\" onClick={() => openConfirm('Clear Context', `Clear context for ${displayName(agent)}?`, () => doAgentAction(agent, 'clearContext', 'agents-grid'))}>\n <Eraser className=\"w-3 h-3\" />\n </Button>\n )}\n {canShutdown && (\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7 text-red-400 hover:text-red-300\" title=\"Shutdown\" onClick={() => openConfirm('Shutdown Agent', `Shutdown ${displayName(agent)}?`, () => doAgentAction(agent, 'shutdown', 'agents-grid'))}>\n <Power className=\"w-3 h-3\" />\n </Button>\n )}\n {canForget && (\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7 text-red-400 hover:text-red-300\" title=\"Forget stale agent\" onClick={() => openConfirm('Forget Agent', `Forget ${displayName(agent)}?`, () => doDeleteAgent(agent.id))}>\n <Trash2 className=\"w-3 h-3\" />\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n {terminalTarget && (\n <TerminalDialog open={terminalOpen} onOpenChange={handleCloseTerminal} orchestratorId={terminalTarget.orchestratorId} session={terminalTarget.session} interactive={terminalTarget.interactive || canWriteTerminal} />\n )}\n </>\n )\n}\n\nexport function AgentsView() {\n const agentPresetFilter = useRelayStore((s) => s.agentPresetFilter)\n const agentStatusFilter = useRelayStore((s) => s.agentStatusFilter)\n const agentTagFilter = useRelayStore((s) => s.agentTagFilter)\n const agentHostFilter = useRelayStore((s) => s.agentHostFilter)\n const agentSort = useRelayStore((s) => s.agentSort)\n const agentSortDir = useRelayStore((s) => s.agentSortDir)\n const showOffline = useRelayStore((s) => s.showOffline)\n const set = useRelayStore((s) => s.set)\n const openAgentSpawn = useRelayStore((s) => s.openAgentSpawn)\n\n const sortedAgents = useSortedAgents()\n const uniqueTags = useUniqueTags()\n const uniqueHosts = useUniqueHosts()\n\n const hasFilters = agentPresetFilter || agentStatusFilter || agentTagFilter || agentHostFilter\n\n function clearFilters() {\n set({ agentPresetFilter: '', agentStatusFilter: '', agentTagFilter: '', agentHostFilter: '' })\n }\n\n function toggleSortDir() {\n set({ agentSortDir: agentSortDir === 'asc' ? 'desc' : 'asc' })\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Toolbar */}\n <div className=\"flex flex-wrap items-center gap-2\">\n <select\n value={agentPresetFilter}\n onChange={(e) => set({ agentPresetFilter: e.target.value })}\n className=\"h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground\"\n >\n <option value=\"\">All agents</option>\n <option value=\"active\">Active</option>\n <option value=\"claude\">Claude</option>\n <option value=\"codex\">Codex</option>\n <option value=\"paired\">Paired</option>\n <option value=\"unpaired\">Unpaired</option>\n <option value=\"offline_stale\">Offline / Stale</option>\n </select>\n\n <select\n value={agentStatusFilter}\n onChange={(e) => set({ agentStatusFilter: e.target.value })}\n className=\"h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground\"\n >\n <option value=\"\">Any status</option>\n <option value=\"online\">Online</option>\n <option value=\"idle\">Idle</option>\n <option value=\"busy\">Busy</option>\n <option value=\"offline\">Offline</option>\n <option value=\"starting\">Starting</option>\n </select>\n\n {uniqueTags.length > 0 && (\n <select\n value={agentTagFilter}\n onChange={(e) => set({ agentTagFilter: e.target.value })}\n className=\"h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground\"\n >\n <option value=\"\">Any tag</option>\n {uniqueTags.map((t) => <option key={t} value={t}>{t}</option>)}\n </select>\n )}\n\n {uniqueHosts.length > 1 && (\n <select\n value={agentHostFilter}\n onChange={(e) => set({ agentHostFilter: e.target.value })}\n className=\"h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground\"\n >\n <option value=\"\">Any host</option>\n {uniqueHosts.map((h) => <option key={h} value={h}>{h}</option>)}\n </select>\n )}\n\n <select\n value={agentSort}\n onChange={(e) => set({ agentSort: e.target.value })}\n className=\"h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground\"\n >\n <option value=\"status\">Sort: Status</option>\n <option value=\"name\">Sort: Name</option>\n <option value=\"lastSeen\">Sort: Last seen</option>\n <option value=\"created\">Sort: Created</option>\n </select>\n\n <Button size=\"icon\" variant=\"outline\" className=\"h-8 w-8\" title=\"Toggle sort direction\" onClick={toggleSortDir}>\n {agentSortDir === 'asc' ? <SortAsc className=\"w-3.5 h-3.5\" /> : <SortDesc className=\"w-3.5 h-3.5\" />}\n </Button>\n\n <label className=\"flex items-center gap-1.5 text-sm text-muted-foreground cursor-pointer select-none\">\n <input\n type=\"checkbox\"\n checked={showOffline}\n onChange={(e) => set({ showOffline: e.target.checked })}\n className=\"rounded\"\n />\n Show offline\n </label>\n\n {hasFilters && (\n <Button size=\"sm\" variant=\"ghost\" className=\"h-8 text-muted-foreground hover:text-foreground gap-1\" onClick={clearFilters}>\n <X className=\"w-3 h-3\" />\n Clear filters\n </Button>\n )}\n\n <div className=\"ml-auto\">\n <Button size=\"sm\" onClick={openAgentSpawn} className=\"gap-1\">\n <Plus className=\"w-3.5 h-3.5\" />\n Spawn\n </Button>\n </div>\n </div>\n\n {/* Agent grid */}\n {sortedAgents.length === 0 ? (\n <div className=\"text-center py-16 text-muted-foreground text-sm\">\n No agents match the current filters.\n </div>\n ) : (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 xl:grid-cols-4 gap-3\">\n {sortedAgents.map((agent) => (\n <AgentCard key={agent.id} agent={agent} />\n ))}\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"agents-Bl-rrgOy.js","names":[],"sources":["../../dashboard/src/components/views/agents.tsx"],"sourcesContent":["import { useAgentTerminal } from '@/hooks/use-agent-terminal'\nimport { useRelayStore, useNow } from '@/store'\nimport {\n useSortedAgents, useUniqueTags, useUniqueHosts, usePairsByAgentId, useAgentAttention,\n} from '@/hooks/use-selectors'\nimport { Card, CardContent } from '@/components/ui/card'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { StatusDot } from '@/components/shared/status-dot'\nimport { AgentTypeIcon } from '@/components/shared/agent-type-icon'\nimport { BranchStateBadge } from '@/components/shared/branch-state-badge'\nimport { AgentRuntimeBadges, AgentRuntimeChips, ContextMeter } from '@/components/shared/agent-runtime-summary'\nimport { TerminalDialog } from '@/components/shared/terminal-viewer'\nimport { CopyButton } from '@/components/shared/copy-button'\nimport {\n displayName, timeAgo, agentPresence, toneToColor, agentSupportsControlAction, agentCanBeForgotten, userFacingCapabilities, shortPath,\n} from '@/lib/display'\nimport {\n MessageSquare, Link, Edit3, Power, Terminal, Minimize2, Eraser, Trash2, Plus, SortAsc, SortDesc, X, Flag,\n} from 'lucide-react'\nimport type { Agent } from '@/types'\n\nfunction AgentCard({ agent }: { agent: Agent }) {\n const now = useNow()\n const set = useRelayStore((s) => s.set)\n const switchView = useRelayStore((s) => s.switchView)\n const openInboxThread = useRelayStore((s) => s.openInboxThread)\n const openAgentDetail = useRelayStore((s) => s.openAgentDetail)\n const openPairInvite = useRelayStore((s) => s.openPairInvite)\n const openRename = useRelayStore((s) => s.openRename)\n const openConfirm = useRelayStore((s) => s.openConfirm)\n const doAgentAction = useRelayStore((s) => s.doAgentAction)\n const doDeleteAgent = useRelayStore((s) => s.doDeleteAgent)\n const openFilesForAgent = useRelayStore((s) => s.openFilesForAgent)\n const workspaceAction = useRelayStore((s) => s.workspaceAction)\n const openWorkspaceFocus = useRelayStore((s) => s.openWorkspaceFocus)\n\n const { terminalOpen, terminalTarget, terminalOpening, openTerminal: handleOpenTerminal, closeTerminal: handleCloseTerminal } = useAgentTerminal(agent.id)\n\n const pairsMap = usePairsByAgentId()\n const rawAttention = useAgentAttention(agent)\n const pair = pairsMap[agent.id] || null\n const attention = { ...rawAttention, needsHumanResponse: false }\n const presence = agentPresence(now, agent, attention, pair)\n\n const canShutdown = agentSupportsControlAction(agent, 'shutdown')\n const canCompact = agentSupportsControlAction(agent, 'compact')\n const canClearContext = agentSupportsControlAction(agent, 'clearContext')\n const canOpenTerminal = Boolean(agent.providerCapabilities?.terminal?.live?.read || agent.providerCapabilities?.terminal?.attach?.create)\n const canWriteTerminal = Boolean(agent.providerCapabilities?.terminal?.live?.write || agent.providerCapabilities?.model?.provider === 'claude')\n const canForget = agentCanBeForgotten(agent)\n\n return (\n <>\n <Card\n className=\"group hover:border-zinc-600 transition-colors cursor-pointer\"\n onClick={() => openAgentDetail(agent)}\n >\n <CardContent className=\"p-4\">\n <div className=\"flex items-start gap-2.5 mb-2.5\">\n <StatusDot agent={agent} now={now} className=\"mt-0.5\" />\n <AgentTypeIcon agent={agent} />\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium truncate\">{displayName(agent)}</div>\n <div className={`text-xs mt-0.5 ${toneToColor(presence.tone)}`}>{presence.label}</div>\n {typeof agent.meta?.cwd === 'string' && agent.meta.cwd && (\n <button\n type=\"button\"\n className=\"mt-0.5 block max-w-full truncate font-mono text-[10px] text-muted-foreground hover:text-foreground\"\n title={`Open ${agent.meta.cwd as string} in Files`}\n onClick={(e) => { e.stopPropagation(); void openFilesForAgent(agent) }}\n >\n {shortPath(agent.meta.cwd as string)}\n </button>\n )}\n </div>\n {agent.branchState && agent.branchWorkspaceId && (\n <BranchStateBadge\n state={agent.branchState}\n className=\"mt-0.5 shrink-0\"\n onClick={(e) => { e.stopPropagation(); void openWorkspaceFocus(agent.branchWorkspaceId!) }}\n />\n )}\n </div>\n\n {/* Presence badges */}\n {presence.badges.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mb-2\">\n {presence.badges.map((b) => (\n <span key={b.label} className={`text-[10px] px-1.5 py-0.5 rounded-full font-medium ${b.className}`}>\n {b.label}\n </span>\n ))}\n </div>\n )}\n\n {/* Tags + caps */}\n {(agent.tags.length > 0 || userFacingCapabilities(agent.capabilities).length > 0) && (\n <div className=\"flex flex-wrap gap-1 mb-2\">\n {agent.tags.slice(0, 3).map((t) => (\n <Badge key={t} variant=\"outline\" className=\"text-[9px] px-1 py-0 h-4\">{t}</Badge>\n ))}\n {userFacingCapabilities(agent.capabilities).slice(0, 2).map((c) => (\n <Badge key={c} variant=\"secondary\" className=\"text-[9px] px-1 py-0 h-4\">{c}</Badge>\n ))}\n </div>\n )}\n\n <div className=\"space-y-2 mb-2\">\n <AgentRuntimeChips agent={agent} />\n <AgentRuntimeBadges agent={agent} compact />\n <ContextMeter agent={agent} />\n </div>\n\n <div className=\"text-xs text-muted-foreground\">\n {agent.id !== 'user' && agent.id !== 'system' && timeAgo(now, agent.lastSeen)}\n </div>\n\n {/* Action buttons – always visible on mobile, hover on desktop */}\n <div\n className=\"flex gap-1 mt-2.5 opacity-100 sm:opacity-0 sm:group-hover:opacity-100 transition-opacity\"\n onClick={(e) => e.stopPropagation()}\n >\n <CopyButton value={agent.id} label=\"Copy agent ID\" size=\"icon\" className=\"h-7 w-7\" iconClassName=\"w-3 h-3\" />\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Chat\" onClick={() => { openInboxThread(agent.id); switchView('chat') }}>\n <MessageSquare className=\"w-3 h-3\" />\n </Button>\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Pair\" onClick={() => openPairInvite(agent.id)}>\n <Link className=\"w-3 h-3\" />\n </Button>\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Rename\" onClick={() => openRename(agent)}>\n <Edit3 className=\"w-3 h-3\" />\n </Button>\n {canOpenTerminal && (\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Terminal\" disabled={terminalOpening} onClick={() => void handleOpenTerminal()}>\n <Terminal className=\"w-3 h-3\" />\n </Button>\n )}\n {(agent.branchState === 'changes' || agent.branchState === 'idle') && agent.branchWorkspaceId && (\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7 text-amber-400 hover:text-amber-300\" title=\"Mark workspace ready — hand off to the auto-merge\" onClick={() => openConfirm('Mark Workspace Ready', `Mark ${displayName(agent)}'s branch ready to land? The relay auto-merge will rebase and land it.`, () => workspaceAction(agent.branchWorkspaceId!, 'ready'))}>\n <Flag className=\"w-3 h-3\" />\n </Button>\n )}\n {canCompact && (\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Compact\" onClick={() => openConfirm('Compact Agent', `Compact context for ${displayName(agent)}?`, () => doAgentAction(agent, 'compact', 'agents-grid'))}>\n <Minimize2 className=\"w-3 h-3\" />\n </Button>\n )}\n {canClearContext && (\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Clear Context\" onClick={() => openConfirm('Clear Context', `Clear context for ${displayName(agent)}?`, () => doAgentAction(agent, 'clearContext', 'agents-grid'))}>\n <Eraser className=\"w-3 h-3\" />\n </Button>\n )}\n {canShutdown && (\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7 text-red-400 hover:text-red-300\" title=\"Shutdown\" onClick={() => openConfirm('Shutdown Agent', `Shutdown ${displayName(agent)}?`, () => doAgentAction(agent, 'shutdown', 'agents-grid'))}>\n <Power className=\"w-3 h-3\" />\n </Button>\n )}\n {canForget && (\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7 text-red-400 hover:text-red-300\" title=\"Forget stale agent\" onClick={() => openConfirm('Forget Agent', `Forget ${displayName(agent)}?`, () => doDeleteAgent(agent.id))}>\n <Trash2 className=\"w-3 h-3\" />\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n {terminalTarget && (\n <TerminalDialog open={terminalOpen} onOpenChange={handleCloseTerminal} orchestratorId={terminalTarget.orchestratorId} session={terminalTarget.session} interactive={terminalTarget.interactive || canWriteTerminal} />\n )}\n </>\n )\n}\n\nexport function AgentsView() {\n const agentPresetFilter = useRelayStore((s) => s.agentPresetFilter)\n const agentStatusFilter = useRelayStore((s) => s.agentStatusFilter)\n const agentTagFilter = useRelayStore((s) => s.agentTagFilter)\n const agentHostFilter = useRelayStore((s) => s.agentHostFilter)\n const agentSort = useRelayStore((s) => s.agentSort)\n const agentSortDir = useRelayStore((s) => s.agentSortDir)\n const showOffline = useRelayStore((s) => s.showOffline)\n const set = useRelayStore((s) => s.set)\n const openAgentSpawn = useRelayStore((s) => s.openAgentSpawn)\n\n const sortedAgents = useSortedAgents()\n const uniqueTags = useUniqueTags()\n const uniqueHosts = useUniqueHosts()\n\n const hasFilters = agentPresetFilter || agentStatusFilter || agentTagFilter || agentHostFilter\n\n function clearFilters() {\n set({ agentPresetFilter: '', agentStatusFilter: '', agentTagFilter: '', agentHostFilter: '' })\n }\n\n function toggleSortDir() {\n set({ agentSortDir: agentSortDir === 'asc' ? 'desc' : 'asc' })\n }\n\n return (\n <div className=\"space-y-4\">\n {/* Toolbar */}\n <div className=\"flex flex-wrap items-center gap-2\">\n <select\n value={agentPresetFilter}\n onChange={(e) => set({ agentPresetFilter: e.target.value })}\n className=\"h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground\"\n >\n <option value=\"\">All agents</option>\n <option value=\"active\">Active</option>\n <option value=\"claude\">Claude</option>\n <option value=\"codex\">Codex</option>\n <option value=\"paired\">Paired</option>\n <option value=\"unpaired\">Unpaired</option>\n <option value=\"offline_stale\">Offline / Stale</option>\n </select>\n\n <select\n value={agentStatusFilter}\n onChange={(e) => set({ agentStatusFilter: e.target.value })}\n className=\"h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground\"\n >\n <option value=\"\">Any status</option>\n <option value=\"online\">Online</option>\n <option value=\"idle\">Idle</option>\n <option value=\"busy\">Busy</option>\n <option value=\"offline\">Offline</option>\n <option value=\"starting\">Starting</option>\n </select>\n\n {uniqueTags.length > 0 && (\n <select\n value={agentTagFilter}\n onChange={(e) => set({ agentTagFilter: e.target.value })}\n className=\"h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground\"\n >\n <option value=\"\">Any tag</option>\n {uniqueTags.map((t) => <option key={t} value={t}>{t}</option>)}\n </select>\n )}\n\n {uniqueHosts.length > 1 && (\n <select\n value={agentHostFilter}\n onChange={(e) => set({ agentHostFilter: e.target.value })}\n className=\"h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground\"\n >\n <option value=\"\">Any host</option>\n {uniqueHosts.map((h) => <option key={h} value={h}>{h}</option>)}\n </select>\n )}\n\n <select\n value={agentSort}\n onChange={(e) => set({ agentSort: e.target.value })}\n className=\"h-8 rounded-md border border-border bg-card text-sm px-2 text-foreground\"\n >\n <option value=\"status\">Sort: Status</option>\n <option value=\"name\">Sort: Name</option>\n <option value=\"lastSeen\">Sort: Last seen</option>\n <option value=\"created\">Sort: Created</option>\n </select>\n\n <Button size=\"icon\" variant=\"outline\" className=\"h-8 w-8\" title=\"Toggle sort direction\" onClick={toggleSortDir}>\n {agentSortDir === 'asc' ? <SortAsc className=\"w-3.5 h-3.5\" /> : <SortDesc className=\"w-3.5 h-3.5\" />}\n </Button>\n\n <label className=\"flex items-center gap-1.5 text-sm text-muted-foreground cursor-pointer select-none\">\n <input\n type=\"checkbox\"\n checked={showOffline}\n onChange={(e) => set({ showOffline: e.target.checked })}\n className=\"rounded\"\n />\n Show offline\n </label>\n\n {hasFilters && (\n <Button size=\"sm\" variant=\"ghost\" className=\"h-8 text-muted-foreground hover:text-foreground gap-1\" onClick={clearFilters}>\n <X className=\"w-3 h-3\" />\n Clear filters\n </Button>\n )}\n\n <div className=\"ml-auto\">\n <Button size=\"sm\" onClick={openAgentSpawn} className=\"gap-1\">\n <Plus className=\"w-3.5 h-3.5\" />\n Spawn\n </Button>\n </div>\n </div>\n\n {/* Agent grid */}\n {sortedAgents.length === 0 ? (\n <div className=\"text-center py-16 text-muted-foreground text-sm\">\n No agents match the current filters.\n </div>\n ) : (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 xl:grid-cols-4 gap-3\">\n {sortedAgents.map((agent) => (\n <AgentCard key={agent.id} agent={agent} />\n ))}\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"4nBAsBA,SAAS,EAAU,CAAE,SAA2B,CAC9C,IAAM,EAAM,GAAQ,CACR,EAAe,GAAM,EAAE,IAAI,CACvC,IAAM,EAAa,EAAe,GAAM,EAAE,WAAW,CAC/C,EAAkB,EAAe,GAAM,EAAE,gBAAgB,CACzD,EAAkB,EAAe,GAAM,EAAE,gBAAgB,CACzD,EAAiB,EAAe,GAAM,EAAE,eAAe,CACvD,EAAa,EAAe,GAAM,EAAE,WAAW,CAC/C,EAAc,EAAe,GAAM,EAAE,YAAY,CACjD,EAAgB,EAAe,GAAM,EAAE,cAAc,CACrD,EAAgB,EAAe,GAAM,EAAE,cAAc,CACrD,EAAoB,EAAe,GAAM,EAAE,kBAAkB,CAC7D,EAAkB,EAAe,GAAM,EAAE,gBAAgB,CACzD,EAAqB,EAAe,GAAM,EAAE,mBAAmB,CAE/D,CAAE,eAAc,iBAAgB,kBAAiB,aAAc,EAAoB,cAAe,GAAwB,EAAiB,EAAM,GAAG,CAEpJ,EAAW,GAAmB,CAC9B,GAAe,EAAkB,EAAM,CACvC,GAAO,EAAS,EAAM,KAAO,KAE7B,EAAW,EAAc,EAAK,EAAO,CADvB,GAAG,GAAc,mBAAoB,GACd,CAAW,GAAK,CAErD,GAAc,EAA2B,EAAO,WAAW,CAC3D,GAAa,EAA2B,EAAO,UAAU,CACzD,GAAkB,EAA2B,EAAO,eAAe,CACnE,GAAkB,GAAQ,EAAM,sBAAsB,UAAU,MAAM,MAAQ,EAAM,sBAAsB,UAAU,QAAQ,QAC5H,GAAmB,GAAQ,EAAM,sBAAsB,UAAU,MAAM,OAAS,EAAM,sBAAsB,OAAO,WAAa,UAChI,GAAY,EAAoB,EAAM,CAE5C,OACE,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACA,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,+DACV,YAAe,EAAgB,EAAM,WAErC,EAAA,EAAA,MAAC,EAAD,CAAa,UAAU,eAAvB,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,2CAAf,EACE,EAAA,EAAA,KAAC,GAAD,CAAkB,QAAY,MAAK,UAAU,SAAW,CAAA,EACxD,EAAA,EAAA,KAAC,EAAD,CAAsB,QAAS,CAAA,EAC/B,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0BAAf,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,wCAAgC,EAAY,EAAM,CAAO,CAAA,EACxE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,kBAAkB,EAAY,EAAS,KAAK,YAAK,EAAS,MAAY,CAAA,CACrF,OAAO,EAAM,MAAM,KAAQ,UAAY,EAAM,KAAK,MACjD,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,UAAU,qGACV,MAAO,QAAQ,EAAM,KAAK,IAAc,WACxC,QAAU,GAAM,CAAE,EAAE,iBAAiB,CAAE,EAAuB,EAAM,WAEnE,EAAU,EAAM,KAAK,IAAc,CAC7B,CAAA,CAEP,GACL,EAAM,aAAe,EAAM,oBAC1B,EAAA,EAAA,KAAC,EAAD,CACE,MAAO,EAAM,YACb,UAAU,kBACV,QAAU,GAAM,CAAE,EAAE,iBAAiB,CAAE,EAAwB,EAAM,kBAAmB,EACxF,CAAA,CAEA,GAGL,EAAS,OAAO,OAAS,IACxB,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,qCACZ,EAAS,OAAO,IAAK,IACpB,EAAA,EAAA,KAAC,OAAD,CAAoB,UAAW,sDAAsD,EAAE,qBACpF,EAAE,MACE,CAFI,EAAE,MAEN,CACP,CACE,CAAA,EAIN,EAAM,KAAK,OAAS,GAAK,EAAuB,EAAM,aAAa,CAAC,OAAS,KAC7E,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qCAAf,CACG,EAAM,KAAK,MAAM,EAAG,EAAE,CAAC,IAAK,IAC3B,EAAA,EAAA,KAAC,EAAD,CAAe,QAAQ,UAAU,UAAU,oCAA4B,EAAU,CAArE,EAAqE,CACjF,CACD,EAAuB,EAAM,aAAa,CAAC,MAAM,EAAG,EAAE,CAAC,IAAK,IAC3D,EAAA,EAAA,KAAC,EAAD,CAAe,QAAQ,YAAY,UAAU,oCAA4B,EAAU,CAAvE,EAAuE,CACnF,CACE,IAGR,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0BAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAA0B,QAAS,CAAA,EACnC,EAAA,EAAA,KAAC,EAAD,CAA2B,QAAO,QAAA,GAAU,CAAA,EAC5C,EAAA,EAAA,KAAC,EAAD,CAAqB,QAAS,CAAA,CAC1B,IAEN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,yCACZ,EAAM,KAAO,QAAU,EAAM,KAAO,UAAY,EAAQ,EAAK,EAAM,SAAS,CACzE,CAAA,EAGN,EAAA,EAAA,MAAC,MAAD,CACE,UAAU,2FACV,QAAU,GAAM,EAAE,iBAAiB,UAFrC,EAIE,EAAA,EAAA,KAAC,EAAD,CAAY,MAAO,EAAM,GAAI,MAAM,gBAAgB,KAAK,OAAO,UAAU,UAAU,cAAc,UAAY,CAAA,EAC7G,EAAA,EAAA,KAAC,EAAD,CAAQ,KAAK,OAAO,QAAQ,QAAQ,UAAU,UAAU,MAAM,OAAO,YAAe,CAAE,EAAgB,EAAM,GAAG,CAAE,EAAW,OAAO,YACjI,EAAA,EAAA,KAAC,EAAD,CAAe,UAAU,UAAY,CAAA,CAC9B,CAAA,EACT,EAAA,EAAA,KAAC,EAAD,CAAQ,KAAK,OAAO,QAAQ,QAAQ,UAAU,UAAU,MAAM,OAAO,YAAe,EAAe,EAAM,GAAG,WAC1G,EAAA,EAAA,KAAC,EAAD,CAAM,UAAU,UAAY,CAAA,CACrB,CAAA,EACT,EAAA,EAAA,KAAC,EAAD,CAAQ,KAAK,OAAO,QAAQ,QAAQ,UAAU,UAAU,MAAM,SAAS,YAAe,EAAW,EAAM,WACrG,EAAA,EAAA,KAAC,EAAD,CAAO,UAAU,UAAY,CAAA,CACtB,CAAA,CACR,KACC,EAAA,EAAA,KAAC,EAAD,CAAQ,KAAK,OAAO,QAAQ,QAAQ,UAAU,UAAU,MAAM,WAAW,SAAU,EAAiB,YAAe,KAAK,GAAoB,WAC1I,EAAA,EAAA,KAAC,EAAD,CAAU,UAAU,UAAY,CAAA,CACzB,CAAA,EAET,EAAM,cAAgB,WAAa,EAAM,cAAgB,SAAW,EAAM,oBAC1E,EAAA,EAAA,KAAC,EAAD,CAAQ,KAAK,OAAO,QAAQ,QAAQ,UAAU,8CAA8C,MAAM,oDAAoD,YAAe,EAAY,uBAAwB,QAAQ,EAAY,EAAM,CAAC,4EAA+E,EAAgB,EAAM,kBAAoB,QAAQ,CAAC,WACpW,EAAA,EAAA,KAAC,EAAD,CAAM,UAAU,UAAY,CAAA,CACrB,CAAA,CAEV,KACC,EAAA,EAAA,KAAC,EAAD,CAAQ,KAAK,OAAO,QAAQ,QAAQ,UAAU,UAAU,MAAM,UAAU,YAAe,EAAY,gBAAiB,uBAAuB,EAAY,EAAM,CAAC,OAAU,EAAc,EAAO,UAAW,cAAc,CAAC,WACrN,EAAA,EAAA,KAAC,EAAD,CAAW,UAAU,UAAY,CAAA,CAC1B,CAAA,CAEV,KACC,EAAA,EAAA,KAAC,EAAD,CAAQ,KAAK,OAAO,QAAQ,QAAQ,UAAU,UAAU,MAAM,gBAAgB,YAAe,EAAY,gBAAiB,qBAAqB,EAAY,EAAM,CAAC,OAAU,EAAc,EAAO,eAAgB,cAAc,CAAC,WAC9N,EAAA,EAAA,KAAC,EAAD,CAAQ,UAAU,UAAY,CAAA,CACvB,CAAA,CAEV,KACC,EAAA,EAAA,KAAC,EAAD,CAAQ,KAAK,OAAO,QAAQ,QAAQ,UAAU,0CAA0C,MAAM,WAAW,YAAe,EAAY,iBAAkB,YAAY,EAAY,EAAM,CAAC,OAAU,EAAc,EAAO,WAAY,cAAc,CAAC,WAC7O,EAAA,EAAA,KAAC,EAAD,CAAO,UAAU,UAAY,CAAA,CACtB,CAAA,CAEV,KACC,EAAA,EAAA,KAAC,EAAD,CAAQ,KAAK,OAAO,QAAQ,QAAQ,UAAU,0CAA0C,MAAM,qBAAqB,YAAe,EAAY,eAAgB,UAAU,EAAY,EAAM,CAAC,OAAU,EAAc,EAAM,GAAG,CAAC,WAC3N,EAAA,EAAA,KAAC,EAAD,CAAQ,UAAU,UAAY,CAAA,CACvB,CAAA,CAEP,GACM,GACT,CAAA,CACN,IACC,EAAA,EAAA,KAAC,EAAD,CAAgB,KAAM,EAAc,aAAc,EAAqB,eAAgB,EAAe,eAAgB,QAAS,EAAe,QAAS,YAAa,EAAe,aAAe,GAAoB,CAAA,CAErN,CAAA,CAAA,CAIP,SAAgB,GAAa,CAC3B,IAAM,EAAoB,EAAe,GAAM,EAAE,kBAAkB,CAC7D,EAAoB,EAAe,GAAM,EAAE,kBAAkB,CAC7D,EAAiB,EAAe,GAAM,EAAE,eAAe,CACvD,EAAkB,EAAe,GAAM,EAAE,gBAAgB,CACzD,EAAY,EAAe,GAAM,EAAE,UAAU,CAC7C,EAAe,EAAe,GAAM,EAAE,aAAa,CACnD,EAAc,EAAe,GAAM,EAAE,YAAY,CACjD,EAAM,EAAe,GAAM,EAAE,IAAI,CACjC,EAAiB,EAAe,GAAM,EAAE,eAAe,CAEvD,EAAe,GAAiB,CAChC,EAAa,GAAe,CAC5B,EAAc,GAAgB,CAE9B,EAAa,GAAqB,GAAqB,GAAkB,EAE/E,SAAS,GAAe,CACtB,EAAI,CAAE,kBAAmB,GAAI,kBAAmB,GAAI,eAAgB,GAAI,gBAAiB,GAAI,CAAC,CAGhG,SAAS,GAAgB,CACvB,EAAI,CAAE,aAAc,IAAiB,MAAQ,OAAS,MAAO,CAAC,CAGhE,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qBAAf,EAEE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,6CAAf,EACE,EAAA,EAAA,MAAC,SAAD,CACE,MAAO,EACP,SAAW,GAAM,EAAI,CAAE,kBAAmB,EAAE,OAAO,MAAO,CAAC,CAC3D,UAAU,oFAHZ,EAKE,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,YAAG,aAAmB,CAAA,EACpC,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,kBAAS,SAAe,CAAA,EACtC,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,kBAAS,SAAe,CAAA,EACtC,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,iBAAQ,QAAc,CAAA,EACpC,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,kBAAS,SAAe,CAAA,EACtC,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,oBAAW,WAAiB,CAAA,EAC1C,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,yBAAgB,kBAAwB,CAAA,CAC/C,IAET,EAAA,EAAA,MAAC,SAAD,CACE,MAAO,EACP,SAAW,GAAM,EAAI,CAAE,kBAAmB,EAAE,OAAO,MAAO,CAAC,CAC3D,UAAU,oFAHZ,EAKE,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,YAAG,aAAmB,CAAA,EACpC,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,kBAAS,SAAe,CAAA,EACtC,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,gBAAO,OAAa,CAAA,EAClC,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,gBAAO,OAAa,CAAA,EAClC,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,mBAAU,UAAgB,CAAA,EACxC,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,oBAAW,WAAiB,CAAA,CACnC,GAER,EAAW,OAAS,IACnB,EAAA,EAAA,MAAC,SAAD,CACE,MAAO,EACP,SAAW,GAAM,EAAI,CAAE,eAAgB,EAAE,OAAO,MAAO,CAAC,CACxD,UAAU,oFAHZ,EAKE,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,YAAG,UAAgB,CAAA,CAChC,EAAW,IAAK,IAAM,EAAA,EAAA,KAAC,SAAD,CAAgB,MAAO,WAAI,EAAW,CAAzB,EAAyB,CAAC,CACvD,GAGV,EAAY,OAAS,IACpB,EAAA,EAAA,MAAC,SAAD,CACE,MAAO,EACP,SAAW,GAAM,EAAI,CAAE,gBAAiB,EAAE,OAAO,MAAO,CAAC,CACzD,UAAU,oFAHZ,EAKE,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,YAAG,WAAiB,CAAA,CACjC,EAAY,IAAK,IAAM,EAAA,EAAA,KAAC,SAAD,CAAgB,MAAO,WAAI,EAAW,CAAzB,EAAyB,CAAC,CACxD,IAGX,EAAA,EAAA,MAAC,SAAD,CACE,MAAO,EACP,SAAW,GAAM,EAAI,CAAE,UAAW,EAAE,OAAO,MAAO,CAAC,CACnD,UAAU,oFAHZ,EAKE,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,kBAAS,eAAqB,CAAA,EAC5C,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,gBAAO,aAAmB,CAAA,EACxC,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,oBAAW,kBAAwB,CAAA,EACjD,EAAA,EAAA,KAAC,SAAD,CAAQ,MAAM,mBAAU,gBAAsB,CAAA,CACvC,IAET,EAAA,EAAA,KAAC,EAAD,CAAQ,KAAK,OAAO,QAAQ,UAAU,UAAU,UAAU,MAAM,wBAAwB,QAAS,WAC9F,IAAiB,OAAQ,EAAA,EAAA,KAAC,EAAD,CAAS,UAAU,cAAgB,CAAA,EAAG,EAAA,EAAA,KAAC,EAAD,CAAU,UAAU,cAAgB,CAAA,CAC7F,CAAA,EAET,EAAA,EAAA,MAAC,QAAD,CAAO,UAAU,8FAAjB,EACE,EAAA,EAAA,KAAC,QAAD,CACE,KAAK,WACL,QAAS,EACT,SAAW,GAAM,EAAI,CAAE,YAAa,EAAE,OAAO,QAAS,CAAC,CACvD,UAAU,UACV,CAAA,CAAA,eAEI,GAEP,IACC,EAAA,EAAA,MAAC,EAAD,CAAQ,KAAK,KAAK,QAAQ,QAAQ,UAAU,wDAAwD,QAAS,WAA7G,EACE,EAAA,EAAA,KAAC,EAAD,CAAG,UAAU,UAAY,CAAA,CAAA,gBAElB,IAGX,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,oBACb,EAAA,EAAA,MAAC,EAAD,CAAQ,KAAK,KAAK,QAAS,EAAgB,UAAU,iBAArD,EACE,EAAA,EAAA,KAAC,EAAD,CAAM,UAAU,cAAgB,CAAA,CAAA,QAEzB,GACL,CAAA,CACF,GAGL,EAAa,SAAW,GACvB,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,2DAAkD,uCAE3D,CAAA,EAEN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,+EACZ,EAAa,IAAK,IACjB,EAAA,EAAA,KAAC,EAAD,CAAiC,QAAS,CAA1B,EAAM,GAAoB,CAC1C,CACE,CAAA,CAEJ"}