Commit Graph
163 Commits
Author SHA1 Message Date
LukeGus cfab6f764c feat: plugin docs and env manifest fields, in-app docs links, SDK 1.0.3 2026-10-08 00:34:50 -05:00
LukeGus c3624cdf62 fix: refuse sessionless tokens and keep the secrets file owner only 2026-10-07 21:20:03 -05:00
LukeGus 740d2adaf3 fix: keep global settings out of non-admin data exports (GHSA-v3vp-ffww-q7pw) 2026-10-07 21:18:08 -05:00
LukeGus 8a45d952fd fix: trust devices by a server-issued token, not a client header (GHSA-6gr3-r7jx-wfmh) 2026-10-07 21:17:07 -05:00
LukeGus ad3a18224f fix: lock the desktop backend to the app's own origin (GHSA-frx8-qqgg-7j7g) 2026-10-07 21:14:34 -05:00
LukeGus ea678c5602 fix: import sshpk as a default so the backend starts under ESM 2026-10-07 19:16:15 -05:00
LukeGus fbf7598399 fix: refresh cached plugin translations when only a translation changes (Support#1411) 2026-10-07 16:59:50 -05:00
LukeGus 18a594a92d fix: start the macOS local terminal when the shell or spawn helper is broken (Support#1418) 2026-10-07 16:56:52 -05:00
LukeGus 679b61da9b fix: add missing sync ids to old snippet tables so snippets sync again (Support#1419) 2026-10-07 16:55:38 -05:00
LukeGus db8305e393 fix: keep client tunnels open when one of their connections fails (Support#1417) 2026-10-07 16:50:07 -05:00
LukeGus 1466c7bcab fix: ask for a push/TOTP menu choice as text instead of a push confirm 2026-10-07 16:40:18 -05:00
ZacharyZcR 42c5682243 fix(hosts): display protocol credential usernames for non-SSH hosts (#1572) 2026-10-07 16:37:58 -05:00
ZacharyZcR 9c31dd41c7 fix(ssh): normalize PKCS8 private keys before connecting (#1570) 2026-10-07 16:37:50 -05:00
ZacharyZcR f412a28bb8 fix(sync): resolve shared hosts for connect-only recipients (#1568) 2026-10-07 16:37:41 -05:00
LukeGus f73c4b5ad6 feat: beta channels for core and plugins with one stable/beta release workflow 2026-10-07 16:25:58 -05:00
LukeGus 27819c477c fix: retry failed or blocked plugins on restart instead of leaving them disabled 2026-10-06 23:08:10 -05:00
LukeGus b6bb3ffc73 feat: show plugin features from the manifest on the plugin page 2026-10-06 22:38:13 -05:00
LukeGus 9bc2be721b feat: changelog.md release notes, v tags, plugin release notes and videos 2026-10-06 18:13:39 -05:00
LukeGus b9dd3488a5 feat: full screen onboarding with a plugin picker and per step versions 2026-10-06 17:44:25 -05:00
LukeGus ec80a8ef8d feat: dev:all runner for web, electron and docker with plugin hot reload, termix-plugin dev 2026-10-06 15:55:00 -05:00
LukeGus 08db1fcdde feat: consent check, developer mode file installs, install counts and issue links for plugins 2026-10-06 14:30:56 -05:00
LukeGus 58c3434e58 feat: shared list kit, settings search, rail order and ui consistency fixes 2026-10-06 13:02:05 -05:00
LukeGus 3ed5775ed5 feat: implement plugin management UI 2026-10-06 10:35:56 -05:00
LukeGus 853615af09 fix: stop full database rewrites on every plugin db call 2026-10-05 20:10:09 -05:00
LukeGus 5e54d95e71 fix: harden plugin sockets, public routes, prebuilt binaries and login fallback 2026-10-05 19:50:19 -05:00
LukeGus e608505b39 chore: rename the plugin sdk to @termix-ssh/plugin-sdk 2026-10-05 18:23:03 -05:00
LukeGus 61f46d2517 feat: drop the 2.8 columns, moves and aliases kept for a downgrade 2026-10-05 10:21:11 -05:00
LukeGus e02b5fe6e4 chore: move plugins to their own repos and drop the plugins folder 2026-10-04 22:40:06 -05:00
LukeGus 6b91c3a460 Merge branch 'dev-2.9.1' into dev-26.10.0
# Conflicts:
#	package-lock.json
#	package.json
#	plugins/ai/locales/translated/af_ZA.json
#	plugins/ai/locales/translated/ar_SA.json
#	plugins/ai/locales/translated/bg_BG.json
#	plugins/ai/locales/translated/bn_BD.json
#	plugins/ai/locales/translated/ca_ES.json
#	plugins/ai/locales/translated/cs_CZ.json
#	plugins/ai/locales/translated/da_DK.json
#	plugins/ai/locales/translated/de_DE.json
#	plugins/ai/locales/translated/el_GR.json
#	plugins/ai/locales/translated/es_ES.json
#	plugins/ai/locales/translated/fi_FI.json
#	plugins/ai/locales/translated/fr_FR.json
#	plugins/ai/locales/translated/he_IL.json
#	plugins/ai/locales/translated/hi_IN.json
#	plugins/ai/locales/translated/hu_HU.json
#	plugins/ai/locales/translated/id_ID.json
#	plugins/ai/locales/translated/it_IT.json
#	plugins/ai/locales/translated/ja_JP.json
#	plugins/ai/locales/translated/ko_KR.json
#	plugins/ai/locales/translated/nl_NL.json
#	plugins/ai/locales/translated/no_NO.json
#	plugins/ai/locales/translated/pl_PL.json
#	plugins/ai/locales/translated/pt_BR.json
#	plugins/ai/locales/translated/pt_PT.json
#	plugins/ai/locales/translated/ro_RO.json
#	plugins/ai/locales/translated/ru_RU.json
#	plugins/ai/locales/translated/sr_SP.json
#	plugins/ai/locales/translated/sv_SE.json
#	plugins/ai/locales/translated/th_TH.json
#	plugins/ai/locales/translated/tr_TR.json
#	plugins/ai/locales/translated/uk_UA.json
#	plugins/ai/locales/translated/vi_VN.json
#	plugins/ai/locales/translated/zh_TW.json
2026-10-04 17:34:09 -05:00
LukeGus 0a436ab3d8 fix: simplify host status to online/offline and keep it live without a refresh 2026-10-04 14:18:50 -05:00
LukeGus 2646b649d7 fix: remote desktop logins missing from shared hosts on desktop 2026-10-04 13:55:55 -05:00
LukeGus 08e1eea2f3 fix: tunnels and host settings missing from shared hosts on desktop 2026-10-04 13:54:09 -05:00
ZacharyZcR abbfca2e94 fix(audit): store plugin entries with no acting user as a null user_id (#1556)
Plugin audit entries written outside a request used the literal "system"
as user_id. That column references users.id, so the insert was refused
(Postgres logs it as an FK violation) and the entry was silently dropped.
Write null instead and keep "system" / plugin:<id> in username.
2026-10-04 18:40:13 +08:00
LukeGus e489d804f9 Merge branch 'dev-2.9.1' into dev-26.10.0 2026-10-03 16:36:59 -05:00
LukeGus b3e220acf1 fix: host key silently accepted when the host is missing from the database (#1397) 2026-10-03 16:35:09 -05:00
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
LukeGus 77bcbdb3d6 chore: merge dev-2.9.1 into dev-26.10.0 2026-10-03 16:01:42 -05:00
LukeGus 7156ac1af3 fix: add openapi docs and error handling to host tag routes 2026-10-03 15:45:41 -05:00
LukeGus b03000e396 fix: op:// secret references rejected as ssh keys on credentials (#1394) 2026-10-03 15:41:44 -05:00
LukeGus 86840f7642 fix: user data export freezing the server (#1393) 2026-10-03 15:38:31 -05:00
LukeGus 79bd10a1b0 fix: high cpu from status probes and full database saves on every sample (#1300) 2026-10-03 15:37:11 -05:00
LukeGus 11a22d30eb fix: host imports running a defaults pass and metrics restart per host (#1384) 2026-10-03 15:37:07 -05:00
LukeGus 6f442c5863 fix: plugins losing the saved ssh login when copying a host (#1391) 2026-10-03 15:31:01 -05:00
LukeGus d433718c35 fix: 2.8 oidc accounts unable to sign in after upgrading (#1381) 2026-10-03 15:27:15 -05:00
ZacharyZcR 13f5736d8f test(database): advance fake timers past the save yield (#1555) 2026-10-03 21:28:28 +08:00
ZacharyZcR b00551c394 feat(hosts): add instance-wide predefined tag suggestions (#1548)
* feat(hosts): add shared predefined tag suggestions

* style(hosts): format tag catalog routes
2026-10-03 21:04:50 +08:00
ZacharyZcR 94a9f815c9 fix(database): batch database saves for bulk host writes (#1554)
* fix(database): yield to the event loop between database saves

Each SQLite save serializes and encrypts the whole database into new
buffers, which V8 only releases once the event loop turns. Boot
migrations and bulk host import write plugin settings per host and per
key in an awaited loop, so hundreds of full copies piled up and the
container ran out of memory.

* fix(database): save once per bulk host write instead of once per row

On SQLite every repository write force-saves the whole database. Boot
plugin data migrations, host defaults materialization and the bulk
host routes write one row per host per setting, so they serialized and
encrypted the full database hundreds of times in a row.

DatabaseSaveTrigger.batched wraps a function so force saves made while
it runs collapse into a single save when it finishes. Nested scopes fold
into the outer one, and work that outlives its scope saves normally.
2026-10-03 21:04:33 +08:00
ZacharyZcR 59083aac00 fix(ssh): read force keyboard-interactive as a boolean when resolving hosts (#1553)
The column holds the text "true"/"false", and the resolver passed it
through as-is. The string "false" is truthy, so the password provider
treated every saved host as forced keyboard-interactive and left the
password out. Jump hops are built straight from the resolved host, so a
password hop whose server doesn't offer keyboard-interactive failed with
"All configured authentication methods failed".
2026-10-03 21:04:21 +08:00
ZacharyZcR ab7a68aa84 fix(desktop): ship the plugin SDK inside Mac App Store builds (#1551) 2026-10-03 21:03:47 +08:00
ZacharyZcR 7b2198e18c fix(auth): reject unresolved legacy identity provisioning (#1550) 2026-10-03 21:03:31 +08:00