witbitz-code 1.10.0__tar.gz → 1.10.1__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 (118) hide show
  1. {witbitz_code-1.10.0/src/witbitz_code.egg-info → witbitz_code-1.10.1}/PKG-INFO +1 -1
  2. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/pyproject.toml +1 -1
  3. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/__init__.py +1 -1
  4. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/ui_static/app.js +3 -3
  5. {witbitz_code-1.10.0 → witbitz_code-1.10.1/src/witbitz_code.egg-info}/PKG-INFO +1 -1
  6. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code.egg-info/SOURCES.txt +1 -0
  7. witbitz_code-1.10.1/tests/test_ui_page.py +50 -0
  8. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/LICENSE +0 -0
  9. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/README.md +0 -0
  10. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/setup.cfg +0 -0
  11. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/__main__.py +0 -0
  12. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/_js.py +0 -0
  13. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/account.py +0 -0
  14. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/asks.py +0 -0
  15. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/attachments.py +0 -0
  16. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/auto.py +0 -0
  17. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/auto_runner.py +0 -0
  18. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/browse.py +0 -0
  19. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/browsetree.py +0 -0
  20. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/cli.py +0 -0
  21. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/codekeys.py +0 -0
  22. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/codetools.py +0 -0
  23. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/compress.py +0 -0
  24. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/computers.py +0 -0
  25. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/confidential.py +0 -0
  26. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/confidential_models.json +0 -0
  27. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/connector.py +0 -0
  28. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/devicelink.py +0 -0
  29. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/dirs.py +0 -0
  30. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/folders.py +0 -0
  31. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/gateway.py +0 -0
  32. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/icons/witbitz-code-wsl.ico +0 -0
  33. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/icons/witbitz-code.ico +0 -0
  34. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/images.py +0 -0
  35. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/keys.py +0 -0
  36. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/link.py +0 -0
  37. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/mkdir.py +0 -0
  38. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/models.py +0 -0
  39. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/net.py +0 -0
  40. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/offered_models.json +0 -0
  41. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/opencode_plugins/notes-init.md +0 -0
  42. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/opencode_plugins/witbitz-browse-cdp.mjs +0 -0
  43. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/opencode_plugins/witbitz-browse-local.mjs +0 -0
  44. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/opencode_plugins/witbitz-browse-publisher.mjs +0 -0
  45. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/opencode_plugins/witbitz-browse-tree.mjs +0 -0
  46. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/opencode_plugins/witbitz-browser.js +0 -0
  47. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/opencode_plugins/witbitz-media-server.mjs +0 -0
  48. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/opencode_plugins/witbitz-notes.js +0 -0
  49. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/opencode_plugins/witbitz-progress.js +0 -0
  50. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/outputs.py +0 -0
  51. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/pair.py +0 -0
  52. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/pairings.py +0 -0
  53. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/payers.py +0 -0
  54. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/plugins.py +0 -0
  55. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/policy.py +0 -0
  56. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/ports.py +0 -0
  57. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/qr.py +0 -0
  58. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/receipt.py +0 -0
  59. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/relay.py +0 -0
  60. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/remind.py +0 -0
  61. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/seccheck.py +0 -0
  62. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/seen.py +0 -0
  63. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/selfupdate.py +0 -0
  64. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/tinfoil_read.py +0 -0
  65. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/tools_catalog.json +0 -0
  66. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/tools_probe.py +0 -0
  67. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/toolsetup.py +0 -0
  68. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/ui.py +0 -0
  69. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/ui_static/app.css +0 -0
  70. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/ui_static/index.html +0 -0
  71. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/uitools.py +0 -0
  72. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/uninstall.py +0 -0
  73. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/winagent.py +0 -0
  74. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/winbg.py +0 -0
  75. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/winconsole.py +0 -0
  76. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/wizard.py +0 -0
  77. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code/wslstart.py +0 -0
  78. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code.egg-info/dependency_links.txt +0 -0
  79. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code.egg-info/entry_points.txt +0 -0
  80. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code.egg-info/requires.txt +0 -0
  81. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/src/witbitz_code.egg-info/top_level.txt +0 -0
  82. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_asks.py +0 -0
  83. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_attachments.py +0 -0
  84. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_auto.py +0 -0
  85. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_browse.py +0 -0
  86. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_browsetree.py +0 -0
  87. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_cli.py +0 -0
  88. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_codekeys.py +0 -0
  89. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_codetools.py +0 -0
  90. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_confidential.py +0 -0
  91. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_connector_e2e.py +0 -0
  92. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_devicelink.py +0 -0
  93. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_dirs.py +0 -0
  94. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_files_and_compress.py +0 -0
  95. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_folders.py +0 -0
  96. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_images.py +0 -0
  97. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_outputs.py +0 -0
  98. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_pair_flows.py +0 -0
  99. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_plugins.py +0 -0
  100. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_policy.py +0 -0
  101. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_ports.py +0 -0
  102. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_ports_win.py +0 -0
  103. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_registry.py +0 -0
  104. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_relay_codec.py +0 -0
  105. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_remind.py +0 -0
  106. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_seccheck.py +0 -0
  107. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_selfupdate.py +0 -0
  108. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_setup.py +0 -0
  109. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_tools_probe.py +0 -0
  110. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_toolsetup.py +0 -0
  111. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_ui.py +0 -0
  112. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_uitools.py +0 -0
  113. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_uninstall.py +0 -0
  114. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_winagent.py +0 -0
  115. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_winbg.py +0 -0
  116. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_winconsole.py +0 -0
  117. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_windows_files.py +0 -0
  118. {witbitz_code-1.10.0 → witbitz_code-1.10.1}/tests/test_wslstart.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: witbitz-code
3
- Version: 1.10.0
3
+ Version: 1.10.1
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.10.0"
7
+ version = "1.10.1"
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.10.0"
7
+ __version__ = "1.10.1"
@@ -65,7 +65,7 @@ function render(s) {
65
65
  if (s.paired.length > 1 && p.computer) { // by the pairing's own id: by email it took both of one email's pairings
66
66
  const out = document.createElement('button'); out.type = 'button'; out.className = 'ghost danger small'; out.textContent = 'Unpair'
67
67
  out.disabled = !!s.busy
68
- out.onclick = () => act('/api/unpair', { computer: p.computer }, `Unpair ${label(p)}? Code there stops reaching this computer; the others keep it.`)
68
+ out.onclick = () => act('/api/unpair', { computer: p.computer }, `Unpair ${pairingLabel(p)}? Code there stops reaching this computer; the others keep it.`)
69
69
  li.append(out)
70
70
  }
71
71
  list.append(li)
@@ -144,13 +144,13 @@ async function act(path, body, ask) {
144
144
  return ok
145
145
  }
146
146
 
147
- const label = (p) => `${p.account || 'your account'}${p.app ? ' (' + p.app + ')' : ''}`
147
+ const pairingLabel = (p) => `${p.account || 'your account'}${p.app ? ' (' + p.app + ')' : ''}`
148
148
 
149
149
  /** Which pairing (Pair again) → its unpair body; {} = the only one; null = cancelled. */
150
150
  function pairingOf() {
151
151
  const ps = (state && state.paired) || []
152
152
  if (ps.length <= 1) return {}
153
- const pick = window.prompt('This computer is paired several times. Which one? Type its number:\n' + ps.map((p, i) => `${i + 1}. ${label(p)}`).join('\n'), '1')
153
+ const pick = window.prompt('This computer is paired several times. Which one? Type its number:\n' + ps.map((p, i) => `${i + 1}. ${pairingLabel(p)}`).join('\n'), '1')
154
154
  const p = pick && ps[Number(pick) - 1]
155
155
  return p ? { computer: p.computer } : null
156
156
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: witbitz-code
3
- Version: 1.10.0
3
+ Version: 1.10.1
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
@@ -106,6 +106,7 @@ tests/test_setup.py
106
106
  tests/test_tools_probe.py
107
107
  tests/test_toolsetup.py
108
108
  tests/test_ui.py
109
+ tests/test_ui_page.py
109
110
  tests/test_uitools.py
110
111
  tests/test_uninstall.py
111
112
  tests/test_winagent.py
@@ -0,0 +1,50 @@
1
+ """The page in a real browser: a row's Unpair, clicked (the owner, 2026-10-22: "unpair button does nothing" — the click threw
2
+ "label is not a function": the row helper was shadowed by render()'s own `label`). Skipped where no browser is installed."""
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import glob
7
+ import os
8
+
9
+ import pytest
10
+
11
+ import test_ui as T
12
+
13
+ pw = pytest.importorskip("playwright.async_api")
14
+ CHROME = next(iter(sorted(glob.glob(os.path.expanduser("~/.cache/ms-playwright/chromium-*/chrome-linux*/chrome")))), None)
15
+
16
+
17
+ @pytest.mark.skipif(not CHROME, reason="no Chromium installed for Playwright")
18
+ def test_a_row_s_unpair_asks_then_unpairs_only_that_pairing():
19
+ async def go():
20
+ vaulted = {**T.DESK, "idx": {"room": "r2"}, "computerId": "c-vaulted", "origin": "https://spaces.witbitz.chat",
21
+ "opencodeUrl": "http://127.0.0.1:4098"}
22
+ w = T.TwoAccounts([T.DESK, vaulted])
23
+ m = w.manager(listening=set())
24
+ srv, base = await T.with_server(m)
25
+ await m.start_serving()
26
+ try:
27
+ async with pw.async_playwright() as p:
28
+ b = await p.chromium.launch(executable_path=CHROME)
29
+ pg = await b.new_page()
30
+ said, errors = [], []
31
+ pg.on("dialog", lambda d: (said.append(d.message), asyncio.ensure_future(d.accept())))
32
+ pg.on("pageerror", lambda e: errors.append(str(e)))
33
+ await pg.goto(f"{base}/?t=T0KEN")
34
+ await pg.wait_for_selector("#paired li:nth-child(2) button")
35
+ assert "vaulted app" in await pg.text_content("#paired li:nth-child(2)")
36
+ await pg.click("#paired li:nth-child(2) button")
37
+ for _ in range(60):
38
+ if w.pair_calls:
39
+ break
40
+ await asyncio.sleep(0.05)
41
+ await b.close()
42
+ assert errors == [], errors
43
+ assert said and "(vaulted app)" in said[0]
44
+ assert w.pair_calls == [["--unpair", "--computer", "c-vaulted"]]
45
+ assert [p.get("computerId") for p in w.pairings] == ["c"]
46
+ finally:
47
+ await m.shutdown()
48
+ await srv.close()
49
+
50
+ asyncio.run(go())
File without changes
File without changes
File without changes