Files
Termix/plugins/ai/manifest.json
T
ZacharyZcR bf817d8bd1 feat(ai): add remote coding agent sessions for SSH hosts (#1545)
* feat(ai): add host coding agent sessions with configured providers

* Wait for agent initialization and shutdown before resuming sessions

* Keep Pi transcripts outside its configuration migration directory

* Cover Pi session directory separation

* Update core permission catalog expectations for remote agents

* Install remote agent runtimes from verified official sources

* Wait for the identity panel credentials request in its test

* Add scoped SSH forwarding setup for remote agents

* Verify forwarding setup through a fresh SSH connection

* Bound the SSH forwarding verification timeout

* Return the forwarding verification callback result

* fix(ai): support agent send and interrupt keyboard shortcuts

* feat(ai): add agent queues attachments worktrees and session recovery

* fix(ai): handle deleted workspace paths and duplicate status events

* fix(ai): accept file references in root workspaces

* fix(ai): refresh paused queues after agent errors

* fix(ai): store agent sessions in plugin tables and lock down OpenCode

Agent sessions lived in a single ctx.kv value holding up to 2000 events,
which passed the 256 KB kv limit within minutes of a normal run. Every
save after that failed, so history, nativeId, queue and archive changes
were lost and every event wrote a kv audit row.

Sessions, events and queued prompts now have their own tables. A running
agent appends events in batches at most once a second with a lazy save;
session and queue changes save immediately. Prompts, drafts and stored
event text are capped in UTF-8 bytes to fit MySQL TEXT. kv:own is no
longer requested.

The OpenCode server now requires a per-session password, so other local
accounts on the host cannot drive the agent through its loopback port.

* test(upgrade): include agent session tables in the reviewed upgrade SQL
2026-10-03 16:01:47 -05:00

208 lines
5.3 KiB
JSON

{
"id": "ai",
"name": "AI Assistant",
"version": "1.0.0",
"description": "An AI assistant that can read your hosts, snippets, fleets, alerts and automations, and suggest changes for you to approve.",
"author": {
"name": "Termix"
},
"license": "MIT",
"repository": "https://github.com/Termix-SSH/Termix",
"category": "Productivity",
"icon": "Sparkles",
"engine": {
"termix": ">=2.9.0",
"api": "1"
},
"capabilities": [
"hosts:read",
"hosts:write",
"credentials:use",
"ssh:connect",
"db:own",
"secrets:own",
"network:outbound",
"notify:send",
"network:serve",
"ui:surface",
"users:impersonate",
"events:core"
],
"optionalDependencies": {
"workspaces": "^1.0.0",
"network-topology": "^1.0.0",
"snippets": "^1.0.0",
"fleets": "^1.0.0",
"ssh-terminal": "^1.0.0",
"automations": "^1.0.0",
"homepage": "^1.0.0"
},
"requires": [
{
"service": "workspaces.saved",
"versionRange": "^1.0.0",
"optional": true
},
{
"service": "network-topology.graph",
"versionRange": "^1.0.0",
"optional": true
},
{
"service": "snippets.access",
"versionRange": "^1.0.0",
"optional": true
},
{
"service": "fleets.access",
"versionRange": "^1.0.0",
"optional": true
},
{
"service": "terminal.history",
"versionRange": "^1.0.0",
"optional": true
},
{
"service": "automations.access",
"versionRange": "^1.0.0",
"optional": true
},
{
"service": "homepage.items",
"versionRange": "^1.0.0",
"optional": true
}
],
"providesSecret": [
{
"key": "api-key",
"permission": "ai.secrets.share",
"descriptionKey": "ai.secrets.shareApiKey"
}
],
"contributes": {
"tabs": [
{
"id": "ai",
"titleKey": "nav.ai",
"icon": "Sparkles",
"openFrom": ["rail", "palette"]
},
{
"id": "ai-agents",
"titleKey": "agents.title",
"icon": "Bot",
"openFrom": ["host-context-menu", "palette"]
}
],
"actions": [
{
"id": "ai.openWithContext",
"titleKey": "ai.assistant",
"handler": "openWithContext",
"icon": "Bot",
"permission": "ai.services.use",
"slot": "terminal.toolbar",
"kind": "button"
}
],
"permissions": [
{
"name": "use",
"titleKey": "permissions.use.title",
"descriptionKey": "permissions.use.description",
"defaultRoles": ["user"]
},
{
"name": "manage_providers",
"titleKey": "permissions.manage_providers.title",
"descriptionKey": "permissions.manage_providers.description",
"defaultRoles": ["user"]
},
{
"name": "apply_proposals",
"titleKey": "permissions.apply_proposals.title",
"descriptionKey": "permissions.apply_proposals.description",
"defaultRoles": ["user"]
},
{
"name": "services.use",
"titleKey": "permissions.services.use.title",
"descriptionKey": "permissions.services.use.description",
"defaultRoles": ["user"]
},
{
"name": "secrets.share",
"titleKey": "permissions.secrets.share.title",
"descriptionKey": "permissions.secrets.share.description",
"defaultRoles": ["user"]
},
{
"name": "agents",
"titleKey": "agents.permissionTitle",
"descriptionKey": "agents.permissionDescription",
"defaultRoles": ["admin"]
}
],
"settings": {
"admin": [
{
"key": "globallyEnabled",
"type": "boolean",
"labelKey": "settings.admin.globallyEnabled.label",
"descriptionKey": "settings.admin.globallyEnabled.description",
"default": false
},
{
"key": "privateEndpoints",
"type": "textarea",
"labelKey": "settings.admin.privateEndpoints.label",
"descriptionKey": "settings.admin.privateEndpoints.description",
"requires": "globallyEnabled",
"default": "localhost\n127.0.0.1\n::1\nhost.docker.internal"
}
],
"user": [
{
"key": "enabled",
"type": "boolean",
"labelKey": "ai.enableTitle",
"descriptionKey": "ai.enableDescription",
"default": false
},
{
"key": "allowReadOnlyCommands",
"type": "boolean",
"labelKey": "ai.readOnlyCommands",
"descriptionKey": "ai.readOnlyCommandsDescription",
"requires": "enabled",
"default": false
},
{
"key": "providers",
"type": "custom",
"component": "providers",
"permission": "manage_providers"
}
],
"host": {
"editorGroup": "ssh",
"editorOrder": 90,
"fields": [
{
"key": "enableAiAssistant",
"type": "boolean",
"labelKey": "settings.host.enableAiAssistant.label",
"descriptionKey": "settings.host.enableAiAssistant.description",
"default": false
}
]
}
},
"uses": ["terminal.sidePanel", "terminal.toolbar"]
},
"locales": "locales",
"platforms": ["linux", "win32", "darwin"]
}