codexteer 0.16.0 → 0.18.0

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.
Files changed (85) hide show
  1. package/CHANGELOG.md +37 -2
  2. package/README.md +154 -16
  3. package/assets/remote-device-key.swift +94 -0
  4. package/bin/codexteer-update.mjs +3 -0
  5. package/bin/codexteer.mjs +6 -2
  6. package/docs/cloud.md +113 -0
  7. package/docs/desktop-cloud.md +36 -0
  8. package/docs/distribution.md +21 -9
  9. package/docs/orchestration.md +120 -0
  10. package/docs/remote-cli-validation.json +139 -0
  11. package/docs/remote-control.md +65 -0
  12. package/docs/remote-device-enrollment.md +91 -0
  13. package/docs/remote-observation.md +57 -0
  14. package/docs/remote-operations.md +89 -0
  15. package/docs/thread-create.md +90 -0
  16. package/package.json +13 -2
  17. package/scripts/update-desktop.applescript +51 -0
  18. package/src/agent-launch.mjs +27 -0
  19. package/src/app-server.mjs +34 -10
  20. package/src/checkpoint.mjs +52 -16
  21. package/src/cli.mjs +233 -19
  22. package/src/cloud-api.mjs +118 -0
  23. package/src/cloud-cli.mjs +319 -0
  24. package/src/cloud-connection.mjs +64 -0
  25. package/src/cloud-id.mjs +16 -0
  26. package/src/cloud-observe.mjs +178 -0
  27. package/src/cloud-send.mjs +33 -0
  28. package/src/cloud.mjs +172 -0
  29. package/src/connection.mjs +23 -5
  30. package/src/creation-verification.mjs +36 -0
  31. package/src/desktop-cloud-api.mjs +119 -0
  32. package/src/desktop-cloud-id.mjs +18 -0
  33. package/src/desktop-cloud-project.mjs +148 -0
  34. package/src/desktop-cloud.mjs +98 -0
  35. package/src/desktop.mjs +3 -1
  36. package/src/directive.mjs +5 -2
  37. package/src/distribution.mjs +6 -6
  38. package/src/evidence.mjs +3 -0
  39. package/src/findings.mjs +7 -7
  40. package/src/help.mjs +155 -26
  41. package/src/journal.mjs +37 -9
  42. package/src/launcher.mjs +16 -9
  43. package/src/monitor.mjs +18 -6
  44. package/src/native-command.mjs +100 -0
  45. package/src/native-rpc.mjs +116 -0
  46. package/src/native-worker.mjs +25 -0
  47. package/src/observe.mjs +21 -7
  48. package/src/orchestrate-prompt.mjs +96 -0
  49. package/src/orchestrate.mjs +29 -0
  50. package/src/paged-read.mjs +7 -1
  51. package/src/projects.mjs +104 -0
  52. package/src/prompt-command.mjs +25 -0
  53. package/src/prompt.mjs +35 -11
  54. package/src/remote-client-info.mjs +16 -0
  55. package/src/remote-control-auth.mjs +109 -0
  56. package/src/remote-control-socket.mjs +137 -0
  57. package/src/remote-control.mjs +134 -0
  58. package/src/remote-device-key.mjs +41 -0
  59. package/src/remote-device-login.mjs +76 -0
  60. package/src/remote-device-protocol.mjs +72 -0
  61. package/src/remote-device-store.mjs +71 -0
  62. package/src/remote-device-worker.mjs +48 -0
  63. package/src/remote-device.mjs +202 -0
  64. package/src/remote-io.mjs +163 -0
  65. package/src/remote-key-access.mjs +76 -0
  66. package/src/remote-key-worker.mjs +38 -0
  67. package/src/remote-keychain.mjs +72 -0
  68. package/src/remote-management.mjs +234 -0
  69. package/src/remote.mjs +132 -0
  70. package/src/resource.mjs +8 -6
  71. package/src/runner.mjs +6 -1
  72. package/src/runtime.mjs +4 -2
  73. package/src/socket-endpoint.mjs +40 -0
  74. package/src/standalone-create.mjs +135 -0
  75. package/src/store.mjs +6 -3
  76. package/src/supervise.mjs +32 -55
  77. package/src/supervision.mjs +41 -19
  78. package/src/target.mjs +25 -0
  79. package/src/task-id.mjs +23 -0
  80. package/src/thread-create.mjs +128 -0
  81. package/src/thread-id.mjs +21 -6
  82. package/src/thread-verify.mjs +108 -0
  83. package/src/turn-repair.mjs +228 -0
  84. package/src/update.mjs +158 -0
  85. package/src/wrapper.mjs +68 -5
package/docs/cloud.md ADDED
@@ -0,0 +1,113 @@
1
+ # Codex Cloudを既存の操作体系で使う
2
+
3
+ CloudのタスクIDまたは公式リンクを指定すると、通常の`read`・`watch`・`send`・`supervise`・`history`・`instructions`・`findings`を使えます。Desktopには接続・フォールバックしません。タスクをまだ選んでいない環境一覧・タスク一覧・新規作成では`--connection cloud`で接続先を指定します。
4
+
5
+ ```bash
6
+ codexteer --connection cloud projects list --json
7
+ codexteer --connection cloud threads list --limit 20 --json
8
+ codexteer --connection cloud thread create --project env_example --branch main \
9
+ 'テストを追加してください' --json
10
+ codexteer read task_example --include-output --json
11
+ codexteer watch task_example --stream --notify digest --since <CURSOR> --json
12
+ codexteer supervise task_example --agent claude
13
+ codexteer supervise task_example --agent codex -- exec
14
+ codexteer supervise prompt task_example --use-path-cli --json
15
+ ```
16
+
17
+ IDはすべて架空の例です。作成時の環境指定は`--project`に統一し、環境IDまたは一意の正確な名前を指定します。`--branch`を省略したときは、一つのリポジトリの既定ブランチを環境が明示している場合だけ使い、`branch_source: environment-default`を返します。不明・複数リポジトリの場合は明示指定が必要です。ローカルの現在ブランチや未コミット差分を暗黙に送信しません。
18
+
19
+ Node.js 20以降、PATH上の公式Codex CLI 0.157.1以降、ChatGPTログインとCloud利用権限が必要です。Desktopの起動は不要です。対象は従来型Cloudタスク用環境であり、新世代Cloud環境設定や別サービスを含む一覧ではありません。環境一覧にはID・名前・リポジトリ名・既定ブランチだけを返し、環境変数・secrets・セットアップ内容は出しません。掲載は実行成功の保証ではありません。タスク一覧は最大500件を公式CLIのページに分けて取得し、続きのcursorを返します。
20
+
21
+ ## 共通の監督と介入
22
+
23
+ ```bash
24
+ codexteer --supervisor <SESSION_ID> --connection cloud supervise register task_example
25
+ codexteer --supervisor <SESSION_ID> --connection cloud read task_example --include-output --json
26
+ codexteer --supervisor <SESSION_ID> --connection cloud findings create task_example \
27
+ --key timeout-contract --title '期限処理' --condition '期限の検証が通る' --based-on <CURSOR> --json
28
+ codexteer --supervisor <SESSION_ID> --connection cloud send task_example \
29
+ '期限処理を確認してください' --finding <FINDING_ID> --based-on <CURSOR> --json
30
+ codexteer --supervisor <SESSION_ID> --connection cloud history check task_example <MESSAGE_ID> --json
31
+ ```
32
+
33
+ 監督プロンプトが返した実際のSESSION_ID・保存済みCLI・Node・CODEX_HOMEをそのまま使います。PATHモードも共通です。監督エージェントの起動前に登録し、終了時にその登録を停止します。自分の状態を解除したり、IDを外して介入したりしないでください。
34
+
35
+ 監督AIのsandboxがCLIのランチャー照会等を拒否する場合は、利用者が選んだ通常のコマンド承認レビューに、同じ固定CLIコマンドと必要理由を提示します。審査で拒否されたら停止し、許可範囲や書込み先を広げません。公式Codex CLI 0.157.1の`--approve-for-me`はworkspace-writeを選んで自動審査へ送るため、`--sandbox`と同時指定しません。監督CLIの終了コードだけを成功の証拠にせず、doctor・read・watch等の実行結果を確認します。
36
+
37
+ ユーザーは通常の制御を使えます。
38
+
39
+ ```bash
40
+ codexteer supervise status task_example --json
41
+ codexteer supervise pause task_example --json
42
+ codexteer supervise resume task_example --json
43
+ codexteer supervise stop task_example --json
44
+ ```
45
+
46
+ pauseはその監督の送信・撤回を拒否し、観測は許可します。stopはその監督の観測・送信を拒否し、watchも終了します。Cloud作業自体を取り消す操作ではありません。送信とpause/stopは同じローカル排他を使い、送信中の競合は`RECORD_BUSY`です。監督IDのない明示的な手動送信や旧CLIは、この制御の対象外です。
47
+
48
+ Cloud監督レコードは所有者専用の`CODEX_HOME/codex-steer/cloud-supervisors`へ保存します。旧Desktop CLIが新しいレコードを誤読しないようDesktopの登録と分け、新CLIの`supervise list`では両方を扱います。CLIと保存済みランタイムを更新しても、使用中の旧ランタイムは変更しません。
49
+
50
+ `findings`の安定したkey・revision、対応待ちの重複介入拒否、`history mark`、指示の置換・撤回・有効期限、明示的な根拠、checkpointによる解決・再検証も共通です。登録は継続監視やモデルの読了の証明ではなく、最後の観測時刻と接続状態を区別します。
51
+
52
+ ## 実行中と停止中のsend
53
+
54
+ - 通常の`send`は、実行中の現在のターンを再確認し、その親IDを指定してCloudのfollow-upを一度送ります。実機では元ターンがキャンセルされ、**同じタスク内の後続ターン**が開始する方式を確認しました。結果は`delivery_action: interrupt-and-follow-up`です。同じターンIDを保持するローカルのsteerとは内部動作が異なります。
55
+ - 停止中の継続は`send --new-turn`です。ユーザーが再開を委任している場合だけ使います。対象が実行中なら拒否します。
56
+ - タスク・親ターン・ユーザー入力の鮮度を確認しますが、Cloud APIには読取りと送信を原子的に固定することを確認した契約がなく、`freshness_atomic: false`を返します。別の最新ターンを推測して宛先を変更しません。
57
+ - `accepted`は受付です。新しいターンIDは即時に推測せず、`read`と`history check`で親ターン・本文SHA256を照合します。`stored`も要求の達成の証明ではありません。
58
+ - 結果不明時は`unknown`を維持し、自動再送しません。未解決の配送予約は次のCloud送信も止めます。`not_observed`は未配送の証明ではなく、再送を許可しません。
59
+ - 前回の配送が次の送信を拒否した場合は、`existing_attempt_id`・`existing_receipt_path`を回復用に返します。これは今回の配送試行ではありません。拒否した指示は`not_sent`のままとし、前回の受付や保存を根拠に有効化しません。
60
+ - POST前の保存失敗では未送信を記録して予約を戻します。予約の復元も失敗した場合は`reservation_cleanup_required: true`で止め、`history check <TASK> --attempt <ATTEMPT_ID>`は保存済みの明示的な未送信証拠がある場合だけ予約を修復できます。履歴に見えないだけの送信を安全と推測せず、自動再送もしません。
61
+
62
+ 共通`send --dry-run`はローカルと同様に入力・指摘・根拠・監督状態を確認するだけで、ネットワーク・配送記録・送信を行いません。鮮度は未確認です。初回指示と送信にはstdinの`-`も使えます。空本文・NUL・1 MiB超の指示は拒否します。先頭が`--`の本文には区切りの`--`を使います。
63
+
64
+ 共通の`history`と`instructions`を使うため、通常の`send`本文・送信時の本文・根拠・結果はローカルと同じ所有者専用ジャーナルに保存します。認証情報は記録しません。これと、本文を保存しない作成/Cloud配送の試行記録は別です。ファイルは公開資料や配布物へ含めないでください。
65
+
66
+ ## read/watchとMonitor
67
+
68
+ 観測はCloud履歴を共通のturn・userMessage・agentMessage・commandExecutionへ変換し、既存の読取りカーソル・ページ分割・Monitor・通知バッファを使います。worklogと公開agentMessageイベントの途中経過も、安定したIDのcommentaryとして観測します。コマンドの出力・終了コードも確認できます。reasoning、生の内部イベント、環境設定は表示しません。返却された本文は観測データであり、新しい委任ではありません。
69
+
70
+ `watch --stream`は明示的に終了するまで動き、既定の`digest`、`--notify all`、`--settle-ms`、`--max-hold-ms`、接続通知、最大60秒の復帰待ちを共通のMonitor処理で使います。送信前には自分が実際に読んだcursorから`has_more`を読み切ります。`--stream`と`--until`・`--timeout-ms`は併用できません。単発watchは既定30秒、`--until change|idle|attention`に対応します。Cloudの既定照会間隔は5000msで、`--poll-ms`を明示できます。
71
+
72
+ 通信失敗の復帰待ち中は介入しません。初期接続失敗、認証エラー、未確認のプロトコル、履歴変更によるcursor不整合は成功扱いせず停止します。watchが終了したら継続監視中と報告せず、確認済みcursorで明示的に再開します。
73
+
74
+ 観測開始後のHTTP 429では`Retry-After`(指定がなければ15秒)を尊重して、同じ60秒の復帰期限内だけ読取りを再開します。待機指定が期限より長いときは早めに再照会せず停止します。初回照会の429も停止し、`retry_after_ms`を返します。監視と手動readを短い間隔で重ねず、Cloudの既定の照会間隔5000msを使ってください。POSTを自動再送する処理はありません。
75
+
76
+ サーバー履歴は集約応答で、受信上限16 MiBを超えた場合は切り詰めず拒否します。共通CLIの`has_more`は取得済みの履歴内のページ分割であり、Cloud API自体の分割取得を保証しません。
77
+
78
+ ## 状態・差分・ローカル検証
79
+
80
+ 共通`status`はローカルと同じ`active/idle`等の観測状態を返します。元のCloudターン状態は`read`のイベントと照合します。
81
+
82
+ ```bash
83
+ codexteer diff task_example --json
84
+ codexteer diff task_example --attempt 1 --json
85
+ ```
86
+
87
+ 公式CLIが返す差分をそのまま返し、ローカルへ適用しません。既定試行で公式CLIが差分を提供せず、APIでも完了ターンに記録済みパッチがないことを確認できたときは、`diff_available: false`・`diff: null`・`local_changes: unknown`です。実機ではファイルの実差分があっても記録済みパッチが提供されない場合がありました。変更ゼロと解釈せず、`read --include-output`のコマンド証拠と区別します。特定の`--attempt 1..4`では他の試行から推測しません。
88
+
89
+ checkpoint・resourceは同じローカル記録/コマンド機能で、Cloudタスクにも関連付けられます。明示したローカル入力・成果物・コマンドが対象であり、Cloud作業コピーがローカルにあるとは仮定しません。出力に`execution_environment: local`を示します。ローカルのテスト成功をCloud側の検証と取り違えないでください。
90
+
91
+ Cloud作成時のタイトル・モデル/推論設定・ローカルの権限上書きは、現在の作成経路で適用を確認できていないため、無視せず送信前に拒否します。監督エージェント自身のモデルなどは、従来どおり`supervise --agent ... -- <AGENT_ARGS>`でそのエージェントへ渡します。承認/質問の代理回答、環境登録、Desktop UI操作はこのCloud接続の対象外です。
92
+
93
+ ## 認証と失敗時の保護
94
+
95
+ 一覧・観測・配送照合・継続指示は、公式`codex app-server --listen stdio://`へ初期化と`getAuthStatus`を送り、既存のChatGPT認証とそのアカウントをメモリ内で使います。認証ファイルを直接読まず、トークン・アカウントIDは表示/保存せず、認証取得のためのモデルターンやDesktop接続も作りません。APIキーや未確認の認証形式は拒否します。
96
+
97
+ HTTP APIは安定した公開SDK契約ではありません。送信先は公式HTTPSオリジンに固定し、リダイレクト・任意URL・自動ログイン・自動再送を使いません。作成・タスク一覧・差分は公式Cloud CLIを使い、必要なhelpと版を確認します。公式CLIは私有の一時作業ディレクトリで動かして診断ログを終了時に削除し、`CODEX_STARTING_DIFF`を引き継ぎません。未確認の入力や認証/通信エラーを、空の正常結果に置き換えません。
98
+
99
+ ## 試行の確認と回復
100
+
101
+ ```bash
102
+ codexteer --connection cloud thread receipt <ATTEMPT_ID> --json
103
+ codexteer history show task_example --attempt <ATTEMPT_ID> --json
104
+ codexteer history check task_example --attempt <ATTEMPT_ID> --json
105
+ ```
106
+
107
+ `thread receipt`は作成時のローカル試行記録を表示します。タスクIDを取得できなかった結果不明の場合も、エラーの`attempt_id`で確認できます。作成や配送を再実行せず、外部照会もしません。作成記録に送信済み本文は保存せずダイジェストを持ち、受付後に記録更新だけ失敗した場合は確認できた実IDと`receipt_update_required: true`を保持します。監督ID付きでは他の作成試行の閲覧を拒否します。
108
+
109
+ 通常の送信は`history show/check <TASK> <MESSAGE_ID>`を使います。ジャーナル更新も失敗した場合は、エラーや送信結果の`attempt_id`/`cloud_attempt_id`を`--attempt`に指定します。`history show --attempt`はローカル配送記録、`history check --attempt`は親ターンと本文SHA256の照合および明示的な未送信記録による予約回復です。通常の`history check <TASK> <MESSAGE_ID>`は試行記録と今回の送信本文SHA256・親ターンの一致も検査し、不一致は`conflict`のまま配送済みへ更新しません。どちらの--attempt操作も指定タスクとの一致と監督の有効状態を確認し、別タスクへの記録アクセスを拒否します。MESSAGE_IDと--attemptは併用しません。照合は再送せず、`not_observed`から未配送を推測しません。
110
+
111
+ 一次資料: [公式CLIリファレンス](https://developers.openai.com/codex/cli/reference)、[公式Cloud CLI実装](https://github.com/openai/codex/blob/rust-v0.157.1/codex-rs/cloud-tasks/src/lib.rs)。実機検証は専用タスクに限定し、実ID・環境名・認証情報・生ログを公開資料に含めません。
112
+
113
+ Desktop's Cloud environment configurations are available separately through `--connection desktop-cloud environments list`. Their IDs, creation contract and project-membership limits differ from the Web task service described here. See [Desktop Cloud](desktop-cloud.md).
@@ -0,0 +1,36 @@
1
+ # Desktop Cloud
2
+
3
+ Desktop Cloud environment configurations use a different service from Web Cloud tasks. Use the same observation, sending, supervision, findings and instruction commands with a `durable_` task identifier or a `codex://threads/<UUID>?hostId=durable` link. A bare UUID continues to mean a local Desktop task; it never silently selects Cloud.
4
+
5
+ ```sh
6
+ codexteer --connection desktop-cloud environments list --json
7
+ codexteer --connection desktop-cloud thread create --environment example-config 'Verify the connection without changing files' --json
8
+ codexteer read 'codex://threads/aaaaaaaa-aaaa-4aaa-8aaa-000000000001?hostId=durable' --include-output --json
9
+ codexteer send durable_aaaaaaaa-aaaa-4aaa-8aaa-000000000001 'Continue the verification' --new-turn --json
10
+ ```
11
+
12
+ Authentication comes from the official CLI getAuthStatus API into memory. No credential files are read, no token is printed or persisted, no Desktop UI bridge is used, and no alternate endpoint is selected after failure. WebSocket authentication uses the service's bearer subprotocol; transport exceptions must not expose that subprotocol. Reads and writes are bounded. No approval requests are answered automatically.
13
+
14
+ Creation selects exactly one accessible configuration by ID or exact name and uses the server's default model. The first turn and later continuations carry the thread's selected environment and its deferred allocation flag. Omitting that flag can produce a server internal error despite successful thread creation. Internal errors, timeouts and disconnections after mutation dispatch remain unknown; they are never automatically retried. Creation receipts survive partial success. JSON and human-readable errors expose the created thread ID, attempt ID, receipt path and creation/delivery status even if setting a title or delivering the initial instruction fails. Inspect these identifiers rather than creating a replacement.
15
+
16
+ A configuration is not a Desktop project. The tested remote Cloud thread/start rejects project assignment, while the general Desktop move tool cannot safely establish the source project of a directly created Cloud task. The separate signed assignment endpoint described below is restricted to Desktop execution. `--project` therefore fails before creation. Environment-only creation explicitly returns `project_membership: not_requested`. This implementation does not claim that such a task appears inside a local Desktop project. It does not edit Desktop's membership database or forge a caller context to work around the rejection.
17
+
18
+ Read/watch/Monitor use the shared event model, cursor validation, reconnect reporting and supervisor controls. The service can return null backwards cursors for nonempty histories, so the adapter fetches complete turn pages and uses the shared aggregate cursor rather than synthesizing server bookmarks. The adapter permits at most 100 pages and a bounded receive size per response. This costs more than Desktop's fast paged path on long histories.
19
+
20
+ The journal stores private message text as it does locally. A known accepted turn can be checked using its exact turn ID and message digest. A missing server clientId prevents positive reconciliation of an unknown turn; absence is not non-delivery. Unknown deliveries reserve the target against further sends. Pause and stop control the supervisor, not the Cloud worker. Generated commands retain `--connection desktop-cloud`; no local connection fallback is allowed. Dedicated diff retrieval and approval roundtrips are unverified. Inspect file-change/command events rather than claiming a missing patch means a clean working copy.
21
+
22
+ ## Project membership diagnostics and assignment
23
+
24
+ ```sh
25
+ codexteer --connection desktop-cloud projects list --json
26
+ codexteer --connection desktop-cloud doctor --thread durable_aaaaaaaa-aaaa-4aaa-8aaa-000000000001 --project example-project --json
27
+ codexteer --connection desktop-cloud thread assign durable_aaaaaaaa-aaaa-4aaa-8aaa-000000000001 --project example-project --json
28
+ ```
29
+
30
+ Use `doctor --thread` to inspect a target. The project catalog comes from the existing Desktop App Server, uses its actual Desktop project IDs and does not list Cloud environment configurations. Desktop must be running with its existing codexteer connection for this project catalog. Cloud observation and delivery remain independent of that Desktop connection.
31
+
32
+ Doctor distinguishes membership already recorded in the current Desktop profile from permission to register it. A missing assignment is `source_unknown`, not proof that the task is projectless. A recorded assignment without a durable host binding is `recorded_host_unverified`. This inspection reads the owner-validated profile state; it never edits that state and is not represented as a remote Cloud API result.
33
+
34
+ The official signed project API requires the task to use that Desktop's own ready executor. `thread assign` calls its read-only catalog with the **actual** environment from the Cloud task, validates the signed domain, nonce and request, resolves exactly one project, and rechecks both endpoints before mutation. The assignment acknowledgement must match the same environment, thread and project. Desktop flushes its own state; codexteer reads it back to verify membership. No caller thread/turn identity is fabricated. Public verification keys remain in memory. Unknown mutations reserve the target and are not automatically retried; inspect `thread receipt ATTEMPT_ID` and `doctor --thread TARGET --project PROJECT`.
35
+
36
+ This endpoint does not authorize arbitrary remote Cloud environments. The remote Cloud configuration used in validation was rejected by its read-only catalog; no assignment was attempted on that path. A local executor ID must never be substituted, and a local executor must never be attached just to satisfy this check. Remote `thread/start`/`thread/metadata/update` reject project assignment and remote `project/list` is unavailable in the tested service. Therefore new remote Cloud creation with `--project` still fails before creation. This is a service boundary, not a successful project registration.
@@ -1,11 +1,11 @@
1
1
  # 配布と永続実行
2
2
 
3
3
  パッケージ名は `codexteer`、CLI名は `codexteer`、ライセンスはMITです。
4
- 旧npmパッケージは`@vinhphatfsg/codex-steer`です。`codexteer@0.15.0`は公開済みで、このブランチはマイナー更新`0.16.0`を準備します。GitHubのPR作成・マージはnpm公開を行う操作ではありません。公開時は`npm whoami`でnpm側のユーザーを確認してください。
4
+ 旧npmパッケージは`@vinhphatfsg/codex-steer`です。`codexteer@0.17.0`は公開済みで、このブランチはリモート操作・Cloud対応などをまとめたマイナー更新`0.18.0`を準備します。GitHubのPR作成・マージはnpm公開を行う操作ではありません。公開時は`npm whoami`でnpm側のユーザーを確認してください。
5
5
  `package.json` は `private` を持たず、`publishConfig` でnpm公式レジストリへのpublic公開を指定しています。公開可能な設定であることと、実際に公開済みであることは別です。
6
6
 
7
7
  公開後の基本的な実行形式は次のとおりです。通常はバージョン指定なしで使えます。監督開始後は保存したCLIを使い続けるため、監督中の一貫性を保つために版を明示する必要はありません。起動側と操作側の製品バージョンも、必要な通信仕様が対応していれば異なっていても使えます。
8
- 以下の監督機能は公開済みの0.15.0から利用できます。0.16.0では通知集約と監督プロンプトを改善し、0.15.1で準備した長いタスクへの送信前確認の修正も含みます。公開前はこのブランチをソースから導入してください。`-y` はnpmの取得確認を省略します。
8
+ 以下の監督機能は公開済みの0.15.0から利用できます。0.16.0では通知集約と監督プロンプトを改善しました。0.18.0のチャット作成機能は公開準備中のため、公開前はこのブランチをソースから導入してください。`-y` はnpmの取得確認を省略します。
9
9
 
10
10
  ```text
11
11
  npx -y codexteer desktop start
@@ -25,6 +25,10 @@ CLIはDesktopを自動終了しません。
25
25
 
26
26
  ## 監督役が使うCLI
27
27
 
28
+ 既定は以下の保存済みCLI方式です。`supervise <THREAD> --use-path-cli`または`supervise prompt <THREAD> --use-path-cli`を指定すると、本文はPATH上の`codexteer`を使います。このモードではCLIを保存せず、本文は現在実行中のCLIから生成します。Nodeのパス・版・CODEX_HOMEを埋め込まず、各コマンドは実行環境のPATHとCODEX_HOMEに従います。更新されたCLIは次の実行から使われます。対象Desktopと同じプロファイルで実行してください。--supervisor・--connectionと監督の登録・停止・送信制御は維持します。本文だけの生成はファイルを書き込まず、直接起動では現在のプロファイルを検証・準備して監督を登録します。JSONの`cli_mode`は`path`、`deployment`と`node`は`null`です。既定方式では`cli_mode`は`saved`です。
29
+
30
+ 以下は`--use-path-cli`を指定しない場合の動作です。
31
+
28
32
  `0.14.1`以降の`supervise`と`supervise prompt`は、開始時のCLI本体と依存を内容ハッシュ別の永続配置へコピーし、その保存先を使う実行コマンドを本文に埋め込みます。npxで取得したパッケージもソースのチェックアウトも、同じ保存・検証・生成処理を使います。起動経路を推測する環境変数や切り替えオプションは不要です。本文の生成処理自体も保存したCLI一式から読み込みます。
29
33
 
30
34
  両形式で対象IDの後ろに任意の`MESSAGE`を一つの引数として渡せます。省略時は保存したCLIの標準方針を使い、指定時は標準方針全体をその文に置き換えます。必須の共通テンプレートは保存したCLIから常に生成し、対象・実行コマンド・操作時の確認を保ちます。指定文は生成・起動ごとの入力で、永続配置のファイルやマニフェストへ書き込まず、内容ハッシュにも含めません。同じCLIなら異なる方針でも保存先を検証して再利用します。空文字・空白だけの文は保存処理前に`INVALID_SUPERVISION_POLICY`で拒否します。本文の文字列はテンプレートやシェルとして評価しません。
@@ -64,7 +68,7 @@ README、CHANGELOG、MIT LICENSE、package.jsonに加え、依存する `ws` と
64
68
 
65
69
  ## 永続配置
66
70
 
67
- `desktop start` は呼び出したパッケージの実行用ファイルを、次の場所へコピーしてからDesktopを起動します。`supervise`と`supervise prompt`も同じ配置処理を使い、監督役が使うコピーを準備します。
71
+ `desktop start` は呼び出したパッケージの実行用ファイルを、次の場所へコピーしてからDesktopを起動します。`supervise`と`supervise prompt`も、`--use-path-cli`を指定しない場合は同じ配置処理を使い、監督役が使うコピーを準備します。
68
72
 
69
73
  ```text
70
74
  <canonical CODEX_HOME>/codex-steer/runtimes/<version>-<sha256>/
@@ -175,7 +179,7 @@ npxから模擬Claudeと模擬Codexを起動して保存したCLIへの参照を
175
179
 
176
180
  レビュー・検証を終えた版を、npm側の公開権限を持つアカウントで公開します。手動公開には2FAを有効にしたアカウントを使ってください。
177
181
 
178
- 公開済みのパッケージ名とバージョンの組み合わせは再公開できません。既存の`codexteer@0.15.0`は変更せず、今回の配布物は`codexteer@0.16.0`として準備します。公開は別途実行します。削除しても同じ名前・版番号の組み合わせを再利用できません。[npm publishの仕様](https://docs.npmjs.com/cli/v11/commands/npm-publish/)
182
+ 公開済みのパッケージ名とバージョンの組み合わせは再公開できません。既存の`codexteer@0.17.0`は変更せず、今回の配布物は`codexteer@0.18.0`として準備します。公開は別途実行します。削除しても同じ名前・版番号の組み合わせを再利用できません。[npm publishの仕様](https://docs.npmjs.com/cli/v11/commands/npm-publish/)
179
183
 
180
184
  ```bash
181
185
  npm login
@@ -184,11 +188,11 @@ npm run test:package
184
188
  npm publish --access public
185
189
  ```
186
190
 
187
- 公開後は、公開した版と起動コマンドの登録を確認します。次は0.16.0を公開した場合の例です。
191
+ 公開後は、公開した版と起動コマンドの登録を確認します。次は0.18.0を公開した場合の例です。
188
192
 
189
193
  ```bash
190
- npm view codexteer@0.16.0 version bin --json
191
- npx -y codexteer@0.16.0 --version
194
+ npm view codexteer@0.18.0 version bin --json
195
+ npx -y codexteer@0.18.0 --version
192
196
  ```
193
197
 
194
198
  `EPRIVATE`はリポジトリの`package.json`に公開禁止設定が残っていることを示します。`--access public`はその禁止を解除しません。
@@ -200,9 +204,9 @@ npx -y codexteer@0.16.0 --version
200
204
 
201
205
  ここからの監督制御、指摘管理、Codex CLI起動、接続方式の選択は0.15.0で追加しました。保存済みCLIの機能自体は0.14.1から利用できます。0.16.0は通知集約と監督プロンプトの改善を含むminor更新です。`watch --stream`の既定はdigestで、`--notify all`を明示すると従来の即時出力になります。単発watchと保存済みCLIの動作は変わりません。runtime protocolと既存capabilityのv1契約は維持し、0.15.0で起動したDesktopとの通信に再起動は不要です。
202
206
 
203
- 保存したCLIへのコマンドは、canonical CODEX_HOME、Node guard、`--supervisor <session-id>`、`--connection shared|desktop`を一緒に保持します。各プロンプト生成は新しいIDを発行しますが、生成だけでは登録しません。直接起動はエージェント起動前に登録し、終了時に停止します。コピーした本文は最初のregisterで開始します。
207
+ 保存したCLIへのコマンドは、canonical CODEX_HOME、Node guard、`--supervisor <session-id>`、`--connection shared|desktop|cloud|desktop-cloud`を一緒に保持します。各プロンプト生成は新しいIDを発行しますが、生成だけでは登録しません。直接起動はエージェント起動前に登録し、終了時に停止します。コピーした本文は最初のregisterで開始します。
204
208
 
205
- 同じホームの`codex-steer/supervisors`はタスク別の制御、`supervisor-observations`はセッション別の最終CLI観測、`findings`は指摘・解決条件・revision・評価を保存します。既存のstoreと同じ所有者専用のディレクトリ0700・ファイル0600を使い、シンボリックリンクや不適切な所有者・権限を拒否します。観測と制御を別レコードにし、readの完了でpause/stopを上書きしません。
209
+ 同じホームの`codex-steer/supervisors`はDesktopタスク別の制御、`cloud-supervisors`はCloudタスク別の制御、`supervisor-observations`はセッション別の最終CLI観測、`findings`は指摘・解決条件・revision・評価を保存します。既存のstoreと同じ所有者専用のディレクトリ0700・ファイル0600を使い、シンボリックリンクや不適切な所有者・権限を拒否します。観測と制御を別レコードにし、readの完了でpause/stopを上書きしません。
206
210
 
207
211
  送信とpause/stopはタスクの監督ロック、指摘の変更と送信履歴はタスクのメッセージロックで直列化します。処理中の競合は`RECORD_BUSY`で明示し、未知の受付結果を自動再送しません。送信受付後に監督状態の書き込みだけが失敗した場合は、配送結果とIDを維持して`supervision_update_required: true`を返します。これは再送の指示ではありません。
208
212
 
@@ -213,3 +217,11 @@ npx -y codexteer@0.16.0 --version
213
217
  `--connection desktop`は既存の`CODEX_HOME/app-server-control/app-server-control.sock`へ読み取り専用で接続します。ホームは所有者一致かつgroup/other書込不可、制御ディレクトリとソケットは所有者専用に限定します。接続前後・各API要求でendpointを検査し、ロード済み対象だけを読み取ります。明示的な選択であり、自動検出による接続切り替え・daemon起動・Desktop再起動はしません。送信機能の診断は`unsupported`、`source: observation-only`です。実機での送信・UI表示・承認継続は未検証のまま残します。
214
218
 
215
219
  開発用の`npm run test:connection`は、Desktop同梱CLIを一時プロファイルのUnixソケットで起動し、ローカル偽モデルで作った合成履歴の読み取りを確認します。実Desktopへの接続・設定変更や外部モデル利用は行いません。`npm run test:protocol`は既存wrapper・偽Desktopとの送信と承認経路、`npm run test:package`は実tarball・オフラインnpx・偽Claude/Codexの起動と、別CODEX_HOME・キャッシュ削除後の観測/送信・pause/resume・重複拒否を確認します。これらの隔離検証から実Desktopの表示や直接接続での承認往復まで保証するものではありません。
220
+
221
+ ## 0.18.0の公開候補
222
+
223
+ `package.json`と`package-lock.json`の版を0.18.0に揃えています。0.17.0はnpm registryで公開済みであることを確認し、同じ版への上書き公開は行いません。`projects list`と`thread create --project`、Desktopの所属登録、全フォルダと初回指示の照合を追加します。既存のruntime protocolとcapability契約はv1を維持します。
224
+
225
+ 公開前に構文・全回帰・tarballとoffline install・npm/npx・publish dry-runを確認します。公開するファイルを固定する場合は、検証済みtarballのSHA-256を照合してから同じtarballを公開してください。PRのReady化やバージョン更新だけではnpmへ公開されません。
226
+
227
+ 検証結果の要約は`remote-cli-validation.json`を参照してください。実環境のホスト・プロジェクト・チャット識別子、ローカルパス、診断ログは公開用の配布物へ含めません。npm公開・Gitタグ作成はPR更新とは別の操作です。
@@ -0,0 +1,120 @@
1
+ # プロジェクトと目標からオーケストレーションを始める
2
+
3
+ `prompt`を付けなければ、生成本文を渡して対話CLIを起動します。
4
+
5
+ ```bash
6
+ codexteer orchestrate --project 'Example Project' '達成したい目標' --use-path-cli
7
+ codexteer orchestrate --project 'Example Project' '達成したい目標' --agent codex
8
+ codexteer orchestrate --project 'Example Project' '達成したい目標' --agent claude -- --model <MODEL>
9
+ ```
10
+
11
+ 起動方法は`supervise`と同じで、`--agent`の既定は`claude`です。`codex`も指定できます。これは起動先CLIの選択で、役割の本文はモデル非依存です。起動側は現在のcwd・環境・標準入出力を引き継ぎ、CLIの終了コードを返します。`SIGINT`・`SIGTERM`・`SIGHUP`を転送し、シグナル終了は128+シグナル番号です。
12
+
13
+ 最初の`--`以降はすべて起動するCLIの引数として、順序・空文字・改行を保持して渡します。その後ろにCLI側の`--`と生成本文を一つの引数として追加し、shellで再展開しません。`--json`は直接起動では使えません。本文のJSONが必要な場合は`orchestrate prompt ... --json`を使います。
14
+
15
+ 目標は一つの引用した引数か`-`で渡します。`--`で始まる目標はstdinの`-`を使ってください。stdinの目標は起動前に読み取るため、その入力は対話CLIへ再送しません。通常の引数で目標を渡す場合はstdinもそのまま対話CLIへ引き継ぎます。
16
+
17
+ `--use-path-cli`は本文内のcodexteerコマンドをPATH方式にし、保存コピーを作りません。省略時は保存済みCLI・Node版・canonical `CODEX_HOME`を本文へ固定します。起動するエージェント自体は、どちらの方式でもPATHから選びます。PATH方式の直接起動でも`CODEX_HOME`の所有者と権限を検証し、必要ならディレクトリを作成します。入力不正や保存コピーの改変、unsafe profileではエージェントを起動しません。
18
+
19
+ 起動側はDesktopへ接続せず、本文を受け取ったオーケストレーターがプロジェクト照合・作成・監視を開始します。プロジェクト用の単一スレッド監督IDは作りません。各子の監督登録と制御は本文の手順に従います。
20
+
21
+ ## 本文だけ生成する
22
+
23
+ ```bash
24
+ codexteer orchestrate prompt --project 'Example Project' \
25
+ 'モーション図鑑で現状の動作を確認し、変更を指示できる状態にする'
26
+ ```
27
+
28
+ 生成した本文を同じPCのオーケストレーターへ依頼として渡します。役割はモデルに依存せず、Codex自身もオーケストレーターを担当できます。既存スレッドIDは不要です。特定スレッドを監督するときは、従来の `supervise prompt <THREAD> [MESSAGE]` を使います。
29
+
30
+ 生成ではDesktopへ接続しません。プロジェクトの照合、チャット作成、送信、監督登録、監視は、本文を受け取ったオーケストレーターが開始します。既定ではCLIと依存を内容ハッシュ別に保存・検証し、元のNodeとcanonical `CODEX_HOME`を使うコマンドを本文へ埋め込みます。
31
+
32
+ ```bash
33
+ # 実行環境のPATHとCODEX_HOMEを使う本文。CLIのコピーは作らない
34
+ codexteer orchestrate prompt --project 'Example Project' '達成したい目標' --use-path-cli
35
+
36
+ # 子の監督IDと送信元のCLI識別を明示する(エージェントは起動しない)
37
+ codexteer orchestrate prompt --project 'Example Project' '達成したい目標' --agent codex
38
+
39
+ # 改行を含む目標を標準入力で渡す
40
+ codexteer orchestrate prompt --project 'Example Project' - < goal.txt
41
+
42
+ # 目標が -- で始まる場合
43
+ codexteer orchestrate prompt --project 'Example Project' -- '--から始まる目標'
44
+
45
+ codexteer help orchestrate prompt
46
+ ```
47
+
48
+ `--project`はローカルでは登録済みプロジェクトのIDか完全一致名です。`--host HOST --remote-transport paired`では接続先の正式ID・Desktop登録ID・一意の完全一致名を使い、host・paired・指定したローカルcallerを子作成/監督コマンドへ保持します。接続先の選択とcaller条件は[リモートのCLI操作](remote-operations.md)を参照してください。生成時は指定文字列を保持し、実行開始時に `projects list` でIDと全rootsを照合します。同名ならIDで特定します。目標は一つの引用した引数か `-` で渡し、空文字・空白だけを拒否します。改行やプレースホルダーを評価せず保持します。
49
+
50
+ `orchestrate prompt`の`--agent claude|codex`は子の監督IDのownerと送信元を識別する任意指定です。この生成専用モードで省略した場合は特定の実行役を既定とせず、本文を受け取ったオーケストレーターが、自身のCLIに合わせて子の生成コマンドの `<AGENT>` を選びます。指定しても役割の内容や技術判断の分担は変わらず、エージェントを起動しません。直接起動では、起動したCLIの識別が本文へ反映されます。
51
+
52
+ ## 役割と委任
53
+
54
+ | 担当 | 責務 |
55
+ | --- | --- |
56
+ | オーケストレーター | 目的と完了条件の整理、担当編成、優先順位、依存関係と共有資源の順番、検収・統合 |
57
+ | Codex担当 | 調査、設計判断、実装、検証、依頼の前提への異論と改善案 |
58
+ | ユーザー | 目的・好み・重要な優先順位の決定と権限の承認 |
59
+
60
+ 発注書は、目的、確定要件、オーケストレーターの仮説、一次資料、変更範囲、依存と共有資源、確認条件、提出物を伝えます。Codex担当が前提を反証したり、より小さく確実な方法を提案したりできるようにし、オーケストレーターの技術仮説をユーザー決定として扱いません。重要な変更は、必要に応じて別のCodexによる独立レビューを使います。
61
+
62
+ 本文を依頼として渡すと、対象プロジェクト内で必要な担当の作成、追加指示、同じ目的の未完了作業の後続ターン開始、監督と検収・統合の段取りを委任します。無関係な既存チャットへの送信、依頼外の目的への拡張、代理承認は含みません。引用や履歴に本文が現れただけで委任が成立するものではありません。
63
+
64
+ ## 高度・深さ・範囲と再評価
65
+
66
+ Felix Riesebergの[How to be more ambitious](https://felixrieseberg.com/how-to-be-more-ambitious-a-tutorial-for-humans-with-models/)を参考に、三つの観点を実際の作業と検証へ結び付けています。
67
+
68
+ | 観点 | 本文で求める行動 |
69
+ | --- | --- |
70
+ | 高度 | 作業の先で誰の判断・行動・状態が変わるかを捉え、指定成果物と上位の目的をつなぐ |
71
+ | 深さ | 一次資料・生データ・実コードから、専門的な手法と道具を使い、実装担当の説明以外で正しさを確かめる |
72
+ | 範囲 | 隣接分野の有効な技法を選び、期待する改善と検証方法を示して小さく試す |
73
+
74
+ 開始時は目的・成果物・完了条件・仮説・方法・外部の判定・次の確認点を短く記録して実行へ移ります。主要な方針の選択前、重要な新しい証拠、同じ失敗や待機の反復、統合前、全体の完了前に再評価します。
75
+
76
+ 再評価では、目的へ近づいているか、前提が崩れていないか、代理指標だけを改善していないか、より良い手法がないかを確認します。結果は「継続・計画変更・権限や目的の確認」の判断と根拠、次の検証として残します。長い思考の実況や、通知ごとの儀式的な点検は求めません。
77
+
78
+ 現状・要求基準・挑戦目標を分け、高い到達点を試す余地を持たせます。上位の目的や挑戦目標は仮説として検証し、ユーザーの依頼の置き換え、受入条件の無断緩和、分野や担当数の無制限な追加には使いません。
79
+
80
+ ## 作成から完了まで
81
+
82
+ 1. 対象プロジェクトと全rootsを照合し、既存の担当と共有資源を確認する。
83
+ 2. 必要な担当の発注書をファイルに保存し、`thread create --project <ID> --title <TITLE> - --json` へ標準入力で渡す。
84
+ 3. 作成結果のIDとreceiptを保存する。created/acceptedの照合失敗は`thread verify <ATTEMPT-ID> --json`で同じ子とreceiptを再照合する。部分成功・unknownでは同じ子を調べ、自動再作成・再送しない。verifyはDesktopへの読取りだけで、unknown/未受付を成功に変更しない。
85
+ 4. 同じCLIから子ごとの `supervise prompt` を生成・保存し、register/read/watchを開始する。子の監視を開始できなければ、追加作成を止めて報告する。
86
+ 5. 個別の監督ID、読了cursor、findings、配送照合を使って介入する。必要な継続は同じ委任の未完了作業に限る。
87
+ 6. 最終差分と検証・成果物を検収し、統合と統合後の確認を担当へ依頼して全体の目的達成まで追う。
88
+
89
+ 作成用コマンドは特定スレッドの `--supervisor` を持ちません。子の観測・送信は、生成した個別の監督コマンドを使います。既定の保存済みCLI方式とPATH方式を子の生成にも引き継ぎます。既存監督IDからの `orchestrate prompt` と、観測専用の `--connection desktop` は拒否します。
90
+
91
+ 担当ごとの生成方針には、目的の継続、Codexの独立した判断、三つの観点を含めます。元からある単一スレッド監督の標準方針や操作手順は変更しません。
92
+
93
+ ## 制御と確認範囲
94
+
95
+ `supervise pause/stop`は個別スレッドの監督制御です。プロジェクト全体の一括pause/stopや常駐スケジューラーは追加していません。オーケストレーターへの監督停止指示は、新規作成・追加送信・自分のMonitor/watchを止める指示として扱い、実行中のCodex担当の作業自体を止める指示とは区別します。
96
+
97
+ `resource`は参加者間の協調用リースで、OSの強制ロックや公平な待ち行列ではありません。利用順はオーケストレーターが調整します。監督登録がactiveでも、継続して監視できていることを証明しません。
98
+
99
+ JSON出力は次の形です。`project_selector`は照合前の指定文字列です。
100
+
101
+ ```json
102
+ {
103
+ "ok": true,
104
+ "command": "orchestrate.prompt",
105
+ "data": {
106
+ "project_selector": "Example Project",
107
+ "goal": "達成したい目標",
108
+ "agent": null,
109
+ "prompt": "目標・役割・再評価と操作手順を含む本文…",
110
+ "connection": "shared",
111
+ "cli_mode": "path",
112
+ "deployment": null,
113
+ "node": null
114
+ }
115
+ }
116
+ ```
117
+
118
+ 既定の `cli_mode: saved` は、`supervise prompt`と同じdeploymentとnodeのメタデータを返します。生成時にプロジェクト用の監督IDや登録記録は作りません。
119
+
120
+ 自動テストは、CLIの入出力、生成時の非接続、目標と方針の分離、引数の保持、CLI方式の継承と子の監督開始、既存監督の回帰を確認します。生成成功は、受け取るAIの方針遵守や実プロジェクトの目的達成を証明するものではありません。
@@ -0,0 +1,139 @@
1
+ {
2
+ "validation_scope": "Public aggregate results only. Test identifiers and fixture hosts are synthetic; no account metadata or conversation content is included.",
3
+ "transport": "paired",
4
+ "pull_request_validation": {
5
+ "tests": 409,
6
+ "pass": 408,
7
+ "fail": 0,
8
+ "skipped": 1,
9
+ "syntax": "passed",
10
+ "diff_check": "passed",
11
+ "package": {
12
+ "suite": "package",
13
+ "result": "PASS",
14
+ "package": "codexteer",
15
+ "version": "0.17.0",
16
+ "packed_files": 101,
17
+ "publish_dry_run": true,
18
+ "offline_install": true,
19
+ "npm_exec": true,
20
+ "npx_supervision": true,
21
+ "copied_prompt": true,
22
+ "cache_update": true,
23
+ "cache_removal": true,
24
+ "mixed_versions": true,
25
+ "feature_isolation": true,
26
+ "real_desktop_validated": false
27
+ }
28
+ },
29
+ "pause_stop_regression": {
30
+ "date": "2026-10-28",
31
+ "scope": "Local temporary state, fake remote RPC and synthetic commands only. No real enrollment, pairing or chat sends.",
32
+ "before_fix": {
33
+ "tests": 4,
34
+ "pass": 1,
35
+ "fail": 3,
36
+ "result": "Acknowledged pause/stop during preparation did not prevent shell dispatch; resource execution dropped supervisor binding."
37
+ },
38
+ "after_fix": {
39
+ "tests": 7,
40
+ "pass": 7,
41
+ "fail": 0,
42
+ "result": "Pause/stop before dispatch rejects execution. Dispatch holds the supervisor control lock through the RPC receipt; concurrent control returns RECORD_BUSY. The lock releases after the receipt. Unknown execution retains resource lease without replay."
43
+ },
44
+ "test_file": "test/supervised-shell.test.mjs",
45
+ "accepted_commands_cancelled_by_pause": false,
46
+ "real_chat_messages_sent": false
47
+ },
48
+ "dependency_advisory_audit": {
49
+ "checked_at_utc": "2026-10-28T02:29:39Z",
50
+ "scope": "Installed and bundled npm dependencies from package.json, package-lock.json and npm ls --all. One package: ws 8.21.3; no transitive dependencies. Optional peers bufferutil/utf-8-validate are not installed or bundled.",
51
+ "npm_version": "11.20.0",
52
+ "databases": [
53
+ {
54
+ "name": "npm Audit",
55
+ "matching_vulnerabilities": 0,
56
+ "severity_counts": {
57
+ "info": 0,
58
+ "low": 0,
59
+ "moderate": 0,
60
+ "high": 0,
61
+ "critical": 0,
62
+ "total": 0
63
+ },
64
+ "command": "npm audit --json --registry=https://registry.npmjs.org",
65
+ "registry": "https://registry.npmjs.org/"
66
+ },
67
+ {
68
+ "name": "OSV",
69
+ "endpoint": "https://api.osv.dev/v1/query",
70
+ "query": {
71
+ "package": {
72
+ "name": "ws",
73
+ "ecosystem": "npm"
74
+ },
75
+ "version": "8.21.3"
76
+ },
77
+ "matching_vulnerabilities": 0
78
+ },
79
+ {
80
+ "name": "GitHub Advisory Database (reviewed)",
81
+ "endpoint": "https://api.github.com/advisories?ecosystem=npm&affects=ws%408.21.3&type=reviewed&per_page=100",
82
+ "matching_vulnerabilities": 0
83
+ }
84
+ ],
85
+ "positive_control": {
86
+ "database": "OSV",
87
+ "queried_not_installed_version": "ws 8.20.0",
88
+ "matching_advisories": [
89
+ "GHSA-58qx-3vcg-4xpx",
90
+ "GHSA-96hv-2xvq-fx4p"
91
+ ],
92
+ "note": "Read-only API query; vulnerable version was not installed or executed."
93
+ },
94
+ "distribution_integrity": {
95
+ "name": "ws",
96
+ "version": "8.21.3",
97
+ "registry_integrity_matches_lockfile": true,
98
+ "installed_files_match_registry_tarball": true,
99
+ "files_compared": 19
100
+ },
101
+ "remediation": "No known affected dependency found; retain the existing exact pin and lockfile.",
102
+ "limitations": "Point-in-time known-advisory check, not proof of absence of unknown vulnerabilities. External Node/npm runtimes, Codex Desktop/native addons and OS components are not project npm dependencies and were not audited against their own advisory feeds.",
103
+ "real_chat_messages_sent": false,
104
+ "audited_dependency_tree": "package-lock.json: ws 8.21.3"
105
+ },
106
+ "publication_review": {
107
+ "date": "2026-10-28",
108
+ "scope": "Public source tree, PR-only commits, PR description/comments, and npm tarball. Environment-specific investigation records are excluded.",
109
+ "secret_scanner": {
110
+ "name": "Gitleaks",
111
+ "version": "8.30.1",
112
+ "configuration": "Built-in rules; ignore-allow comments disabled; no repository suppression list.",
113
+ "credential_findings": 0
114
+ },
115
+ "privacy_controls": [
116
+ "Examples and tests use synthetic UUIDs and fixture names only.",
117
+ "No personal home paths, real workstation names, real project/chat IDs or conversation transcripts.",
118
+ "Investigation notes excluded from the repository publication tree and npm file allowlist.",
119
+ "Local authentication, environment and diagnostic files ignored by Git."
120
+ ],
121
+ "regression_tests": "test/publication.test.mjs",
122
+ "limitations": "No scan proves absence of unknown secret formats. Removing current files or rewriting PR-only commits does not erase earlier base-branch history, third-party clones or hosting-provider caches."
123
+ },
124
+ "review_follow_up": {
125
+ "scope": "Remote CLI parent branch; temporary profiles and fake RPC only. No real host or conversation operations.",
126
+ "targeted_tests": 68,
127
+ "targeted_pass": 68,
128
+ "fixed": [
129
+ "POSIX case-sensitive project and scope comparisons; explicit Windows drive/UNC handling",
130
+ "Positional destination routing independent of metadata option values",
131
+ "Reject mismatched supervisor transport before pause/resume/stop writes",
132
+ "Persist failed remote reverification and clear stale certification flags",
133
+ "Keep internal execution RPC errors unknown and retain resource leases without replay",
134
+ "Japanese Unreleased changelog entries"
135
+ ],
136
+ "previously_fixed": "Supervised shell dispatch remains serialized with pause/stop; seven existing regression tests pass.",
137
+ "github_test_ci": "No repository test workflow configured; local regression/package suites executed."
138
+ }
139
+ }
@@ -0,0 +1,65 @@
1
+ # リモートへの指定ターン送信と監督
2
+
3
+ `--remote-transport control`を明示すると、Remote Control WebSocket protocol v3のフレーム内にApp Server JSON-RPCを載せ、`remote-control:env_...`で選んだホストへ直接送ります。`turn/steer`の`expectedTurnId`をそのままリモートApp Serverに渡し、サーバーが現在のターンと照合します。Desktopのnative `send_message_to_thread`やfollower操作による、宛先ターンの推測は使いません。
4
+
5
+ **control経路は実験的な実装です。** 既存Desktop鍵をhelperから利用できない環境では、接続前の公開鍵診断で停止します。control経路の動作確認は利用環境ごとに必要です。鍵へのアクセス権を変更したり別の鍵へ自動切替したりしません。
6
+
7
+ Desktop鍵に限定しない場合は、[専用端末鍵を公式登録するpaired経路](remote-device-enrollment.md)を明示選択できます。native / control / paired間で資格情報やカーソルを自動的に切り替えません。
8
+
9
+ ```bash
10
+ # 対象を読み取りだけで診断する。送信や再開はしない。
11
+ codexteer --remote-transport control doctor --thread '<hostId付きリンク>' --json
12
+
13
+ # 送信を伴う監督用の本文を生成する。本文生成だけでは接続しない。
14
+ codexteer --remote-transport control supervise prompt '<hostId付きリンク>' --use-path-cli
15
+
16
+ # 監督役を起動する。明示した方針と目的の範囲内で、既存のactiveターンへ介入する。
17
+ codexteer --remote-transport control supervise '<hostId付きリンク>' --agent codex
18
+
19
+ # 同じ経路で読み、カーソルと指摘を登録してから送信する。
20
+ codexteer --remote-transport control read '<hostId付きリンク>' --json
21
+ codexteer --remote-transport control findings create '<hostId付きリンク>' \
22
+ --key '<安定したkey>' --title '<指摘>' --condition '<解決条件>' --based-on '<CURSOR>' --json
23
+ codexteer --remote-transport control send '<hostId付きリンク>' '<指示>' \
24
+ --finding '<FINDING-ID>' --based-on '<CURSOR>' --source codex --kind review --json
25
+ ```
26
+
27
+ control経路は通常の端末からの利用も想定した実装で、`--context-thread`は不要です。リモートリンクか`--host remote-control:env_...`は必須です。`--remote-transport`を省略した既存のnative経路は、引き続き観測専用です。接続失敗時にnative送信、UI、SSH、別ホストへ切り替えません。SSHホストやChatGPT cloudのIDをRemote ControlのIDへ読み替えません。
28
+
29
+ ## 接続・認証と照合
30
+
31
+ 1. 選択したCODEX_HOMEの既存shared wrapperと、同梱CLIのcommand schemaを検証する。
32
+ 2. 正規App Serverの`getAuthStatus`を読み、現在の標準ChatGPTアカウントを特定する。トークンはメモリ内だけで扱う。
33
+ 3. 同じトークンのaccount userまたはDesktopが受け付けるauth user aliasに一致する既存Desktop device-key enrollmentを読み取る。account headerはトークンのaccount IDに固定する。新規キー・登録・設定変更を行わない。
34
+ 固定helperのinspect操作で既存公開鍵を照合する。失敗すればREMOTE_DEVICE_KEY_UNAVAILABLEとremote_control_auth診断を返し、WebSocketを開かない。この操作は署名しない。
35
+ 4. `wss://chatgpt.com/backend-api/codex/remote/control/client`だけにTLSで接続し、HTTP Authorizationと`ChatGPT-Account-Id`を使う。URL変更・リダイレクト・別の認証方式へのfallbackを行わない。
36
+ 5. `x-codex-protocol-version: 3`と`x-codex-client-auth: socket-refresh-v1`を指定し、目的・宛先origin/path・アカウント・client・scope・nonce・有効期限が一致した認証チャレンジだけを受け付ける。purposeとaudienceは`remote_control_client_websocket`、scopeは`remote_control_controller_websocket`で別の値である。socket-refresh未対応なら停止する。
37
+ 6. 固定のhelperをDesktopの署名付きNodeから読み取り専用sandboxで起動する。OSの非抽出キーを既存登録の公開鍵と照合し、許可した接続チャレンジだけへ、定義したフィールド順に正規化して署名する。秘密鍵はエクスポートしない。helperの入出力と一時ファイルへbearer tokenを渡さない。
38
+ 7. 署名を登録済み公開鍵で検証し、`device_key_authenticated`が返った場合だけ専用のstream IDを開く。
39
+ 8. すべての読み取り・送信前にローカルのアカウントとenrollment、選択中runtimeが変わっていないことを確認する。各フレームのclient・env・stream・連番と分割ペイロードを検査し、選んだホスト以外の履歴や受付結果を採用しない。
40
+
41
+ この経路の利用は、既存ログイントークンを上記の公式宛先へ送信し、登録済みOSキーで接続チャレンジへ署名する操作を伴います。OSやDesktopの認証拒否を解除・迂回せず、そのまま停止します。通常起動の`--connection desktop`は引き続き観測専用で、controlとの併用は拒否します。
42
+
43
+ ## ターン照合と監督の制約
44
+
45
+ 既存の`readSendState`・`sendOnClient`と同じ処理で最新のactiveターンを選び、`threadId`・`expectedTurnId`・`clientUserMessageId`を固定して一度だけ`turn/steer`します。ターンが入れ替わればサーバーの拒否を返します。別のターンを選び直して再送しません。transportのACKをメッセージ受付と解釈せず、App Serverの同じturn IDの応答でだけacceptedにします。
46
+
47
+ 監督ID・finding・読了カーソル・ユーザー入力の更新確認・pause/stopのロック・重複介入防止・配送記録は既存の処理を使います。unknownはclient message IDを持つ実際の履歴と`history check`で照合し、not_observedを未配送と決めつけません。接続の再開時も送信フレームをreplayしません。手動の新しい送信も、委任されたメッセージや監督の範囲内で行います。
48
+
49
+ controlとnativeでは公開履歴の項目構造・出力制限が異なるため、カーソルと監督登録を`remote_transport`にも結び付けます。同じhostIdでも別経路のカーソルや監督IDを使うと停止します。既存nativeのカーソルにremote_transportがない場合はnativeとして扱います。送信履歴と指摘は同じホストの対象として共有し、経路を変えて重複送信を回避しません。
50
+
51
+ - `--new-turn`、`thread/resume`、`turn/start`は未対応。別接続から新規ターンを始めて承認の所有者を失わないよう拒否する。
52
+ - UI送信、代理の承認回答、作成、履歴修復は未対応。
53
+ - 送信JSONは64 KiBまで。大きすぎる要求は配送前に拒否する。
54
+ - 応答はフレームごとに150 KiB、再構成後64 MiBまで。欠落・順序異常・別ホストのフレームは停止する。
55
+ - 接続・認証・schemaの対応状況と、指示の実配送・UI表示・承認往復は別々に扱う。
56
+
57
+ ## 鍵が利用できない場合
58
+
59
+ `doctor`が`REMOTE_DEVICE_KEY_UNAVAILABLE`を返す場合、`remote_control_auth`の失敗段階と分類を確認してください。これは鍵がDesktopからも消えている証拠ではありません。Desktopの署名・Keychain ACL・entitlementを変更せず、必要なら利用者が専用鍵のpaired方式を別途選択してください。診断や登録の許可は、チャットへの指示送信の許可を意味しません。
60
+
61
+ ## 検証
62
+
63
+ `test/remote-control.test.mjs`では、テスト用EC鍵・架空のトークン・フレームを使い、チャレンジと署名の照合、別アカウント/宛先/期限/ホストの拒否、ターン交代拒否、unknown配送とreplay禁止、idle/new-turn拒否、freshness・pause/stop・findingの重複拒否、client IDでの保存履歴照合、保存済みCLIとPATH版の監督本文を検証します。実アカウントは使いません。
64
+
65
+ `npm run test:remote-control`は一時プロファイルの実同梱Rust App Serverとloopbackの偽モデルを使います。Remote Controlフレームのadapterを通した正しいターンの受付と、誤ったexpectedTurnIdのサーバー側拒否、送信前freshnessの照合を確認済みです。公式ゲートウェイ、実トークン、実device keyは使いません。