codexteer 0.18.0 → 0.18.1
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.
- package/CHANGELOG.md +13 -6
- package/README.md +2 -2
- package/docs/distribution.md +10 -7
- package/package.json +1 -1
- package/src/store.mjs +19 -10
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
公開日は日本時間です。
|
|
4
|
+
|
|
5
|
+
## 0.18.1 — 2026-10-31
|
|
6
|
+
|
|
7
|
+
- ローカルロックの保持者と回収者が続けてクラッシュした後、`RECORD_BUSY`から自動回復できなくなる問題を修正しました。回収処理にもPIDと世代トークンを持つロックを使い、生きた保持者・回収者の排他を維持します。
|
|
8
|
+
- 更新前に、同じ`CODEX_HOME`を使う旧版CLIの操作と、保存済み旧CLIで動く監督を終了してください。旧版と修正版の回収方式を混在させることはできません。残った旧`.recover`ディレクトリは修正版の動作を妨げません。更新後に監督を起動し直すか、プロンプトを生成し直してください。
|
|
9
|
+
|
|
10
|
+
## 0.18.0 — 2026-10-29公開
|
|
4
11
|
|
|
5
12
|
- `thread repair <THREAD>`で古いターンの終了記録欠落を検出します。明示的な`--apply`はCodexの完全終了・検証済みバージョンを必須とし、バックアップ後に対象IDの中断記録だけを追記・照合します。既存の会話やDBは書き換えず、最新の未完了ターンは修復しません。
|
|
6
13
|
- macOS向けに`desktop update`と`desktop update-status`を追加しました。独立したworkerが公式更新UI(英語・日本語)を操作し、新ビルドと再起動を確認してから共有wrapperを再適用・検証します。外部NodeとターミナルのAccessibility・Automation権限が必要です。
|
|
@@ -13,21 +20,21 @@
|
|
|
13
20
|
- POSIXパスの大文字小文字を保持し、CLIの宛先はオプション値ではなく位置引数から選択します。監督の制御は登録時のtransportと一致する場合だけ受け付けます。
|
|
14
21
|
- リモート作成の再照合失敗時は古い認定フラグを除去してreceiptへ記録します。実行RPCの内部エラーでは実行済みの可能性を保持し、resource leaseを解放しません。
|
|
15
22
|
|
|
16
|
-
## 0.18.0 — 未公開
|
|
17
|
-
|
|
18
23
|
- Cloud監督の登録前診断と、初回配送の受付不明を共通履歴から照合・回復できるよう修正しました。本文・client IDが一致する保存証拠だけを採用し、自動再送は行いません。
|
|
19
24
|
|
|
20
25
|
- Desktop Cloudの所属確認をdoctorへ追加し、プロジェクト一覧と環境一覧を分離しました。署名付きのthread assignは実環境・nonce・署名・保存結果を照合します。そのDesktop実行環境への結合が必要で、通常のCloud環境の拒否を成功扱いしたり別環境へ置き換えたりしません。作成後のタイトル設定・初回配送失敗時にも通常表示へ作成済みIDと復旧情報を残します。
|
|
21
26
|
|
|
22
27
|
- Desktop Cloudの環境構成一覧・新規作成・継続送信・共通監視を追加しました。初回送信にも選択済み環境と遅延起動指定を保持します。環境選択とDesktopプロジェクト所属を区別し、所属登録が確認できない`--project`作成は事前拒否します。受付不明の自動再送は行いません。
|
|
23
28
|
|
|
24
|
-
- Cloudの重複拒否で前回の試行IDを今回の配送履歴へ結び付けないよう修正しました。回復用IDを分離し、history check
|
|
29
|
+
- Cloudの重複拒否で前回の試行IDを今回の配送履歴へ結び付けないよう修正しました。回復用IDを分離し、history checkは今回の本文・親ターンも照合して、拒否した指示の誤有効化を防ぎます。作成用--env別名を削除し、環境指定は--projectに統一しました。新規作成の本文がCloud ID/URLで始まっても、それを宛先と誤判定しません。
|
|
25
30
|
|
|
26
31
|
- 共通Cloud観測で公開commentaryの途中経過を保持し、途中経過だけの更新でもMonitorへ通知します。reasoning等の非公開内容は除外し、`--backend app-server`を宛先より前に置く場合のCloud振り分けも修正しました。
|
|
27
32
|
|
|
28
33
|
- Cloudタスクも共通の`supervise`・`read/watch`・`send`・`history/instructions/findings`で扱えます。監督の登録・pause/resume/stop・保存済みCLI・Monitorのdigestと復帰待ちを既存基盤へ接続し、実行中の指定ターンの中断と同一タスク内での継続、配送照合を追加しました。旧Desktop CLIとの記録互換性を保つCloud専用監督名前空間を使います。
|
|
29
34
|
|
|
30
|
-
- Cloud環境・タスクの一覧と新規作成は`--connection cloud projects list`・`threads list`・`thread create`で扱います。作成試行は`thread receipt`、配送照合・予約回復は`history show/check --attempt`、試行を選ぶ差分取得は`diff --attempt
|
|
35
|
+
- Cloud環境・タスクの一覧と新規作成は`--connection cloud projects list`・`threads list`・`thread create`で扱います。作成試行は`thread receipt`、配送照合・予約回復は`history show/check --attempt`、試行を選ぶ差分取得は`diff --attempt`に統一しました。重複サブコマンドと専用のカーソル・watch処理を削除し、結果不明時の自動再送は行いません。公式CLIの診断は私有一時領域で処理し、ローカル差分を暗黙に送信・適用しません。
|
|
36
|
+
|
|
37
|
+
## 0.17.0 — 2026-10-15公開
|
|
31
38
|
|
|
32
39
|
- `projects list`と`thread create --project`を追加しました。プロジェクト名と初回指示だけで作成でき、既存チャット・`CODEX_THREAD_ID`・中継AIは不要です。App Serverで作成・Desktop購読・初回配送を行い、新規チャット自身の実在IDからnative RPCで所属登録し、全フォルダと初回指示を照合します。明示的な`--context-thread`は任意で、従来のnative直接作成を使います。配送不明・部分成功を保持し、自動再作成・再送を行いません。
|
|
33
40
|
|
|
@@ -41,7 +48,7 @@
|
|
|
41
48
|
- `--settle-ms`と`--max-hold-ms`で待ち時間を調整できます。初回の読み取りは基準として扱い、実行中コマンドの出力だけの更新ではsettleを延長しません。保留分は接続断・終了時にも排出し、ページ途中の場合だけ`has_more:true`を保持します。200件/64KBはページ読了後の排出目安です。
|
|
42
49
|
- 監督プロンプトを方針先頭の8節へ整理し、既定方針に設計上の責務と作業の焦点を追加します。設計上の責務では、事実・計算・判定を設計がどの層やシステムの担当と定めているかを先に確認し、別の層での検算や再計算など、同じ事実の持ち主が二つになる実装を観測します。基準は複数のリポジトリにまたがる設計の全体とし、分担が示されていない場合は推測せずユーザーに確認します。開始時の`help monitor`の重複読み取りをなくし、通知の読み方・無操作時の応答・Monitor期限切れ・議論の送信を明示します。生成する監視コマンドは`--notify digest`を明示します。
|
|
43
50
|
|
|
44
|
-
## 0.15.1 —
|
|
51
|
+
## 0.15.1 — 2026-09-13公開
|
|
45
52
|
|
|
46
53
|
- ページ履歴に対応するタスクへの`send`・`send --new-turn`は、本文を含まないターン状態を分割取得して送信前に確認します。長いタスクの全履歴が64 MiBを超え、観測はできても送信準備だけ失敗する問題を修正しました。`--based-on`等の安全確認は維持します。
|
|
47
54
|
- 64 MiBの受信上限を超えた場合は`PAYLOAD_TOO_LARGE`を返します。上限は維持し、送信前の`not_sent`と受付未確認の`unknown`を区別します。
|
package/README.md
CHANGED
|
@@ -18,7 +18,7 @@ Desktop操作にはmacOS、Node.js 20以降とnpm、`/Applications/ChatGPT.app`
|
|
|
18
18
|
|
|
19
19
|
リポジトリのcloneやグローバルインストールなしで実行できます。npmパッケージ名とCLI名は`codexteer`です。
|
|
20
20
|
|
|
21
|
-
npm
|
|
21
|
+
npm公開済みの最新版は[`0.18.0`](https://www.npmjs.com/package/codexteer/v/0.18.0)です。リモート操作・Cloud対応・Desktop更新・オフライン履歴修復を含みます。変更点と各機能の条件は[CHANGELOG](CHANGELOG.md)を参照してください。
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
24
|
npx -y codexteer --version
|
|
@@ -36,7 +36,7 @@ npx -y codexteer doctor --json
|
|
|
36
36
|
<details>
|
|
37
37
|
<summary>特定のバージョンで実行する場合(任意)</summary>
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
不具合の切り分けや、同じ版で監督を開始し直したい場合は、パッケージ名に`@バージョン`を付けられます。公開済みの`0.18.0`を選ぶ場合は、次のように指定します。
|
|
40
40
|
|
|
41
41
|
```bash
|
|
42
42
|
npx -y codexteer@0.18.0 supervise <thread-id>
|
package/docs/distribution.md
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
# 配布と永続実行
|
|
2
2
|
|
|
3
3
|
パッケージ名は `codexteer`、CLI名は `codexteer`、ライセンスはMITです。
|
|
4
|
-
旧npmパッケージは`@vinhphatfsg/codex-steer
|
|
4
|
+
旧npmパッケージは`@vinhphatfsg/codex-steer`です。リモート操作・Cloud対応・Desktop更新・オフライン履歴修復を含む[`codexteer@0.18.0`](https://www.npmjs.com/package/codexteer/v/0.18.0)は2026-10-29にnpmへ公開済みです。GitHubのPR作成・マージはnpm公開を行う操作ではありません。次の版を公開する際も`npm whoami`でnpm側のユーザーを確認してください。
|
|
5
|
+
|
|
6
|
+
`0.18.1`は、保持者と回収者の連続クラッシュでローカルロックが永久に`RECORD_BUSY`になる問題を修正します。更新前に、同じ`CODEX_HOME`を使う旧版CLIの操作と、保存済み旧CLIで動く監督を終了してください。旧版と修正版の回収方式の混在は非対応です。旧`.recover`ディレクトリは修正版では無視されます。監督は更新後のCLIで起動し直すか、プロンプトを生成し直してください。
|
|
7
|
+
|
|
5
8
|
`package.json` は `private` を持たず、`publishConfig` でnpm公式レジストリへのpublic公開を指定しています。公開可能な設定であることと、実際に公開済みであることは別です。
|
|
6
9
|
|
|
7
10
|
公開後の基本的な実行形式は次のとおりです。通常はバージョン指定なしで使えます。監督開始後は保存したCLIを使い続けるため、監督中の一貫性を保つために版を明示する必要はありません。起動側と操作側の製品バージョンも、必要な通信仕様が対応していれば異なっていても使えます。
|
|
8
|
-
以下の監督機能は公開済みの0.15.0から利用できます。0.16.0
|
|
11
|
+
以下の監督機能は公開済みの0.15.0から利用できます。0.16.0では通知集約と監督プロンプトを改善し、0.17.0でDesktopのチャット作成、0.18.0でリモート操作・Cloud対応などを追加しました。いずれもnpmから利用できます。`-y` はnpmの取得確認を省略します。
|
|
9
12
|
|
|
10
13
|
```text
|
|
11
14
|
npx -y codexteer desktop start
|
|
@@ -179,7 +182,7 @@ npxから模擬Claudeと模擬Codexを起動して保存したCLIへの参照を
|
|
|
179
182
|
|
|
180
183
|
レビュー・検証を終えた版を、npm側の公開権限を持つアカウントで公開します。手動公開には2FAを有効にしたアカウントを使ってください。
|
|
181
184
|
|
|
182
|
-
|
|
185
|
+
公開済みのパッケージ名とバージョンの組み合わせは再公開できません。`codexteer@0.18.0`は公開済みのため、次の変更をnpmへ配布する際は新しい版番号を使います。削除しても同じ名前・版番号の組み合わせを再利用できません。[npm publishの仕様](https://docs.npmjs.com/cli/v11/commands/npm-publish/)
|
|
183
186
|
|
|
184
187
|
```bash
|
|
185
188
|
npm login
|
|
@@ -188,7 +191,7 @@ npm run test:package
|
|
|
188
191
|
npm publish --access public
|
|
189
192
|
```
|
|
190
193
|
|
|
191
|
-
|
|
194
|
+
公開後は、公開した版と起動コマンドの登録を確認します。公開済みの0.18.0は次のコマンドで確認できます。
|
|
192
195
|
|
|
193
196
|
```bash
|
|
194
197
|
npm view codexteer@0.18.0 version bin --json
|
|
@@ -218,10 +221,10 @@ npx -y codexteer@0.18.0 --version
|
|
|
218
221
|
|
|
219
222
|
開発用の`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
223
|
|
|
221
|
-
## 0.18.0
|
|
224
|
+
## 0.18.0の公開結果
|
|
222
225
|
|
|
223
|
-
|
|
226
|
+
0.18.0公開時の`package.json`と`package-lock.json`の版、およびnpm registryの`latest`は0.18.0でした。公開tarballが事前検証したファイルと同一であることを確認しました。0.18.0にはリモート操作・Cloud対応・Desktop更新・オフライン履歴修復を含みます。`projects list`と`thread create --project`によるDesktopのチャット作成は0.17.0から利用できます。既存のruntime protocolとcapability契約はv1を維持します。
|
|
224
227
|
|
|
225
|
-
公開前に構文・全回帰・tarballとoffline install・npm/npx・publish dry-run
|
|
228
|
+
公開前に構文・全回帰・tarballとoffline install・npm/npx・publish dry-runを検証しました。公開対象119ファイルの内部情報・シークレット検査と依存脆弱性監査で検出は0件でした。公開後はregistryから取得したtarballのSHA-256一致と、隔離キャッシュからのCLI起動を確認しました。次の版でも検証済みtarballを固定して公開してください。PRのReady化やバージョン更新だけではnpmへ公開されません。
|
|
226
229
|
|
|
227
230
|
検証結果の要約は`remote-cli-validation.json`を参照してください。実環境のホスト・プロジェクト・チャット識別子、ローカルパス、診断ログは公開用の配布物へ含めません。npm公開・Gitタグ作成はPR更新とは別の操作です。
|
package/package.json
CHANGED
package/src/store.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { lstat, mkdir, readFile, writeFile, rename, rm, readdir, link } from "node:fs/promises";
|
|
2
|
-
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { codexHome, isAlive } from "./runtime.mjs";
|
|
5
5
|
import { hostNamespace, hostFields } from "./target.mjs";
|
|
@@ -51,22 +51,31 @@ export async function listRecords(bucket, options = {}) {
|
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
export async function withStoreLock(key, fn, { home = codexHome() } = {}) {
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
return withRecordLock("locks", key, fn, { home });
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async function withRecordLock(bucket, key, fn, { home }) {
|
|
58
|
+
await directory(bucket, home, true);
|
|
59
|
+
const file = storePath(bucket, key, home), token = randomUUID(), temp = `${file}.${token}.tmp`;
|
|
56
60
|
await writeFile(temp, JSON.stringify({ token, pid: process.pid }), { mode: 0o600, flag: "wx" });
|
|
57
61
|
let acquired = false;
|
|
58
62
|
let outcome;
|
|
59
63
|
try {
|
|
60
64
|
for (let attempt = 0; attempt < 2; attempt++) {
|
|
61
65
|
try { await link(temp, file); acquired = true; break; } catch (e) { if (e.code !== "EEXIST") throw e; }
|
|
62
|
-
const old = await readRecord(
|
|
66
|
+
const old = await readRecord(bucket, key, { home });
|
|
63
67
|
if (old && !isAlive(old.pid)) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
+
// Serialize deletion of this generation, including recovery of a crashed
|
|
69
|
+
// recoverer. Each nested lock has an atomically published PID + token.
|
|
70
|
+
// A finite chain of dead owners ends at an absent recovery lock.
|
|
71
|
+
// Legacy .recover directories have no owner and are unsupported/inert.
|
|
72
|
+
// Stop all old-version operations (including saved supervisor CLIs)
|
|
73
|
+
// sharing this CODEX_HOME before using this recovery protocol.
|
|
74
|
+
const recoveryKey = createHash("sha256").update(String(old.token)).digest("hex");
|
|
75
|
+
await withRecordLock("lock-recovery", recoveryKey, async () => {
|
|
76
|
+
const current = await readRecord(bucket, key, { home });
|
|
68
77
|
if (current?.token === old.token && !isAlive(current.pid)) await rm(file);
|
|
69
|
-
}
|
|
78
|
+
}, { home });
|
|
70
79
|
} else break;
|
|
71
80
|
}
|
|
72
81
|
if (!acquired) throw Object.assign(new Error("Another operation owns this local record. Retry after it finishes."), { code: "RECORD_BUSY" });
|
|
@@ -74,7 +83,7 @@ export async function withStoreLock(key, fn, { home = codexHome() } = {}) {
|
|
|
74
83
|
return outcome;
|
|
75
84
|
} finally {
|
|
76
85
|
try {
|
|
77
|
-
if (acquired && (await readRecord(
|
|
86
|
+
if (acquired && (await readRecord(bucket, key, { home }))?.token === token) await rm(file);
|
|
78
87
|
await rm(temp, { force: true });
|
|
79
88
|
} catch { if (outcome && typeof outcome === "object") outcome.state_cleanup_required = true; }
|
|
80
89
|
}
|