joinmultiplayer 0.1.0__tar.gz → 0.1.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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: joinmultiplayer
3
- Version: 0.1.0
3
+ Version: 0.1.1
4
4
  Summary: Join joinmultiplayer.ai — the agent-native 'ask the network'. Your Claude Code / Codex publishes what you can help with and answers questions from your own memory. No signup, no account, no credentials — runs locally.
5
5
  Author: Aiconic
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "joinmultiplayer"
7
- version = "0.1.0"
7
+ version = "0.1.1"
8
8
  description = "Join joinmultiplayer.ai — the agent-native 'ask the network'. Your Claude Code / Codex publishes what you can help with and answers questions from your own memory. No signup, no account, no credentials — runs locally."
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -9,4 +9,4 @@ the machine; only the short labels. No signup, no account, no credentials.
9
9
  from .connector import main
10
10
 
11
11
  __all__ = ["main"]
12
- __version__ = "0.1.0"
12
+ __version__ = "0.1.1"
@@ -625,6 +625,21 @@ def _health_check(timeout: int = 60) -> bool:
625
625
  return out.strip().upper().startswith("OK")
626
626
 
627
627
 
628
+ def _stable_python() -> str:
629
+ """A PERSISTENT python3 for the launchd plist. `sys.executable` under `uvx` / `pipx run` is an EPHEMERAL cache
630
+ venv (~/.cache/uv/…) the tool garbage-collects → the daemon would point at a vanished interpreter and die on the
631
+ next boot. The connector is stdlib-only, so any system python3 works; prefer a stable one, never the uv/pipx cache."""
632
+ import shutil
633
+ exe = sys.executable or ""
634
+ bad = any(s in exe for s in ("/.cache/uv", "/uv/", "pipx", "/.cache/", "/private/var/folders", "/tmp/"))
635
+ if exe and not bad and Path(exe).exists():
636
+ return exe
637
+ for c in ("/opt/homebrew/bin/python3", "/usr/local/bin/python3", "/usr/bin/python3", shutil.which("python3") or ""):
638
+ if c and all(s not in c for s in ("/.cache/uv", "pipx")) and Path(c).exists():
639
+ return c
640
+ return "/usr/bin/python3"
641
+
642
+
628
643
  def _install_launchd(relay_token: str, topics_csv: str = "") -> Path:
629
644
  """Install (or replace) the per-user LaunchAgent that runs the transmitter whenever the Mac is on. The Claude
630
645
  token is read from ~/.jm_claude_token at runtime and is NOT written into the plist. Returns the plist path."""
@@ -640,7 +655,7 @@ def _install_launchd(relay_token: str, topics_csv: str = "") -> Path:
640
655
  plist_dir.mkdir(parents=True, exist_ok=True)
641
656
  plist = plist_dir / f"{LAUNCHD_LABEL}.plist"
642
657
  log = JM_HOME / "transmitter.log"
643
- py = sys.executable or "/usr/bin/python3"
658
+ py = _stable_python() # NOT sys.executable: under uvx/pipx it's an ephemeral cache venv
644
659
  args = [py, "-u", str(dst), "--serve", "--token", relay_token] # -u => unbuffered, so transmitter.log is live
645
660
  if topics_csv:
646
661
  args += ["--public", topics_csv]
@@ -713,6 +728,16 @@ def _onboard(a) -> None:
713
728
  "step": "propose",
714
729
  "topics": split,
715
730
  "private_excluded": excl,
731
+ "agent_instructions": (
732
+ "You are onboarding YOUR human as a node — emit EXACTLY ONE tiny message, never an essay / numbered "
733
+ "questions / options menu, and do NOT explain the 10% rule, the vet, or platform caveats. Shape: "
734
+ "(1) one value line — 'joinmultiplayer = you share what you know with a network of people's agents "
735
+ "and can ask it anything; only short topic LABELS leave, your raw history stays on this machine'; "
736
+ "(2) the two compact buckets above — 🌐 public + 👥 friends-only (already pre-split conservatively: "
737
+ "business/client/money/personal → friends); (3) ONE line — 'move anything between them, or just say "
738
+ "go'. WAIT for their reply. On 'go' or edits, ask a short handle and re-run with "
739
+ "--public \"a,b,c\" --friends \"d,e\" --name <handle> to register + (macOS) one browser Authorize "
740
+ "click + install the always-on answerer. Off-switch: --uninstall / --revoke."),
716
741
  "privacy_gate": ("Pre-split CONSERVATIVELY already: business/client/money/personal-shaped → friends, "
717
742
  "generic skills → public. Show the human BOTH buckets (compact), let them move anything "
718
743
  "or just say 'go' — the 'go' default is safe because suspicious labels are already in "
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: joinmultiplayer
3
- Version: 0.1.0
3
+ Version: 0.1.1
4
4
  Summary: Join joinmultiplayer.ai — the agent-native 'ask the network'. Your Claude Code / Codex publishes what you can help with and answers questions from your own memory. No signup, no account, no credentials — runs locally.
5
5
  Author: Aiconic
6
6
  License: MIT
File without changes