provide-terminal
2026-03-22
0.4.0 release: connector registry, CF http_routes split, remove compiled frontend
315 files · 9,704+ · 11,959-
Remove compiled frontend assets from git
36 files changed
hijack.jsRemoved compiled output (852 lines)hijack.htmlRemovedhijack.cssRemovedhijack-codec.jsRemovedhijack-page.jsRemovedhijack-page.cssRemovedmanifest.jsonRemovedterminal.jsRemovedterminal.cssRemovedterminal.htmlRemovedserver-app.cssRemovedserver-app-components.cssRemovedserver-app-foundation.cssRemovedserver-app-layout.cssRemovedserver-app-views.cssRemovedserver-common.jsRemovedserver-replay-page.jsRemovedserver-session-page.jsRemovedterminal-page.jsRemovedterminal-page.cssRemovedapi.jsRemovedboot.jsRemovedrouter.jsRemovedstate.jsRemovedtypes.jsRemovedmain-D-UFUT__.jsRemovedmain-DuZ7sYOn.cssRemovedapp-header.jsRemovedconnect-view.jsRemoveddashboard-view.jsRemovedoperator-view.jsRemovedreplay-view.jsRemovedsession-view.jsRemovedhijack-widget-host.jsRemovedci.ymlAdded npm run build:frontend step to CI so built assets are generated during CI rather than tracked in git.gitignoreAdded frontend build output directories to .gitignore
- All compiled JS/CSS frontend assets (~3000 lines across 25+ files) removed from git tracking. CI workflow now generates them via npm run build:frontend. This eliminates noisy build-artifact commits and ensures the frontend build is always reproducible from source.
baseline
behavioral
2 files
ci.yml.gitignore
Rename control_stream → control_channel
13 files changed
control_channel.pyRenamed from control_stream.py; updated module APIcontrol_stream.pyRemoved — replaced by control_channel.pycontrol_ws.pyUpdated importswebsockets.pyUpdated importscontrol_channel.pyRenamed from control_stream.pycontrol_channel.pyRenamed from control_stream.pycontrol_channel_helpers.pyRenamed from control_stream_helpers.pytest_control_channel_codec.pyRenamed from test_control_stream_codec.pytest_control_channel_coverage.pyRenamed from test_control_stream_coverage.pytest_bridge_mutants.pyUpdated for renamed moduletest_hub_resume_flow_mutants.pyUpdated for renamed moduletest_hub_resume_hello_mutants.pyUpdated for renamed moduletest_routes_mutants.pyUpdated for renamed module
- control_stream renamed to control_channel throughout — source files, test helpers, test files, and mutation tests. All references updated.
decouple
behavioral
2 files
control_channel.pycontrol_ws.py
CF http_routes split into module directory
6 files changed
__init__.pyNew package init exposing only route_http_shared.pyShared types and helpers extracted from http_routes.py_hijack.pyHijack routes extracted from http_routes.py_session.pySession routes extracted from http_routes.py_dispatch.pyRoute dispatch extracted from http_routes.pytest_http_routes_coverage3.pyCoverage tests for split http_routes
- The monolithic http_routes.py split into four sub-modules: _shared (types/helpers), _hijack (hijack route handlers), _session (session route handlers), _dispatch (route dispatch). Package init exports only route_http to keep the public surface minimal.
decouple
internal
5 files
__init__.py_shared.py_hijack.py_session.py_dispatch.py
Connector self-registration registry
9 files changed
registry.pyNew registry module — connectors register themselves by calling @register_connector(connector_type) rather than being listed in a central frozenset+factory__init__.pyUpdated to use registry; removed hardcoded frozenset and factoryshell.pyRegisters itself via @register_connectorssh.pyRegisters itself via @register_connectortelnet.pyRegisters itself via @register_connectorwebsocket.pyRegisters itself via @register_connectorregistry.pyMirrored in packages/__init__.pyMirrored in packages/test_connectors.py64-line mutation-killing connector tests
- Connectors now call @register_connector(connector_type) at module level to self-register with the registry. The central frozenset of connector names and the factory lookup dict have been removed. New connectors can be added without modifying the init file.
decouple
behavioral
2 files
registry.py__init__.py
Register ushell as first-class connector; add E2E tests
3 files changed
test_app_ushell.py152-line E2E test suite for ushell connector typetest_shell_connector.py143-line tests for the undef-shell ShellConnector_connector.pyUpdated ShellConnector for first-class integration
- ushell (undef.shell) is now a registered connector_type in the server registry, enabling the terminal server to accept undef-shell connections the same way as SSH, telnet, and websocket connectors. E2E tests verify full session lifecycle through the ushell connector.
instantiate
behavioral
2 files
test_app_ushell.pytest_shell_connector.py
CF Access service token support for E2E tests
4 files changed
jwt.pyAdded service token authentication pathtest_coverage_jwt.py379-line coverage tests for JWT and service token authtest_coverage_entry_registry.py455-line coverage tests for entry/registrytest_coverage_session_runtime.py142-line tests for session runtime
- CF Access service token authentication added to jwt.py, allowing E2E tests to authenticate against live Cloudflare deployments using a service token (CF-Access-Client-Id/Secret headers) rather than requiring a human-issued JWT. All 14 real_cf E2E tests now pass.
instantiate
behavioral
1 file
jwt.py
Agent heartbeat expiry fixes
2 files changed
_monitor.pyExpire blocked agents on heartbeat timeout; expire recovering agents on manager restart_monitor.pyMirrored in packages/
- Agents stuck in blocked state are now expired when a heartbeat timeout fires, preventing leaked sessions from accumulating. Recovering agents are expired on manager restart rather than being left in an indeterminate state. kill_agent falls back to PID when the process object is not tracked.
harden
behavioral
1 file
_monitor.py
Vendor undef.shell and workers SDK into CF python_modules
6 files changed
__init__.pyWorkers runtime SDK package — 66 lines_workers.pyWorkers runtime SDK implementation — 1418 linespy.typedMarker fileworkflows.pyWorkflows API stubs_connector.pyVendored undef.shell ShellConnector for Pyodide workertest_ushell_vendor_guard.pyGuard test ensuring vendored undef.shell tree matches source
- Vendored the Cloudflare Workers Python runtime SDK (~1500 lines) into python_modules/ for Pyodide. Added undef.shell to python_modules/ for CF worker use. A vendor guard test verifies the vendored copy stays in sync with the source package.
baseline
behavioral
3 files
__init__.py_workers.py_connector.py
Detection module refactor: extract input_type
5 files changed
input_type.pyNew module: auto_detect_input_type() extracted from detector.py__init__.pyUpdated exportsdetector.pyReduced — auto_detect_input_type moved outinput_type.pyMirrored in packages/test_extractor_validate.py143-line test for extractor validate internals
0.4.0 release and dependency updates
12 files changed
VERSIONBumped to 0.4.0VERSIONUpdatedpyproject.tomlUpdated dependencies and test pathsuv.lockLockfile update for 0.4.0 and dependency changesuv.lockCF package lockfile updateuv.lockShell package lockfilepyproject.tomlAdded dev dependency additionsHANDOFF.mdUpdated with session context2026-03-22-codebase-hygiene.mdCodebase hygiene implementation plan documentconftest.pyRoot conftest updates_example_session.pyExample session script updatesmemray_gateway_stress.pyMemray gateway stress script updates
- Bumped undef-terminal to 0.4.0 and updated uv.lock across all packages. The undef-shell symlink (src/undef/shell pointing to packages/undef-shell/src/undef/shell) was removed as it broke Windows compatibility and was made redundant by the vendored CF python_modules.
baseline
internal
3 files
VERSIONpyproject.tomluv.lock