@burdenoff/microfe-vibecontrols 2026.601.16 → 2026.601.18

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.
@@ -1,70 +1,98 @@
1
1
  import { useTr as e } from "../../shared/hooks/useTr.js";
2
- import { ExternalLink as t, Rocket as n, Send as r, Terminal as i, X as a } from "lucide-react";
3
- import { jsx as o, jsxs as s } from "react/jsx-runtime";
2
+ import { useState as t } from "react";
3
+ import { ExternalLink as n, Loader2 as r, Power as i, Rocket as a, Send as o, Terminal as s, X as c } from "lucide-react";
4
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
4
5
  //#region src/components/graph/MeshNodeActions.tsx
5
- function c({ agent: c, onRunCommand: l, onStartTerminal: u, onDeployFromHere: d, onOpenAgent: f, onClose: p }) {
6
- let m = e(), h = "w-full flex items-center gap-2 px-3 py-2 text-sm text-text-primary hover:bg-bg-sunken text-left transition-colors";
7
- return /* @__PURE__ */ s("div", {
6
+ function d(e) {
7
+ if (!e.isActive) return !0;
8
+ let t = e.tunnelStatus?.toLowerCase();
9
+ return t ? t === "offline" || t === "disconnected" || t === "stale" : !1;
10
+ }
11
+ function f({ agent: f, onRunCommand: p, onStartTerminal: m, onDeployFromHere: h, onWakeViaSsh: g, onOpenAgent: _, onClose: v }) {
12
+ let y = e(), [b, x] = t(!1), S = "w-full flex items-center gap-2 px-3 py-2 text-sm text-text-primary hover:bg-bg-sunken text-left transition-colors disabled:opacity-50 disabled:cursor-not-allowed", C = d(f), w = async () => {
13
+ if (!b) {
14
+ x(!0);
15
+ try {
16
+ await g(f.id);
17
+ } finally {
18
+ x(!1);
19
+ }
20
+ }
21
+ };
22
+ return /* @__PURE__ */ u("div", {
8
23
  className: "rounded-lg border border-border-default bg-bg-surface shadow-lg overflow-hidden w-56",
9
- children: [/* @__PURE__ */ s("div", {
24
+ children: [/* @__PURE__ */ u("div", {
10
25
  className: "flex items-center justify-between px-3 py-2 border-b border-border-default bg-bg-sunken",
11
- children: [/* @__PURE__ */ o("span", {
26
+ children: [/* @__PURE__ */ l("span", {
12
27
  className: "text-xs font-semibold text-text-primary truncate",
13
- children: c.name
14
- }), /* @__PURE__ */ o("button", {
28
+ children: f.name
29
+ }), /* @__PURE__ */ l("button", {
15
30
  type: "button",
16
- onClick: p,
31
+ onClick: v,
17
32
  className: "p-0.5 rounded hover:bg-bg-elevated",
18
- "aria-label": m("common.close", "Close"),
19
- children: /* @__PURE__ */ o(a, {
33
+ "aria-label": y("common.close", "Close"),
34
+ children: /* @__PURE__ */ l(c, {
20
35
  size: 14,
21
36
  className: "text-text-secondary"
22
37
  })
23
38
  })]
24
- }), /* @__PURE__ */ s("div", {
39
+ }), /* @__PURE__ */ u("div", {
25
40
  className: "py-1",
26
41
  children: [
27
- /* @__PURE__ */ s("button", {
42
+ /* @__PURE__ */ u("button", {
43
+ type: "button",
44
+ className: S,
45
+ onClick: () => p(f.id),
46
+ children: [/* @__PURE__ */ l(o, {
47
+ size: 14,
48
+ className: "text-text-secondary"
49
+ }), y("mesh.actions.runCommand", "Run command")]
50
+ }),
51
+ /* @__PURE__ */ u("button", {
28
52
  type: "button",
29
- className: h,
30
- onClick: () => l(c.id),
31
- children: [/* @__PURE__ */ o(r, {
53
+ className: S,
54
+ onClick: () => m(f.id),
55
+ children: [/* @__PURE__ */ l(s, {
32
56
  size: 14,
33
57
  className: "text-text-secondary"
34
- }), m("mesh.actions.runCommand", "Run command")]
58
+ }), y("mesh.actions.startTerminal", "Start terminal")]
35
59
  }),
36
- /* @__PURE__ */ s("button", {
60
+ /* @__PURE__ */ u("button", {
37
61
  type: "button",
38
- className: h,
39
- onClick: () => u(c.id),
40
- children: [/* @__PURE__ */ o(i, {
62
+ className: S,
63
+ onClick: () => h(f.id),
64
+ children: [/* @__PURE__ */ l(a, {
41
65
  size: 14,
42
66
  className: "text-text-secondary"
43
- }), m("mesh.actions.startTerminal", "Start terminal")]
67
+ }), y("mesh.actions.deployFromHere", "Deploy from here")]
44
68
  }),
45
- /* @__PURE__ */ s("button", {
69
+ C && /* @__PURE__ */ u("button", {
46
70
  type: "button",
47
- className: h,
48
- onClick: () => d(c.id),
49
- children: [/* @__PURE__ */ o(n, {
71
+ className: S,
72
+ onClick: () => void w(),
73
+ disabled: b,
74
+ children: [b ? /* @__PURE__ */ l(r, {
75
+ size: 14,
76
+ className: "text-text-secondary animate-spin"
77
+ }) : /* @__PURE__ */ l(i, {
50
78
  size: 14,
51
79
  className: "text-text-secondary"
52
- }), m("mesh.actions.deployFromHere", "Deploy from here")]
80
+ }), b ? y("mesh.actions.wakingViaSsh", "Waking…") : y("mesh.actions.wakeViaSsh", "Wake via SSH")]
53
81
  }),
54
- /* @__PURE__ */ s("button", {
82
+ /* @__PURE__ */ u("button", {
55
83
  type: "button",
56
- className: h,
57
- onClick: () => f(c.id),
58
- children: [/* @__PURE__ */ o(t, {
84
+ className: S,
85
+ onClick: () => _(f.id),
86
+ children: [/* @__PURE__ */ l(n, {
59
87
  size: 14,
60
88
  className: "text-text-secondary"
61
- }), m("mesh.actions.openAgent", "Open agent")]
89
+ }), y("mesh.actions.openAgent", "Open agent")]
62
90
  })
63
91
  ]
64
92
  })]
65
93
  });
66
94
  }
67
95
  //#endregion
68
- export { c as MeshNodeActions };
96
+ export { f as MeshNodeActions };
69
97
 
70
98
  //# sourceMappingURL=MeshNodeActions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MeshNodeActions.js","names":[],"sources":["../../../src/components/graph/MeshNodeActions.tsx"],"sourcesContent":["/**\n * MeshNodeActions — quick-action menu for a selected agent node in the mesh.\n *\n * Actions:\n * - Run command → opens the MeshRequestPanel targeting this node\n * - Start terminal → best-effort deep-terminal via startMeshAgentSession\n * - Deploy from here → opens the deploy wizard pre-seeded with this node\n * - Open agent → navigate to the agent details page\n *\n * Rendered as a lightweight popover anchored to the page; the parent owns the\n * open/close state and the action callbacks.\n */\n\nimport { Terminal, Send, Rocket, ExternalLink, X } from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport type { MeshAgentUi } from './meshTypes';\n\ninterface MeshNodeActionsProps {\n agent: MeshAgentUi;\n onRunCommand: (agentId: string) => void;\n onStartTerminal: (agentId: string) => void;\n onDeployFromHere: (agentId: string) => void;\n onOpenAgent: (agentId: string) => void;\n onClose: () => void;\n}\n\nexport function MeshNodeActions({\n agent,\n onRunCommand,\n onStartTerminal,\n onDeployFromHere,\n onOpenAgent,\n onClose,\n}: MeshNodeActionsProps) {\n const tr = useTr();\n\n const ITEM =\n 'w-full flex items-center gap-2 px-3 py-2 text-sm text-text-primary hover:bg-bg-sunken text-left transition-colors';\n\n return (\n <div className=\"rounded-lg border border-border-default bg-bg-surface shadow-lg overflow-hidden w-56\">\n <div className=\"flex items-center justify-between px-3 py-2 border-b border-border-default bg-bg-sunken\">\n <span className=\"text-xs font-semibold text-text-primary truncate\">{agent.name}</span>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-0.5 rounded hover:bg-bg-elevated\"\n aria-label={tr('common.close', 'Close')}\n >\n <X size={14} className=\"text-text-secondary\" />\n </button>\n </div>\n <div className=\"py-1\">\n <button type=\"button\" className={ITEM} onClick={() => onRunCommand(agent.id)}>\n <Send size={14} className=\"text-text-secondary\" />\n {tr('mesh.actions.runCommand', 'Run command')}\n </button>\n <button type=\"button\" className={ITEM} onClick={() => onStartTerminal(agent.id)}>\n <Terminal size={14} className=\"text-text-secondary\" />\n {tr('mesh.actions.startTerminal', 'Start terminal')}\n </button>\n <button type=\"button\" className={ITEM} onClick={() => onDeployFromHere(agent.id)}>\n <Rocket size={14} className=\"text-text-secondary\" />\n {tr('mesh.actions.deployFromHere', 'Deploy from here')}\n </button>\n <button type=\"button\" className={ITEM} onClick={() => onOpenAgent(agent.id)}>\n <ExternalLink size={14} className=\"text-text-secondary\" />\n {tr('mesh.actions.openAgent', 'Open agent')}\n </button>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;AA0BA,SAAgB,EAAgB,EAC9B,UACA,iBACA,oBACA,qBACA,gBACA,cACuB;CACvB,IAAM,IAAK,GAAO,EAEZ,IACJ;AAEF,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,QAAD;IAAM,WAAU;cAAoD,EAAM;IAAY,CAAA,EACtF,kBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,WAAU;IACV,cAAY,EAAG,gBAAgB,QAAQ;cAEvC,kBAAC,GAAD;KAAG,MAAM;KAAI,WAAU;KAAwB,CAAA;IACxC,CAAA,CACL;MACN,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,UAAD;KAAQ,MAAK;KAAS,WAAW;KAAM,eAAe,EAAa,EAAM,GAAG;eAA5E,CACE,kBAAC,GAAD;MAAM,MAAM;MAAI,WAAU;MAAwB,CAAA,EACjD,EAAG,2BAA2B,cAAc,CACtC;;IACT,kBAAC,UAAD;KAAQ,MAAK;KAAS,WAAW;KAAM,eAAe,EAAgB,EAAM,GAAG;eAA/E,CACE,kBAAC,GAAD;MAAU,MAAM;MAAI,WAAU;MAAwB,CAAA,EACrD,EAAG,8BAA8B,iBAAiB,CAC5C;;IACT,kBAAC,UAAD;KAAQ,MAAK;KAAS,WAAW;KAAM,eAAe,EAAiB,EAAM,GAAG;eAAhF,CACE,kBAAC,GAAD;MAAQ,MAAM;MAAI,WAAU;MAAwB,CAAA,EACnD,EAAG,+BAA+B,mBAAmB,CAC/C;;IACT,kBAAC,UAAD;KAAQ,MAAK;KAAS,WAAW;KAAM,eAAe,EAAY,EAAM,GAAG;eAA3E,CACE,kBAAC,GAAD;MAAc,MAAM;MAAI,WAAU;MAAwB,CAAA,EACzD,EAAG,0BAA0B,aAAa,CACpC;;IACL;KACF"}
1
+ {"version":3,"file":"MeshNodeActions.js","names":[],"sources":["../../../src/components/graph/MeshNodeActions.tsx"],"sourcesContent":["/**\n * MeshNodeActions — quick-action menu for a selected agent node in the mesh.\n *\n * Actions:\n * - Run command → opens the MeshRequestPanel targeting this node\n * - Start terminal → best-effort deep-terminal via startMeshAgentSession\n * - Deploy from here → opens the deploy wizard pre-seeded with this node\n * - Wake via SSH → SSH-hop a source agent into an OFFLINE target's host and\n * `vibe restart` it to bring up a fresh tunnel (only shown\n * when the agent is offline/inactive)\n * - Open agent → navigate to the agent details page\n *\n * Rendered as a lightweight popover anchored to the page; the parent owns the\n * open/close state and the action callbacks.\n */\n\nimport { useState } from 'react';\nimport { Terminal, Send, Rocket, ExternalLink, Power, Loader2, X } from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport type { MeshAgentUi } from './meshTypes';\n\ninterface MeshNodeActionsProps {\n agent: MeshAgentUi;\n onRunCommand: (agentId: string) => void;\n onStartTerminal: (agentId: string) => void;\n onDeployFromHere: (agentId: string) => void;\n /** Wake an offline agent over SSH. Resolves once the wake attempt finishes. */\n onWakeViaSsh: (agentId: string) => Promise<void>;\n onOpenAgent: (agentId: string) => void;\n onClose: () => void;\n}\n\n/**\n * An agent is \"offline\" when it isn't active or its tunnel is in a\n * stale/disconnected state — these are the states where a SSH wake makes sense.\n */\nfunction isAgentOffline(agent: MeshAgentUi): boolean {\n if (!agent.isActive) return true;\n const status = agent.tunnelStatus?.toLowerCase();\n if (!status) return false;\n return status === 'offline' || status === 'disconnected' || status === 'stale';\n}\n\nexport function MeshNodeActions({\n agent,\n onRunCommand,\n onStartTerminal,\n onDeployFromHere,\n onWakeViaSsh,\n onOpenAgent,\n onClose,\n}: MeshNodeActionsProps) {\n const tr = useTr();\n const [waking, setWaking] = useState(false);\n\n const ITEM =\n 'w-full flex items-center gap-2 px-3 py-2 text-sm text-text-primary hover:bg-bg-sunken text-left transition-colors disabled:opacity-50 disabled:cursor-not-allowed';\n\n const showWake = isAgentOffline(agent);\n\n const handleWake = async () => {\n if (waking) return;\n setWaking(true);\n try {\n await onWakeViaSsh(agent.id);\n } finally {\n setWaking(false);\n }\n };\n\n return (\n <div className=\"rounded-lg border border-border-default bg-bg-surface shadow-lg overflow-hidden w-56\">\n <div className=\"flex items-center justify-between px-3 py-2 border-b border-border-default bg-bg-sunken\">\n <span className=\"text-xs font-semibold text-text-primary truncate\">{agent.name}</span>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-0.5 rounded hover:bg-bg-elevated\"\n aria-label={tr('common.close', 'Close')}\n >\n <X size={14} className=\"text-text-secondary\" />\n </button>\n </div>\n <div className=\"py-1\">\n <button type=\"button\" className={ITEM} onClick={() => onRunCommand(agent.id)}>\n <Send size={14} className=\"text-text-secondary\" />\n {tr('mesh.actions.runCommand', 'Run command')}\n </button>\n <button type=\"button\" className={ITEM} onClick={() => onStartTerminal(agent.id)}>\n <Terminal size={14} className=\"text-text-secondary\" />\n {tr('mesh.actions.startTerminal', 'Start terminal')}\n </button>\n <button type=\"button\" className={ITEM} onClick={() => onDeployFromHere(agent.id)}>\n <Rocket size={14} className=\"text-text-secondary\" />\n {tr('mesh.actions.deployFromHere', 'Deploy from here')}\n </button>\n {showWake && (\n <button\n type=\"button\"\n className={ITEM}\n onClick={() => void handleWake()}\n disabled={waking}\n >\n {waking ? (\n <Loader2 size={14} className=\"text-text-secondary animate-spin\" />\n ) : (\n <Power size={14} className=\"text-text-secondary\" />\n )}\n {waking\n ? tr('mesh.actions.wakingViaSsh', 'Waking…')\n : tr('mesh.actions.wakeViaSsh', 'Wake via SSH')}\n </button>\n )}\n <button type=\"button\" className={ITEM} onClick={() => onOpenAgent(agent.id)}>\n <ExternalLink size={14} className=\"text-text-secondary\" />\n {tr('mesh.actions.openAgent', 'Open agent')}\n </button>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;AAoCA,SAAS,EAAe,GAA6B;AACnD,KAAI,CAAC,EAAM,SAAU,QAAO;CAC5B,IAAM,IAAS,EAAM,cAAc,aAAa;AAEhD,QADK,IACE,MAAW,aAAa,MAAW,kBAAkB,MAAW,UADnD;;AAItB,SAAgB,EAAgB,EAC9B,UACA,iBACA,oBACA,qBACA,iBACA,gBACA,cACuB;CACvB,IAAM,IAAK,GAAO,EACZ,CAAC,GAAQ,KAAa,EAAS,GAAM,EAErC,IACJ,qKAEI,IAAW,EAAe,EAAM,EAEhC,IAAa,YAAY;AACzB,UACJ;KAAU,GAAK;AACf,OAAI;AACF,UAAM,EAAa,EAAM,GAAG;aACpB;AACR,MAAU,GAAM;;;;AAIpB,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,QAAD;IAAM,WAAU;cAAoD,EAAM;IAAY,CAAA,EACtF,kBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,WAAU;IACV,cAAY,EAAG,gBAAgB,QAAQ;cAEvC,kBAAC,GAAD;KAAG,MAAM;KAAI,WAAU;KAAwB,CAAA;IACxC,CAAA,CACL;MACN,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,UAAD;KAAQ,MAAK;KAAS,WAAW;KAAM,eAAe,EAAa,EAAM,GAAG;eAA5E,CACE,kBAAC,GAAD;MAAM,MAAM;MAAI,WAAU;MAAwB,CAAA,EACjD,EAAG,2BAA2B,cAAc,CACtC;;IACT,kBAAC,UAAD;KAAQ,MAAK;KAAS,WAAW;KAAM,eAAe,EAAgB,EAAM,GAAG;eAA/E,CACE,kBAAC,GAAD;MAAU,MAAM;MAAI,WAAU;MAAwB,CAAA,EACrD,EAAG,8BAA8B,iBAAiB,CAC5C;;IACT,kBAAC,UAAD;KAAQ,MAAK;KAAS,WAAW;KAAM,eAAe,EAAiB,EAAM,GAAG;eAAhF,CACE,kBAAC,GAAD;MAAQ,MAAM;MAAI,WAAU;MAAwB,CAAA,EACnD,EAAG,+BAA+B,mBAAmB,CAC/C;;IACR,KACC,kBAAC,UAAD;KACE,MAAK;KACL,WAAW;KACX,eAAe,KAAK,GAAY;KAChC,UAAU;eAJZ,CAMG,IACC,kBAAC,GAAD;MAAS,MAAM;MAAI,WAAU;MAAqC,CAAA,GAElE,kBAAC,GAAD;MAAO,MAAM;MAAI,WAAU;MAAwB,CAAA,EAEpD,IACG,EAAG,6BAA6B,UAAU,GAC1C,EAAG,2BAA2B,eAAe,CAC1C;;IAEX,kBAAC,UAAD;KAAQ,MAAK;KAAS,WAAW;KAAM,eAAe,EAAY,EAAM,GAAG;eAA3E,CACE,kBAAC,GAAD;MAAc,MAAM;MAAI,WAAU;MAAwB,CAAA,EACzD,EAAG,0BAA0B,aAAa,CACpC;;IACL;KACF"}