remo-cli 2.2.0rc6__tar.gz → 2.2.0rc7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (435) hide show
  1. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/PKG-INFO +1 -1
  2. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/TerminalCard.tsx +12 -0
  3. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/terminal/GhosttyRenderer.ts +30 -4
  4. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/terminal/TerminalConnection.ts +85 -2
  5. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/terminal/XtermRenderer.ts +32 -2
  6. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/pyproject.toml +1 -1
  7. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/uv.lock +1 -1
  8. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.claude/skills/speckit-analyze/SKILL.md +0 -0
  9. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.claude/skills/speckit-checklist/SKILL.md +0 -0
  10. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.claude/skills/speckit-clarify/SKILL.md +0 -0
  11. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.claude/skills/speckit-constitution/SKILL.md +0 -0
  12. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.claude/skills/speckit-converge/SKILL.md +0 -0
  13. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.claude/skills/speckit-git-commit/SKILL.md +0 -0
  14. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.claude/skills/speckit-git-feature/SKILL.md +0 -0
  15. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.claude/skills/speckit-git-initialize/SKILL.md +0 -0
  16. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.claude/skills/speckit-git-remote/SKILL.md +0 -0
  17. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.claude/skills/speckit-git-validate/SKILL.md +0 -0
  18. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.claude/skills/speckit-implement/SKILL.md +0 -0
  19. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.claude/skills/speckit-plan/SKILL.md +0 -0
  20. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.claude/skills/speckit-specify/SKILL.md +0 -0
  21. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.claude/skills/speckit-tasks/SKILL.md +0 -0
  22. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.claude/skills/speckit-taskstoissues/SKILL.md +0 -0
  23. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.devcontainer/devcontainer.json +0 -0
  24. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.dockerignore +0 -0
  25. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.github/dependabot.yml +0 -0
  26. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.github/workflows/ci.yml +0 -0
  27. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.github/workflows/provision.yml +0 -0
  28. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.github/workflows/release.yml +0 -0
  29. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.github/workflows/smoke-test-cleanup.yml +0 -0
  30. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.github/workflows/smoke-test.yml +0 -0
  31. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.github/workflows/teardown.yml +0 -0
  32. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.gitignore +0 -0
  33. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.maverick/checkpoints/feature/implementation_complete.json +0 -0
  34. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.maverick/checkpoints/feature/phase_${{ index }}_complete.json +0 -0
  35. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.maverick/checkpoints/feature/validation_complete.json +0 -0
  36. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/extensions/.registry +0 -0
  37. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/extensions/git/README.md +0 -0
  38. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/extensions/git/commands/speckit.git.commit.md +0 -0
  39. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/extensions/git/commands/speckit.git.feature.md +0 -0
  40. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/extensions/git/commands/speckit.git.initialize.md +0 -0
  41. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/extensions/git/commands/speckit.git.remote.md +0 -0
  42. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/extensions/git/commands/speckit.git.validate.md +0 -0
  43. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/extensions/git/config-template.yml +0 -0
  44. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/extensions/git/extension.yml +0 -0
  45. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/extensions/git/git-config.yml +0 -0
  46. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/extensions/git/scripts/bash/auto-commit.sh +0 -0
  47. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/extensions/git/scripts/bash/create-new-feature.sh +0 -0
  48. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/extensions/git/scripts/bash/git-common.sh +0 -0
  49. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/extensions/git/scripts/bash/initialize-repo.sh +0 -0
  50. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  51. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/extensions/git/scripts/powershell/create-new-feature.ps1 +0 -0
  52. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/extensions/git/scripts/powershell/git-common.ps1 +0 -0
  53. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  54. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/extensions.yml +0 -0
  55. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/feature.json +0 -0
  56. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/init-options.json +0 -0
  57. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/integration.json +0 -0
  58. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/integrations/claude.manifest.json +0 -0
  59. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/integrations/speckit.manifest.json +0 -0
  60. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/memory/constitution.md +0 -0
  61. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/scripts/bash/check-prerequisites.sh +0 -0
  62. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/scripts/bash/common.sh +0 -0
  63. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/scripts/bash/create-new-feature.sh +0 -0
  64. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/scripts/bash/setup-plan.sh +0 -0
  65. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/scripts/bash/setup-tasks.sh +0 -0
  66. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/scripts/bash/update-agent-context.sh +0 -0
  67. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/templates/agent-file-template.md +0 -0
  68. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/templates/checklist-template.md +0 -0
  69. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/templates/constitution-template.md +0 -0
  70. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/templates/plan-template.md +0 -0
  71. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/templates/spec-template.md +0 -0
  72. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/templates/tasks-template.md +0 -0
  73. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/workflows/speckit/workflow.yml +0 -0
  74. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/.specify/workflows/workflow-registry.json +0 -0
  75. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/AGENTS.md +0 -0
  76. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/CLAUDE.md +0 -0
  77. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/CONTRIBUTING.md +0 -0
  78. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/Dockerfile +0 -0
  79. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/LICENSE +0 -0
  80. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/README.md +0 -0
  81. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/.ansible-lint +0 -0
  82. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/README.md +0 -0
  83. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/ansible.cfg +0 -0
  84. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/aws_configure.yml +0 -0
  85. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/aws_resize.yml +0 -0
  86. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/aws_site.yml +0 -0
  87. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/aws_teardown.yml +0 -0
  88. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/group_vars/all.yml +0 -0
  89. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/group_vars/incus_containers.yml +0 -0
  90. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/group_vars/proxmox_containers.yml +0 -0
  91. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/hetzner_configure.yml +0 -0
  92. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/hetzner_provision.yml +0 -0
  93. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/hetzner_resize.yml +0 -0
  94. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/hetzner_site.yml +0 -0
  95. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/hetzner_teardown.yml +0 -0
  96. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/incus_bootstrap.yml +0 -0
  97. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/incus_configure.yml +0 -0
  98. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/incus_provision.yml +0 -0
  99. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/incus_resize.yml +0 -0
  100. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/incus_site.yml +0 -0
  101. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/incus_teardown.yml +0 -0
  102. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/inventory/hosts.yml +0 -0
  103. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/inventory/incus_containers.yml +0 -0
  104. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/proxmox_bootstrap.yml +0 -0
  105. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/proxmox_configure.yml +0 -0
  106. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/proxmox_provision.yml +0 -0
  107. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/proxmox_resize.yml +0 -0
  108. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/proxmox_site.yml +0 -0
  109. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/proxmox_teardown.yml +0 -0
  110. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/requirements.yml +0 -0
  111. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/aws_server/defaults/main.yml +0 -0
  112. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/aws_server/tasks/ebs.yml +0 -0
  113. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/aws_server/tasks/ec2.yml +0 -0
  114. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/aws_server/tasks/main.yml +0 -0
  115. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/aws_server/tasks/patch_manager.yml +0 -0
  116. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/aws_server/tasks/preflight.yml +0 -0
  117. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/aws_server/tasks/security_group.yml +0 -0
  118. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/deacon/defaults/main.yml +0 -0
  119. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/deacon/tasks/main.yml +0 -0
  120. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/devcontainers/tasks/main.yml +0 -0
  121. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/docker/handlers/main.yml +0 -0
  122. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/docker/tasks/main.yml +0 -0
  123. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/fzf/tasks/main.yml +0 -0
  124. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/github_cli/tasks/main.yml +0 -0
  125. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/hetzner_server/defaults/main.yml +0 -0
  126. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/hetzner_server/tasks/main.yml +0 -0
  127. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/incus_bootstrap/defaults/main.yml +0 -0
  128. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/incus_bootstrap/handlers/main.yml +0 -0
  129. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/incus_bootstrap/tasks/main.yml +0 -0
  130. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/incus_container/defaults/main.yml +0 -0
  131. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/incus_container/handlers/main.yml +0 -0
  132. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/incus_container/meta/main.yml +0 -0
  133. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/incus_container/tasks/main.yml +0 -0
  134. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/incus_container/tasks/preflight.yml +0 -0
  135. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/incus_container_teardown/defaults/main.yml +0 -0
  136. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/incus_container_teardown/meta/main.yml +0 -0
  137. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/incus_container_teardown/tasks/main.yml +0 -0
  138. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/nodejs/defaults/main.yml +0 -0
  139. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/nodejs/tasks/main.yml +0 -0
  140. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/proxmox_bootstrap/defaults/main.yml +0 -0
  141. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/proxmox_bootstrap/meta/main.yml +0 -0
  142. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/proxmox_bootstrap/tasks/main.yml +0 -0
  143. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/proxmox_container/defaults/main.yml +0 -0
  144. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/proxmox_container/handlers/main.yml +0 -0
  145. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/proxmox_container/meta/main.yml +0 -0
  146. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/proxmox_container/tasks/main.yml +0 -0
  147. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/proxmox_container/tasks/preflight.yml +0 -0
  148. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/proxmox_container_teardown/defaults/main.yml +0 -0
  149. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/proxmox_container_teardown/meta/main.yml +0 -0
  150. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/proxmox_container_teardown/tasks/main.yml +0 -0
  151. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/user_setup/defaults/main.yml +0 -0
  152. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/user_setup/tasks/main.yml +0 -0
  153. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/user_setup/templates/devshell.sh.j2 +0 -0
  154. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/user_setup/templates/project-launch.sh.j2 +0 -0
  155. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/user_setup/templates/project-menu.sh.j2 +0 -0
  156. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/user_setup/templates/remo-host.sh.j2 +0 -0
  157. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/zellij/defaults/main.yml +0 -0
  158. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/zellij/tasks/main.yml +0 -0
  159. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/zellij/templates/config.kdl.j2 +0 -0
  160. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/roles/zellij/templates/layouts/minimal.kdl.j2 +0 -0
  161. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/ansible/tasks/configure_dev_tools.yml +0 -0
  162. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/docker/Dockerfile +0 -0
  163. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/docker/compose.example.yml +0 -0
  164. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/docker/entrypoint.sh +0 -0
  165. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/docs/aws.md +0 -0
  166. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/docs/hetzner.md +0 -0
  167. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/docs/incus.md +0 -0
  168. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/docs/install.sh +0 -0
  169. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/docs/proxmox.md +0 -0
  170. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/docs/remo-web-speckit-input.md +0 -0
  171. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/docs/remo-web.html +0 -0
  172. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/docs/web-session-interface.md +0 -0
  173. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/index.html +0 -0
  174. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/package-lock.json +0 -0
  175. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/package.json +0 -0
  176. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/public/README.md +0 -0
  177. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/public/dist__ghostty-vt.wasm +0 -0
  178. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/public/ghostty-vt.wasm +0 -0
  179. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/scripts/copy-ghostty-wasm.mjs +0 -0
  180. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/api/client.ts +0 -0
  181. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/AppRoot.tsx +0 -0
  182. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/AppShell.css +0 -0
  183. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/AppShell.tsx +0 -0
  184. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/AwaitingAdoption.css +0 -0
  185. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/AwaitingAdoption.tsx +0 -0
  186. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/OfflineOverlay.css +0 -0
  187. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/OfflineOverlay.tsx +0 -0
  188. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/PairToSync.css +0 -0
  189. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/PairToSync.tsx +0 -0
  190. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/SessionRail.css +0 -0
  191. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/SessionRail.tsx +0 -0
  192. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/SettingsPage.css +0 -0
  193. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/SettingsPage.tsx +0 -0
  194. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/ShortcutsModal.css +0 -0
  195. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/ShortcutsModal.tsx +0 -0
  196. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/TerminalCard.css +0 -0
  197. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/TopBar.css +0 -0
  198. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/TopBar.tsx +0 -0
  199. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/WorkspacePane.css +0 -0
  200. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/WorkspacePane.tsx +0 -0
  201. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/providerMeta.ts +0 -0
  202. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/components/railModel.ts +0 -0
  203. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/lib/clipboard.ts +0 -0
  204. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/lib/fullscreen.ts +0 -0
  205. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/main.tsx +0 -0
  206. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/state/discovery.ts +0 -0
  207. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/state/fonts.ts +0 -0
  208. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/state/health.ts +0 -0
  209. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/state/settings.ts +0 -0
  210. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/state/useConsoleKeyboard.ts +0 -0
  211. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/state/workspace.ts +0 -0
  212. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/terminal/.gitkeep +0 -0
  213. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/terminal/RendererAdapter.ts +0 -0
  214. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/terminal/defaultRenderer.ts +0 -0
  215. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/theme/fonts.ts +0 -0
  216. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/src/theme/tokens.css +0 -0
  217. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/tsconfig.json +0 -0
  218. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/frontend/vite.config.ts +0 -0
  219. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/install.sh +0 -0
  220. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/maverick.yaml +0 -0
  221. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/playwright.config.ts +0 -0
  222. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/project-menu.sh +0 -0
  223. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/remo +0 -0
  224. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/run.sh +0 -0
  225. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/scripts/setup-aws-oidc.sh +0 -0
  226. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/001-bootstrap-incus-host/checklists/requirements.md +0 -0
  227. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/001-bootstrap-incus-host/checklists/validation.md +0 -0
  228. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/001-bootstrap-incus-host/contracts/playbook-interface.yaml +0 -0
  229. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/001-bootstrap-incus-host/contracts/role-interface.yaml +0 -0
  230. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/001-bootstrap-incus-host/data-model.md +0 -0
  231. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/001-bootstrap-incus-host/plan.md +0 -0
  232. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/001-bootstrap-incus-host/quickstart.md +0 -0
  233. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/001-bootstrap-incus-host/research.md +0 -0
  234. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/001-bootstrap-incus-host/spec.md +0 -0
  235. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/001-bootstrap-incus-host/tasks.md +0 -0
  236. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/002-incus-container-support/checklists/requirements.md +0 -0
  237. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/002-incus-container-support/contracts/playbook-interface.yaml +0 -0
  238. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/002-incus-container-support/contracts/role-interface.yaml +0 -0
  239. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/002-incus-container-support/data-model.md +0 -0
  240. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/002-incus-container-support/plan.md +0 -0
  241. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/002-incus-container-support/quickstart.md +0 -0
  242. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/002-incus-container-support/research.md +0 -0
  243. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/002-incus-container-support/spec.md +0 -0
  244. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/002-incus-container-support/tasks.md +0 -0
  245. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/003-python-cli-rewrite/checklists/requirements.md +0 -0
  246. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/003-python-cli-rewrite/data-model.md +0 -0
  247. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/003-python-cli-rewrite/plan.md +0 -0
  248. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/003-python-cli-rewrite/quickstart.md +0 -0
  249. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/003-python-cli-rewrite/research.md +0 -0
  250. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/003-python-cli-rewrite/spec.md +0 -0
  251. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/003-python-cli-rewrite/tasks.md +0 -0
  252. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/004-proxmox-container-support/spec.md +0 -0
  253. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/005-provider-snapshots/checklists/requirements.md +0 -0
  254. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/005-provider-snapshots/contracts/cli-surface.md +0 -0
  255. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/005-provider-snapshots/data-model.md +0 -0
  256. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/005-provider-snapshots/plan.md +0 -0
  257. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/005-provider-snapshots/quickstart.md +0 -0
  258. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/005-provider-snapshots/research.md +0 -0
  259. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/005-provider-snapshots/spec.md +0 -0
  260. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/005-provider-snapshots/tasks.md +0 -0
  261. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/010-web-session-interface/checklists/requirements.md +0 -0
  262. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/010-web-session-interface/contracts/remo-host-protocol.md +0 -0
  263. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/010-web-session-interface/contracts/rest-api.md +0 -0
  264. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/010-web-session-interface/contracts/terminal-websocket.md +0 -0
  265. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/010-web-session-interface/data-model.md +0 -0
  266. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/010-web-session-interface/plan.md +0 -0
  267. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/010-web-session-interface/quickstart.md +0 -0
  268. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/010-web-session-interface/research.md +0 -0
  269. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/010-web-session-interface/spec.md +0 -0
  270. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/010-web-session-interface/tasks.md +0 -0
  271. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/011-web-adopt/checklists/requirements.md +0 -0
  272. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/011-web-adopt/contracts/cli-web-adopt.md +0 -0
  273. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/011-web-adopt/contracts/setup-api.md +0 -0
  274. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/011-web-adopt/data-model.md +0 -0
  275. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/011-web-adopt/plan.md +0 -0
  276. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/011-web-adopt/quickstart-results.md +0 -0
  277. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/011-web-adopt/quickstart.md +0 -0
  278. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/011-web-adopt/research.md +0 -0
  279. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/011-web-adopt/spec.md +0 -0
  280. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/011-web-adopt/tasks.md +0 -0
  281. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/012-web-adopt-pairing/contracts/cli-web-adopt.md +0 -0
  282. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/012-web-adopt-pairing/contracts/pairing-api.md +0 -0
  283. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/012-web-adopt-pairing/contracts/setup-api.md +0 -0
  284. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/012-web-adopt-pairing/data-model.md +0 -0
  285. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/012-web-adopt-pairing/plan.md +0 -0
  286. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/012-web-adopt-pairing/quickstart.md +0 -0
  287. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/012-web-adopt-pairing/research.md +0 -0
  288. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/012-web-adopt-pairing/spec.md +0 -0
  289. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/specs/012-web-adopt-pairing/tasks.md +0 -0
  290. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/__init__.py +0 -0
  291. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/__main__.py +0 -0
  292. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/cli/__init__.py +0 -0
  293. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/cli/cp.py +0 -0
  294. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/cli/main.py +0 -0
  295. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/cli/providers/__init__.py +0 -0
  296. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/cli/providers/aws.py +0 -0
  297. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/cli/providers/hetzner.py +0 -0
  298. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/cli/providers/incus.py +0 -0
  299. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/cli/providers/proxmox.py +0 -0
  300. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/cli/shell.py +0 -0
  301. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/cli/web.py +0 -0
  302. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/core/__init__.py +0 -0
  303. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/core/ansible_runner.py +0 -0
  304. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/core/completion.py +0 -0
  305. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/core/config.py +0 -0
  306. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/core/known_hosts.py +0 -0
  307. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/core/output.py +0 -0
  308. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/core/picker.py +0 -0
  309. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/core/remo_host_client.py +0 -0
  310. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/core/rsync.py +0 -0
  311. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/core/snapshot.py +0 -0
  312. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/core/ssh.py +0 -0
  313. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/core/validation.py +0 -0
  314. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/core/version.py +0 -0
  315. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/core/web_adopt.py +0 -0
  316. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/models/__init__.py +0 -0
  317. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/models/capability.py +0 -0
  318. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/models/discovery.py +0 -0
  319. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/models/host.py +0 -0
  320. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/models/session_target.py +0 -0
  321. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/models/snapshot.py +0 -0
  322. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/providers/__init__.py +0 -0
  323. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/providers/aws.py +0 -0
  324. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/providers/hetzner.py +0 -0
  325. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/providers/incus.py +0 -0
  326. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/providers/proxmox.py +0 -0
  327. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/web/__init__.py +0 -0
  328. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/web/api/__init__.py +0 -0
  329. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/web/api/hosts.py +0 -0
  330. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/web/api/pairing.py +0 -0
  331. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/web/api/setup.py +0 -0
  332. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/web/api/terminals.py +0 -0
  333. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/web/app.py +0 -0
  334. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/web/check.py +0 -0
  335. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/web/config.py +0 -0
  336. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/web/discovery.py +0 -0
  337. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/web/health.py +0 -0
  338. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/web/logging_config.py +0 -0
  339. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/web/models.py +0 -0
  340. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/web/operator_auth.py +0 -0
  341. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/web/pairing.py +0 -0
  342. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/web/ssh_master.py +0 -0
  343. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/web/state.py +0 -0
  344. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/web/terminal.py +0 -0
  345. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/web/terminal_registry.py +0 -0
  346. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/src/remo_cli/web/tokens.py +0 -0
  347. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/__init__.py +0 -0
  348. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/ansible/__init__.py +0 -0
  349. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/ansible/test_remo_host_idempotency.py +0 -0
  350. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/conftest.py +0 -0
  351. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/e2e/fixtures.ts +0 -0
  352. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/e2e/ghostty-shell-io.spec.ts +0 -0
  353. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/e2e/ghostty-tui-compatibility.spec.ts +0 -0
  354. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/e2e/keyboard-routing.spec.ts +0 -0
  355. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/e2e/mobile.spec.ts +0 -0
  356. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/e2e/reconnect.spec.ts +0 -0
  357. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/e2e/workspace-layout.spec.ts +0 -0
  358. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/image/__init__.py +0 -0
  359. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/image/test_docker_image.py +0 -0
  360. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/integration/__init__.py +0 -0
  361. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/integration/_nine_terminal_fixture.py +0 -0
  362. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/integration/orbstack-cloud-init.yml +0 -0
  363. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/integration/orbstack.sh +0 -0
  364. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/integration/test_nine_terminals.py +0 -0
  365. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/integration/test_nine_terminals_soak.py +0 -0
  366. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/integration/test_remo_host_e2e.py +0 -0
  367. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/integration/test_security_rejections.py +0 -0
  368. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/integration/test_terminal_attach.py +0 -0
  369. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/integration/test_web_adopt_e2e.py +0 -0
  370. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/integration/test_web_cli_parity.py +0 -0
  371. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/perf/__init__.py +0 -0
  372. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/perf/test_latency.py +0 -0
  373. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/__init__.py +0 -0
  374. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/cli/__init__.py +0 -0
  375. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/cli/providers/test_aws_snapshot.py +0 -0
  376. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/cli/providers/test_hetzner_snapshot.py +0 -0
  377. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/cli/providers/test_incus_snapshot.py +0 -0
  378. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/cli/providers/test_proxmox_snapshot.py +0 -0
  379. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/cli/test_cp.py +0 -0
  380. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/cli/test_main.py +0 -0
  381. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/cli/test_shell.py +0 -0
  382. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/cli/test_web_adopt_cmd.py +0 -0
  383. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/core/__init__.py +0 -0
  384. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/core/test_ansible_runner.py +0 -0
  385. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/core/test_config.py +0 -0
  386. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/core/test_known_hosts.py +0 -0
  387. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/core/test_output.py +0 -0
  388. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/core/test_picker.py +0 -0
  389. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/core/test_remo_host_client.py +0 -0
  390. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/core/test_rsync.py +0 -0
  391. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/core/test_snapshot.py +0 -0
  392. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/core/test_ssh.py +0 -0
  393. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/core/test_ssh_controlpath.py +0 -0
  394. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/core/test_ssh_identity_opts.py +0 -0
  395. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/core/test_validation.py +0 -0
  396. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/core/test_version.py +0 -0
  397. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/core/test_web_adopt_authorize.py +0 -0
  398. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/core/test_web_adopt_code.py +0 -0
  399. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/core/test_web_adopt_payload.py +0 -0
  400. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/core/test_web_adopt_trust.py +0 -0
  401. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/core/test_web_push.py +0 -0
  402. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/models/__init__.py +0 -0
  403. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/models/test_capability.py +0 -0
  404. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/models/test_discovery.py +0 -0
  405. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/models/test_session_target.py +0 -0
  406. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/providers/__init__.py +0 -0
  407. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/providers/test_aws_snapshot.py +0 -0
  408. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/providers/test_hetzner_snapshot.py +0 -0
  409. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/providers/test_incus_snapshot.py +0 -0
  410. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/providers/test_proxmox_devcontainer_runtime.py +0 -0
  411. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/providers/test_proxmox_snapshot.py +0 -0
  412. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/test_ansible_templates.py +0 -0
  413. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/test_host_model.py +0 -0
  414. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/__init__.py +0 -0
  415. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/_pairing_support.py +0 -0
  416. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/conftest.py +0 -0
  417. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/test_backpressure.py +0 -0
  418. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/test_check.py +0 -0
  419. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/test_csp.py +0 -0
  420. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/test_discovery.py +0 -0
  421. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/test_health_states.py +0 -0
  422. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/test_hosts_mapping.py +0 -0
  423. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/test_lazy_import.py +0 -0
  424. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/test_log_redaction.py +0 -0
  425. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/test_mint_gating.py +0 -0
  426. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/test_operator_auth.py +0 -0
  427. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/test_pairing.py +0 -0
  428. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/test_pairing_origin.py +0 -0
  429. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/test_setup_api.py +0 -0
  430. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/test_setup_auth.py +0 -0
  431. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/test_setup_dormancy.py +0 -0
  432. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/test_state.py +0 -0
  433. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/test_terminal_resize.py +0 -0
  434. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/test_terminals_api.py +0 -0
  435. {remo_cli-2.2.0rc6 → remo_cli-2.2.0rc7}/tests/unit/web/test_tokens.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: remo-cli
3
- Version: 2.2.0rc6
3
+ Version: 2.2.0rc7
4
4
  Summary: Remote development environment CLI
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -257,6 +257,18 @@ export function TerminalCard({
257
257
  // eslint-disable-next-line react-hooks/exhaustive-deps
258
258
  }, [target.id, settings.renderer]);
259
259
 
260
+ // Move DOM keyboard focus into the terminal whenever this card becomes the
261
+ // focused, visible one — e.g. after clicking a rail row (selectOnly) or a
262
+ // number-key jump. Without this the card is "focused" in workspace state (our
263
+ // input gate opens) but the xterm textarea has no DOM focus, so keystrokes go
264
+ // nowhere until the user clicks into the surface. Guarded on isVisible: a
265
+ // hidden card must never steal focus.
266
+ useEffect(() => {
267
+ if (isFocused && isVisible) {
268
+ adapterRef.current?.focus();
269
+ }
270
+ }, [isFocused, isVisible]);
271
+
260
272
  const handleReconnect = useCallback(() => {
261
273
  setError(null);
262
274
  void connectionRef.current?.reconnect();
@@ -33,6 +33,9 @@ export class GhosttyRenderer implements RendererAdapter {
33
33
  private readonly terminal: Terminal;
34
34
  private container: HTMLElement | null = null;
35
35
  private font: TerminalFontOptions;
36
+ /** Input subscribers — see XtermRenderer for the rationale (fan real input in,
37
+ * plus synthesize Shift+Enter, through one path). */
38
+ private readonly dataHandlers = new Set<(data: Uint8Array | string) => void>();
36
39
 
37
40
  constructor(font: TerminalFontOptions = DEFAULT_FONT) {
38
41
  this.font = font;
@@ -42,6 +45,31 @@ export class GhosttyRenderer implements RendererAdapter {
42
45
  fontFamily: font.fontFamily,
43
46
  fontSize: font.fontSize,
44
47
  });
48
+ this.terminal.onData((data: string | Uint8Array) => this.emit(data));
49
+ // Best-effort Shift+Enter → ESC+CR (newline), matching XtermRenderer. Guarded
50
+ // because ghostty-web's custom-key-handler API is unconfirmed at 0.4.0; if
51
+ // absent this is a no-op and Shift+Enter falls back to the engine default.
52
+ const t = this.terminal as unknown as {
53
+ attachCustomKeyEventHandler?: (h: (e: KeyboardEvent) => boolean) => void;
54
+ };
55
+ t.attachCustomKeyEventHandler?.((e) => this.handleKeyEvent(e));
56
+ }
57
+
58
+ private emit(data: Uint8Array | string): void {
59
+ for (const handler of this.dataHandlers) {
60
+ handler(data);
61
+ }
62
+ }
63
+
64
+ private handleKeyEvent(e: KeyboardEvent): boolean {
65
+ if (e.key === "Enter" && e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey) {
66
+ if (e.type === "keydown") {
67
+ e.preventDefault();
68
+ this.emit("\x1b\r");
69
+ }
70
+ return false;
71
+ }
72
+ return true;
45
73
  }
46
74
 
47
75
  open(container: HTMLElement): void {
@@ -54,10 +82,8 @@ export class GhosttyRenderer implements RendererAdapter {
54
82
  }
55
83
 
56
84
  onData(handler: (data: Uint8Array | string) => void): () => void {
57
- const disposable = this.terminal.onData((data: string | Uint8Array) => handler(data)) as
58
- | Disposable
59
- | undefined;
60
- return () => disposable?.dispose();
85
+ this.dataHandlers.add(handler);
86
+ return () => this.dataHandlers.delete(handler);
61
87
  }
62
88
 
63
89
  fit(): TerminalDimensions {
@@ -65,6 +65,13 @@ export class TerminalConnection {
65
65
  private reconnectAttempts = 0;
66
66
  private reconnectTimer: ReturnType<typeof setTimeout> | undefined;
67
67
  private _needsManualReconnect = false;
68
+ /** True while an attach() is between requesting a fresh terminal and having a
69
+ * socket assigned — serializes the burst of wake events (visibilitychange +
70
+ * focus + online all fire near-simultaneously on resume). */
71
+ private attaching = false;
72
+ /** Bumped each attach() so a slow, superseded attach can't assign a socket. */
73
+ private attachGen = 0;
74
+ private wakeListenersBound = false;
68
75
 
69
76
  constructor(
70
77
  sessionTargetId: string,
@@ -88,6 +95,7 @@ export class TerminalConnection {
88
95
 
89
96
  /** Starts the initial connection. Call once after construction. */
90
97
  async connect(): Promise<void> {
98
+ this.addWakeListeners();
91
99
  await this.attach("connecting");
92
100
  }
93
101
 
@@ -121,6 +129,7 @@ export class TerminalConnection {
121
129
  /** Client-initiated clean close (WS code 1000) plus server-side cleanup. */
122
130
  async close(): Promise<void> {
123
131
  this.clientInitiatedClose = true;
132
+ this.removeWakeListeners();
124
133
  this.clearReconnectTimer();
125
134
  const socket = this.socket;
126
135
  const terminalId = this.terminalId;
@@ -157,8 +166,70 @@ export class TerminalConnection {
157
166
  }
158
167
  }
159
168
 
169
+ private addWakeListeners(): void {
170
+ if (this.wakeListenersBound) {
171
+ return;
172
+ }
173
+ this.wakeListenersBound = true;
174
+ if (typeof window !== "undefined") {
175
+ window.addEventListener("online", this.onWake);
176
+ window.addEventListener("focus", this.onWake);
177
+ }
178
+ if (typeof document !== "undefined") {
179
+ document.addEventListener("visibilitychange", this.onWake);
180
+ }
181
+ }
182
+
183
+ private removeWakeListeners(): void {
184
+ if (!this.wakeListenersBound) {
185
+ return;
186
+ }
187
+ this.wakeListenersBound = false;
188
+ if (typeof window !== "undefined") {
189
+ window.removeEventListener("online", this.onWake);
190
+ window.removeEventListener("focus", this.onWake);
191
+ }
192
+ if (typeof document !== "undefined") {
193
+ document.removeEventListener("visibilitychange", this.onWake);
194
+ }
195
+ }
196
+
197
+ // Regaining focus/visibility/connectivity (e.g. reopening a slept laptop lid)
198
+ // is our cue that a socket that died while backgrounded should recover NOW,
199
+ // rather than waiting out a backoff that may have already been exhausted while
200
+ // hidden. Reset the auto-retry budget and force a fresh attach.
201
+ private readonly onWake = (): void => {
202
+ if (typeof document !== "undefined" && document.visibilityState === "hidden") {
203
+ return; // visibilitychange firing on the way OUT — ignore.
204
+ }
205
+ if (this.clientInitiatedClose || this.state === "closed" || this.attaching) {
206
+ return;
207
+ }
208
+ const readyState = this.socket?.readyState;
209
+ if (readyState === WebSocket.OPEN) {
210
+ // Looks alive; prod it so a silently-dead (post-sleep) socket surfaces an
211
+ // onclose and takes the reconnect path. Best-effort — a throw here just
212
+ // means the close is imminent anyway.
213
+ try {
214
+ this.sendPing();
215
+ } catch {
216
+ /* dead socket; onclose will drive the reconnect */
217
+ }
218
+ return;
219
+ }
220
+ if (readyState === WebSocket.CONNECTING) {
221
+ return; // a handshake is already in flight.
222
+ }
223
+ this._needsManualReconnect = false;
224
+ this.reconnectAttempts = 0;
225
+ this.clearReconnectTimer();
226
+ void this.attach("reconnecting");
227
+ };
228
+
160
229
  /** Creates a fresh terminal_id + token and opens a new WS to it. */
161
230
  private async attach(nextState: "connecting" | "reconnecting"): Promise<void> {
231
+ const gen = ++this.attachGen;
232
+ this.attaching = true;
162
233
  this.clientInitiatedClose = false;
163
234
  this.setState(nextState);
164
235
 
@@ -166,7 +237,17 @@ export class TerminalConnection {
166
237
  try {
167
238
  created = await createTerminal(this.sessionTargetId, this.cols, this.rows);
168
239
  } catch (error) {
169
- this.handleFatalError(error);
240
+ this.attaching = false;
241
+ // A newer attach (e.g. a wake-triggered one) has superseded this; stay quiet.
242
+ if (gen === this.attachGen) {
243
+ this.handleFatalError(error);
244
+ }
245
+ return;
246
+ }
247
+
248
+ // Superseded while awaiting the fresh terminal — don't open a second socket.
249
+ if (gen !== this.attachGen) {
250
+ this.attaching = false;
170
251
  return;
171
252
  }
172
253
 
@@ -174,6 +255,7 @@ export class TerminalConnection {
174
255
  const socket = openTerminalSocket(created.terminal_id, created.ws_token);
175
256
  socket.binaryType = "arraybuffer";
176
257
  this.socket = socket;
258
+ this.attaching = false;
177
259
 
178
260
  socket.onopen = () => {
179
261
  // Server confirms readiness via the `ready` control frame, not onopen.
@@ -274,7 +356,8 @@ export class TerminalConnection {
274
356
  this.reconnectTimer = setTimeout(resolve, delay);
275
357
  });
276
358
 
277
- if (this.clientInitiatedClose) {
359
+ if (this.clientInitiatedClose || this.attaching || this.socket) {
360
+ // A wake-triggered reconnect already took over while we were backing off.
278
361
  return;
279
362
  }
280
363
  await this.attach("reconnecting");
@@ -44,6 +44,10 @@ export class XtermRenderer implements RendererAdapter {
44
44
  /** Desired ligature state; the addon is only actually (un)loaded after
45
45
  * open() since it registers a character joiner that needs an opened terminal. */
46
46
  private ligaturesEnabled = false;
47
+ /** Input subscribers. We fan xterm's own onData into these AND synthesize
48
+ * input for keys xterm doesn't distinguish (Shift+Enter), so both reach the
49
+ * remote PTY through the same path. */
50
+ private readonly dataHandlers = new Set<(data: Uint8Array | string) => void>();
47
51
 
48
52
  constructor(font: TerminalFontOptions = DEFAULT_FONT) {
49
53
  this.terminal = new Terminal({
@@ -58,9 +62,35 @@ export class XtermRenderer implements RendererAdapter {
58
62
  });
59
63
  this.fitAddon = new FitAddon();
60
64
  this.terminal.loadAddon(this.fitAddon);
65
+ // Real typed input flows through here to every subscriber.
66
+ this.terminal.onData((data: string) => this.emit(data));
67
+ // Distinguish Shift+Enter from Enter: xterm sends a plain CR for both, but
68
+ // Claude Code and other TUIs expect Shift+Enter to insert a newline. Emit
69
+ // ESC+CR (what `claude /terminal-setup` configures desktop terminals to
70
+ // send) and suppress xterm's default CR so it isn't ALSO submitted.
71
+ this.terminal.attachCustomKeyEventHandler((e) => this.handleKeyEvent(e));
61
72
  this.applyLigatures(font.ligatures);
62
73
  }
63
74
 
75
+ private emit(data: Uint8Array | string): void {
76
+ for (const handler of this.dataHandlers) {
77
+ handler(data);
78
+ }
79
+ }
80
+
81
+ private handleKeyEvent(e: KeyboardEvent): boolean {
82
+ if (e.key === "Enter" && e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey) {
83
+ if (e.type === "keydown") {
84
+ // preventDefault stops the browser from also inserting a newline into
85
+ // xterm's hidden textarea (which would double-send via its input event).
86
+ e.preventDefault();
87
+ this.emit("\x1b\r");
88
+ }
89
+ return false; // suppress xterm's default CR (which would submit the line)
90
+ }
91
+ return true;
92
+ }
93
+
64
94
  private applyLigatures(enabled: boolean): void {
65
95
  this.ligaturesEnabled = enabled;
66
96
  // @xterm/addon-ligatures calls registerCharacterJoiner in activate(), which
@@ -110,8 +140,8 @@ export class XtermRenderer implements RendererAdapter {
110
140
  }
111
141
 
112
142
  onData(handler: (data: Uint8Array | string) => void): () => void {
113
- const disposable = this.terminal.onData((data: string) => handler(data));
114
- return () => disposable.dispose();
143
+ this.dataHandlers.add(handler);
144
+ return () => this.dataHandlers.delete(handler);
115
145
  }
116
146
 
117
147
  fit(): TerminalDimensions {
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "remo-cli"
7
- version = "2.2.0rc6"
7
+ version = "2.2.0rc7"
8
8
  description = "Remote development environment CLI"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -1038,7 +1038,7 @@ wheels = [
1038
1038
 
1039
1039
  [[package]]
1040
1040
  name = "remo-cli"
1041
- version = "2.2.0rc6"
1041
+ version = "2.2.0rc7"
1042
1042
  source = { editable = "." }
1043
1043
  dependencies = [
1044
1044
  { name = "ansible-core" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes