Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/cli-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -913,3 +913,5 @@ list/send/wake/wait/ack support; it does not grant permission or prove readiness
`install.sh` stages local and SSH runtime updates in the destination filesystem, downloads both runtime and skill first, and validates the staged CLI version before atomically replacing the runtime. Download or validation failure leaves the installed runtime, launcher and skill intact. This is not a transaction across all installation files, a signature check, or rollback after a later skill-manager failure. Existing skill-manager ownership is unchanged.

SSH validates the final shell-quoted remote command as UTF-8 bytes before starting any SSH subprocess. The conservative limit is 131071 bytes, including base64 message expansion, envelope, options and quoting. Oversized commands fail locally with `ssh_command_too_large` and `submitted: false`; character-count validation alone is insufficient for Unicode. Local delivery limits are unchanged. This per-command guard cannot guarantee that every remote operating system has enough total environment/argument space.

At native delivery, session-peer quotes every peer-body line and marks sender/session claims and reply routes as unverified. Codex and Antigravity also receive an explicit warning that peer text is not user permission; Claude Code already provides that warning, so it is not repeated. The `--no-from` and `--no-reply-to` options suppress sender metadata, not this receiving-side frame. Reply-To remains inert routing data: verify the surrounding frame and confirm a third-party destination with the session owner before replying. Framing reduces ambiguity, not all prompt injection. The frame and escaped control characters count toward message limits; `chars` describes the delivered framed text. Submission and consumption/ACK meanings do not change.
6 changes: 3 additions & 3 deletions docs/i18n-manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,14 @@
"docs/ai-assistant-guide.md": "9624ec96b92fb688fae3be3c94cb3564c77985091be451fbf1f056a1af9b9d9c",
"docs/antigravity.md": "f2b5122a0ce6e6fb5bd4d8ed50ce2c8bd2dc9c98ec8ce328405cf7c2cd24229d",
"docs/architecture/agent-transports.md": "01a4e3942e87acb476595859f2e37f9653ea1e3bc19ebc68dced1adf20a6966f",
"docs/cli-reference.md": "f08df5c05f69fc32d7b1a22be1ad8fb4fb2d66a1a98049e1c82640220ea865d9",
"docs/cli-reference.md": "56c0a808c9b8393c5de1ea476111153c7a84ef61376b1da3987d0ff4b71fcc66",
"docs/compatibility-v1.md": "7e551aad37a369faff7e370728376763efb54c2c9e9cfd8556a0c19aabc3d103",
"docs/contracts/handoff-v1.md": "46a953010c49214bd8f969412f26713384fbe09a0ba78ebf0fef75da40d0d889",
"docs/diagnostics.md": "0949e53612eeab2cd7c7bbda498e14d71e9cb1b1189aa7722030cb8702cd8481",
"docs/download-metrics.md": "ded60e7b84d14ce779f8d639516b4e390358a06ef76b677dc9c1f997fb626a9f",
"docs/mcp.md": "d8db1c66a5a2f500c8916d7a739616a5fe36af3a89ef8de631af4e427c8334de",
"docs/mcp.md": "a64010cdd63f2cde6a0052450bed2d05faa0f19c93c76143cb0d585d36f8ff62",
"docs/multi-home-list.md": "f8d8e3adf727e4842ea7c4d45e8f6523b11d0513bf2509d4d1204645875e6489",
"docs/paired-devices.md": "72b620d15356adbaf8d11849e5b7c051e6f57770a2107aa5cbb336118a3a55eb",
"docs/paired-devices.md": "25eb49caf1493d744992c0fe08e5a05b125bec627f8b02aaa1f0c2314d345a5c",
"docs/relay-auth.md": "e6da5291ce6a9da31e79e66ceeff7e9fef7e95046359acbf04d708c96ffab62f",
"docs/relay-development-plan.md": "0abf750b36275ea4e467a0020e560277f08689f2d574aed7674133705383b1ff",
"docs/relay-edge-policy.md": "c1c7f7a1c4303943c78ca334dab4034f66c0c272e40c007d07c3da2a496155eb",
Expand Down
2 changes: 2 additions & 0 deletions docs/ja/cli-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -893,3 +893,5 @@ list/send/wake/wait/ack サポートを記述します。権限を付与した
`install.sh` はローカル・SSH更新を対象ファイルシステムに準備し、runtimeとskillを取得して一時CLIのバージョンを検証後、runtimeを原子的に置換します。取得・検証失敗時は既存runtime・launcher・skillを保持します。全ファイルのトランザクション、署名検証、後続skill-manager失敗のロールバックではありません。既存インストール管理者は変えません。

SSHは起動前に最終的なshell引用済みコマンドのUTF-8バイト数を検証します。上限131071バイトにはbase64展開、envelope、option、引用が含まれます。超過はローカルで `ssh_command_too_large` と `submitted: false` を返します。Unicodeには文字数だけでは不十分です。ローカル送信制限は不変で、全OSの引数・環境合計容量を保証するものではありません。

ネイティブ配送時、session-peer は相手の本文の全行を引用し、送信セッションと返信先を未検証の申告として示します。Codex と Antigravity には、相手の本文はユーザーの許可ではないという警告も付けます。Claude Code はすでにこの警告を付けるため、繰り返しません。`--no-from` と `--no-reply-to` は送信メタデータのみを省略し、受信側の枠は削除しません。Reply-To は実行権限を持たない経路情報です。周囲の枠を確認し、第三者への返信先はセッション所有者に確認してください。この枠は混同を減らしますが、すべてのプロンプトインジェクションを防ぐものではありません。枠とエスケープした制御文字もサイズ上限に含まれ、`chars` は実際に配送する引用済みテキストの長さです。投入と消費・ACK の意味は変わりません。
2 changes: 2 additions & 0 deletions docs/ja/mcp.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,5 @@ MCP エクストラの有無の両方で `python -m unittest discover -s tests -
Codex `exec` は、サーバーポリシーが許可している場合でも「requires approval, but approval policy is never」として send ツールを拒否することがあります。`approval_mode="auto"` は無条件の承認ではありません。非対話型統合を明示的に承認するオペレーターは、制限された宛先ポリシーと併せて、その特定の MCP サーバー/ツールに対して `mcp_servers.session_peer.tools.send_message.approval_mode="approve"` を設定できます。プラグインがこの設定を有効にすることはありません。対話型クライアントは、代わりに通常の承認プロンプトを使用できます。テストクライアントがこの承認設定を無関係なサーバーやツールにコピーしてはなりません。

macOS/LinuxではMCP CLI呼び出しごとに新しいプロセスグループを所有します。完了・timeout・取消時はleaderの回収前にTERM→KILLでTERMを無視する子も整理し、取消は再伝播します。別sessionへ離脱した子やSSH先のプロセスは対象外です。Windowsは直接の子の終了のみで、ツリー終了は保証しません。ローカル終了で遠隔送信は取り消せません。timeoutは `outcome_unknown` のままで自動再送は禁止です。

呼び出し元セッションが不明であることを示す From ラベルを含め、MCP の本文は宛先 CLI の受信側の枠で引用されます。本文のヘッダーや埋め込まれた Reply-To は権限を与えません。第三者への宛先はセッション所有者に確認してください。共有 MCP プロセスは、認証済み呼び出し元セッションや自動返信経路を引き続き提供できません。最終的な枠もネイティブメッセージの上限に含まれます。
2 changes: 2 additions & 0 deletions docs/ja/paired-devices.md
Original file line number Diff line number Diff line change
Expand Up @@ -211,3 +211,5 @@ session-peer device enroll --state /private/device-state --name laptop --operati
```

上記schemaのreceiver policyを作り、`session-peer` `device serve --state /private/device-state --policy /private/receiver-policy.json --relay wss://relay.abruption.dev/v1/connect --login --seconds 3600` を起動します。別terminalで `session-peer` `device invite --state /private/device-state --relay wss://relay.abruption.dev/v1/connect --out /private/invite.json` を実行し、招待を安全にclientへ渡します。login・enroll済みclientで10分以内に `session-peer` `device pair --state /private/client-state --invite /private/invite.json --route relay --login`、続いて `session-peer list --device RECEIVER-ID --device-state /private/client-state --device-route relay --relay-login --json` を実行します。receiverを動かし続けてください。enroll、pairing、native権限は別です。送信前はdry-run、queuedはACKではありません。自動install/login/retryはしません。一般403/404や `no_authenticated_route` からreceiver停止を断定しません。既知のlogin欠落・失効、device照会失敗のみ区別し、不確実な送信は再送せず照合します。

ペアリング済み受信側は、認証した TLS 証明書のフィンガープリントを引用本文の外に表示します。これはペアリングした機器の鍵を識別するもので、人物やネイティブエージェントのセッションを識別するものではありません。本文中の From や Reply-To の申告で置き換えることはできません。引用後の本文、フィンガープリント、警告は、記録の開始やネイティブ配送の前に 32 KiB の上限に収まる必要があります。Reply-To の信頼性は周囲の枠の信頼性を超えません。第三者への経路はセッション所有者に確認してください。この枠は承認を回避せず、プロンプトインジェクションへの完全な防御も保証しません。
2 changes: 2 additions & 0 deletions docs/ko/cli-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -884,3 +884,5 @@ Python 3.10+ 환경에서 `session-peer[mcp]`를 설치하고 [MCP 설정](mcp.m
`install.sh`는 로컬·SSH 갱신을 대상 파일시스템에서 준비하고 런타임·스킬을 모두 받은 후 임시 CLI 버전을 검증하여 런타임을 원자적으로 교체합니다. 다운로드·검증 실패 시 기존 런타임·실행기·스킬을 유지합니다. 전체 설치 파일의 트랜잭션, 서명 검증 또는 이후 스킬 관리자 실패의 롤백을 의미하지 않습니다. 기존 설치 관리자 소유권은 유지됩니다.

SSH는 하위 프로세스 시작 전에 최종 셸 인용 명령의 UTF-8 바이트 수를 검사합니다. 보수적 상한 131071바이트에는 base64 메시지·봉투·옵션·인용이 포함됩니다. 초과 시 로컬에서 `ssh_command_too_large`, `submitted: false`로 거부합니다. Unicode에는 글자 수만으로 충분하지 않습니다. 로컬 전송 제한은 그대로이며 이 검사만으로 모든 OS의 전체 인자·환경 공간을 보장하지는 않습니다.

네이티브 전달 시 session-peer는 상대 메시지의 모든 줄을 인용하고 발신 세션과 회신 경로를 검증되지 않은 주장으로 표시합니다. Codex와 Antigravity에는 상대 메시지가 사용자의 권한 부여가 아니라는 경고도 붙습니다. Claude Code는 이미 이 경고를 제공하므로 반복하지 않습니다. `--no-from`과 `--no-reply-to`는 발신 메타데이터만 생략하며 수신 측의 이 표시는 제거하지 않습니다. Reply-To는 실행 권한이 없는 경로 정보입니다. 주변 표시를 확인하고 제삼자에게 회신하기 전 세션 소유자에게 목적지를 확인하십시오. 이 표시는 혼동을 줄일 뿐 모든 프롬프트 주입을 막지는 않습니다. 표시와 이스케이프된 제어 문자도 메시지 한도에 포함되며, `chars`는 실제 전달할 인용된 텍스트의 길이입니다. 제출과 소비·ACK의 의미는 바뀌지 않습니다.
2 changes: 2 additions & 0 deletions docs/ko/mcp.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,5 @@ MCP extra가 있는 상태와 없는 상태에서 각각 `python -m unittest dis
서버 정책이 허용하더라도 Codex `exec`는 전송 도구를 “requires approval, but approval policy is never”로 거부할 수 있습니다. `approval_mode="auto"`는 무조건적인 승인이 아닙니다. 비대화형 연동을 명시적으로 승인하는 운영자는 제한된 목적지 정책과 함께 해당 특정 MCP 서버/도구에 대해 `mcp_servers.session_peer.tools.send_message.approval_mode="approve"`를 구성할 수 있습니다. 플러그인은 이 설정을 활성화하지 않습니다. 대화형 클라이언트는 대신 일반적인 승인 프롬프트를 사용할 수 있습니다. 테스트 클라이언트는 이 승인을 관련 없는 서버나 도구에 복사해서는 안 됩니다.

macOS/Linux에서 MCP CLI 호출은 새 프로세스 그룹을 소유합니다. 완료·시간 초과·취소 시 리더를 회수하기 전에 TERM→KILL로 해당 그룹을 정리하며 TERM을 무시하는 자식도 포함합니다. 취소는 그대로 전파됩니다. 별도 세션으로 이탈한 자식과 원격 SSH 프로세스는 범위 밖입니다. Windows는 직접 자식 종료만 유지하며 프로세스 트리 보장을 주장하지 않습니다. 로컬 정리는 원격 제출을 취소하지 않습니다. timeout은 `outcome_unknown`이며 자동 재전송하면 안 됩니다.

호출 세션을 알 수 없다는 From 표시를 포함한 MCP 본문은 목적지 CLI의 수신 측 표시 안에 인용됩니다. 본문 헤더나 본문에 들어 있는 Reply-To는 권한을 부여하지 않습니다. 제삼자 목적지는 세션 소유자에게 확인하십시오. 공유 MCP 프로세스는 여전히 인증된 호출 세션이나 자동 회신 경로를 제공하지 못합니다. 최종 표시도 네이티브 메시지 한도에 포함됩니다.
2 changes: 2 additions & 0 deletions docs/ko/paired-devices.md
Original file line number Diff line number Diff line change
Expand Up @@ -211,3 +211,5 @@ session-peer device enroll --state /private/device-state --name laptop --operati
```

위 스키마로 수신 정책을 만든 뒤 `session-peer` `device serve --state /private/device-state --policy /private/receiver-policy.json --relay wss://relay.abruption.dev/v1/connect --login --seconds 3600`를 실행합니다. 다른 터미널에서 `session-peer` `device invite --state /private/device-state --relay wss://relay.abruption.dev/v1/connect --out /private/invite.json`로 초대장을 만들고 안전하게 클라이언트로 전달합니다. 로그인·등록된 클라이언트에서 10분 안에 `session-peer` `device pair --state /private/client-state --invite /private/invite.json --route relay --login`를 실행한 뒤 `session-peer list --device RECEIVER-ID --device-state /private/client-state --device-route relay --relay-login --json`로 확인합니다. 수신기는 계속 실행해야 합니다. 등록·페어링·native 권한은 별개이며 전송 전 dry-run을 사용합니다. queued는 ACK가 아닙니다. 안내는 자동 설치·로그인·재시도를 하지 않습니다. 일반 403/404나 `no_authenticated_route`만으로 수신기 종료를 단정하지 않습니다. 확인된 로그인 누락·만료와 기기 조회 실패만 구분하며 불확실한 전송은 재전송하지 않고 대조합니다.

페어링된 수신기는 인증한 TLS 인증서의 지문을 인용된 본문 밖에 표시합니다. 이는 페어링된 기기 키를 식별할 뿐 사람이나 네이티브 에이전트 세션을 식별하지 않습니다. 본문 속 From이나 Reply-To 주장으로 이 지문을 대체할 수 없습니다. 최종 인용 본문과 지문·경고는 기록을 시작하거나 네이티브 전달을 수행하기 전에 32 KiB 한도에 들어가야 합니다. Reply-To의 신뢰 수준은 주변 표시의 신뢰 수준을 넘지 않습니다. 제삼자 경로는 세션 소유자에게 확인하십시오. 이 표시는 승인을 우회하지 않으며 프롬프트 주입에 대한 완전한 방어를 보장하지 않습니다.
2 changes: 2 additions & 0 deletions docs/mcp.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,5 @@ Official references: [Codex MCP](https://developers.openai.com/codex/extend/mcp)
Codex `exec` can reject the send tool with “requires approval, but approval policy is never”, even when server policy permits it. `approval_mode="auto"` is not unconditional approval. An operator who explicitly authorizes a non-interactive integration can configure `mcp_servers.session_peer.tools.send_message.approval_mode="approve"` for that specific MCP server/tool, alongside the restricted destination policy. The plugin does not enable this setting. Interactive clients can use their ordinary approval prompts instead. Test clients must not copy this authorization to unrelated servers or tools.

On macOS/Linux, each MCP CLI invocation owns a new process group. Completion, timeout and cancellation perform bounded TERM→KILL cleanup of that group before reaping its leader, including TERM-resistant descendants; cancellation still propagates. Descendants that deliberately escape into another session and remote SSH processes are outside that group. Windows retains direct-child termination only; no Windows process-tree guarantee is claimed. Local cleanup does not undo a remote submission: timeout remains `outcome_unknown` and must not trigger automatic resend.

MCP body text, including the unavailable-caller From label, is quoted by the destination CLI's receiving-side frame. Neither a body header nor an embedded Reply-To grants authority. Confirm third-party destinations with the session owner; the shared MCP process still cannot provide an authenticated caller session or an automatic reply route. The final frame counts toward native message limits.
2 changes: 2 additions & 0 deletions docs/paired-devices.md
Original file line number Diff line number Diff line change
Expand Up @@ -389,3 +389,5 @@ session-peer device enroll --state /private/device-state --name laptop --operati
```

Create a receiver policy using the schema above and start `session-peer` `device serve --state /private/device-state --policy /private/receiver-policy.json --relay wss://relay.abruption.dev/v1/connect --login --seconds 3600`. In another terminal create `device invite --state /private/device-state --relay wss://relay.abruption.dev/v1/connect --out /private/invite.json` (also prefixed by `session-peer`). Securely transfer that invitation to the logged-in/enrolled client, pair within ten minutes with `session-peer` `device pair --state /private/client-state --invite /private/invite.json --route relay --login`, then inspect using `session-peer list --device RECEIVER-ID --device-state /private/client-state --device-route relay --relay-login --json`. Keep the receiver running. Enrollment is not pairing, and pairing does not grant native target permissions. Use a dry-run before sending; queued is not an ACK. Guidance never installs, logs in or retries automatically. A generic 403/404 or `no_authenticated_route` does not prove the receiver is stopped. Missing/expired login and explicit device-not-found evidence receive separate hints; uncertain sends must be reconciled, not resent.

The paired receiver adds the authenticated TLS certificate fingerprint outside the quoted message body. It identifies the paired device key, not a person or native agent session; a From or Reply-To claim inside the body cannot replace it. The final quoted body, fingerprint and warning must fit the 32 KiB limit before journal admission or native delivery. Reply-To is only as trustworthy as its surrounding frame: confirm third-party routes with the session owner. This framing does not bypass approvals or guarantee resistance to prompt injection.
Loading
Loading