mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-28 06:05:24 +00:00
19 KiB
19 KiB
Finish list
Running list of things intentionally left unfinished by a Phase B/C step, so D0 (or an earlier owner named below) can pick them up. Remove a line once it's done.
- B3 (tailscale):
ManagerCardShell/ManagerSearch-equivalent presentation is duplicated asTailscaleManagerShell/TailscaleManagerSearchinplugins/tailscale/src/frontend/TailscaleManagerShell.tsxrather than shared with host-metrics's originals. Promote a shared version into@termix/plugin-sdk/uionce a second manager-card plugin needs one, per the contract's "add to the SDK when a second plugin needs it" rule. Owner: D1. - B3 (tailscale):
plugins/tailscale/src/backend/host-metrics-manager.tsandroutes.tsstill resolve hosts and access through core'sPermissionManager/resolveHostById/DataCryptoby relative import instead ofctx.hosts, which B4 built. Same debt every other host-metrics manager already carries; not new, but tailscale now carries it too. Owner: host-metrics's own Phase B step (it and every manager plugin convert together). - B4 (fleets/host-metrics):
src/backend/hosts/metrics-shared/(platform detection, package commands, exec-elevated) is still core's own copy, used by host-metrics, which has not converted yet.@termix/plugin-sdk/host-commandsis the SDK copy fleets now uses; core's copy was left in place rather than turned into a re-export, since host-metrics's own conversion step is where its imports should move wholesale. Owner: host-metrics's Phase B step. - B5 (proxmox):
runAdaptivePollingandcnare duplicated inplugins/proxmox/src/frontend/stats/rather than shared with core'ssrc/ui/lib/originals.useConnectionRetry(the third duplicate B5 left here) is resolved: B6 promoted it into@termix/plugin-sdk/frontendonce file-manager became its fourth caller (after proxmox, docker, host-metrics, remote-desktop) and switched proxmox's own copy over too. host-metrics's own conversion needsrunAdaptivePollingfor its stats tab, so promote it into@termix/plugin-sdk/frontend(andcninto@termix/plugin-sdk/ui) the next time either is touched. Owner: D1, or host-metrics's Phase B step if it lands first. - B5 (proxmox):
runDueProxmoxAutoSyncsinplugins/proxmox/src/backend/routes.tsstill reachescreateCurrentPluginSettingsRepository/createCurrentHostRepositoryby relative import instead ofctx, because it needs to scan every host's Proxmox settings across every user before it knows which actor to run each sync as, and neitherctx.settingsnorctx.hostsexpose a cross-user bulk read today. Actx.settings.listHostsWithKeyor similar SDK addition would close this, if a second plugin's background scan ever needs the same shape. Owner: D1. - B6 (file-manager):
plugins/file-manager/src/frontend/components/PdfPreview.tsxruns pdfjs without a worker (main-thread parsing) becausetermix-plugin build's esbuild step has no static-asset-copy pipeline the way core's Vite build resolves a?urlimport to a hashed/assets/file. Fine for the small files this preview usually opens; restoring a real worker needs the CLI (packages/plugin-sdk/cli/commands/build.mjs) to gain a way to emit an extra file intodist/and have the frontend reference it by its served/plugin-assets/<id>/path. Owner: D1, or whichever step first needs a worker or other static asset from a plugin bundle. - B6 (file-manager):
transfer-tuning.ts's adaptive-tuning profile still persists to a JSON file underDATA_DIRrather thanctx.kv, andHostFilesTab.tsx'st()calls plus the manifest'scontributes.settings.hostlabelKeys deliberately point at two different key paths (hosts.*andsettings.host.*) for the same three fields, both carrying the same English text - a minor duplication from keeping the host editor's exact existing section verbatim (registerHostEditorSection) instead of switching it to the schema-driven settings form. Neither blocks anything; flagging for whoever next touches this plugin's settings UI. - B6 (file-manager):
TabContext.tsx'scomputeUniqueTitlecomparestabType === "file_manager"(an activity-log type string, not a tab type - the real tab type has always been"files"), so that branch has never matched and silently falls through to the terminal title. Pre-existing, unrelated to the conversion; noted rather than fixed per the lean-mode rules. Owner: whoever next touches tab title logic. - B6 (file-manager):
enable_file_manager,default_pathandscp_legacyare still livessh_datacolumns; only the copy-into-plugin- settings migration shipped (file-manager-settings-migration.ts). Every core read site the earlier exploration found (host.ts,host-normalizers.ts,host-bulk-routes.ts,credentials.ts,host-internal-routes.ts,database.ts's encrypt/decrypt round trip,plugins/host-view.ts,ctx-hosts.ts, plus the frontend'sHostEditorData.ts/HostManagerData.ts/SidebarTree.tsx/quick-connect mapping) still reads the column directly rather thanctx.settings.getHost. Switching every one of those and then dropping the column in lockstep (schema.ts,db/index.ts, a drizzle migration per dialect,schema:generate) is real, separate work this step didn't attempt, since none of those reads block the plugin conversion itself. Owner: a dedicated follow-up step, or D0. - B7 (tunnels):
enable_tunnelandtunnel_connectionsare still livessh_datacolumns; only the copy-into-plugin-settings migration shipped (tunnels-settings-migration.ts), and the plugin reads its host settings now. Core still carries the columns through the host routes, the encrypt/decrypt round trip,SidebarTree.tsx's host duplicate payload, the quick-connect mapping and theHost/SSHHosttypes, none of which the plugin reads any more. Dropping them in lockstep (schema.ts,db/index.ts, a drizzle migration per dialect,schema:generate) is the same follow-up the B6 file-manager line above describes. Owner: a dedicated follow-up step, or D0. - B7 (tunnels): host export/import, host duplicate, the Hosts panel
feature filter and the bulk enable/disable menu all work off
ssh_datacolumns, so none of them can see a plugin's host settings. For tunnels the "Tunnel" filter and the bulk enable/disable entries were removed, and the export's "Tunnels" group became "Proxy" (SOCKS5 fields only) sincetunnelConnectionsthere is now stale. Bringing these back needs a way for core to read and write host-scope plugin settings generically (keyed offcontributes.settings.hostorhostCapability) rather than per column. Owner: D1. - B7 (tunnels): the tunnel tab no longer writes a recent-activity entry:
logActivityis a core@/main-axioscall and the plugin imports nothing from@/. Old "tunnel" entries still reopen the tab through the plugin'sactivityTypes. Anapp.logActivity(or equivalent bridge member) would restore it for this plugin and let docker, file-manager and host-metrics drop their own@/main-axiosimport for it too. Owner: D1. - B7 (tunnels): on the desktop app, tunnel statuses from a connected
remote server are no longer merged into the tab: the old code polled the
remote tunnel service through
getRemoteTunnelApi(), and the SDK has no remote-origin plugin API client.subscribeTunnelStatusesalready takes afetchRemoteand merges with local statuses winning, so it only needs a client for/plugin-api/tunnels/statuson the remote server. Owner: D1. - B8 (web-endpoint):
enable_web_uiandweb_ui_configare still livessh_datacolumns; only the copy-into-plugin-settings migration shipped (web-endpoint-settings-migration.ts). Unlike B6/B7, this step DID convert every core read/write of those two fields (host.ts's create/update and export routes,host-normalizers.ts,host-bulk-routes.ts,database.ts's encrypt/decrypt round trip is the one exception - it copies whatever is already in the column for the raw DB export/backup tool, which needs no change since nothing reads that copy throughpluginSettings). Dropping the columns in lockstep (schema.ts,db/index.ts, a drizzle migration per dialect,schema:generate) is the only remaining piece. Owner: a dedicated follow-up step, or D0. - B8 (web-endpoint): added the first generic cross-plugin hook for core
routes that touch host-scope plugin settings without importing a plugin:
ctx.registry.provide("<id>.hostImportNormalizer", fn)plusapplyPluginHostImportSettingsinhost-plugin-settings.ts, called fromhost-bulk-routes.ts's Termix-JSON import path. Only import validation is covered; B7's TODO above about the Hosts panel feature filter and the bulk enable/disable menu (hostCapability-driven, not import-driven) is unrelated and still open. Owner: D1 for extending the same pattern there. - B8 (web-endpoint): noticed while sanity-checking with
npm run lint(not required by this step):eslint.config.mjs'sglobalIgnores(["dist", ...])only matches a top-leveldist/folder, not nestedpackages/*/distorplugins/*/dist, sonpm run lintfails on bundled output repo-wide with "Definition for rule X was not found" errors. Pre-existing, not introduced by this or any single plugin step. Owner: whoever next needs a cleannpm run lint, or D0. - B8 (web-endpoint): the isolated-window Electron IPC bridge
(
src/backend/utils/electron-ipc-bridge.ts,ctx.desktop.openIsolatedWindow) is a single request/response channel keyed by a random id with one registered backend-request handler (open-isolated-window) inelectron/main.cjs. Fine for today's one caller; if a second plugin needs to ask Electron's main process for something, extendBACKEND_REQUEST_HANDLERSthere rather than building a parallel channel. No owner needed unless a second caller appears. - B9 (ssh-terminal): session sharing has no provider yet. The terminal
consumes
sessions.sharingv1 (member joins throughauthorizeJoinandrecordJoin, collab room events throughsubscribeRoom/unsubscribeRoom) and reads guest link resolution fromctx.registryassessions.sharing.guests(resolve,recordJoin), all typed inplugins/ssh-terminal/src/backend/services.ts. Until something provides them, share-link and room guests are refused and in-app joins fail. Core's session-sharing, collab and open-tabs code reach the terminal throughsessions.livealready. Owner: B12, which provides both from the session-sharing plugin (the lookups are the old code inhosts/session-sharingandhosts/collab: share repo, room repo, guest rate limit,canJoinRoomStageShare,session_sharing_globally_enabled, hostallowSessionSharing,getAuditUsernamefor labels,collabRoomHub). B12 also moveseventsWsPathincollab/routes.tsand the share dialog the shell opens from a tab'sgetShareTarget(). - B9 (ssh-terminal), for D2: the terminal socket is a public route with
optionalAuth, because share-link and room guests authenticate inside the handler with their token. Guest auth itself is unchanged; review it with the rest of the public routes. - B9 (ssh-terminal): recording has no provider yet. The terminal calls the
optional
recordings.writerv1open(meta)and gets a sink withappend(chunk)(one call per 300 ms batch, the first starting with the asciicast header),persist(summary)anddiscard(). Without it nothing is recorded and nosession_recordingsrow is written. Owner: B13, which writes the file underDATA_DIR/session_logs/<user>/<session>.cast(mkdir and writeFile on the first append, appendFile after, never per chunk, see issue #1049) and creates or updates the row as the old session manager did. - B9 (ssh-terminal):
enable_terminal,enable_terminal_toolbarandenable_command_historyare still livessh_datacolumns. The copy into ssh-terminal host settings shipped (ssh-terminal-settings-migration.ts) and the terminal reads its settings, but core host routes, types, the export/import sample andHostEditorDatastill carry the columns.enable_terminal_toolbaralso drives the RDP/VNC/Telnet toolbar (remote-desktop/GuacamoleApp.tsx), whose host editor switch stays in the General tab, so remote-desktop needs its own host setting and copy first. Then drop all three in lockstep. Owner: remote-desktop's step for its copy, then D0. - B9 (ssh-terminal): the legacy
settingsrows for the terminal (terminal_session_timeout_minutes,terminal_session_persistence_enabled,command_history_enabled,touch_input_settings,terminal_image_*) are left in place for a release after the move; nothing reads them. Delete them in 3.0.0.sessionPersistenceis carried over but, as before, nothing acts on it. Owner: D0 to decide. - B9 (ssh-terminal): the image storage paths used to be rejected at save when not absolute; the schema-driven settings form accepts any string and the resolver ignores a bad one with a warning. A custom field or a validate hook on plugin settings would restore the save-time error. Owner: D1.
- B9 (ssh-terminal):
@termix/plugin-sdk/uinow re-exports a handful of core APIs the terminal needs (logActivity,getHostPassword,patchOpenTab,getUserPreferences,parseCustomKeybindings,setHostAutoTmux,getCookie) and the connection helpers. They belong on the typed host bridge, which is also where B7'sapp.logActivityline above lands. Owner: D1. - B9 (ssh-terminal):
OPKSSHDialogis exported from@termix/plugin-sdk/uiso the terminal can show the opkssh sign-in. It leaves the ui entry when opkssh becomes a plugin that draws its own UI interminal.overlay. Owner: Phase C (opkssh). - B9 (host-metrics): the terminal toolbar's CPU/memory/disk bars
(
TerminalMetricsStatus) poll the local backend only; on the desktop app a host that lives on a connected remote server shows no bars. Same fix as the B7 remote-origin line above. Owner: D1. - B9: the Hosts panel's "Terminal" feature filter was removed along with the column reads, the same as B7's tunnel filter. Owner: D1, with the generic host-settings filter.
- B9: the startup purge of expired open tabs in
db/index.tsreadterminal_session_timeout_minutesfrom core settings; it was removed and expired tabs are dropped when the tab list is read, against the terminal's own timeout (GET /open-tabs/session-timeout, 30 while the terminal is off). No owner unless the table growth matters. - Pre-existing (B8), found in B9:
node scripts/check-shell-plugin-ids.cjsfails onsrc/ui/lib/host-to-ssh-host.tsspellingweb-endpoint(thepluginSettingslookup B8 added). Not allowlisted and not introduced here. Owner: D0 (read it through a registry or allowlist it with a reason). - B10 (tmux-monitor):
enable_tmux_monitoris still a livessh_datacolumn; only the copy-into-plugin-settings migration shipped (tmux-monitor-settings-migration.ts), the same as B6/B7's own columns. Every core read site (host.ts,host-normalizers.ts,host-bulk-routes.ts,database.ts's encrypt/decrypt round trip) still reads the column directly. Dropping it in lockstep (schema.ts,db/index.ts, a drizzle migration per dialect,schema:generate) is the same follow-up the B6/B7/B8 lines above describe. Owner: a dedicated follow-up step, or D0. - B10 (tmux-monitor):
terminalToolbar.openTmuxMonitorandterminalToolbar.tmuxDetachare dead locale keys (nothing callst("terminalToolbar.openTmuxMonitor")ort("terminalToolbar.tmuxDetach")anywhere in the tree; the terminal's own live detach button usesterminalToolbar.detachTmux/detachTmuxDescriptioninstead). Pre-existing, not introduced by this step; sibling dead keys (copyTerminalUrlAction/copyDockerUrlAction/copyHostMetricsUrlAction,terminalUrlCopied/dockerUrlCopied/hostMetricsUrlCopied) are the same vintage, from before the generichosts.copiedToClipboard/copyViewUrlActionreplaced them. Owner: whoever next cleans upsrc/ui/locales/en.json, or D0. - B10 (tmux-monitor): no plugin contributes an "Open Tmux Monitor" (or
"Open Docker" / "Open Tunnel" / "Open Host Metrics") quick link into
terminal.toolbartoday; that whole quick-link row was dropped when the toolbar was rebuilt as a generic action slot (aiis the only realterminal.toolbarcontributor, for its assistant button) and never replaced per-feature. Adding tmux-monitor's own link is straightforward (app.registerSlotContribution("terminal.toolbar", ...)plusapp.registerActionopening the singleton tab) but is a shared gap across four plugins, not specific to this step. Owner: D1, or whoever revisits the toolbar's quick-link row. - B11 (serial):
plugins/serial/src/frontend/Serial.tsxuses a small hardcoded light/dark xterm palette and a generic monospace font stack instead of the app's real terminal theme system (resolveTermixThemeColors,DEFAULT_TERMINAL_CONFIG,TERMINAL_FONTS, font loading), which is still core-only (src/ui/features/terminal/,src/ui/lib/terminal-themes.ts) and not yet exposed through the SDK. The serial console therefore does not match a user's chosen terminal theme or font. Promoting that system into@termix/plugin-sdk/uiis really ssh-terminal's own Phase B step's call to make (it is the plugin that currently owns the terminal component itself, per the "Known specifics" note above), so this line just points at the gap rather than building a premature shared surface for one caller. Owner: ssh-terminal's own Phase B step, or D1. - B11 (serial): shipping a plugin's own native dependency (
serialport) works for this repo's three bundled deployments only because they all install the whole npm workspace at once and copy/rebuild one sharednode_modules- see "Native dependencies" in ARCHITECTURE.md for the full reasoning. A community plugin installed later from a tarball has no such sharednode_modulesto land in, so it cannot ship a native dependency the same way. No fix attempted here; the honest workarounds are listed in that section. Owner: whoever designs the 3.0.0 install flow (prebuild-per-platform packaging, or a documented "avoid native code" rule for community plugins).
Manual checks after 2.9.0
- SSH terminal: password auth, key auth (and an encrypted key's passphrase prompt), TOTP keyboard-interactive, a jump host, Warpgate, split view, snippets sent to a terminal, reconnect after a network drop and after a page reload (session reattach), and the local terminal in the desktop app.
- Serial: the Electron backend path against a real device path/COM port, and the Web Serial browser picker in Chrome or Edge.