portacode 1.4.12.dev6__py3-none-any.whl → 1.4.12.dev8__py3-none-any.whl

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.
portacode/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '1.4.12.dev6'
32
- __version_tuple__ = version_tuple = (1, 4, 12, 'dev6')
31
+ __version__ = version = '1.4.12.dev8'
32
+ __version_tuple__ = version_tuple = (1, 4, 12, 'dev8')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -468,13 +468,7 @@ def _build_bootstrap_steps(user: str, password: str, ssh_key: str) -> List[Dict[
468
468
  steps.extend([
469
469
  {"name": "pip_upgrade", "cmd": "python3 -m pip install --upgrade pip", "retries": 0},
470
470
  {"name": "install_portacode", "cmd": "python3 -m pip install --upgrade portacode", "retries": 0},
471
- {
472
- "name": "portacode_connect",
473
- "type": "portacode_connect",
474
- "timeout_s": 30,
475
- "retries": 2,
476
- "retry_delay_s": 5,
477
- },
471
+ {"name": "portacode_connect", "type": "portacode_connect", "timeout_s": 30},
478
472
  ])
479
473
  return steps
480
474
 
@@ -708,14 +702,24 @@ def _portacode_connect_and_read_key(vmid: int, user: str, timeout_s: int = 10) -
708
702
 
709
703
  last_pub = last_priv = None
710
704
  stable = 0
705
+ history: List[Dict[str, Any]] = []
706
+
711
707
  while time.time() - start < timeout_s:
712
708
  if proc.poll() is not None:
713
709
  out, err = proc.communicate(timeout=1)
710
+ history.append(
711
+ {
712
+ "timestamp_s": round(time.time() - start, 2),
713
+ "status": "process_exited",
714
+ "returncode": proc.returncode,
715
+ }
716
+ )
714
717
  return {
715
718
  "ok": False,
716
719
  "error": "portacode connect exited before keys were created",
717
720
  "stdout": (out or "").strip(),
718
721
  "stderr": (err or "").strip(),
722
+ "history": history,
719
723
  }
720
724
  pub_size = file_size(pub_path)
721
725
  priv_size = file_size(priv_path)
@@ -726,7 +730,23 @@ def _portacode_connect_and_read_key(vmid: int, user: str, timeout_s: int = 10) -
726
730
  stable = 0
727
731
  last_pub, last_priv = pub_size, priv_size
728
732
  if stable >= 1:
733
+ history.append(
734
+ {
735
+ "timestamp_s": round(time.time() - start, 2),
736
+ "pub_size": pub_size,
737
+ "priv_size": priv_size,
738
+ "stable": stable,
739
+ }
740
+ )
729
741
  break
742
+ history.append(
743
+ {
744
+ "timestamp_s": round(time.time() - start, 2),
745
+ "pub_size": pub_size,
746
+ "priv_size": priv_size,
747
+ "stable": stable,
748
+ }
749
+ )
730
750
  time.sleep(1)
731
751
 
732
752
  if stable < 1:
@@ -736,11 +756,18 @@ def _portacode_connect_and_read_key(vmid: int, user: str, timeout_s: int = 10) -
736
756
  except subprocess.TimeoutExpired:
737
757
  proc.kill()
738
758
  out, err = proc.communicate(timeout=1)
759
+ history.append(
760
+ {
761
+ "timestamp_s": round(time.time() - start, 2),
762
+ "status": "timeout_waiting_for_keys",
763
+ }
764
+ )
739
765
  return {
740
766
  "ok": False,
741
767
  "error": "timed out waiting for portacode key files",
742
768
  "stdout": (out or "").strip(),
743
769
  "stderr": (err or "").strip(),
770
+ "history": history,
744
771
  }
745
772
 
746
773
  proc.terminate()
@@ -753,6 +780,7 @@ def _portacode_connect_and_read_key(vmid: int, user: str, timeout_s: int = 10) -
753
780
  return {
754
781
  "ok": True,
755
782
  "public_key": key_res["stdout"].strip(),
783
+ "history": history,
756
784
  }
757
785
 
758
786
 
@@ -785,26 +813,15 @@ def _run_setup_steps(
785
813
  progress_callback(step_index, computed_total, step, "in_progress", None)
786
814
 
787
815
  if step.get("type") == "portacode_connect":
788
- attempts = 0
789
- max_attempts = step.get("retries", 0) + 1
790
- retry_delay = step.get("retry_delay_s", 5)
791
- while True:
792
- attempts += 1
793
- res = _portacode_connect_and_read_key(vmid, user, timeout_s=step.get("timeout_s", 10))
794
- res["name"] = step["name"]
795
- res["attempt"] = attempts
796
- results.append(res)
797
- if res.get("ok"):
798
- if progress_callback:
799
- progress_callback(step_index, computed_total, step, "completed", res)
800
- break
801
- will_retry = attempts < max_attempts
816
+ res = _portacode_connect_and_read_key(vmid, user, timeout_s=step.get("timeout_s", 10))
817
+ res["name"] = step["name"]
818
+ results.append(res)
819
+ if not res.get("ok"):
802
820
  if progress_callback:
803
- status = "retrying" if will_retry else "failed"
804
- progress_callback(step_index, computed_total, step, status, res)
805
- if not will_retry:
806
- return results, False
807
- time.sleep(retry_delay)
821
+ progress_callback(step_index, computed_total, step, "failed", res)
822
+ return results, False
823
+ if progress_callback:
824
+ progress_callback(step_index, computed_total, step, "completed", res)
808
825
  continue
809
826
 
810
827
  attempts = 0
@@ -863,8 +880,17 @@ def _bootstrap_portacode(
863
880
  if not ok:
864
881
  details = results[-1] if results else {}
865
882
  summary = details.get("error_summary") or details.get("stderr") or details.get("stdout") or details.get("name")
883
+ history = details.get("history")
884
+ history_snippet = ""
885
+ if isinstance(history, list) and history:
886
+ history_snippet = f" history={history[-3:]}"
866
887
  if summary:
867
- raise RuntimeError(f"Portacode bootstrap steps failed: {summary}")
888
+ logger.warning(
889
+ "Portacode bootstrap failure summary=%s%s",
890
+ summary,
891
+ f" history_len={len(history)}" if history else "",
892
+ )
893
+ raise RuntimeError(f"Portacode bootstrap steps failed: {summary}{history_snippet}")
868
894
  raise RuntimeError("Portacode bootstrap steps failed.")
869
895
  key_step = next((entry for entry in results if entry.get("name") == "portacode_connect"), None)
870
896
  public_key = key_step.get("public_key") if key_step else None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: portacode
3
- Version: 1.4.12.dev6
3
+ Version: 1.4.12.dev8
4
4
  Summary: Portacode CLI client and SDK
5
5
  Home-page: https://github.com/portacode/portacode
6
6
  Author: Meena Erian
@@ -1,7 +1,7 @@
1
1
  portacode/README.md,sha256=4dKtpvR8LNgZPVz37GmkQCMWIr_u25Ao63iW56s7Ke4,775
2
2
  portacode/__init__.py,sha256=oB3sV1wXr-um-RXio73UG8E5Xx6cF2ZVJveqjNmC-vQ,1086
3
3
  portacode/__main__.py,sha256=jmHTGC1hzmo9iKJLv-SSYe9BSIbPPZ2IOpecI03PlTs,296
4
- portacode/_version.py,sha256=xx3S_KMrMvaCb_u6CDGcxc6yRCv1FpMo9IP_Y5NQaeE,719
4
+ portacode/_version.py,sha256=nE85_ZPmwxcGnUUwZo-c56maL3k35W0GWwB3dFJmT-o,719
5
5
  portacode/cli.py,sha256=mGLKoZ-T2FBF7IA9wUq0zyG0X9__-A1ao7gajjcVRH8,21828
6
6
  portacode/data.py,sha256=5-s291bv8J354myaHm1Y7CQZTZyRzMU3TGe5U4hb-FA,1591
7
7
  portacode/keypair.py,sha256=0OO4vHDcF1XMxCDqce61xFTlFwlTcmqe5HyGsXFEt7s,5838
@@ -22,7 +22,7 @@ portacode/connection/handlers/diff_handlers.py,sha256=iYTIRCcpEQ03vIPKZCsMTE5aZb
22
22
  portacode/connection/handlers/file_handlers.py,sha256=nAJH8nXnX07xxD28ngLpgIUzcTuRwZBNpEGEKdRqohw,39507
23
23
  portacode/connection/handlers/project_aware_file_handlers.py,sha256=AqgMnDqX2893T2NsrvUSCwjN5VKj4Pb2TN0S_SuboOE,9803
24
24
  portacode/connection/handlers/project_state_handlers.py,sha256=v6ZefGW9i7n1aZLq2jOGumJIjYb6aHlPI4m1jkYewm8,1686
25
- portacode/connection/handlers/proxmox_infra.py,sha256=Ah-92sfur0TBIL_fHE-ro7cgqG_WqTs8G2opouzGwXQ,52209
25
+ portacode/connection/handlers/proxmox_infra.py,sha256=9YYIZFf1uMcB67vBqPA14gQd14-QZo-DX8eS7mekF14,53103
26
26
  portacode/connection/handlers/registry.py,sha256=qXGE60sYEWg6ZtVQzFcZ5YI2XWR6lMgw4hAL9x5qR1I,6181
27
27
  portacode/connection/handlers/session.py,sha256=uNGfiO_1B9-_yjJKkpvmbiJhIl6b-UXlT86UTfd6WYE,42219
28
28
  portacode/connection/handlers/system_handlers.py,sha256=AKh7IbwptlLYrbSw5f-DHigvlaKHsg9lDP-lkAUm8cE,10755
@@ -64,7 +64,7 @@ portacode/utils/__init__.py,sha256=NgBlWTuNJESfIYJzP_3adI1yJQJR0XJLRpSdVNaBAN0,3
64
64
  portacode/utils/diff_apply.py,sha256=4Oi7ft3VUCKmiUE4VM-OeqO7Gk6H7PF3WnN4WHXtjxI,15157
65
65
  portacode/utils/diff_renderer.py,sha256=S76StnQ2DLfsz4Gg0m07UwPfRp8270PuzbNaQq-rmYk,13850
66
66
  portacode/utils/ntp_clock.py,sha256=VqCnWCTehCufE43W23oB-WUdAZGeCcLxkmIOPwInYHc,2499
67
- portacode-1.4.12.dev6.dist-info/licenses/LICENSE,sha256=2FGbCnUDgRYuQTkB1O1dUUpu5CVAjK1j4_p6ack9Z54,1066
67
+ portacode-1.4.12.dev8.dist-info/licenses/LICENSE,sha256=2FGbCnUDgRYuQTkB1O1dUUpu5CVAjK1j4_p6ack9Z54,1066
68
68
  test_modules/README.md,sha256=Do_agkm9WhSzueXjRAkV_xEj6Emy5zB3N3VKY5Roce8,9274
69
69
  test_modules/__init__.py,sha256=1LcbHodIHsB0g-g4NGjSn6AMuCoGbymvXPYLOb6Z7F0,53
70
70
  test_modules/test_device_online.py,sha256=QtYq0Dq9vME8Gp2O4fGSheqVf8LUtpsSKosXXk56gGM,1654
@@ -90,8 +90,8 @@ testing_framework/core/playwright_manager.py,sha256=Tw46qwxIhOFkS48C2IWIQHHNpEe-
90
90
  testing_framework/core/runner.py,sha256=j2QwNJmAxVBmJvcbVS7DgPJUKPNzqfLmt_4NNdaKmZU,19297
91
91
  testing_framework/core/shared_cli_manager.py,sha256=BESSNtyQb7BOlaOvZmm04T8Uezjms4KCBs2MzTxvzYQ,8790
92
92
  testing_framework/core/test_discovery.py,sha256=2FZ9fJ8Dp5dloA-fkgXoJ_gCMC_nYPBnA3Hs2xlagzM,4928
93
- portacode-1.4.12.dev6.dist-info/METADATA,sha256=Lupv2cPUyEr2kc4qrOe8jnf8KLOKgedEn4jqLBtiG20,13051
94
- portacode-1.4.12.dev6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
95
- portacode-1.4.12.dev6.dist-info/entry_points.txt,sha256=lLUUL-BM6_wwe44Xv0__5NQ1BnAz6jWjSMFvZdWW3zU,48
96
- portacode-1.4.12.dev6.dist-info/top_level.txt,sha256=TGhTYUxfW8SyVZc_zGgzjzc24gGT7nSw8Qf73liVRKM,41
97
- portacode-1.4.12.dev6.dist-info/RECORD,,
93
+ portacode-1.4.12.dev8.dist-info/METADATA,sha256=j1-Q9VdU_Jceje1hG31JZ9YDUFfh--0GhmCIJlCtGTk,13051
94
+ portacode-1.4.12.dev8.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
95
+ portacode-1.4.12.dev8.dist-info/entry_points.txt,sha256=lLUUL-BM6_wwe44Xv0__5NQ1BnAz6jWjSMFvZdWW3zU,48
96
+ portacode-1.4.12.dev8.dist-info/top_level.txt,sha256=TGhTYUxfW8SyVZc_zGgzjzc24gGT7nSw8Qf73liVRKM,41
97
+ portacode-1.4.12.dev8.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5