Tags: Meirtz/Shinken
Tags
feat(#206): wire sandbox.checkpoint() to snapshot_ref — link replay t… …o runtime state (#211) B(2): connect checkpoints to the replay log so a checkpoint id is anchored at the exact `.skn` event offset it was taken at — the replay↔runtime-state link. - `Recorder.snapshot_ref(checkpoint_id, *, name, agent_state_ref)` emits a `snapshot_ref` event whose `snapshot_ref` field is the checkpoint id (the event's own `seq` is the offset); `Recorder.current_seq` exposes that offset. - `sandbox.checkpoint(name, *, agent_state_ref)` (async + sync facade): calls `provider.checkpoint(handle, event_seq=<current offset>, agent_state_ref=...)` off-thread, then records the `snapshot_ref` event. Requires a provider-managed session (clear error otherwise). - `provider.connect()` (base) now injects the provider+handle context, so any provider-opened Sandbox can checkpoint (Docker inherits it via super().connect). - `.skn` schema: `snapshot_ref` field description updated — it IS emitted now (was "never"), as a pointer to a provider-held checkpoint (a `.skn` is still a replay bundle, not the substrate state). Packaged copy synced. Tests: the snapshot_ref event shape; checkpoint records it at the offset handed to the provider; provider-context required; end-to-end via DockerLocalProvider (docker commit mocked). Full SDK suite 314 passing; ruff clean. CI quota-blocked, verified locally. Part of #206.
feat(#59): optional PyAutoGUI synthetic GUI execution backend (#204) Adds a PyAutoGUI action backend behind the existing executor abstraction, selectable with SHINKEND_EXECUTOR=pyautogui (#58's mechanism). - `PyAutoGuiExecutor` (shinkend/src/pyautogui.rs) maps the typed verb subset (move/click/double_click/right_click/scroll/type_text/key/wait) to a FIXED helper program invoked as a subprocess, with parameters passed as discrete argv — never interpolated into code, so no arbitrary Python runs over ACI. - Fails clearly at startup when Python or PyAutoGUI is unavailable (`python3 -c "import pyautogui"` probe; interpreter via $SHINKEND_PYTHON). - Wired into BackendChoice + the SHINKEND_EXECUTOR parser; point_norm targets are rejected with a clear message (normalize to point_px first). - 3 command-construction tests cover every verb's argv + rejection of unsupported verbs / missing params / point_norm — no live desktop required. The Linux image is unchanged (pyautogui is opt-in; install separately). cargo fmt/test (46)/clippy clean. CI is quota/billing-blocked repo-wide (0-step failures); verified locally with the exact CI commands. Closes #59.