@vibecontrols/vibe-plugin-tool-ssh 2026.508.3 → 2026.509.1
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.
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* Migrated to consume `@vibecontrols/plugin-sdk` for the contract,
|
|
13
13
|
* lifecycle, telemetry, CLI multimode, and redaction helpers.
|
|
14
14
|
*/
|
|
15
|
-
import { type
|
|
15
|
+
import { type VibePluginFactory } from "@vibecontrols/plugin-sdk";
|
|
16
16
|
export type { AgentHostServices, AgentStorageProvider, AgentEventBus, AgentServiceRegistry, HostServices, StorageProvider, EventBus, ServiceRegistry, SSHConnection, PortForward, SSHTerminalSession, RemoteAgentInstallJob, } from "./types.js";
|
|
17
|
-
export declare const
|
|
18
|
-
export default
|
|
17
|
+
export declare const createPlugin: VibePluginFactory;
|
|
18
|
+
export default createPlugin;
|
package/dist/index.js
CHANGED
|
@@ -38,7 +38,7 @@ ${suffix}`}};var MAX_32BIT_INT=4294967296,MAX_32BIT_BIGINT=(()=>{try{return Func
|
|
|
38
38
|
${row.detail}
|
|
39
39
|
`};return renderDetail(0),list.on(SelectRenderableEvents.SELECTION_CHANGED,(idx)=>{renderDetail(idx)}),await new Promise((resolve)=>{let cleanup=(chosen)=>{try{renderer.destroy()}catch{}resolve(chosen)};list.on(SelectRenderableEvents.ITEM_SELECTED,()=>{let row=opts.rows[list.getSelectedIndex()];cleanup(row??null)}),renderer.keyInput.on("keypress",(key)=>{if(key.name==="escape"||key.name==="q")cleanup(null)})}).then(async(chosen)=>{if(chosen&&opts.onSelect)await opts.onSelect(chosen);return chosen})}async function interactiveDetail(opts){let core=await loadCore(),{createCliRenderer,BoxRenderable,TextRenderable}=core,renderer=await createCliRenderer({exitOnCtrlC:!0,targetFps:30}),ctx=renderer.root.ctx,root=new BoxRenderable(ctx,{width:"100%",height:"100%",flexDirection:"column",backgroundColor:"#0b0d12"}),title=new TextRenderable(ctx,{content:` ${opts.title}`,fg:"#8be9fd",height:1}),bodyBox=new BoxRenderable(ctx,{width:"100%",flexGrow:1,paddingLeft:2,paddingRight:2,backgroundColor:"#11141c"}),bodyText=new TextRenderable(ctx,{content:`
|
|
40
40
|
${opts.body}
|
|
41
|
-
`,fg:"#cdd6f4"}),footer=new TextRenderable(ctx,{content:` ${opts.footer??"q to quit"}`,fg:"#6c7086",height:1});bodyBox.add(bodyText),root.add(title),root.add(bodyBox),root.add(footer),renderer.root.add(root),await new Promise((resolve)=>{let cleanup=()=>{try{renderer.destroy()}catch{}resolve()};renderer.keyInput.on("keypress",(key)=>{if(key.name==="escape"||key.name==="q"||key.name==="return")cleanup()})})}var AGENT_BASE_URL=process.env.VIBE_AGENT_URL??"http://localhost:3005",API_KEY=process.env.VIBE_AGENT_API_KEY??"";async function apiFetch(urlPath,options){return fetch(`${AGENT_BASE_URL}${urlPath}`,{...options,headers:{"Content-Type":"application/json","x-agent-api-key":API_KEY,...options?.headers}})}var cleanupPortForwards,cleanupTerminals,PLUGIN_NAME="ssh",PLUGIN_VERSION="2026.
|
|
41
|
+
`,fg:"#cdd6f4"}),footer=new TextRenderable(ctx,{content:` ${opts.footer??"q to quit"}`,fg:"#6c7086",height:1});bodyBox.add(bodyText),root.add(title),root.add(bodyBox),root.add(footer),renderer.root.add(root),await new Promise((resolve)=>{let cleanup=()=>{try{renderer.destroy()}catch{}resolve()};renderer.keyInput.on("keypress",(key)=>{if(key.name==="escape"||key.name==="q"||key.name==="return")cleanup()})})}var AGENT_BASE_URL=process.env.VIBE_AGENT_URL??"http://localhost:3005",API_KEY=process.env.VIBE_AGENT_API_KEY??"";async function apiFetch(urlPath,options){return fetch(`${AGENT_BASE_URL}${urlPath}`,{...options,headers:{"Content-Type":"application/json","x-agent-api-key":API_KEY,...options?.headers}})}var cleanupPortForwards,cleanupTerminals,PLUGIN_NAME="ssh",PLUGIN_VERSION="2026.509.1",createPlugin=(_ctx)=>{let lifecycle=createLifecycleHooks({name:PLUGIN_NAME,telemetryEventName:"tool.ready",onInit:(hostServices)=>{new TelemetryEmitter(PLUGIN_NAME,PLUGIN_VERSION,hostServices).emitEvent("tool.ready",{provider:"ssh"})}});return{capabilities:{storage:"rw",subprocess:!0,audit:!0,telemetry:!0},name:PLUGIN_NAME,version:PLUGIN_VERSION,description:"SSH connection management, remote terminals, port forwarding, and remote agent installation",tags:["backend","cli","integration","provider"],cliCommand:"ssh",apiPrefix:"/api/ssh",async onServerStart(app,hostServices){if(await lifecycle.onServerStart(app,hostServices),process.platform==="win32"){process.stderr.write(" Plugin 'ssh' is not supported on Windows yet \u2014 skipping route + provider registration. "+`See https://github.com/algoshred/vibe-plugin-tool-ssh for status.
|
|
42
42
|
`);return}let elysiaApp=app,agentHost=hostServices,{createSSHRoutes:createSSHRoutes2}=await Promise.resolve().then(() => (init_ssh(),exports_ssh)),{createPortForwardRoutes:createPortForwardRoutes2,cleanupAllTunnels:cleanupAllTunnels2}=await Promise.resolve().then(() => (init_port_forward(),exports_port_forward)),{createRemoteTerminalRoutes:createRemoteTerminalRoutes2,cleanupAllTerminals:cleanupAllTerminals2,getTerminalInfo:getTerminalInfo2,listTerminalSessions:listTerminalSessions2}=await Promise.resolve().then(() => (init_remote_terminal(),exports_remote_terminal)),{createRemoteAgentInstallRoutes:createRemoteAgentInstallRoutes2}=await Promise.resolve().then(() => (init_remote_agent_install(),exports_remote_agent_install)),{createSSHConfigScanRoutes:createSSHConfigScanRoutes2}=await Promise.resolve().then(() => (init_ssh_config_scan(),exports_ssh_config_scan));if(elysiaApp.use(createSSHRoutes2(agentHost)),elysiaApp.use(createPortForwardRoutes2(agentHost)),elysiaApp.use(createRemoteTerminalRoutes2(agentHost)),elysiaApp.use(createRemoteAgentInstallRoutes2(agentHost)),elysiaApp.use(createSSHConfigScanRoutes2(agentHost)),cleanupPortForwards=cleanupAllTunnels2,cleanupTerminals=cleanupAllTerminals2,agentHost.serviceRegistry){let sshSessionProvider={name:"ssh",getTerminalInfo:(sessionId)=>getTerminalInfo2(sessionId),list:async()=>{return listTerminalSessions2().map((s)=>({id:s.id,name:`ssh-terminal-${s.id.slice(0,8)}`,status:s.status==="active"?"active":"inactive",provider:"ssh",createdAt:s.startedAt}))},get:async(sessionId)=>{let s=listTerminalSessions2().find((x)=>x.id===sessionId);if(!s)return null;return{id:s.id,name:`ssh-terminal-${s.id.slice(0,8)}`,status:s.status==="active"?"active":"inactive",provider:"ssh",createdAt:s.startedAt}}};agentHost.serviceRegistry.registerProvider("session",sshSessionProvider,"ssh")}process.stdout.write(` Plugin 'ssh' registered routes: /api/ssh, /api/port-forward, /api/ssh/terminal, /api/ssh/agent-install, /api/ssh/config-scan
|
|
43
43
|
`)},async onServerStop(){if(cleanupTerminals)cleanupTerminals(),cleanupTerminals=void 0;if(cleanupPortForwards)cleanupPortForwards(),cleanupPortForwards=void 0;process.stdout.write(` Plugin 'ssh' cleaned up active connections and terminals
|
|
44
44
|
`)},onCliSetup(programArg){let ssh=programArg.command("ssh").description("SSH connection and remote terminal management");ssh.hook("preAction",()=>{if(process.platform==="win32")process.stderr.write(`SSH plugin is not supported on Windows yet \u2014 see issue tracker.
|
|
@@ -47,4 +47,4 @@ ${opts.body}
|
|
|
47
47
|
`)},interactive:async(rows)=>{if(!rows||rows.length===0){await interactiveDetail({title:"ssh \u2014 connections",body:"No saved SSH connections."});return}let tableRows=rows.map((r)=>({id:String(r.id??r.name??""),label:String(r.name??r.host??r.id??"(unnamed)"),hint:r.host?`${r.username??""}@${r.host}`:void 0,detail:JSON.stringify(redact(r),null,2)}));await interactiveTable({title:`ssh list \u2014 ${rows.length} connection(s)`,rows:tableRows})},json:(rows)=>redact(rows)})}),ssh.command("terminals").description("List active remote terminal sessions").option("--json","Emit JSON").option("--plain","Force plain text output").action(async(opts)=>{await runMultimode({mode:pickOutputMode(opts),fetchData:async()=>{let data=await(await apiFetch("/api/ssh/terminal/sessions")).json();return Array.isArray(data)?data:data.sessions??[]},plain:(rows)=>{if(!rows||rows.length===0){process.stdout.write(`Use the agent API to list terminal sessions: GET /api/ssh/terminal/sessions
|
|
48
48
|
`);return}process.stdout.write(`${JSON.stringify(rows,null,2)}
|
|
49
49
|
`)},interactive:async(rows)=>{if(!rows||rows.length===0){await interactiveDetail({title:"ssh \u2014 terminals",body:"No active terminal sessions."});return}let tableRows=rows.map((r)=>({id:String(r.id??""),label:String(r.name??r.id??"(terminal)"),hint:r.status?String(r.status):void 0,detail:JSON.stringify(redact(r),null,2)}));await interactiveTable({title:`ssh terminals \u2014 ${rows.length} session(s)`,rows:tableRows})},json:(rows)=>redact(rows)})}),ssh.command("install-jobs").description("List remote agent installation jobs").option("--json","Emit JSON").action(async(opts)=>{if(maybePrintJson(opts,{ok:!0,action:"install-jobs",message:"Use the agent API to list install jobs: GET /api/ssh/agent-install/jobs"}))return;process.stdout.write(`Use the agent API to list install jobs: GET /api/ssh/agent-install/jobs
|
|
50
|
-
`)})}},src_default=
|
|
50
|
+
`)})}}},src_default=createPlugin;export{src_default as default,createPlugin};
|