witbitz-code 1.6.2__tar.gz → 1.6.3__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 (100) hide show
  1. {witbitz_code-1.6.2/src/witbitz_code.egg-info → witbitz_code-1.6.3}/PKG-INFO +1 -1
  2. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/pyproject.toml +1 -1
  3. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/__init__.py +1 -1
  4. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/ui.py +6 -2
  5. {witbitz_code-1.6.2 → witbitz_code-1.6.3/src/witbitz_code.egg-info}/PKG-INFO +1 -1
  6. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_ui.py +13 -0
  7. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/LICENSE +0 -0
  8. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/README.md +0 -0
  9. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/setup.cfg +0 -0
  10. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/__main__.py +0 -0
  11. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/_js.py +0 -0
  12. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/account.py +0 -0
  13. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/asks.py +0 -0
  14. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/attachments.py +0 -0
  15. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/auto.py +0 -0
  16. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/auto_runner.py +0 -0
  17. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/cli.py +0 -0
  18. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/codekeys.py +0 -0
  19. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/codetools.py +0 -0
  20. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/compress.py +0 -0
  21. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/computers.py +0 -0
  22. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/confidential.py +0 -0
  23. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/confidential_models.json +0 -0
  24. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/connector.py +0 -0
  25. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/devicelink.py +0 -0
  26. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/dirs.py +0 -0
  27. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/folders.py +0 -0
  28. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/gateway.py +0 -0
  29. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/icons/witbitz-code-wsl.ico +0 -0
  30. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/icons/witbitz-code.ico +0 -0
  31. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/keys.py +0 -0
  32. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/link.py +0 -0
  33. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/mkdir.py +0 -0
  34. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/models.py +0 -0
  35. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/net.py +0 -0
  36. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/offered_models.json +0 -0
  37. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/opencode_plugins/notes-init.md +0 -0
  38. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/opencode_plugins/witbitz-media-server.mjs +0 -0
  39. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/opencode_plugins/witbitz-notes.js +0 -0
  40. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/opencode_plugins/witbitz-progress.js +0 -0
  41. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/outputs.py +0 -0
  42. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/pair.py +0 -0
  43. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/pairings.py +0 -0
  44. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/payers.py +0 -0
  45. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/plugins.py +0 -0
  46. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/policy.py +0 -0
  47. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/ports.py +0 -0
  48. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/qr.py +0 -0
  49. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/receipt.py +0 -0
  50. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/relay.py +0 -0
  51. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/seen.py +0 -0
  52. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/tinfoil_read.py +0 -0
  53. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/tools_catalog.json +0 -0
  54. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/tools_probe.py +0 -0
  55. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/toolsetup.py +0 -0
  56. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/ui_static/app.css +0 -0
  57. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/ui_static/app.js +0 -0
  58. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/ui_static/index.html +0 -0
  59. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/uitools.py +0 -0
  60. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/uninstall.py +0 -0
  61. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/winagent.py +0 -0
  62. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/winbg.py +0 -0
  63. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/winconsole.py +0 -0
  64. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/wizard.py +0 -0
  65. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code/wslstart.py +0 -0
  66. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code.egg-info/SOURCES.txt +0 -0
  67. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code.egg-info/dependency_links.txt +0 -0
  68. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code.egg-info/entry_points.txt +0 -0
  69. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code.egg-info/requires.txt +0 -0
  70. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/src/witbitz_code.egg-info/top_level.txt +0 -0
  71. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_asks.py +0 -0
  72. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_attachments.py +0 -0
  73. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_auto.py +0 -0
  74. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_cli.py +0 -0
  75. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_codekeys.py +0 -0
  76. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_codetools.py +0 -0
  77. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_confidential.py +0 -0
  78. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_connector_e2e.py +0 -0
  79. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_devicelink.py +0 -0
  80. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_dirs.py +0 -0
  81. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_files_and_compress.py +0 -0
  82. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_folders.py +0 -0
  83. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_outputs.py +0 -0
  84. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_pair_flows.py +0 -0
  85. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_plugins.py +0 -0
  86. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_policy.py +0 -0
  87. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_ports.py +0 -0
  88. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_ports_win.py +0 -0
  89. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_registry.py +0 -0
  90. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_relay_codec.py +0 -0
  91. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_setup.py +0 -0
  92. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_tools_probe.py +0 -0
  93. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_toolsetup.py +0 -0
  94. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_uitools.py +0 -0
  95. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_uninstall.py +0 -0
  96. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_winagent.py +0 -0
  97. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_winbg.py +0 -0
  98. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_winconsole.py +0 -0
  99. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_windows_files.py +0 -0
  100. {witbitz_code-1.6.2 → witbitz_code-1.6.3}/tests/test_wslstart.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: witbitz-code
3
- Version: 1.6.2
3
+ Version: 1.6.3
4
4
  Summary: Reach OpenCode on this computer from the Witbitz Spaces Code section, through an end-to-end sealed relay.
5
5
  Author: Witbitz
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "witbitz-code"
7
- version = "1.6.2"
7
+ version = "1.6.3"
8
8
  description = "Reach OpenCode on this computer from the Witbitz Spaces Code section, through an end-to-end sealed relay."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -4,4 +4,4 @@ The Python implementation of tools/witbitz-code.mjs (docs/opencode-relay.md phas
4
4
  vectors and cross-implementation tests.
5
5
  """
6
6
 
7
- __version__ = "1.6.2"
7
+ __version__ = "1.6.3"
@@ -63,11 +63,15 @@ def computer_label() -> dict:
63
63
  def open_browser(url: str) -> bool:
64
64
  """WSL has no browser of its own: ask Windows (wslview, then cmd's start, then explorer)."""
65
65
  if ports.on_wsl():
66
+ # WAIT for the hand-off (~0.4 s measured): a second copy started from the Start menu finds the first, opens its page
67
+ # and exits — and an opener still running then was cut off with it (the owner, 2026-10-09: "the wsl does not open
68
+ # anything"). From a Windows folder, or cmd says "UNC paths are not supported".
69
+ cwd = "/mnt/c" if os.path.isdir("/mnt/c") else None
66
70
  for argv in (["wslview", url], ["cmd.exe", "/c", "start", "", url], ["explorer.exe", url]):
67
71
  try:
68
- subprocess.Popen(argv, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) # noqa: S603 — fixed argv, our own URL
72
+ subprocess.run(argv, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, cwd=cwd, timeout=15, check=False) # noqa: S603 — fixed argv, our own URL
69
73
  return True
70
- except OSError:
74
+ except (OSError, subprocess.SubprocessError):
71
75
  continue
72
76
  return False
73
77
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: witbitz-code
3
- Version: 1.6.2
3
+ Version: 1.6.3
4
4
  Summary: Reach OpenCode on this computer from the Witbitz Spaces Code section, through an end-to-end sealed relay.
5
5
  Author: Witbitz
6
6
  License-Expression: MIT
@@ -263,3 +263,16 @@ def test_quit_stops_serving_and_ends_the_manager():
263
263
  await m.shutdown()
264
264
  await srv.close()
265
265
  run(go())
266
+
267
+
268
+ def test_in_wsl_the_page_opener_is_waited_for(monkeypatch):
269
+ """A second copy (the Start-menu entry) opens the first one's page and exits: an opener still running was cut off with
270
+ it (the owner, 2026-10-09: "the wsl does not open anything")."""
271
+ import subprocess as sp
272
+ calls = []
273
+ monkeypatch.setattr(ui.ports, "on_wsl", lambda: True)
274
+ monkeypatch.setattr(ui.subprocess, "run", lambda argv, **kw: calls.append((argv, kw)) or sp.CompletedProcess(argv, 0))
275
+ monkeypatch.setattr(ui.subprocess, "Popen", lambda *a, **k: (_ for _ in ()).throw(AssertionError("never fire-and-forget")))
276
+ assert ui.open_browser("http://127.0.0.1:4291/?t=x") is True
277
+ argv, kw = calls[0]
278
+ assert argv == ["wslview", "http://127.0.0.1:4291/?t=x"] and kw["timeout"] == 15
File without changes
File without changes
File without changes