session-peer 1.3.1__tar.gz → 1.3.2__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.
- {session_peer-1.3.1 → session_peer-1.3.2}/PKG-INFO +5 -3
- {session_peer-1.3.1 → session_peer-1.3.2}/README.ja.md +3 -1
- {session_peer-1.3.1 → session_peer-1.3.2}/README.ko.md +3 -1
- {session_peer-1.3.1 → session_peer-1.3.2}/README.md +3 -1
- {session_peer-1.3.1 → session_peer-1.3.2}/README.zh-CN.md +3 -1
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/README.md +2 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/i18n-manifest.json +6 -5
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/README.md +2 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/mcp.md +6 -2
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/paired-devices.md +16 -0
- session_peer-1.3.2/docs/ja/releases/v1.3.2.md +37 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/README.md +2 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/mcp.md +7 -3
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/paired-devices.md +16 -0
- session_peer-1.3.2/docs/ko/releases/v1.3.2.md +37 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/mcp.md +5 -1
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/paired-devices.md +16 -0
- session_peer-1.3.2/docs/releases/v1.3.2.md +37 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/README.md +2 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/mcp.md +7 -3
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/paired-devices.md +16 -0
- session_peer-1.3.2/docs/zh-CN/releases/v1.3.2.md +37 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/pyproject.toml +1 -1
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer.py +1 -1
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/common.py +1 -1
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_relay/app.py +59 -1
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_relay/cli.py +1 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/.agents/plugins/marketplace.json +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/.gitattributes +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/.gitignore +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/LICENSE +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/SECURITY.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/deploy/README.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/deploy/examples/authenticated-control/README.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/deploy/examples/authenticated-control/session-peer-control.service +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/deploy/examples/static-account/README.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/deploy/examples/static-account/session-peer-relay.service +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/agent-adapters.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ai-assistant-guide.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/antigravity.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/architecture/agent-transports.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/assets/session-peer-live-codex-claude.gif +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/cli-reference.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/compatibility-v1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/contracts/handoff-v1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/diagnostics.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/download-metrics.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/handoff-runtime.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/agent-adapters.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/ai-assistant-guide.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/antigravity.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/architecture/agent-transports.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/cli-reference.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/compatibility-v1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/contracts/handoff-v1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/diagnostics.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/download-metrics.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/handoff-runtime.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/multi-home-list.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/relay-auth.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/relay-development-plan.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/relay-edge-policy.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/relay-google-bootstrap.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/relay-lifecycle.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/relay-public-pilot-2026-09-17.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/relay-watchdog.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v0.6.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v0.6.2.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v0.7.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v0.8.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v0.9.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v1.0.0-alpha.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v1.0.0-beta.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v1.0.0-rc.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v1.0.0-rc.2.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v1.0.0-rc.3.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v1.0.0-rc.4.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v1.0.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v1.0.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v1.0.2.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v1.0.3.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v1.0.4.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v1.1.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v1.1.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v1.1.2.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v1.2.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v1.2.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v1.3.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/releases/v1.3.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/validation/69-rc.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/validation/85-antigravity.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ja/wake.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/agent-adapters.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/ai-assistant-guide.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/antigravity.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/architecture/agent-transports.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/cli-reference.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/compatibility-v1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/contracts/handoff-v1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/diagnostics.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/download-metrics.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/handoff-runtime.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/multi-home-list.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/relay-auth.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/relay-development-plan.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/relay-edge-policy.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/relay-google-bootstrap.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/relay-lifecycle.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/relay-public-pilot-2026-09-17.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/relay-watchdog.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v0.6.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v0.6.2.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v0.7.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v0.8.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v0.9.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v1.0.0-alpha.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v1.0.0-beta.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v1.0.0-rc.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v1.0.0-rc.2.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v1.0.0-rc.3.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v1.0.0-rc.4.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v1.0.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v1.0.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v1.0.2.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v1.0.3.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v1.0.4.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v1.1.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v1.1.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v1.1.2.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v1.2.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v1.2.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v1.3.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/releases/v1.3.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/validation/69-rc.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/validation/85-antigravity.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/ko/wake.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/multi-home-list.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/relay-auth.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/relay-development-plan.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/relay-edge-policy.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/relay-google-bootstrap.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/relay-lifecycle.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/relay-public-pilot-2026-09-17.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/relay-watchdog.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v0.6.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v0.6.2.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v0.7.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v0.8.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v0.9.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v1.0.0-alpha.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v1.0.0-beta.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v1.0.0-rc.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v1.0.0-rc.2.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v1.0.0-rc.3.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v1.0.0-rc.4.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v1.0.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v1.0.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v1.0.2.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v1.0.3.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v1.0.4.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v1.1.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v1.1.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v1.1.2.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v1.2.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v1.2.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v1.3.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/releases/v1.3.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/validation/69-rc.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/validation/85-antigravity.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/wake.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/agent-adapters.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/ai-assistant-guide.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/antigravity.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/architecture/agent-transports.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/cli-reference.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/compatibility-v1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/contracts/handoff-v1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/diagnostics.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/download-metrics.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/handoff-runtime.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/multi-home-list.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/relay-auth.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/relay-development-plan.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/relay-edge-policy.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/relay-google-bootstrap.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/relay-lifecycle.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/relay-public-pilot-2026-09-17.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/relay-watchdog.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v0.6.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v0.6.2.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v0.7.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v0.8.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v0.9.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v1.0.0-alpha.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v1.0.0-beta.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v1.0.0-rc.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v1.0.0-rc.2.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v1.0.0-rc.3.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v1.0.0-rc.4.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v1.0.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v1.0.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v1.0.2.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v1.0.3.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v1.0.4.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v1.1.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v1.1.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v1.1.2.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v1.2.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v1.2.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v1.3.0.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/releases/v1.3.1.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/validation/69-rc.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/validation/85-antigravity.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/docs/zh-CN/wake.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/plugins/session-peer/.codex-plugin/plugin.json +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/plugins/session-peer/.mcp.json +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/plugins/session-peer/README.ja.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/plugins/session-peer/README.ko.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/plugins/session-peer/README.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/plugins/session-peer/README.zh-CN.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/README.md +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/adapters.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/address_cli.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/address_selection.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/addresses.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/antigravity.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/claude.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/cli.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/codex.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/commands.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/diagnostics.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/explanation.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/handoff.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/handoff_process.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/handoff_remote.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/handoff_stdin.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/handoff_watch.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/messages.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/output.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/preset_cli.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/presets.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/registry.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/relay.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/release_verification.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/replies.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/sending.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/ssh.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/ssh_config.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/ssh_identity.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/target_generation.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/update_preferences.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/updates.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_core/wake_chain.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_mcp.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_relay/__init__.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_relay/auth.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_relay/control.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_relay/framing.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_relay/guidance.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_relay/identity.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_relay/lifecycle.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_relay/native.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_relay/pairing_links.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_relay/pairing_ui.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_relay/recovery.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_relay/relay.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_relay/rotation.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_relay/setup.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_relay/store.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_relay/transport_errors.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_relay/wire.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_relay/worker.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_shorthand/__init__.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_shorthand/__main__.py +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_shorthand/sp-remove.sh +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_shorthand/sp.ps1 +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/session_peer_shorthand/sp.sh +0 -0
- {session_peer-1.3.1 → session_peer-1.3.2}/tools/generate_session_peer.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: session-peer
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.2
|
|
4
4
|
Summary: Discover and message Claude Code, Codex, and Antigravity sessions locally, over SSH, through MCP, or via an optional end-to-end encrypted relay.
|
|
5
5
|
Project-URL: Homepage, https://github.com/abruption/session-peer
|
|
6
6
|
Project-URL: Repository, https://github.com/abruption/session-peer
|
|
@@ -26,7 +26,7 @@ Classifier: Topic :: System :: Networking
|
|
|
26
26
|
Classifier: Topic :: Utilities
|
|
27
27
|
Requires-Python: >=3.9
|
|
28
28
|
Provides-Extra: mcp
|
|
29
|
-
Requires-Dist: mcp<2,>=1.
|
|
29
|
+
Requires-Dist: mcp<2,>=1.30; (python_version >= '3.10') and extra == 'mcp'
|
|
30
30
|
Provides-Extra: relay
|
|
31
31
|
Requires-Dist: cryptography<51,>=50.0.1; (python_version >= '3.11') and extra == 'relay'
|
|
32
32
|
Requires-Dist: websockets<18,>=17.1; (python_version >= '3.11') and extra == 'relay'
|
|
@@ -67,7 +67,9 @@ in this ~22-second animation, not a screen recording; send success alone is not
|
|
|
67
67
|
### Install
|
|
68
68
|
|
|
69
69
|
Python 3.9+. The core local/SSH CLI has no third-party Python dependencies.
|
|
70
|
-
Source version: **1.3.
|
|
70
|
+
Source version: **1.3.2**. At the 2026-10-28 preparation checkpoint, the last verified published stable release was **1.3.1**. See the [maintenance release notes](docs/releases/v1.3.2.md) for macOS firewall guidance and Direct listener/TLS diagnostics. Control's Better Auth security update is in repository source, outside Python wheel/sdist, and requires a separately authorized rollout.
|
|
71
|
+
|
|
72
|
+
The optional [MCP extra](docs/mcp.md) now requires `mcp>=1.30,<2`; its Python 3.10+ requirement and the dependency-free Python 3.9 core remain unchanged. Existing MCP environments need an explicit package upgrade.
|
|
71
73
|
|
|
72
74
|
Version 1.3.0 adds delivery explanations, local/SSH route presets and recipient addresses, bounded handoff observation, trusted SSH configuration, pairing links and per-version notice preferences. See the [release scope and verification gates](docs/releases/v1.3.0.md) for supported combinations and limits. Package publication and operational deployment are separate.
|
|
73
75
|
|
|
@@ -33,7 +33,9 @@ session-peer 1.0.2による実際のローカル通信です。CodexがClaude Co
|
|
|
33
33
|
### インストール
|
|
34
34
|
|
|
35
35
|
Python 3.9以上が必要です。基本のローカル・SSH CLIに外部Python依存パッケージはありません。
|
|
36
|
-
ソースバージョン:**1.3.
|
|
36
|
+
ソースバージョン:**1.3.2**。2026-10-28の準備時点で、最後に確認した公開済み安定版は**1.3.1**でした。macOSのファイアウォール案内とDirectリスナー・TLSの診断については、[メンテナンスリリースの案内](docs/ja/releases/v1.3.2.md)を参照してください。ControlのBetter Authセキュリティ更新はリポジトリのソースにあり、Python wheel/sdistには含まれないため、別途承認された配備が必要です。
|
|
37
|
+
|
|
38
|
+
任意の[MCPエクストラ](docs/ja/mcp.md)は`mcp>=1.30,<2`を必要とします。MCPのPython 3.10+要件と依存関係のないPython 3.9コアは変更しません。既存のMCP環境では明示的なパッケージ更新が必要です。
|
|
37
39
|
|
|
38
40
|
1.3.0では配信説明、ローカル・SSH経路プリセットと受信者アドレス帳、時間制限付きhandoff観察、信頼したSSH設定、ペアリングリンク、バージョン別通知設定を追加します。対応する組み合わせと制限は[リリース範囲と検証条件](docs/ja/releases/v1.3.0.md)を参照してください。パッケージ公開と本番環境への配備は別です。
|
|
39
41
|
|
|
@@ -33,7 +33,9 @@ session-peer 1.0.2를 사용해 실제 로컬 요청과 회신을 주고받았
|
|
|
33
33
|
### 설치
|
|
34
34
|
|
|
35
35
|
Python 3.9 이상이 필요합니다. 기본 로컬·SSH CLI는 외부 Python 패키지에 의존하지 않습니다.
|
|
36
|
-
소스 버전: **1.3.
|
|
36
|
+
소스 버전: **1.3.2**. 2026-10-28 준비 시점의 마지막 확인 공개 안정판은 **1.3.1**이었습니다. macOS 방화벽 안내와 Direct 리스너·TLS 진단은 [유지보수 릴리스 안내](docs/ko/releases/v1.3.2.md)를 참고하십시오. Control의 Better Auth 보안 갱신은 저장소 소스에 있으며 Python wheel/sdist에는 포함되지 않으므로 별도로 승인된 배포가 필요합니다.
|
|
37
|
+
|
|
38
|
+
선택형 [MCP extra](docs/ko/mcp.md)는 이제 `mcp>=1.30,<2`를 요구합니다. MCP의 Python 3.10+ 요건과 의존성 없는 Python 3.9 핵심 CLI는 유지됩니다. 기존 MCP 환경에는 명시적인 패키지 업그레이드가 필요합니다.
|
|
37
39
|
|
|
38
40
|
1.3.0에는 전달 설명, 로컬·SSH 경로 프리셋과 수신자 주소록, 유한 시간 handoff 관찰, 신뢰한 SSH 설정, 페어링 링크와 버전별 알림 설정이 추가됩니다. 지원 조합과 제한은 [릴리스 범위와 검증 조건](docs/ko/releases/v1.3.0.md)을 참고하십시오. 패키지 공개와 운영 배포는 별개입니다.
|
|
39
41
|
|
|
@@ -33,7 +33,9 @@ in this ~22-second animation, not a screen recording; send success alone is not
|
|
|
33
33
|
### Install
|
|
34
34
|
|
|
35
35
|
Python 3.9+. The core local/SSH CLI has no third-party Python dependencies.
|
|
36
|
-
Source version: **1.3.
|
|
36
|
+
Source version: **1.3.2**. At the 2026-10-28 preparation checkpoint, the last verified published stable release was **1.3.1**. See the [maintenance release notes](docs/releases/v1.3.2.md) for macOS firewall guidance and Direct listener/TLS diagnostics. Control's Better Auth security update is in repository source, outside Python wheel/sdist, and requires a separately authorized rollout.
|
|
37
|
+
|
|
38
|
+
The optional [MCP extra](docs/mcp.md) now requires `mcp>=1.30,<2`; its Python 3.10+ requirement and the dependency-free Python 3.9 core remain unchanged. Existing MCP environments need an explicit package upgrade.
|
|
37
39
|
|
|
38
40
|
Version 1.3.0 adds delivery explanations, local/SSH route presets and recipient addresses, bounded handoff observation, trusted SSH configuration, pairing links and per-version notice preferences. See the [release scope and verification gates](docs/releases/v1.3.0.md) for supported combinations and limits. Package publication and operational deployment are separate.
|
|
39
41
|
|
|
@@ -33,7 +33,9 @@ session-peer使用各智能体自身的收件箱和队列;接收方智能体
|
|
|
33
33
|
### 安装
|
|
34
34
|
|
|
35
35
|
需要Python 3.9或更高版本。核心本地与SSH CLI没有第三方Python依赖。
|
|
36
|
-
源码版本:**1.3.
|
|
36
|
+
源码版本:**1.3.2**。在2026-10-28的准备检查时,最后确认的已发布稳定版本为**1.3.1**。macOS防火墙说明和Direct监听器/TLS诊断请参阅[维护版本说明](docs/zh-CN/releases/v1.3.2.md)。Control的Better Auth安全更新位于仓库源码中,不包含在Python wheel/sdist内,需另行批准部署。
|
|
37
|
+
|
|
38
|
+
可选的[MCP extra](docs/zh-CN/mcp.md)现在要求`mcp>=1.30,<2`;MCP的Python 3.10+要求和无外部依赖的Python 3.9核心保持不变。现有MCP环境需要显式升级软件包。
|
|
37
39
|
|
|
38
40
|
1.3.0增加传递说明、本地与SSH路由预设及收件人地址簿、有时限的handoff观察、受信任SSH配置、配对链接和按版本设置的通知偏好。支持的组合与限制请参阅[发布范围与验证条件](docs/zh-CN/releases/v1.3.0.md)。软件包发布与生产环境部署是两项独立操作。
|
|
39
41
|
|
|
@@ -24,6 +24,8 @@ installation paths.
|
|
|
24
24
|
|
|
25
25
|
## Development and history
|
|
26
26
|
|
|
27
|
+
- [v1.3.2 maintenance notes](releases/v1.3.2.md) explain macOS firewall approval, Direct listener/TLS diagnostics, the MCP SDK floor and the Control security update outside Python archives, which requires a separate rollout.
|
|
28
|
+
|
|
27
29
|
- [v1.3.1 maintenance notes](releases/v1.3.1.md) cover the Control dependency fix, compatibility skill update and publication/deployment boundaries.
|
|
28
30
|
|
|
29
31
|
- [v1.3.0 release notes](releases/v1.3.0.md) describe the six merged features, supported combinations and release verification.
|
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
"zh-CN"
|
|
8
8
|
],
|
|
9
9
|
"sources": {
|
|
10
|
-
"README.md": "
|
|
11
|
-
"RELEASING.md": "
|
|
10
|
+
"README.md": "bbab4acce7d5bbb1b4a03bd22c48fc71feacc98e231e42d23468309f80be30d1",
|
|
11
|
+
"RELEASING.md": "521f2c857e034714f63118eff5a9fcf8a0a4763b1e6c55b1797eee2a00aab424",
|
|
12
12
|
"SECURITY.md": "8f018f6f98002312e143609b9734aeb971ca5217e146597c06b57b5645031046",
|
|
13
|
-
"docs/README.md": "
|
|
13
|
+
"docs/README.md": "b2113e46b366055cab95b77ab5940236bc8c18217144b9a6dbd08264773968c6",
|
|
14
14
|
"docs/agent-adapters.md": "bf185d3121c94829bb412071a25c4d943302e10a6b2e713111e653b8f8c3ea91",
|
|
15
15
|
"docs/ai-assistant-guide.md": "9624ec96b92fb688fae3be3c94cb3564c77985091be451fbf1f056a1af9b9d9c",
|
|
16
16
|
"docs/antigravity.md": "f2b5122a0ce6e6fb5bd4d8ed50ce2c8bd2dc9c98ec8ce328405cf7c2cd24229d",
|
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
"docs/diagnostics.md": "0949e53612eeab2cd7c7bbda498e14d71e9cb1b1189aa7722030cb8702cd8481",
|
|
22
22
|
"docs/download-metrics.md": "a537300d3fe2b60273b6f4bd84e0ae0944364fda3881d7fb7e32ce665dc2c724",
|
|
23
23
|
"docs/handoff-runtime.md": "a236e48392c91eca0f7c3734a6008a991955ae66d16fd71f97691aac5bf0091f",
|
|
24
|
-
"docs/mcp.md": "
|
|
24
|
+
"docs/mcp.md": "48c761666abc09540fdbdb39b6974b0002e5cc89dda774ac6c24376190fa2c7b",
|
|
25
25
|
"docs/multi-home-list.md": "f8d8e3adf727e4842ea7c4d45e8f6523b11d0513bf2509d4d1204645875e6489",
|
|
26
|
-
"docs/paired-devices.md": "
|
|
26
|
+
"docs/paired-devices.md": "03619867241a2db20d0b2281f17fdef2020ba159b7d565a0f5bc32de3152228d",
|
|
27
27
|
"docs/relay-auth.md": "e6da5291ce6a9da31e79e66ceeff7e9fef7e95046359acbf04d708c96ffab62f",
|
|
28
28
|
"docs/relay-development-plan.md": "0abf750b36275ea4e467a0020e560277f08689f2d574aed7674133705383b1ff",
|
|
29
29
|
"docs/relay-edge-policy.md": "c1c7f7a1c4303943c78ca334dab4034f66c0c272e40c007d07c3da2a496155eb",
|
|
@@ -54,6 +54,7 @@
|
|
|
54
54
|
"docs/releases/v1.2.1.md": "70a3026c2d874a6fd7addcaef840ecfa84bf4f33a0165605217379acffa4fddb",
|
|
55
55
|
"docs/releases/v1.3.0.md": "a422901b83c85cfb48ac0ad2f99dbc82dca46c4929a3016acd15010e4a18188b",
|
|
56
56
|
"docs/releases/v1.3.1.md": "1600b3f6e708ded1cd5d0cad7b5f2d78244e0e4b01d122d727f2a692fccaf652",
|
|
57
|
+
"docs/releases/v1.3.2.md": "fe97d1feec0c3a5ebe04d3b573d2c9872a95b110b9ed57a2ce4989f376e1b96f",
|
|
57
58
|
"docs/validation/69-rc.md": "e490c6a9ad0fec9108b91c74922cedac7ddf214ed405f8f5523da22f48a4b222",
|
|
58
59
|
"docs/validation/85-antigravity.md": "f89b175191cd98ab03d4029b487065133814b3c8dd8de8cd0a5cc367e2579e4f",
|
|
59
60
|
"docs/wake.md": "cde135da2ea7be21c815bb265e694f737dbe467d8e76bb82eb118e3b86e29d22",
|
|
@@ -23,6 +23,8 @@
|
|
|
23
23
|
|
|
24
24
|
## 開発と履歴
|
|
25
25
|
|
|
26
|
+
- [v1.3.2メンテナンス案内](releases/v1.3.2.md)ではmacOSのファイアウォール承認、Directリスナー・TLS診断、MCP SDK下限、Python配布物の外にあるControlのセキュリティ更新と別途の配備について説明します。
|
|
27
|
+
|
|
26
28
|
- [v1.3.1メンテナンス案内](releases/v1.3.1.md)はControlの依存関係修正、互換スキル更新、公開と運用配備の範囲を説明します。
|
|
27
29
|
|
|
28
30
|
- [v1.3.0リリースノート](releases/v1.3.0.md)は、マージ済みの6機能、対応する組み合わせ、リリース検証を説明します。
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Python 3.10 以降でインストールします: `pipx install 'session-peer[mcp]'`(または隔離された venv にエクストラをインストール)。依存関係のない Python 3.9 CLI および `install.sh` は引き続きサポートされます。シェルインストーラーは MCP の依存関係をインストールしません。Python 3.9 では、MCP エントリポイントが Python 3.10+ が必要である旨を報告します。
|
|
4
4
|
|
|
5
|
+
任意のエクストラはMCP SDK `mcp>=1.30,<2`を必要とします。上流の1.xセキュリティ修正を含む版まで依存関係の下限を引き上げるもので、stdio専用のこのサーバーで悪用可能な欠陥を確認したという意味ではありません。HTTP転送、OAuthサーバー経路、MCPクライアント経路は有効にしません。既存環境では明示的なパッケージ更新が必要で、宣言の変更だけではインストール済みSDKは更新されません。
|
|
6
|
+
|
|
5
7
|
`session-peer-mcp --config /absolute/path/policy.json` を起動します。ポリシーがない場合、サーバーは起動環境の Codex ホームを使用して、ローカルの一覧取得のみを許可します。ポリシーを指定するとデフォルトが置き換えられます。例:
|
|
6
8
|
|
|
7
9
|
```json
|
|
@@ -42,12 +44,14 @@ MCP ツールのアノテーションは、一覧取得を読み取り専用、
|
|
|
42
44
|
|
|
43
45
|
MCP エクストラの有無の両方で `python -m unittest discover -s tests -v` を実行します。オプションのテストでは実際の stdio MCP サーバーを起動し、モデルの認証情報なしで初期化、スキーマ、ポリシー拒否、および CLI の部分的な失敗を検証します。wheel と sdist の両方のインストールをテストしてください。実環境チェックでは Codex バージョン、OS、およびホストの承認設定を記録する必要があります。UDS アクセスは環境依存であり、承認のバイパスを約束するものではありません。メッセージには専用のテストセッションを使用してください。
|
|
44
46
|
|
|
45
|
-
|
|
47
|
+
CIではmacOS/LinuxのPython 3.10/3.13で、SDK下限の`mcp==1.30.0`と最新の互換1.xを別々に試験します。両プロファイルでstdio・ポリシー・タイムアウト・キャンセル・所有する子プロセスの終了処理を試験し、解決されたランタイム依存関係を監査して、版とレポートを保存します。推移的依存関係の版は通常の依存関係解決に従って選択されます。すべての推移的パッケージの最小版を試験するものではありません。版を固定したビルド・監査用要件はランタイム環境の外にインストールし、監査対象には初期構成用の`pip`/`setuptools`パッケージも含めます。既存の最新版解決監査とリリース監査も引き続き必須です。
|
|
48
|
+
|
|
49
|
+
公式リファレンス: [Codex MCP](https://developers.openai.com/codex/extend/mcp), [Python MCP SDK](https://github.com/modelcontextprotocol/python-sdk)。 [SDK 1.30.0](https://pypi.org/pypi/mcp/1.30.0/json), [GHSA-84m7-p3x7-pcfv](https://github.com/modelcontextprotocol/python-sdk/security/advisories/GHSA-84m7-p3x7-pcfv), [GHSA-fmmv-w9g8-j3gc](https://github.com/modelcontextprotocol/python-sdk/security/advisories/GHSA-fmmv-w9g8-j3gc).
|
|
46
50
|
|
|
47
51
|
### 非対話型クライアントの承認
|
|
48
52
|
|
|
49
53
|
Codex `exec` は、サーバーポリシーが許可している場合でも「requires approval, but approval policy is never」として send ツールを拒否することがあります。`approval_mode="auto"` は無条件の承認ではありません。非対話型統合を明示的に承認するオペレーターは、制限された宛先ポリシーと併せて、その特定の MCP サーバー/ツールに対して `mcp_servers.session_peer.tools.send_message.approval_mode="approve"` を設定できます。プラグインがこの設定を有効にすることはありません。対話型クライアントは、代わりに通常の承認プロンプトを使用できます。テストクライアントがこの承認設定を無関係なサーバーやツールにコピーしてはなりません。
|
|
50
54
|
|
|
51
|
-
macOS/LinuxではMCP CLI呼び出しごとに新しいプロセスグループを所有します。完了・timeout・取消時はleader
|
|
55
|
+
macOS/LinuxではMCP CLI呼び出しごとに新しいプロセスグループを所有します。完了・timeout・取消時はleaderの回収前に制限時間付きのTERM→KILLでTERMを無視する子も整理し、キャンセルは引き続き伝播します。別sessionへ離脱した子やSSH先のプロセスは対象外です。Windowsは直接の子の終了のみで、ツリー終了は保証しません。ローカル終了で遠隔送信は取り消せません。timeoutは `outcome_unknown` のままで自動再送は禁止です。
|
|
52
56
|
|
|
53
57
|
呼び出し元セッションが不明であることを示す From ラベルを含め、MCP の本文は宛先 CLI の受信側の枠で引用されます。本文のヘッダーや埋め込まれた Reply-To は権限を与えません。第三者への宛先はセッション所有者に確認してください。共有 MCP プロセスは、認証済み呼び出し元セッションや自動返信経路を引き続き提供できません。最終的な枠もネイティブメッセージの上限に含まれます。
|
|
@@ -120,6 +120,22 @@ WebSocket 切断の `closeSource` はコードの受信・送信方向を区別
|
|
|
120
120
|
|
|
121
121
|
1 秒以上開いていた待機ルームが Relay により正常に閉じられた場合、受信側はバックオフを増やさず 0.5 秒後に再接続します。その他の失敗と 1 秒以内に閉じたルームは、引き続き最大 5 秒まで指数バックオフします。Relay レグは両端で 10 秒の WebSocket ping 間隔・タイムアウトを使うため、停止したレグを約 40 秒ではなく約 20 秒で検出します。これは再接続の空白を減らすだけで、停止したネットワーク経路を修復するものではありません。
|
|
122
122
|
|
|
123
|
+
### macOS Directリスナーの確認(#341)
|
|
124
|
+
|
|
125
|
+
この節はv1.3.1以降の未公開の変更を説明します。`device serve`起動時の`ready:true`はローカルリスナーの設定だけを確認します。今回の変更は`directReadyConfirmed:false`を追加します。以前のレシーバーではフィールドがない場合があります。TCP接続、起動準備、ピアTLS成功は別々の観測です。TLSハンドシェイクは未認証のペアリング初期接続の場合もあるため、それだけでペアリング、ネイティブ対象へのアクセス、ACKを証明しません。既存のペアリング設定の準備確認は認証済みprobe/list要求を使います。
|
|
126
|
+
|
|
127
|
+
`--diagnostic-events`を指定すると、今回の変更は`direct_transport`ライフサイクル記録を出力します。`phase`はTCPコールバックへの進入時が`accepted`、ハンドシェイクの成功・失敗時が`peer_tls`です。上限のあるレシーバーごとの累積カウンターは`accepted`、`tlsCompleted`、`tlsFailed`です。単調時計で各段階につき60秒に最大1件、合計で1分に最大2件に制限し、TLS成功と失敗は同じ段階の制限を共有します。正常終了時には0件も含む`summary`スナップショットの出力を追加で1件試み、終了処理を繰り返しても再出力しません。これは終了時のスナップショットであり、定期通知や欠落のないイベント履歴ではありません。接続受け入れの拒否、未完了・キャンセルされたハンドシェイク、カウンターの上限により数値は一致しない場合があります。ベストエフォートのDirect記録にエンドポイントアドレス、ピアID、メッセージデータ、例外原文は含めません。記録がないだけで接続が受け付けられなかったとは断定できません。
|
|
128
|
+
|
|
129
|
+
ファイアウォール許可前に行った2026-10-27の隔離ペアリング試験では、Homebrew Python 3.14.9レシーバーを使うと両方向ともクライアントがTLS段階まで進んだものの`peer_tls/timeout`となり、明示的に試した`0.0.0.0`でも解消しませんでした。一方のMacのpython.org Python 3.13.7レシーバーは、もう一方のMacとのペアリングと認証済みprobeに成功しました。逆方向では、別途選択した短時間のprivate TCP転送プロセスを介してloopback TLSレシーバーに接続した場合だけ成功しました。転送プロセスはTLSを終端せず、TLSのバイト列を解釈せずに渡しました。これらは異なる試験構成であり、一般的な対応保証やmacOS・Tailscale・Pythonの原因確定ではありません。観測範囲は[#341](https://github.com/abruption/session-peer/issues/341)を参照してください。
|
|
130
|
+
|
|
131
|
+
所有者が`Python.app`への着信接続を許可した後、両方のMacで、以前失敗した公開済みv1.3.1のHomebrew Python 3.14.9ランタイム、tailnetのbindアドレス、各機器の同じポートを使ってDirectペアリングと認証済みprobeが成功しました。新しい試験用の識別情報を使い、転送プロセス、別のインタープリター、ネイティブ呼び出しは使っていません。この前後比較は、今回の原因がmacOSアプリケーションファイアウォールの承認待ちだったことを裏付けます。診断PRがネットワーク経路を修復した結果ではありません。
|
|
132
|
+
|
|
133
|
+
[Appleのファイアウォール説明](https://support.apple.com/en-euro/guide/mac-help/mh34041/27/mac/27)によれば、通知に応答するまで着信接続の試みは拒否されます。意図したレシーバーがこの通知を出した場合、所有者は実際のPythonアプリケーションを確認し、必要であれば明示的に許可してください。ファイアウォール、選択したprivate bind、証明書を固定したTLS、受信ポリシーは維持してください。この許可はネイティブエージェントへのアクセスを認めるものではありません。
|
|
134
|
+
|
|
135
|
+
実際に動くPythonイメージ・配布元、macOSバージョン、Tailscaleバージョン・種類、bindアドレス、自己接続かリモート接続かを記録してください。ファイアウォールの許可表示だけでは接続全体の準備を保証しません。リスナーを自動的に`0.0.0.0`へ広げたり、ファイアウォール・アクセス方針・ランタイムを変更したり、転送構成の対応を推定したりしないでください。不確実なペアリング後は`pending`状態と`retryAllowed:false`を保持してください。独立した試験結果は、その状態の再試行や消去を許可するものではありません。
|
|
136
|
+
|
|
137
|
+
記録数には上限がありますが、既存の同期stderrロガーは出力先が詰まった場合の強制的な制限時間を設けていません。
|
|
138
|
+
|
|
123
139
|
## インストール
|
|
124
140
|
|
|
125
141
|
両方のデバイス上の隔離された環境に、PyPI から session-peer v0.9.0 以降をインストールします:
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# v1.3.2 メンテナンスリリース
|
|
2
|
+
|
|
3
|
+
公開済みv1.3.1を基準に2026-10-28に準備しました。Direct機能のソース基準は`dac1c30b1553136b9379be0c6d94eef34ccbad51`で、最終統合リリースコミットではありません。本書は準備範囲を説明します。実際の公開記録は[GitHub Releases](https://github.com/abruption/session-peer/releases)と[PyPI](https://pypi.org/project/session-peer/)で確認してください。
|
|
4
|
+
|
|
5
|
+
PR #345のゲート修正ソース基準は`a68c6cf16c234cd3fe72926e519e4178c093081a`です。マージ済みPR #347後の統合準備基準は、バージョン準備コミットより前の`ef7748a78e6b466f67074708f5c14decf37f31d7`です。最終公開記録でリリースコミットを別途特定します。
|
|
6
|
+
|
|
7
|
+
## 変更内容
|
|
8
|
+
|
|
9
|
+
- #341 / #342:レシーバー起動時の`ready:true`を維持し、`directReadyConfirmed:false`を追加して、ローカルリスナーの設定とリモートからの到達可能性を区別します。TLS完了だけではペアリング、ネイティブ対象へのアクセス、ACKを証明しません。
|
|
10
|
+
- 明示的に選択する`--diagnostic-events`にDirectのコールバック・TLS観測と、上限のあるレシーバーごとの`accepted`、`tlsCompleted`、`tlsFailed`カウンターを追加します。`accepted`と`peer_tls`の段階では合計で60秒に最大2件を記録し、TLS成功・失敗は後者の段階の制限を共有します。正常終了時には0件も含む`summary`の記録を追加で1回試み、終了処理を繰り返しても再試行しません。固定フィールドにアドレス、ピア/セッションID、メッセージデータ、例外原文は含めません。ロギング失敗は元のハンドシェイク例外を置き換えません。既存の同期stderr出力には、出力先が詰まった場合の強制的な制限時間はありません。
|
|
11
|
+
- 実験用TCPプローブはPython 3.9/3.10の`asyncio.TimeoutError`を処理し、Python 3.9/3.13で応答が止まるループバック回帰試験を実施しました。手動の2台のMac・tailnet実験はCIとは別で、`experiments/`はwheel/sdistから除外されます。[実験記録](https://github.com/abruption/session-peer/blob/dac1c30b1553136b9379be0c6d94eef34ccbad51/experiments/macos-direct-listener/README.md)を参照してください。
|
|
12
|
+
- #343 / #345:Node Controlの`better-auth`と`@better-auth/core`の固定版を1.7.5から1.7.7へ更新し、アダプター・telemetryの版もそろえます。上流は[GHSA-965c-763c-88jm](https://github.com/advisories/GHSA-965c-763c-88jm)(重大)、[GHSA-r4xp-prcw-77qf](https://github.com/advisories/GHSA-r4xp-prcw-77qf)(高)、[GHSA-44jh-23m7-hpcf](https://github.com/advisories/GHSA-44jh-23m7-hpcf)(低)の最初の修正版を1.7.7としています。
|
|
13
|
+
- #344 / #345:保護された読み取り区間に入ってからだけREADYを通知するよう、SIGINT試験を同期します。macOS Python 3.13で観測されたシグナル終了(-2)と想定する処理済み終了130の競合に対応し、製品のシグナル動作ではなく試験の同期を変更します。固定sleepや弱いアサーションでこの境界を代用せず、過去のCI失敗の正確な原因も確定していません。
|
|
14
|
+
|
|
15
|
+
- #346 / #347:オプションのMCP SDK要件を`mcp>=1.30,<2`へ引き上げます。コアのPython 3.9下限とMCPのPython 3.10+マーカーは維持します。POSIX CIはMac/Linux、Python 3.10/3.13、正確な下限`1.30.0`または最新の互換`1.x`という2つのSDKプロファイルを組み合わせた8セルです。間接依存関係は通常どおり解決し、下限プロファイルは全パッケージの最低版を検証するものではありません。インストール済みSDKの標準入出力(`stdio`)契約チェックは、HTTP/OAuthの露出や悪用可能性を立証しません。
|
|
16
|
+
|
|
17
|
+
PR #345の2つのゲート修正は個別レビュー済みのコミットとしてマージされ、PR #347のMCP下限・CIプロファイルもマージされました。レビュー対象のPR #347コミットはMCPの全8セルを含む32チェックに成功し、自動Codexコード・セキュリティレビューも別途指摘なしで完了しました。このPR結果は保護された最終mainの検証や公開証拠に代わるものではありません。リリース準備PRのマージ前に現在のmainの検証成功を必須とします。
|
|
18
|
+
|
|
19
|
+
## 原因と互換性の範囲
|
|
20
|
+
|
|
21
|
+
所有者がPython.appへの着信接続を許可した後、両方のMacで、元の公開済みv1.3.1のHomebrew Python 3.14.9ランタイム、同じtailnetのbindアドレスと各機器の同じポートを使い、Directペアリングと認証済みprobeが成功しました。新しい試験用の識別情報を使い、ネイティブ呼び出しは0件でした。転送プロセスや別のインタープリターは不要でした。この結果は、今回の接続を妨げていたのがmacOSアプリケーションファイアウォールの承認待ちだったことを裏付けます。診断コードが接続を復旧したわけではありません。以前の陰性・署名・転送の対照試験は過去の観測記録であり、必須の解決策やmacOS・Tailscale・Pythonに共通する原因の判定ではありません。
|
|
22
|
+
|
|
23
|
+
Directのbind、TLS・認証チェック、期限、ペアリング状態、自動再試行禁止の動作は維持します。ファイアウォール・アクセス方針・ランタイム選択を自動化せず、新しいプラットフォームや一般的なACK対応も追加しません。既存ユーザーのpending状態は再試行・初期化していません。ネイティブ世代識別、handoff、保存先、起動時の受け入れ条件(#180/#181/#268/#304/#306/#307)とSide Session・steering研究は別途扱います。
|
|
24
|
+
|
|
25
|
+
オプションのRelayレシーバーモジュールの変更はwheel/sdistに含まれ、単体版`session_peer.py`には組み込まれません。診断機能を適用するには、レシーバー自身のパッケージ・環境を更新し、そのプロセスを明示的に再起動する必要があります。単体ファイルの更新だけでは、これらのモジュールは更新されません。この公開で運用環境の更新や再起動は行いません。
|
|
26
|
+
|
|
27
|
+
調査したControlソースはSQLiteと`bearer`、`deviceAuthorization`プラグインを使い、勧告のMagic Link/OAuth Proxy/PostgreSQL経路は使っていません。配備済み環境での悪用可能性は立証していません。Node Controlの依存関係修正はPython wheel/sdistに含まれず、別途承認されたサービス配備が必要です。上流のOAuth検証識別子の接頭辞変更を確認し、検証ストレージを共有するサーバー間で更新を調整してください。更新後、進行中だったOAuthサインインは最初からやり直す必要が生じる場合があります。この準備では運用環境への配備、セッション失効、データ移行を行いません。
|
|
28
|
+
|
|
29
|
+
互換スキルはv0.4.0、最小ランタイム0.9.1 / 文書のCLI機能の基準1.3.0を維持し、受信側`codexBin`の最小バージョンも1.0.1のままです。変更のないSHA-256は`debedd472e3b0c0c6844fb63f7fb2f17cb6c6cc8c3e981e9afd2531a35327af7`です。ランタイムの公開は、別途管理するスキルの更新や稼働サービスの配備を行いません。
|
|
30
|
+
|
|
31
|
+
## リリース検証
|
|
32
|
+
|
|
33
|
+
ゲート修正のローカル検証ではControlテスト123件、Node/Python統合テスト11件、脆弱性0件を報告した依存関係監査に加え、Python 3.9/3.13それぞれのstdinテスト17件と制御したシグナル試行400回が成功しました。このローカル結果は保護されたmainのCIや実際のOAuth受け入れ試験に代わるものではありません。
|
|
34
|
+
|
|
35
|
+
ローカルMacのMCP検証では、4つのSDK・PythonプロファイルそれぞれでMCPテスト28件が成功し、依存関係監査の報告は脆弱性0件でした。現在の文書チェックも69件成功しています。このローカル結果はCIの8セル、最終mainの検証やHTTP/OAuth受け入れ試験の代わりにはなりません。
|
|
36
|
+
|
|
37
|
+
#342の検証記録にはRelayテスト354件、文書テスト65件、Python 3.9/3.13で試験したプローブ回帰テスト1件が含まれます。これは実装の検証資料であり、この準備で新しく行ったネイティブエージェントの受け入れ試験ではありません。最新の準備レビュー、保護されたmainのCI、依存関係監査、生成器の一致、再現可能な成果物、新規インストールの検証が必要です。準備成功後、`SHA256SUMS`と`release-provenance.json`を含む不変資産7件、およびそれらの認証済みattestationを正確なタグ・ソースと照合してから公開してください。必須の人手によるPyPI環境承認は維持します。この準備は既存のv1.3.1資産や稼働中のインストールを置き換えません。
|
|
@@ -23,6 +23,8 @@
|
|
|
23
23
|
|
|
24
24
|
## 개발과 이력
|
|
25
25
|
|
|
26
|
+
- [v1.3.2 유지보수 안내](releases/v1.3.2.md)에서 macOS 방화벽 승인, Direct 리스너·TLS 진단, MCP SDK 하한과 Python 배포물 밖의 Control 보안 업데이트 및 별도 배포 필요성을 설명합니다.
|
|
27
|
+
|
|
26
28
|
- [v1.3.1 유지보수 안내](releases/v1.3.1.md)는 Control 의존성 수정, 호환 스킬 갱신과 발행·운영 배포의 범위를 설명합니다.
|
|
27
29
|
|
|
28
30
|
- [v1.3.0 릴리스 노트](releases/v1.3.0.md)는 병합된 기능 6개, 지원 조합과 릴리스 검증을 설명합니다.
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Python 3.10 이상에서 설치하십시오: `pipx install 'session-peer[mcp]'`(또는 격리된 venv에 extra 설치). 의존성이 없는 Python 3.9 CLI 및 `install.sh`는 계속 지원됩니다. 셸 설치기는 MCP 의존성을 설치하지 않습니다. Python 3.9에서 MCP 엔트리 포인트는 Python 3.10+이 필요하다고 보고합니다.
|
|
4
4
|
|
|
5
|
+
선택형 extra는 MCP SDK `mcp>=1.30,<2`를 요구합니다. 업스트림 1.x 보안 수정이 포함된 버전으로 의존성 하한을 올리는 것으로, stdio만 사용하는 이 서버에서 악용 가능한 결함이 확인됐다는 뜻은 아닙니다. 이번 변경으로 HTTP 전송, OAuth 서버 경로, MCP 클라이언트 경로가 활성화되지는 않습니다. 기존 환경에는 명시적인 패키지 업그레이드가 필요하며, 선언 변경만으로 설치된 SDK가 업데이트되지는 않습니다.
|
|
6
|
+
|
|
5
7
|
`session-peer-mcp --config /absolute/path/policy.json`으로 시작합니다. 정책이 없으면 서버는 실행 환경의 Codex 홈을 사용하여 로컬 목록 조회만 허용합니다. 제공된 정책은 기본값을 대체합니다. 예시:
|
|
6
8
|
|
|
7
9
|
```json
|
|
@@ -42,12 +44,14 @@ MCP 도구 어노테이션은 목록 조회를 읽기 전용으로, 전송을
|
|
|
42
44
|
|
|
43
45
|
MCP extra가 있는 상태와 없는 상태에서 각각 `python -m unittest discover -s tests -v`를 실행하십시오. 선택형 테스트는 실제 stdio MCP 서버를 시작하고 모델 자격 증명 없이 초기화, 스키마, 정책 거부 및 CLI 부분 실패를 실행합니다. wheel 및 sdist 설치를 모두 테스트하십시오. 실시간 확인 시에는 Codex 버전, OS 및 호스트 승인 설정을 기록해야 합니다. UDS 접근은 환경에 따라 다르며 승인 우회를 약속하는 것이 아닙니다. 메시지에는 전용 테스트 세션을 사용하십시오.
|
|
44
46
|
|
|
45
|
-
|
|
47
|
+
CI는 macOS/Linux의 Python 3.10/3.13에서 SDK 하한 `mcp==1.30.0`과 최신 호환 1.x를 별도로 시험합니다. 두 프로필 모두 stdio·정책·시간 초과·취소·소유 자식 프로세스 정리 시험을 실행하고, 해결된 런타임 의존성 그래프를 감사하며 버전과 보고서를 보존합니다. 전이 의존성 버전은 패키지 관리자가 일반적인 방식으로 결정합니다. 모든 전이 패키지의 최솟값을 시험하는 것은 아닙니다. 버전을 고정한 빌드·감사 요구 패키지는 런타임 환경 밖에 설치하며, 감사 대상 환경에는 초기 구성용 `pip`/`setuptools` 패키지도 포함됩니다. 기존 최신 버전 해결 감사와 릴리스 감사도 계속 필수입니다.
|
|
48
|
+
|
|
49
|
+
공식 참조: [Codex MCP](https://developers.openai.com/codex/extend/mcp), [Python MCP SDK](https://github.com/modelcontextprotocol/python-sdk). [SDK 1.30.0](https://pypi.org/pypi/mcp/1.30.0/json), [GHSA-84m7-p3x7-pcfv](https://github.com/modelcontextprotocol/python-sdk/security/advisories/GHSA-84m7-p3x7-pcfv), [GHSA-fmmv-w9g8-j3gc](https://github.com/modelcontextprotocol/python-sdk/security/advisories/GHSA-fmmv-w9g8-j3gc).
|
|
46
50
|
|
|
47
51
|
### 비대화형 클라이언트 승인
|
|
48
52
|
|
|
49
53
|
서버 정책이 허용하더라도 Codex `exec`는 전송 도구를 “requires approval, but approval policy is never”로 거부할 수 있습니다. `approval_mode="auto"`는 무조건적인 승인이 아닙니다. 비대화형 연동을 명시적으로 승인하는 운영자는 제한된 목적지 정책과 함께 해당 특정 MCP 서버/도구에 대해 `mcp_servers.session_peer.tools.send_message.approval_mode="approve"`를 구성할 수 있습니다. 플러그인은 이 설정을 활성화하지 않습니다. 대화형 클라이언트는 대신 일반적인 승인 프롬프트를 사용할 수 있습니다. 테스트 클라이언트는 이 승인을 관련 없는 서버나 도구에 복사해서는 안 됩니다.
|
|
50
54
|
|
|
51
|
-
macOS/Linux에서 MCP CLI 호출은 새 프로세스 그룹을 소유합니다. 완료·시간 초과·취소 시 리더를 회수하기 전에 TERM→KILL로 해당 그룹을 정리하며 TERM을 무시하는 자식도 포함합니다. 취소는 그대로 전파됩니다. 별도 세션으로 이탈한 자식과 원격 SSH 프로세스는 범위 밖입니다. Windows는 직접 자식 종료만 유지하며 프로세스 트리 보장을 주장하지 않습니다. 로컬 정리는 원격 제출을 취소하지 않습니다. timeout은 `outcome_unknown`이며 자동 재전송하면 안 됩니다.
|
|
55
|
+
macOS/Linux에서 MCP CLI 호출은 새 프로세스 그룹을 소유합니다. 완료·시간 초과·취소 시 리더를 회수하기 전에 시간 제한이 있는 TERM→KILL로 해당 그룹을 정리하며 TERM을 무시하는 자식도 포함합니다. 취소는 그대로 전파됩니다. 별도 세션으로 이탈한 자식과 원격 SSH 프로세스는 범위 밖입니다. Windows는 직접 자식 종료만 유지하며 프로세스 트리 보장을 주장하지 않습니다. 로컬 정리는 원격 제출을 취소하지 않습니다. timeout은 `outcome_unknown`이며 자동 재전송하면 안 됩니다.
|
|
52
56
|
|
|
53
|
-
호출 세션을 알 수 없다는 From 표시를 포함한 MCP 본문은 목적지 CLI의 수신 측
|
|
57
|
+
호출 세션을 알 수 없다는 From 표시를 포함한 MCP 본문은 목적지 CLI의 수신 측 프레임 안에 인용됩니다. 본문 헤더나 본문에 들어 있는 Reply-To는 권한을 부여하지 않습니다. 제삼자 목적지는 세션 소유자에게 확인하십시오. 공유 MCP 프로세스는 여전히 인증된 호출 세션이나 자동 회신 경로를 제공하지 못합니다. 최종 프레임도 네이티브 메시지 한도에 포함됩니다.
|
|
@@ -120,6 +120,22 @@ WebSocket 종료의 `closeSource`는 코드가 수신됐는지 송신됐는지
|
|
|
120
120
|
|
|
121
121
|
1초 이상 열려 있던 대기 방이 Relay에 의해 정상 종료되면 수신자는 백오프를 늘리지 않고 0.5초 뒤 다시 연결합니다. 그 밖의 실패와 1초 안에 닫힌 방은 계속 최대 5초까지 지수 백오프합니다. Relay 레그는 양쪽 모두 10초 WebSocket ping 간격·제한을 사용하므로 정체된 레그를 약 40초가 아닌 약 20초 안에 감지합니다. 이는 재연결 공백을 줄일 뿐 정체된 네트워크 경로를 고치지는 않습니다.
|
|
122
122
|
|
|
123
|
+
### macOS Direct 리스너 확인(#341)
|
|
124
|
+
|
|
125
|
+
이 절은 v1.3.1 이후의 미발행 변경을 설명합니다. `device serve` 시작 시의 `ready:true`는 로컬 리스너 구성만 확인합니다. 이번 변경은 `directReadyConfirmed:false`를 추가하며, 이전 수신기는 이 필드를 생략할 수 있습니다. TCP 연결, 시작 준비 상태, 피어 TLS 성공은 각각 별도의 관측입니다. TLS 핸드셰이크는 아직 인증되지 않은 페어링 초기 연결일 수 있으므로, 그 자체로 페어링·네이티브 대상 접근·ACK를 증명하지 않습니다. 기존 페어링 설정의 준비 확인은 인증된 probe/list 요청을 사용합니다.
|
|
126
|
+
|
|
127
|
+
`--diagnostic-events`를 사용하면 이번 변경은 `direct_transport` 수명주기 기록을 출력합니다. `phase`는 TCP 콜백 진입 시 `accepted`, 핸드셰이크 성공·실패 시 `peer_tls`입니다. 상한이 있는 수신기별 누적 카운터는 `accepted`, `tlsCompleted`, `tlsFailed`입니다. 단조 시계를 기준으로 단계마다 60초에 최대 한 번, 분당 최대 두 번 기록하며, TLS 성공과 실패는 같은 단계의 제한을 공유합니다. 정상 종료 시에는 0회도 포함한 `summary` 스냅샷의 기록을 한 번 더 시도하며, 종료를 반복해도 다시 출력하지 않습니다. 이는 종료 시점의 스냅샷이며 주기적인 상태 알림이나 손실 없는 이벤트 이력은 아닙니다. 연결 수락 거부, 미완료·취소된 핸드셰이크, 카운터 상한 때문에 수치가 서로 일치하지 않을 수 있습니다. 최선 노력 방식의 Direct 기록에는 엔드포인트 주소·피어 ID·메시지 데이터·예외 원문을 포함하지 않습니다. 기록이 없다는 사실만으로 연결이 수락되지 않았다고 단정할 수 없습니다.
|
|
128
|
+
|
|
129
|
+
방화벽 알림을 허용하기 전인 2026-10-27의 격리된 페어링 시험에서는 Homebrew Python 3.14.9 수신기를 사용할 때 양방향 모두 클라이언트가 TLS 단계까지 진행했지만 `peer_tls/timeout`을 반환했으며, 명시적으로 시험한 `0.0.0.0`도 해결책이 되지 않았습니다. 한 Mac의 python.org Python 3.13.7 수신기는 다른 Mac과 실제 페어링·인증된 probe를 완료했습니다. 반대 방향은 별도로 선택한 단기 private TCP 중계기로 loopback TLS 수신기에 연결했을 때만 성공했습니다. 이 중계기는 TLS 종단 처리를 수행하지 않고 TLS 바이트를 해석하지 않은 채 전달했습니다. 각각 다른 시험 구성이며 일반적인 지원 보장이나 macOS·Tailscale·Python의 원인 확정이 아닙니다. 관측 범위는 [#341](https://github.com/abruption/session-peer/issues/341)을 참고하십시오.
|
|
130
|
+
|
|
131
|
+
사용자가 `Python.app`의 들어오는 연결을 허용한 뒤, 두 Mac 모두 이전에 실패했던 공개 v1.3.1의 Homebrew Python 3.14.9 런타임·tailnet 바인딩 주소·기기별 동일 포트에서 Direct 페어링과 인증된 probe를 완료했습니다. 새 시험 신원을 사용했으며 중계기·대체 인터프리터·네이티브 호출은 사용하지 않았습니다. 이 전후 비교는 이번 사례의 원인이 macOS 애플리케이션 방화벽의 승인 대기 상태였음을 뒷받침합니다. 진단 PR이 네트워크 경로를 고친 결과는 아닙니다.
|
|
132
|
+
|
|
133
|
+
[Apple의 방화벽 안내](https://support.apple.com/en-euro/guide/mac-help/mh34041/27/mac/27)는 알림에 응답하기 전까지 들어오는 연결 시도가 거부된다고 설명합니다. 의도한 수신기를 실행하다 이 창이 나타나면 소유자가 실제 Python 애플리케이션을 확인하고 허용 여부를 명시적으로 결정해야 합니다. 방화벽, 선택한 private 바인딩, 인증서를 고정한 TLS와 수신 정책은 유지하십시오. 이 권한은 네이티브 에이전트 접근을 허가하지 않습니다.
|
|
134
|
+
|
|
135
|
+
실제 실행 중인 Python 이미지·배포판, macOS 버전, Tailscale 버전·배포 형태, 바인딩 주소, 자기 연결인지 원격 연결인지 기록하십시오. 방화벽 허용 표시만으로 전체 연결의 준비를 보장하지 않습니다. 리스너를 자동으로 `0.0.0.0`으로 넓히거나 방화벽·접근 정책·런타임을 바꾸지 말고, 중계 구성이 지원된다고 추정하지 마십시오. 불확실한 페어링 후에는 `pending` 상태와 `retryAllowed:false`를 유지하십시오. 별도 시험 환경의 결과는 해당 상태를 재시도하거나 지울 권한이 아닙니다.
|
|
136
|
+
|
|
137
|
+
기록 수에는 상한이 있지만, 기존의 동기식 stderr 로거는 출력 대상이 막혔을 때 강제 시간 제한을 두지 않습니다.
|
|
138
|
+
|
|
123
139
|
## 설치
|
|
124
140
|
|
|
125
141
|
양쪽 기기 모두 격리된 환경에서 PyPI의 session-peer v0.9.0 이상을 설치합니다:
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# v1.3.2 유지보수 릴리스
|
|
2
|
+
|
|
3
|
+
공개된 v1.3.1을 기준으로 2026-10-28에 준비했습니다. Direct 기능 소스 기준은 `dac1c30b1553136b9379be0c6d94eef34ccbad51`이며 최종 통합 릴리스 커밋은 아닙니다. 이 문서는 준비 범위를 설명하며, 실제 공개 기록은 [GitHub Releases](https://github.com/abruption/session-peer/releases)와 [PyPI](https://pypi.org/project/session-peer/)에서 확인하십시오.
|
|
4
|
+
|
|
5
|
+
PR #345의 게이트 수정 소스 기준은 `a68c6cf16c234cd3fe72926e519e4178c093081a`입니다. 병합된 PR #347 이후 통합 준비 기준은 버전 준비 커밋 이전의 `ef7748a78e6b466f67074708f5c14decf37f31d7`입니다. 최종 발행 증거에서 릴리스 커밋을 별도로 식별합니다.
|
|
6
|
+
|
|
7
|
+
## 변경 사항
|
|
8
|
+
|
|
9
|
+
- #341 / #342: 수신기 시작 출력의 `ready:true`를 유지하고 `directReadyConfirmed:false`를 추가해 로컬 리스너 구성과 원격 도달 가능성을 구분합니다. TLS 완료만으로 페어링·네이티브 대상 접근·ACK를 증명하지 않습니다.
|
|
10
|
+
- 명시적으로 선택하는 `--diagnostic-events`에 Direct 콜백·TLS 관측과 상한이 있는 수신기별 `accepted`, `tlsCompleted`, `tlsFailed` 카운터를 추가합니다. `accepted`와 `peer_tls` 단계는 합계로 60초에 최대 2개를 기록하며, TLS 성공·실패는 후자의 단계 제한을 공유합니다. 정상 종료 시에는 0회도 포함한 `summary`의 기록을 1번 더 시도하고, 종료 처리를 반복해도 재시도하지 않습니다. 고정 필드에는 주소·피어/세션 ID·메시지 데이터·예외 원문을 포함하지 않습니다. 로깅 실패는 원래 핸드셰이크 예외를 대체하지 않습니다. 기존의 동기식 stderr 출력에는 출력 대상이 막혔을 때 강제 시간 제한이 없습니다.
|
|
11
|
+
- 실험용 TCP 프로브는 Python 3.9/3.10의 `asyncio.TimeoutError`를 처리하며, Python 3.9/3.13에서 응답이 지연되는 루프백 회귀 시험을 수행했습니다. 수동 두 Mac·tailnet 실험은 CI와 별개이며 `experiments/`는 wheel/sdist에서 제외됩니다. [실험 기록](https://github.com/abruption/session-peer/blob/dac1c30b1553136b9379be0c6d94eef34ccbad51/experiments/macos-direct-listener/README.md)을 참고하십시오.
|
|
12
|
+
- #343 / #345: Node Control의 `better-auth`와 `@better-auth/core` 고정 버전을 1.7.5에서 1.7.7로 올리고 어댑터·telemetry 버전도 맞춥니다. 업스트림은 [GHSA-965c-763c-88jm](https://github.com/advisories/GHSA-965c-763c-88jm)(치명적), [GHSA-r4xp-prcw-77qf](https://github.com/advisories/GHSA-r4xp-prcw-77qf)(높음), [GHSA-44jh-23m7-hpcf](https://github.com/advisories/GHSA-44jh-23m7-hpcf)(낮음)의 최초 수정 버전을 1.7.7로 명시합니다.
|
|
13
|
+
- #344 / #345: 보호된 읽기 구간에 들어간 뒤에만 READY를 알리도록 SIGINT 시험을 동기화합니다. macOS Python 3.13에서 관측한 시그널 종료(-2)와 기대한 처리 후 종료 130 사이의 경합에 대응하며, 제품의 시그널 동작이 아닌 시험 동기화를 바꿉니다. 고정 sleep이나 약화된 단언으로 이 경계를 대체하지 않으며, 과거 CI 실패의 정확한 원인이 확정된 것은 아닙니다.
|
|
14
|
+
|
|
15
|
+
- #346 / #347: 선택적 MCP SDK 요구 사항을 `mcp>=1.30,<2`로 올립니다. 코어의 Python 3.9 하한과 MCP의 Python 3.10+ 마커는 그대로입니다. POSIX CI는 Mac/Linux, Python 3.10/3.13, 정확한 하한 `1.30.0` 또는 최신 호환 `1.x`의 SDK 프로필 2개를 조합한 8개 셀로 구성합니다. 간접 의존성은 일반 규칙으로 해석하며, 하한 프로필이 모든 패키지의 최소 버전을 검증하는 것은 아닙니다. 설치된 SDK의 표준 입출력(`stdio`) 계약 검사는 HTTP/OAuth 노출이나 악용 가능성을 입증하지 않습니다.
|
|
16
|
+
|
|
17
|
+
PR #345의 두 게이트 수정은 별도로 검토된 커밋으로 병합됐고, PR #347의 MCP 하한·CI 프로필도 병합됐습니다. 검토한 PR #347 커밋은 MCP 8개 셀을 포함한 검사 32개를 통과했으며, 자동 Codex 코드·보안 리뷰도 별도로 지적 없이 완료됐습니다. 이 PR 결과는 보호된 최종 main 검증이나 발행 증거를 대신하지 않습니다. 릴리스 준비 PR 병합 전 현재 main 검사의 성공을 확인해야 합니다.
|
|
18
|
+
|
|
19
|
+
## 원인과 호환성 범위
|
|
20
|
+
|
|
21
|
+
소유자가 Python.app의 들어오는 연결을 허용한 뒤, 두 Mac 모두 공개된 원래 v1.3.1의 Homebrew Python 3.14.9 런타임, 각 Mac에서 같은 tailnet 바인딩 주소와 포트로 Direct 페어링과 인증된 probe를 완료했습니다. 새 시험 신원을 사용했고 네이티브 호출은 0회였습니다. 중계기나 대체 인터프리터는 필요하지 않았습니다. 이 결과는 이번 사례의 차단 원인이 macOS 애플리케이션 방화벽의 승인 대기였음을 뒷받침합니다. 진단 코드가 연결을 복구한 것은 아닙니다. 이전의 연결 실패·코드 서명·중계 대조시험은 과거 실측 기록이며 필수 해결책이나 macOS·Tailscale·Python의 보편적인 원인 판정이 아닙니다.
|
|
22
|
+
|
|
23
|
+
Direct의 바인딩, TLS·인증 검사, 시간 제한, 페어링 상태와 자동 재시도 금지 동작은 유지합니다. 방화벽·접근 정책·런타임 선택을 자동화하지 않으며 새 플랫폼이나 일반 ACK 지원을 추가하지 않습니다. 기존 사용자의 pending 상태는 재시도하거나 초기화하지 않았습니다. 네이티브 세대 식별·handoff·저장소·시작 시점 수락 조건(#180/#181/#268/#304/#306/#307)과 Side Session·steering 연구는 별도 과제입니다.
|
|
24
|
+
|
|
25
|
+
선택적 Relay 수신기 모듈의 변경은 wheel/sdist에 포함되며 독립 실행형 `session_peer.py`에 내장되지 않습니다. 진단 기능을 적용하려면 수신기 자체의 패키지·환경을 갱신하고 해당 프로세스를 명시적으로 재시작해야 합니다. 독립 실행 파일만 갱신해서는 이 모듈이 갱신되지 않습니다. 이번 발행에서는 운영 갱신이나 재시작을 수행하지 않습니다.
|
|
26
|
+
|
|
27
|
+
검토한 Control 소스는 SQLite와 `bearer`, `deviceAuthorization` 플러그인을 사용하며, 권고문에 나온 Magic Link/OAuth Proxy/PostgreSQL 경로는 사용하지 않습니다. 운영 환경의 악용 가능성은 입증하지 않았습니다. Node Control 의존성 수정은 Python wheel/sdist에 포함되지 않으며 별도로 승인된 서비스 배포가 필요합니다. 업스트림의 OAuth 검증 식별자 접두어 변경을 검토하고, 검증 저장소를 공유하는 서버들의 갱신을 조율하십시오. 업데이트 뒤 진행 중이던 OAuth 로그인은 처음부터 다시 시작해야 할 수 있습니다. 이 준비에서는 운영 배포·세션 취소·데이터 마이그레이션을 수행하지 않습니다.
|
|
28
|
+
|
|
29
|
+
호환 스킬은 v0.4.0, 최소 런타임 0.9.1 / 문서의 CLI 기능 기준 1.3.0을 유지하며 수신 측 `codexBin`의 최소 버전은 1.0.1입니다. 변경되지 않은 SHA-256은 `debedd472e3b0c0c6844fb63f7fb2f17cb6c6cc8c3e981e9afd2531a35327af7`입니다. 런타임 발행은 별도로 관리되는 스킬을 갱신하거나 실행 중인 서비스를 배포하지 않습니다.
|
|
30
|
+
|
|
31
|
+
## 릴리스 검증
|
|
32
|
+
|
|
33
|
+
게이트 수정의 로컬 검증에서는 Control 테스트 123개, Node/Python 연동 테스트 11개, 취약점 0건을 보고한 의존성 감사가 기록됐고, Python 3.9/3.13 각각의 stdin 테스트 17개와 통제된 시그널 시도 400회도 통과했습니다. 이 로컬 결과는 보호된 main의 CI나 실제 OAuth 수락 시험을 대신하지 않습니다.
|
|
34
|
+
|
|
35
|
+
로컬 Mac MCP 검증은 SDK·Python 프로필 4개 각각에서 MCP 테스트 28개를 통과했고, 의존성 감사에서 보고된 취약점은 0건이었습니다. 현재 문서 검사도 69개를 통과했습니다. 이 로컬 결과는 CI 매트릭스 8개 셀, 최종 main 검사나 HTTP/OAuth 수락 시험을 대신하지 않습니다.
|
|
36
|
+
|
|
37
|
+
#342의 검증 기록에는 Relay 테스트 354개, 문서 테스트 65개, Python 3.9/3.13에서 시험한 프로브 회귀 테스트 1개가 포함됩니다. 이는 구현 검증 자료이며 이번 준비의 새로운 네이티브 에이전트 수락 시험은 아닙니다. 최신 준비 리뷰, 보호된 main의 CI, 의존성 감사, 생성기 일치, 재현 가능한 산출물과 신규 설치 검증을 완료해야 합니다. 준비가 성공한 뒤에는 `SHA256SUMS`와 `release-provenance.json`을 포함한 불변 자산 7개 및 해당 자산의 인증된 attestation을 정확한 태그·소스와 대조한 후 공개하십시오. 사람이 수행하는 필수 PyPI 환경 승인은 유지합니다. 이 준비는 기존 v1.3.1 자산이나 운영 설치본을 교체하지 않습니다.
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Install with Python 3.10 or later: `pipx install 'session-peer[mcp]'` (or install the extra in an isolated venv). The dependency-free Python 3.9 CLI and `install.sh` remain supported. The shell installer does not install MCP dependencies. On Python 3.9 the MCP entry point reports that Python 3.10+ is required.
|
|
4
4
|
|
|
5
|
+
The optional extra requires MCP SDK `mcp>=1.30,<2`. This raises the dependency floor past upstream 1.x security fixes; it does not establish an exploitable issue in this stdio-only server. HTTP transports, OAuth server paths and MCP client paths are not enabled by this change. Existing environments need an explicit package upgrade; changing the manifest does not update an installed SDK.
|
|
6
|
+
|
|
5
7
|
Start `session-peer-mcp --config /absolute/path/policy.json`. Without a policy the server allows only local listing, using the launching environment's Codex home. A supplied policy replaces defaults. Example:
|
|
6
8
|
|
|
7
9
|
```json
|
|
@@ -42,7 +44,9 @@ A shared MCP process cannot reliably identify the invoking thread. Messages iden
|
|
|
42
44
|
|
|
43
45
|
Run `python -m unittest discover -s tests -v` with and without the MCP extra. Optional tests start a real stdio MCP server and exercise initialization, schemas, policy rejection and CLI partial failures without model credentials. Test both wheel and sdist installs. Live checks must record Codex version, OS and host approval settings; UDS access is environment-dependent and is not an approval-bypass promise. Use dedicated test sessions for messages.
|
|
44
46
|
|
|
45
|
-
|
|
47
|
+
CI tests the exact SDK floor `mcp==1.30.0` and the latest compatible 1.x separately on macOS/Linux with Python 3.10/3.13. Both profiles run the stdio/policy/timeout/cancellation/owned-child tests and audit their resolved runtime dependency graphs, retaining versions and reports. Transitive dependencies resolve normally; this is not a test of every transitive package's minimum version. The pinned build/audit requirements are installed outside the runtime environment; the audited environment also includes its `pip`/`setuptools` bootstrap packages. Existing latest-resolution and release audits remain required.
|
|
48
|
+
|
|
49
|
+
Official references: [Codex MCP](https://developers.openai.com/codex/extend/mcp), [Python MCP SDK](https://github.com/modelcontextprotocol/python-sdk). [SDK 1.30.0](https://pypi.org/pypi/mcp/1.30.0/json), [GHSA-84m7-p3x7-pcfv](https://github.com/modelcontextprotocol/python-sdk/security/advisories/GHSA-84m7-p3x7-pcfv), [GHSA-fmmv-w9g8-j3gc](https://github.com/modelcontextprotocol/python-sdk/security/advisories/GHSA-fmmv-w9g8-j3gc).
|
|
46
50
|
|
|
47
51
|
### Non-interactive client approvals
|
|
48
52
|
|
|
@@ -203,6 +203,22 @@ and timeout on both endpoints, so a stalled leg is detected in about 20 seconds
|
|
|
203
203
|
rather than about 40. These reduce reconnect gaps; they do not repair a stalled
|
|
204
204
|
network path.
|
|
205
205
|
|
|
206
|
+
### macOS Direct listener checks (#341)
|
|
207
|
+
|
|
208
|
+
This section describes an unreleased change after v1.3.1. The `device serve` startup `ready:true` confirms local listener setup only. The change adds `directReadyConfirmed:false`; older receivers may omit the field. TCP connect, startup readiness and successful peer TLS are separate observations. A TLS handshake may be the unauthenticated pairing bootstrap, so it does not itself establish pairing, native-target access or ACK. Existing paired setup readiness uses authenticated probe/list requests.
|
|
209
|
+
|
|
210
|
+
With `--diagnostic-events`, the change emits `direct_transport` lifecycle records. The `phase` is `accepted` for entry into the TCP callback or `peer_tls` for handshake success/failure. Bounded per-receiver counters are `accepted`, `tlsCompleted` and `tlsFailed`. Monotonic throttling allows at most one record per phase per 60 seconds: at most two per minute, with TLS successes and failures sharing the same phase limit. Normal closing attempts one additional `summary` snapshot, including zero counts; repeated closure does not emit it again. This is a shutdown snapshot, not a heartbeat or lossless event history. Counts need not balance because of admission refusals, unfinished/cancelled handshakes and saturation. Best-effort Direct records contain no endpoint addresses, peer IDs, message data or exception text. Missing records alone do not prove that no connection was accepted.
|
|
211
|
+
|
|
212
|
+
Before the firewall alert was approved, in isolated tests on 2026-10-27, pairing against Homebrew Python 3.14.9 receivers timed out at the client's TLS phase with `peer_tls/timeout` in both directions; explicitly testing `0.0.0.0` did not fix it. A python.org Python 3.13.7 receiver on one Mac completed pairing and an authenticated probe from the other. The reverse direction succeeded only with a separately selected, short-lived private TCP forwarder into a loopback TLS receiver. That forwarder passed opaque TLS bytes without terminating TLS. These are different tested topologies, not universal support or a proven macOS/Tailscale/Python root cause. See [#341](https://github.com/abruption/session-peer/issues/341) for the scoped observations.
|
|
213
|
+
|
|
214
|
+
After the owner allowed incoming connections for `Python.app`, both Macs completed direct pairing and an authenticated probe using the original released v1.3.1 Homebrew Python 3.14.9 runtime, tailnet bind addresses and the same per-machine ports as the earlier failures. These runs used fresh test identities, no forwarder or alternate interpreter, and zero native calls. This before/after result supports pending macOS Application Firewall consent as the cause of this incident; the diagnostic PR did not repair the network path.
|
|
215
|
+
|
|
216
|
+
[Apple's firewall guide](https://support.apple.com/en-euro/guide/mac-help/mh34041/27/mac/27) explains that incoming attempts are denied until the alert is answered. When an expected receiver triggers this prompt, its owner should verify the actual Python application and explicitly allow it if intended. Keep the firewall enabled, the selected private bind, pinned TLS and receiver policy; the permission does not grant native-agent access.
|
|
217
|
+
|
|
218
|
+
Record the actual running Python image/distribution, macOS version, Tailscale version/variant, bind address and whether the check is self-connect or remote. A reported firewall permission is not end-to-end readiness. Do not automatically widen a listener to `0.0.0.0`, change firewall/access policy, switch runtimes or infer a supported forwarding configuration. Preserve `pending` state and `retryAllowed:false` after uncertain pairing; an independent fixture does not authorize retrying that state or clearing it.
|
|
219
|
+
|
|
220
|
+
Event counts are bounded; the existing synchronous stderr logger does not impose a hard deadline on a blocked output sink.
|
|
221
|
+
|
|
206
222
|
## Install
|
|
207
223
|
|
|
208
224
|
Install session-peer v0.9.0 or later from PyPI in an isolated environment on both devices:
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# v1.3.2 maintenance release
|
|
2
|
+
|
|
3
|
+
Prepared on 2026-10-28 against published v1.3.1. Direct-feature source base: `dac1c30b1553136b9379be0c6d94eef34ccbad51`; this is not the final integrated release commit. These notes describe the preparation scope; check [GitHub Releases](https://github.com/abruption/session-peer/releases) and [PyPI](https://pypi.org/project/session-peer/) for publication records.
|
|
4
|
+
|
|
5
|
+
Gate-fix source base after PR #345: `a68c6cf16c234cd3fe72926e519e4178c093081a`. Integrated preparation base after merged PR #347: `ef7748a78e6b466f67074708f5c14decf37f31d7`, before the version-preparation commit. Final publication evidence identifies the release commit separately.
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- #341 / #342: receiver startup preserves `ready:true` and adds `directReadyConfirmed:false`, distinguishing local listener setup from remote reachability. TLS completion alone does not prove pairing, native-target access or ACK.
|
|
10
|
+
- Opt-in `--diagnostic-events` adds Direct callback/TLS observations with bounded per-receiver `accepted`, `tlsCompleted` and `tlsFailed` counters. The `accepted` and `peer_tls` phases permit at most 2 records per 60 seconds in total; TLS success/failure share the latter phase limit. Normal close attempts 1 additional `summary`, including zero counts, without repeating it on repeated close. Fixed fields omit addresses, peer/session IDs, message data and exception text. Logging failures do not replace handshake exceptions. Existing synchronous stderr has no hard deadline for a blocked sink.
|
|
11
|
+
- The experimental TCP probe catches `asyncio.TimeoutError` on Python 3.9/3.10 and has a stalled-loopback regression test on Python 3.9/3.13. Manual two-Mac/tailnet experiments remain separate from CI; `experiments/` is excluded from wheel/sdist. See the [experiment record](https://github.com/abruption/session-peer/blob/dac1c30b1553136b9379be0c6d94eef34ccbad51/experiments/macos-direct-listener/README.md).
|
|
12
|
+
- #343 / #345: update Node Control's exact `better-auth` and `@better-auth/core` versions from 1.7.5 to 1.7.7, with aligned adapters/telemetry. Upstream lists 1.7.7 as the first patched version for [GHSA-965c-763c-88jm](https://github.com/advisories/GHSA-965c-763c-88jm) (critical), [GHSA-r4xp-prcw-77qf](https://github.com/advisories/GHSA-r4xp-prcw-77qf) (high) and [GHSA-44jh-23m7-hpcf](https://github.com/advisories/GHSA-44jh-23m7-hpcf) (low).
|
|
13
|
+
- #344 / #345: synchronize the SIGINT test fixture so READY is announced only inside the protected read. This addresses the observed macOS Python 3.13 race between signal termination (-2) and the expected handled exit 130; it changes test synchronization, not product signal behavior. No fixed sleep or weaker assertion is a substitute for that boundary, and the exact cause of historical CI failures is not established.
|
|
14
|
+
|
|
15
|
+
- #346 / #347: raise the optional MCP SDK requirement to `mcp>=1.30,<2`. The core Python 3.9 floor and MCP Python 3.10+ marker remain unchanged. POSIX CI defines 8 cells: Mac/Linux, Python 3.10/3.13 and 2 SDK profiles, exact floor `1.30.0` or latest compatible `1.x`. Transitive dependencies resolve normally; the floor profile does not certify every package's minimum version. Installed standard-input/output (`stdio`) contract checks do not establish HTTP/OAuth exposure or exploitability.
|
|
16
|
+
|
|
17
|
+
PR #345 has merged the two separately reviewed gate fixes, and PR #347 has merged the MCP floor/CI-profile work. The reviewed PR #347 head passed 32 checks, including all 8 MCP cells; its automatic Codex code/security reviews separately completed without findings. These PR results do not replace final protected-main validation or publication evidence. Require successful current-main checks before merging the release-preparation PR.
|
|
18
|
+
|
|
19
|
+
## Incident and compatibility boundaries
|
|
20
|
+
|
|
21
|
+
After the owner allowed Python.app's incoming connections, both Macs completed Direct pairing and authenticated probes using the original released session-peer v1.3.1 on the Homebrew Python 3.14.9 runtime, the same tailnet bind addresses and per-machine ports, fresh test identities and zero native calls. No forwarder or alternate interpreter was needed. This supports pending macOS Application Firewall approval as the blocker in this incident; the diagnostic code did not restore the connection. Earlier negative/signature/forwarding controls are historical evidence, not required remedies or a universal macOS/Tailscale/Python diagnosis.
|
|
22
|
+
|
|
23
|
+
Direct binds, TLS/authentication checks, deadlines, pairing state and no-automatic-retry behavior are unchanged. No firewall, access policy or runtime selection is automated, and no platform or general ACK support is added. Existing user pending state was not retried or reset. Native generation, handoff, storage and startup acceptance (#180/#181/#268/#304/#306/#307) and Side Session/steering research remain separate.
|
|
24
|
+
|
|
25
|
+
The optional Relay receiver module changes are included in wheel/sdist, not embedded in standalone `session_peer.py`. Applying the diagnostics requires updating the receiver's own package/environment and explicitly restarting its process; a standalone-file update alone does not update those modules. This release performs no operational update or restart.
|
|
26
|
+
|
|
27
|
+
The inspected Control source uses `bearer` and `deviceAuthorization` plugins with SQLite, not the Magic Link/OAuth Proxy/PostgreSQL paths named in the advisories; deployed exploitability was not established. The Node Control dependency patch is outside the Python wheel/sdist and requires its own separately authorized service rollout. Review the upstream OAuth verification-identifier prefix changes and coordinate upgrades across servers sharing verification storage; pending OAuth sign-ins may need to be started again after the update. This preparation performs no operational rollout, session revocation or data migration.
|
|
28
|
+
|
|
29
|
+
The compatibility skill remains v0.4.0, minimum runtime 0.9.1 / documented CLI coverage 1.3.0; receiver `codexBin` retains its 1.0.1 floor. Its unchanged SHA-256 is `debedd472e3b0c0c6844fb63f7fb2f17cb6c6cc8c3e981e9afd2531a35327af7`. Runtime publication does not update independently managed skills or deploy running services.
|
|
30
|
+
|
|
31
|
+
## Release verification
|
|
32
|
+
|
|
33
|
+
Local gate-fix validation passed 123 Control tests, 11 Node/Python integration tests, 17 stdin tests on each of Python 3.9/3.13 and 400 controlled signal attempts; dependency audits reported 0 vulnerabilities. These local results do not replace protected-main CI or live OAuth acceptance.
|
|
34
|
+
|
|
35
|
+
Local Mac MCP validation passed 28 MCP tests in each of 4 SDK/Python profiles, with dependency audits reporting 0 vulnerabilities; current documentation checks passed 69 tests. These local results do not replace the 8-cell CI matrix, final main checks or HTTP/OAuth acceptance.
|
|
36
|
+
|
|
37
|
+
The #342 verification record includes 354 Relay tests, 65 documentation tests and 1 probe regression tested on Python 3.9/3.13. These are implementation evidence, not new native-agent acceptance for this preparation. Require current preparation review, protected-main CI, dependency audits, generator consistency, reproducible artifacts and fresh installations. After preparation succeeds, verify all 7 immutable assets (including `SHA256SUMS` and `release-provenance.json`) and their authenticated attestations against the exact tag/source before publication. Required human PyPI environment approval remains. Existing v1.3.1 assets and operating installations are not replaced by this preparation.
|
|
@@ -22,6 +22,8 @@
|
|
|
22
22
|
|
|
23
23
|
## 开发与历史
|
|
24
24
|
|
|
25
|
+
- [v1.3.2维护说明](releases/v1.3.2.md)说明macOS防火墙授权、Direct监听器/TLS诊断、MCP SDK下限,以及位于Python分发包之外且需要单独部署的Control安全更新。
|
|
26
|
+
|
|
25
27
|
- [v1.3.1维护说明](releases/v1.3.1.md)介绍Control依赖修复、兼容技能更新以及发布与运行环境部署的界限。
|
|
26
28
|
|
|
27
29
|
- [v1.3.0发行说明](releases/v1.3.0.md)介绍已合并的六项功能、支持的组合和发行验证。
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
在 Python 3.10 或更高版本下安装:`pipx install 'session-peer[mcp]'`(或在隔离的 venv 中安装 extra)。仍支持无依赖的 Python 3.9 CLI 和 `install.sh`。shell 安装程序不安装 MCP 依赖项。在 Python 3.9 上,MCP 入口点会报告需要 Python 3.10+。
|
|
4
4
|
|
|
5
|
+
可选extra要求MCP SDK `mcp>=1.30,<2`。这是将依赖版本下限提高到包含上游1.x安全修复的版本,并不表示已在这个仅使用stdio的服务器中确认可利用漏洞。本次变更不启用HTTP传输、OAuth服务器路径或MCP客户端路径。现有环境需要显式升级软件包;仅修改声明不会更新已安装的SDK。
|
|
6
|
+
|
|
5
7
|
启动 `session-peer-mcp --config /absolute/path/policy.json`。在没有策略的情况下,服务器仅允许本地列出,使用启动环境的 Codex 主目录。提供的策略将替换默认值。例如:
|
|
6
8
|
|
|
7
9
|
```json
|
|
@@ -42,12 +44,14 @@ MCP 工具注解将列出标记为只读,将发送标记为非幂等。根据
|
|
|
42
44
|
|
|
43
45
|
在有和没有 MCP extra 的情况下运行 `python -m unittest discover -s tests -v`。可选测试会启动真实的 stdio MCP 服务器,并在没有模型凭据的情况下执行初始化、模式、策略拒绝和 CLI 部分失败测试。同时测试 wheel 和 sdist 安装。实时检查必须记录 Codex 版本、操作系统和宿主批准设置;UDS 访问取决于环境,不是批准绕过承诺。消息请使用专用测试会话。
|
|
44
46
|
|
|
45
|
-
|
|
47
|
+
CI在macOS/Linux的Python 3.10/3.13上分别测试SDK下限`mcp==1.30.0`及最新兼容1.x。两个配置均运行stdio、策略、超时、取消及所属子进程清理测试,并审计解析得到的运行时依赖图,保留版本和报告。传递依赖按常规方式解析;这不是对所有传递依赖包的最低版本进行测试。固定版本的构建与审计依赖安装在运行时环境之外;被审计的环境也包含用于初始配置的`pip`/`setuptools`包。现有的最新版本解析审计和发布审计仍为必需。
|
|
48
|
+
|
|
49
|
+
官方参考:[Codex MCP](https://developers.openai.com/codex/extend/mcp)、[Python MCP SDK](https://github.com/modelcontextprotocol/python-sdk)。 [SDK 1.30.0](https://pypi.org/pypi/mcp/1.30.0/json), [GHSA-84m7-p3x7-pcfv](https://github.com/modelcontextprotocol/python-sdk/security/advisories/GHSA-84m7-p3x7-pcfv), [GHSA-fmmv-w9g8-j3gc](https://github.com/modelcontextprotocol/python-sdk/security/advisories/GHSA-fmmv-w9g8-j3gc).
|
|
46
50
|
|
|
47
51
|
### 非交互式客户端批准
|
|
48
52
|
|
|
49
53
|
Codex `exec` 可能会以“requires approval, but approval policy is never”拒绝发送工具,即使服务器策略允许也是如此。`approval_mode="auto"` 并不是无条件批准。显式授权非交互式集成的操作员可以为该特定 MCP 服务器/工具配置 `mcp_servers.session_peer.tools.send_message.approval_mode="approve"`,同时配合受限的目的地策略。插件不会启用此设置。交互式客户端可以改用其常规的批准提示。测试客户端切勿将此授权复制到不相关的服务器或工具。
|
|
50
54
|
|
|
51
|
-
macOS/Linux上的每次MCP CLI调用拥有独立进程组。完成、超时或取消时,在回收leader
|
|
55
|
+
macOS/Linux上的每次MCP CLI调用拥有独立进程组。完成、超时或取消时,在回收leader前通过有时间限制的TERM→KILL清理该组,包括忽略TERM的子进程;取消仍向上传播。主动逃离到新session的子进程和SSH远端进程不在范围内。Windows仍仅终止直接子进程,不保证整个进程树。清理本地进程不撤销远端提交;超时仍为 `outcome_unknown`,不可自动重发。
|
|
52
56
|
|
|
53
|
-
MCP 正文,包括表示调用会话不可用的 From 标签,都会被目标 CLI
|
|
57
|
+
MCP 正文,包括表示调用会话不可用的 From 标签,都会被目标 CLI 的接收侧消息框架引用。正文头部或嵌入的 Reply-To 均不授予权限。请向会话所有者确认第三方目的地;共享 MCP 进程仍不能提供已认证的调用会话或自动回复路由。最终消息框架也计入原生消息限制。
|
|
@@ -115,6 +115,22 @@ WebSocket 关闭的 `closeSource` 区分代码来自接收还是发送。Relay
|
|
|
115
115
|
|
|
116
116
|
若等待房间已开启至少 1 秒后被 Relay 正常关闭,接收端会在 0.5 秒后重连,而不会增加退避时间。其他失败以及 1 秒内关闭的房间仍按指数退避,最长 5 秒。Relay 连接两端均使用 10 秒的 WebSocket ping 间隔与超时,因此停滞连接约 20 秒即可检测到,而不是约 40 秒。这些改动只缩短重连空档,并不能修复停滞的网络路径。
|
|
117
117
|
|
|
118
|
+
### macOS Direct监听检查(#341)
|
|
119
|
+
|
|
120
|
+
本节说明v1.3.1之后尚未发布的变更。`device serve`启动时的`ready:true`只确认本地监听器已建立。此次变更增加`directReadyConfirmed:false`;旧接收端可能没有该字段。TCP连接、启动就绪和对端TLS成功是不同的观测。TLS握手可能只是尚未认证的配对初始连接,因此本身不能证明配对完成、原生目标访问或ACK。现有配对设置的就绪检查使用已认证的probe/list请求。
|
|
121
|
+
|
|
122
|
+
启用`--diagnostic-events`后,此次变更会输出`direct_transport`生命周期记录。`phase`在进入TCP回调时为`accepted`,在握手成功或失败时为`peer_tls`。有上限的每个接收端的累计计数器为`accepted`、`tlsCompleted`和`tlsFailed`。按单调时钟,每阶段每60秒最多输出一条,合计每分钟最多两条;TLS成功和失败共享同一阶段的限制。正常关闭时额外尝试输出一次包含零计数的`summary`快照,重复关闭不会再次输出。这是关闭时的快照,不是定期通知或无损事件历史。连接受理拒绝、未完成或已取消的握手及计数器上限可能使各项数量不相等。尽力而为的Direct记录不包含端点地址、对端ID、消息数据或异常原文。仅凭缺少记录不能断定未接受连接。
|
|
123
|
+
|
|
124
|
+
在用户允许防火墙提示前进行的2026-10-27隔离配对试验中,使用Homebrew Python 3.14.9接收端时,两个方向的客户端均进入TLS阶段但返回`peer_tls/timeout`,明确试验`0.0.0.0`也未解决。一台Mac上使用python.org Python 3.13.7的接收端成功完成了来自另一台Mac的配对及已认证probe。反向连接仅在使用另行选择的短时private TCP转发进程连接loopback TLS接收端时成功;该进程不充当TLS终结端点,仅转发不作解析的TLS字节。这些是不同的试验拓扑,不代表通用支持,也未确定macOS、Tailscale或Python的根因。观测范围请参阅[#341](https://github.com/abruption/session-peer/issues/341)。
|
|
125
|
+
|
|
126
|
+
用户允许`Python.app`接收入站连接后,两台Mac均使用此前失败的已发布v1.3.1 Homebrew Python 3.14.9运行时、tailnet绑定地址和各自相同的端口,成功完成Direct配对及已认证probe。试验使用新的身份,没有使用转发进程、替代解释器或原生调用。这一前后对照支持macOS应用程序防火墙等待批准是本次事件的原因;恢复并非诊断PR修复了网络路径。
|
|
127
|
+
|
|
128
|
+
[Apple防火墙说明](https://support.apple.com/en-euro/guide/mac-help/mh34041/27/mac/27)指出,响应提示之前,入站连接尝试会被拒绝。预期的接收端触发该提示时,应由所有者确认实际Python应用程序,并按需要明确允许。保持防火墙启用、所选private绑定、固定证书的TLS及接收策略;该权限不授予原生代理访问权。
|
|
129
|
+
|
|
130
|
+
请记录实际运行的Python映像及发行来源、macOS版本、Tailscale版本及类型、绑定地址,以及检查是自连接还是远程连接。防火墙显示允许并不证明端到端就绪。不要自动将监听范围扩大至`0.0.0.0`、修改防火墙或访问策略、切换运行时,或推断某个转发配置已受支持。配对结果不确定时,应保留`pending`状态和`retryAllowed:false`。独立试验结果不授权重试或清除此状态。
|
|
131
|
+
|
|
132
|
+
记录数量有上限,但现有同步stderr日志器在输出目标阻塞时没有强制超时机制。
|
|
133
|
+
|
|
118
134
|
## 安装
|
|
119
135
|
|
|
120
136
|
在两台设备上的隔离环境中从 PyPI 安装 session-peer v0.9.0 或更高版本:
|