plugin.json
- name
- ssh
- version
- 0.1.15
- extensions
- dev.sailry.platform
plugin.json
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
"name": "ssh",
"version": "0.1.15",
"extensions": {
"dev.sailry.platform": {
"min_sailry_version": "0.1.0-alpha.4",
"api_version": "v1",
"actions": [
"ssh.read",
"ssh.control",
"ssh.manage",
"conversation.read",
"conversation.control",
"projects.read"
],
"display": {
"label": "SSH",
"locales": {
"zh-CN": "SSH"
},
"icon": "reicon:it/terminal-square"
},
"description": {
"label": "Connect and manage remote servers",
"locales": {
"zh-CN": "连接与管理远程服务器"
}
},
"host": {
"entry": "dev.sailry.platform/host/main.js",
"resources": [
"dev.sailry.platform/host/main.js",
"dev.sailry.platform/host/tools.js",
"dev.sailry.platform/host/connections.js"
],
"handlers": [
"initialize",
"run",
"transfer",
"completed",
"connections",
"save",
"saved"
],
"turn": {
"initialize": "initialize"
}
},
"tools": [
{
"name": "ssh_run",
"presentation": "details",
"description": "Run a command on a saved SSH connection available to this session. Resolve the connection ID with ssh_connections; do not recreate an existing connection when it is unavailable. A first connection requires the user to confirm the exact host fingerprint in the runtime approval. Do not request credentials, accept host keys or bypass verification.",
"contexts": [
"workspace",
"ssh"
],
"handler": {
"name": "run",
"result": "completed",
"operation": "ssh.run",
"parameters": {
"type": "object",
"properties": {
"connection": {
"type": "string",
"pattern": "^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$",
"description": "[]"
},
"command": {
"type": "string"
},
"timeout_ms": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"required": [
"connection",
"command"
],
"additionalProperties": false
}
},
"display": {
"label": "Run SSH command",
"locales": {
"zh-CN": "执行 SSH 命令",
"zh-TW": "執行 SSH 命令",
"ja": "SSH コマンドを実行",
"ko": "SSH 명령 실행",
"fr": "Exécuter une commande SSH",
"de": "SSH-Befehl ausführen",
"es": "Ejecutar comando SSH",
"pt-BR": "Executar comando SSH",
"ru": "Выполнить команду SSH",
"en": "Run SSH command"
},
"icon": "reicon:it/terminal-square",
"input": {
"summary": {
"path": "/connection",
"format": "connection",
"result_path": "/connection_name"
},
"content": {
"path": "/command",
"code": true
}
},
"output": {
"preview": {
"parts": [
{
"text": "stdout:\n",
"when": {
"all": [
{
"value": {
"source": "result",
"path": "/data/stdout"
},
"equals": null,
"negate": true
},
{
"value": {
"source": "result",
"path": "/data/stdout"
},
"equals": "",
"negate": true
}
]
}
},
{
"value": {
"source": "result",
"path": "/data/stdout"
}
},
{
"text": "\n",
"when": {
"all": [
{
"value": {
"source": "result",
"path": "/data/stdout"
},
"equals": null,
"negate": true
},
{
"value": {
"source": "result",
"path": "/data/stdout"
},
"equals": "",
"negate": true
}
]
}
},
{
"text": "stderr:\n",
"when": {
"all": [
{
"value": {
"source": "result",
"path": "/data/stderr"
},
"equals": null,
"negate": true
},
{
"value": {
"source": "result",
"path": "/data/stderr"
},
"equals": "",
"negate": true
}
]
}
},
{
"value": {
"source": "result",
"path": "/data/stderr"
}
},
{
"text": "\n",
"when": {
"all": [
{
"value": {
"source": "result",
"path": "/data/stderr"
},
"equals": null,
"negate": true
},
{
"value": {
"source": "result",
"path": "/data/stderr"
},
"equals": "",
"negate": true
}
]
}
},
{
"text": "exit_code: ",
"when": {
"all": [
{
"value": {
"source": "result",
"path": "/data/exit_code"
},
"equals": null,
"negate": true
}
]
}
},
{
"value": {
"source": "result",
"path": "/data/exit_code"
}
},
{
"text": "\nfingerprint: ",
"when": {
"all": [
{
"value": {
"source": "result",
"path": "/data/key/fingerprint"
},
"equals": null,
"negate": true
}
]
}
},
{
"value": {
"source": "result",
"path": "/data/key/fingerprint"
}
}
]
},
"notices": [
{
"message": {
"label": "Partial results",
"locales": {
"en": "Partial results",
"zh-CN": "仅显示部分结果",
"zh-TW": "僅顯示部分結果",
"ja": "一部の結果",
"ko": "일부 결과",
"fr": "Résultats partiels",
"de": "Teilergebnisse",
"es": "Resultados parciales",
"pt-BR": "Resultados parciais",
"ru": "Частичные результаты"
}
},
"when": {
"all": [
{
"value": {
"source": "result",
"path": "/data/truncated"
},
"equals": true
}
]
}
}
]
}
}
},
{
"name": "ssh_transfer",
"presentation": "details",
"description": "Upload or download a file using a saved SSH connection available to this session. Resolve the connection ID with ssh_connections; do not recreate an existing connection when it is unavailable. The local path is relative to the session worktree. Do not request credentials.",
"contexts": [
"workspace",
"ssh"
],
"handler": {
"name": "transfer",
"result": "completed",
"operation": "ssh.transfer",
"parameters": {
"type": "object",
"properties": {
"connection": {
"type": "string",
"pattern": "^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$",
"description": "[]"
},
"path": {
"type": "string"
},
"remote_path": {
"type": "string"
},
"direction": {
"type": "string",
"enum": [
"upload",
"download"
]
}
},
"required": [
"connection",
"path",
"remote_path",
"direction"
],
"additionalProperties": false
}
},
"display": {
"label": "Transfer SSH file",
"locales": {
"zh-CN": "传输 SSH 文件",
"zh-TW": "傳輸 SSH 檔案",
"ja": "SSH でファイルを転送",
"ko": "SSH 파일 전송",
"fr": "Transférer un fichier SSH",
"de": "SSH-Datei übertragen",
"es": "Transferir archivo SSH",
"pt-BR": "Transferir arquivo SSH",
"ru": "Передать файл по SSH",
"en": "Transfer SSH file"
},
"icon": "reicon:it/terminal-square",
"input": {
"summary": {
"path": "/connection",
"format": "connection",
"result_path": "/connection_name"
},
"content": {
"path": "/path",
"code": true
},
"target": {
"path": "/path"
}
},
"output": {
"preview": {
"parts": [
{
"value": {
"source": "arguments",
"path": "/direction"
}
},
{
"text": "\npath: "
},
{
"value": {
"source": "arguments",
"path": "/path"
}
},
{
"text": "\nremote_path: "
},
{
"value": {
"source": "arguments",
"path": "/remote_path"
}
},
{
"text": "\nbytes: ",
"when": {
"all": [
{
"value": {
"source": "result",
"path": "/data/bytes"
},
"equals": null,
"negate": true
}
]
}
},
{
"value": {
"source": "result",
"path": "/data/bytes"
}
},
{
"text": "\nfingerprint: ",
"when": {
"all": [
{
"value": {
"source": "result",
"path": "/data/key/fingerprint"
},
"equals": null,
"negate": true
}
]
}
},
{
"value": {
"source": "result",
"path": "/data/key/fingerprint"
}
}
]
}
}
}
},
{
"name": "ssh_connections",
"presentation": "summary",
"description": "List saved SSH connections available to this session, including IDs and revisions. Passwords, private keys and passphrases are never returned.",
"contexts": [
"workspace",
"ssh"
],
"handler": {
"name": "connections",
"operation": "ssh.connections",
"parameters": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}
},
"display": {
"label": "SSH connections",
"locales": {
"zh-CN": "SSH 连接",
"zh-TW": "SSH 連線",
"ja": "SSH 接続",
"ko": "SSH 연결",
"fr": "Connexions SSH",
"de": "SSH-Verbindungen",
"es": "Conexiones SSH",
"pt-BR": "Conexões SSH",
"ru": "Подключения SSH",
"en": "SSH connections"
},
"icon": "reicon:it/terminal-square"
}
},
{
"name": "ssh_save_connection",
"presentation": "details",
"description": "Create or update an SSH connection under the session permission policy. Create requires name, host, port, username and authentication: password, private_key, key_path or agent. Supply credentials only for the requested save; key paths must be absolute on the execution Node. Update requires connection and expected_revision from ssh_connections. Omitted credentials remain unchanged; a supplied credential replaces them, and an omitted passphrase clears the replacement's passphrase. Do not echo credentials or supply host keys. Use the returned ID for SSH tools in this turn. First use requires runtime host-fingerprint approval. Do not automatically repeat a denied or uncertain save.",
"contexts": [
"workspace",
"ssh"
],
"handler": {
"name": "save",
"operation": "ssh.save",
"result": "saved",
"parameters": {
"type": "object",
"additionalProperties": false,
"required": [],
"properties": {
"connection": {
"type": [
"string",
"null"
],
"pattern": "^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$",
"description": "Saved connection ID; omit with expected_revision to create"
},
"expected_revision": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 9007199254740991
},
"name": {
"type": "string",
"minLength": 1
},
"host": {
"type": "string",
"minLength": 1
},
"port": {
"type": "integer",
"minimum": 1,
"maximum": 65535
},
"username": {
"type": "string",
"minLength": 1
},
"authentication": {
"type": "string",
"enum": [
"password",
"private_key",
"key_path",
"agent"
]
},
"credential": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"const": "password"
},
"password": {
"type": "string"
}
},
"required": [
"kind",
"password"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"const": "private_key"
},
"key": {
"type": "string"
},
"passphrase": {
"type": [
"string",
"null"
]
}
},
"required": [
"kind",
"key"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"const": "key_path"
},
"path": {
"type": "string"
},
"passphrase": {
"type": [
"string",
"null"
]
}
},
"required": [
"kind",
"path"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"const": "agent"
}
},
"required": [
"kind"
],
"additionalProperties": false
}
]
},
"key_path": {
"type": "string",
"minLength": 1,
"description": "Path to an existing private key on the execution Node; never its contents"
}
},
"allOf": [
{
"if": {
"required": [
"connection"
],
"properties": {
"connection": {
"type": "string"
}
}
},
"then": {
"required": [
"expected_revision"
],
"properties": {
"expected_revision": {
"type": "integer"
}
}
},
"else": {
"required": [
"name",
"host",
"port",
"username",
"authentication"
],
"properties": {
"expected_revision": {
"type": "null"
}
},
"allOf": [
{
"if": {
"properties": {
"authentication": {
"enum": [
"password",
"private_key"
]
}
}
},
"then": {
"required": [
"credential"
]
}
},
{
"if": {
"properties": {
"authentication": {
"const": "key_path"
}
}
},
"then": {
"anyOf": [
{
"required": [
"credential"
]
},
{
"required": [
"key_path"
]
}
]
}
}
]
}
}
]
}
},
"display": {
"label": "Save SSH connection",
"locales": {
"zh-CN": "保存 SSH 连接",
"zh-TW": "儲存 SSH 連線",
"ja": "SSH 接続を保存",
"ko": "SSH 연결 저장",
"fr": "Enregistrer la connexion SSH",
"de": "SSH-Verbindung speichern",
"es": "Guardar conexión SSH",
"pt-BR": "Salvar conexão SSH",
"ru": "Сохранить подключение SSH",
"en": "Save SSH connection"
},
"icon": "reicon:it/terminal-square",
"input": {
"summary": {
"path": "/name",
"result_path": "/data/name"
}
},
"output": {
"preview": {
"parts": [
{
"value": {
"source": "result",
"path": "/data/name"
}
},
{
"text": "\n"
},
{
"value": {
"source": "result",
"path": "/data/username"
}
},
{
"text": "@"
},
{
"value": {
"source": "result",
"path": "/data/host"
}
},
{
"text": ":"
},
{
"value": {
"source": "result",
"path": "/data/port"
}
},
{
"text": "\n"
},
{
"value": {
"source": "result",
"path": "/data/authentication"
}
}
]
}
}
}
}
],
"desktop": {
"entry": "dev.sailry.platform/desktop/main.js",
"resources": [
"dev.sailry.platform/desktop/main.js",
"dev.sailry.platform/desktop/view.js",
"dev.sailry.platform/desktop/editor-view.js",
"dev.sailry.platform/desktop/editor.js",
"dev.sailry.platform/desktop/files.js",
"dev.sailry.platform/desktop/requests.js",
"dev.sailry.platform/desktop/mutations.js",
"dev.sailry.platform/desktop/locales.js"
],
"navigation": {
"label": "SSH",
"locales": {
"zh-CN": "SSH"
},
"icon": "reicon:it/terminal-square"
},
"navigation_options": {
"pinned": true,
"order": 700,
"target": "node",
"details": true
},
"conversations": [
{
"id": "ssh",
"resource": "ssh",
"tools": [
{
"kind": "plugin",
"name": "ssh_run"
},
{
"kind": "plugin",
"name": "ssh_transfer"
},
{
"kind": "plugin",
"name": "ssh_connections"
},
{
"kind": "plugin",
"name": "ssh_save_connection"
}
],
"context": "You are the SSH workspace assistant. Work only on the saved SSH connection exposed by your tools. Help inspect the remote system, diagnose issues, run requested commands, and transfer files. Establish the remote OS, working directory, and relevant state before choosing commands; do not assume they match the desktop. Use ssh_run for commands and ssh_transfer for transfers. Local transfer paths are relative to this session's project worktree, while remote paths belong to the SSH host. The runtime applies the session permission policy to each command and transfer: invoke the actual tool without asking for redundant permission in chat. Keep commands focused, bound output, and prefer inspection before changes. Clarify ambiguous targets with ask_user. Never bypass host-key verification, access another connection, or claim a transfer succeeded without tool evidence. Do not automatically repeat interrupted or uncertain commands. Explain results concisely in the user's language. Use compact only to manage conversation context. Use ssh_connections to inspect saved public profiles and their revisions. When asked to add or edit a connection, use ssh_save_connection with the chosen authentication and explicitly supplied credentials. Omit credentials to retain them; never read or echo saved credentials. Use the returned ID in this turn; the user must confirm the exact first host fingerprint through the runtime approval. Never provide or auto-trust a host key."
}
]
},
"instructions": "Use ssh_connections to inspect saved public profiles and their revisions. When asked to add or edit a connection, use ssh_save_connection with the chosen authentication and explicitly supplied credentials. Omit credentials to retain them; never read or echo saved credentials. Use the returned ID in this turn; the user must confirm the exact first host fingerprint through the runtime approval. Never provide or auto-trust a host key.",
"category": "development",
"tint": "blue"
}
}
}
What else this package ships
These files come with the package and this site does not publish them. They are listed so you know what is there before you install it.
- 11JavaScript files
- NOTICE
Client extensions
Data this package carries for particular clients. The directory lists the clients named and never reads what is addressed to them.
- dev.sailry.platformships a directory of files