peertable 0.4.20 → 0.4.22
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "peertable",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.22",
|
|
4
4
|
"description": "A round table of peer agents. No orchestrator at the head. Turn Claude Code, Codex, and Grok sessions into a team of equal, long-lived peers.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
package/room/client.mjs
CHANGED
|
@@ -13,7 +13,7 @@ import { findModelsDoc, resolveSeatIdentity } from '../skill/scripts/resolve-sea
|
|
|
13
13
|
|
|
14
14
|
// client.mjs 側のハードコード版数。package.json の version と一致していることを
|
|
15
15
|
// diagnostics の version_consistency が見る(2 つの版数源の drift 検出。決定45)
|
|
16
|
-
const MCP_VERSION = '0.4.
|
|
16
|
+
const MCP_VERSION = '0.4.22'
|
|
17
17
|
const PKG_ROOT = join(dirname(fileURLToPath(import.meta.url)), '..')
|
|
18
18
|
|
|
19
19
|
const USAGE = `usage:
|
package/skill/SKILL.md
CHANGED
|
@@ -66,7 +66,7 @@ script は内部で Aiterm の公開 `claude_agent` / `codex_agent` / `grok_agen
|
|
|
66
66
|
- 着任指示を第6引数に渡すと着席後に送る。文面: 「あなたは「<日本語名>」。.team/roles/member.md を読んで着任し、作業ループを開始せよ。全タスク完了の宣言まで自律的に続けること。」
|
|
67
67
|
- 席が読む env は script が組み立てる(`PEERTABLE_URL` / `PEERTABLE_ROOM` / `PEERTABLE_MEMBER` / `PEERTABLE_CREDENTIAL_FILE`、Lattice 併用なら `PEERTABLE_PLAN` と actor 3点)。token値は席別`0600` fileにだけ置き、pathだけを席へ渡す。**channels は `--mcp-config` の MCP server を解決しない**(実測 2026-08-08・Claude Code v2.1.226・決定44)ため、room の MCP 定義は setup.sh が project root へ置く `.mcp.json` が正。Peertable管理下fileはlaunch時にもcurrent-tree clientへ同期する。project に既存 `.mcp.json` があった場合は無断更新せず`SEAT_ROOM_MCP_STALE`で止まるので、AI がroom定義を手動mergeしてteardownで復元する
|
|
68
68
|
- **Codex 席**(`vendor=codex`): Codex には channels が無いので、room は `-c` 上書きの stdio MCPとして、同じPeertable treeの`node room/client.mjs`を差す。**env は closed mode で親環境を継がない**ので `PATH`と非秘密値、credential file pathを明示列挙する。effortはmember metadataだけでなく`model_reasoning_effort`へも同じ値を渡す。モデル名は ChatGPT アカウントで使える slug を渡す(`~/.codex/config.toml` の `model` が既定値の参考。使えない slug は起動後の最初のターンで 400 になって初めて分かる)。**起床ブリッジは Codex / Grok だけ**(下記)——Claude 席は room client が `notifications/claude/channel` を送る(8/12 に送信ループを削った回帰を 0.4.5 で戻した)
|
|
69
|
-
- **Grok 席**(`vendor=grok`): project rootの`.mcp.json`をGrok Buildが読み、同じroom clientと席固有envをAiterm
|
|
69
|
+
- **Grok 席**(`vendor=grok`): project rootの`.mcp.json`をGrok Buildが読み、同じroom clientと席固有envをAitermが渡す。**user `~/.grok/config.toml` の booth/lattice 等 MCP は載せない**——席専用 `GROK_HOME`(`.team/seats/<name>.grok-home`、auth.json と ui だけ)を preflight と live 席の両方へ渡す。通らなければ席を立てず、別 model へ落とさない。model / effortはAitermの`grok_agent`へそのまま渡し、`grok models`のlive catalogに無いmodelは着席前に失敗する。初めて開くtreeの既知workspace trustは着席処理が通す。channelsは無いので起床ブリッジを使う。Grok TUIの既定はターン中の素送信を今の仕事へ混ぜず入力キューへ積むので、ブリッジはGrok席がidleになるまで送らない
|
|
70
70
|
6. **起床ブリッジ(Codex / Grok 席がある時)**: `scripts/ensure-bridge.sh <project> wakeup <席名>…`。room の SSE を購読し、明示的にその席宛の新着(自分の発言は除く)だけを tmux へ素送信して起こす。ensure は専用 tmux session で起動し、bridge の `ready_at` を待つ。確認できなければログ末尾を出して非ゼロで終わる。Codexは即送信、Grokはidle待ち。親(`parent_watch` / `observe: null`)は対象にしない。停止は `node scripts/wakeup-bridge.mjs <project> --stop`(teardown.sh が自動で行う)
|
|
71
71
|
- **黙って止まらないための三段**(決定58 の受信側の作法): ①75秒なにも届かなければ自分から切って繋ぎ直す ②繋ぎ直したら `?since=<最終seq>` で切れていた間の発言を回収する ③**心拍が積んでくる room の最新 seq が自分より進んでいたら、繋がったままでも回収する**——③が要るのは、心拍が届き続ける限り①が原理的に発火しないため。**server 側の心拍(`event: ping`・25秒周期)が前提**なので、古い room サーバーへ繋ぐと①だけが効く形になる
|
|
72
72
|
- ログは `.team/wakeup-bridge.log`。**0件でも0件と出す**ので、起こせているか・取りこぼしていないかはログを見れば分かる。再現ハーネスは `experiments/bridge-catchup-repro.mjs`
|
|
@@ -20,6 +20,7 @@ if (process.env.PEERTABLE_PLAN) env_vars.push(
|
|
|
20
20
|
'PEERTABLE_PLAN', 'LATTICE_CLI', 'LATTICE_TODO_ACTOR_HOST',
|
|
21
21
|
'LATTICE_TODO_ACTOR_SESSION', 'LATTICE_TODO_ACTOR_AGENT',
|
|
22
22
|
)
|
|
23
|
+
if (vendor === 'grok' && process.env.GROK_HOME) env_vars.push('GROK_HOME')
|
|
23
24
|
const result = await client.callTool({
|
|
24
25
|
name: `${vendor}_agent`,
|
|
25
26
|
arguments: {
|
|
@@ -229,8 +229,11 @@ case "$vendor" in
|
|
|
229
229
|
exit 1
|
|
230
230
|
fi
|
|
231
231
|
# 通常 GROK_HOME の config は booth 等 MCP を起動する。preflight がそれを待つと
|
|
232
|
-
# 120 秒で空ログのまま死ぬ(2026-08-20
|
|
233
|
-
|
|
232
|
+
# 120 秒で空ログのまま死ぬ(2026-08-20)。live 席も同じ config を読むと
|
|
233
|
+
# lattice MCP が数分固まる。認証だけ借りて MCP 無しの席専用 HOME を残す。
|
|
234
|
+
grok_home="${proj}/.team/seats/${name}.grok-home"
|
|
235
|
+
rm -rf "$grok_home"
|
|
236
|
+
mkdir -p "$grok_home"
|
|
234
237
|
if [ ! -f "${HOME}/.grok/auth.json" ]; then
|
|
235
238
|
echo "SEAT_GROK_AUTH_MISSING: ${HOME}/.grok/auth.json が無い(席は立てない)" >&2
|
|
236
239
|
exit 1
|
|
@@ -273,7 +276,6 @@ if [ "$preflight_rc" != 0 ]; then
|
|
|
273
276
|
exit 1
|
|
274
277
|
fi
|
|
275
278
|
rm -f "$preflight_log"
|
|
276
|
-
[ -n "${grok_home:-}" ] && rm -rf "$grok_home"
|
|
277
279
|
|
|
278
280
|
sock=$(node "$(dirname "$0")/tmux-socket.mjs")
|
|
279
281
|
sess="peer-$name"
|
|
@@ -328,6 +330,19 @@ case "$stale_member_rc" in
|
|
|
328
330
|
;;
|
|
329
331
|
esac
|
|
330
332
|
|
|
333
|
+
# leave-seat が席専用 GROK_HOME を消す。同名再着席では preflight 後に空になるので、
|
|
334
|
+
# live 起動の直前に auth と ui だけを書き直す(user booth MCP は載せない)。
|
|
335
|
+
if [ "$vendor" = grok ]; then
|
|
336
|
+
mkdir -p "$grok_home"
|
|
337
|
+
if [ ! -f "${HOME}/.grok/auth.json" ]; then
|
|
338
|
+
echo "SEAT_GROK_AUTH_MISSING: ${HOME}/.grok/auth.json が無い(席は立てない)" >&2
|
|
339
|
+
exit 1
|
|
340
|
+
fi
|
|
341
|
+
cp "${HOME}/.grok/auth.json" "${grok_home}/auth.json"
|
|
342
|
+
chmod 600 "${grok_home}/auth.json" 2>/dev/null || true
|
|
343
|
+
printf '%s\n' '[ui]' 'permission_mode = "always-approve"' >"${grok_home}/config.toml"
|
|
344
|
+
fi
|
|
345
|
+
|
|
331
346
|
# 前の卓の残骸を回収してから、Aiterm の公開 agent launcher を唯一の席起動経路として呼ぶ。
|
|
332
347
|
# direct CLI launch へ戻るfallbackは置かない。Aiterm が作る同名PTYと launch receipt が、
|
|
333
348
|
# 以後の `pty_read` / `agent_configure` / room metadata を同じsessionへ束縛する。
|
|
@@ -356,6 +371,9 @@ if [ "$mode" = "lattice" ]; then
|
|
|
356
371
|
)
|
|
357
372
|
[ -n "$lattice_cli" ] && launch_env+=("LATTICE_CLI=$lattice_cli")
|
|
358
373
|
fi
|
|
374
|
+
if [ "$vendor" = grok ]; then
|
|
375
|
+
launch_env+=("GROK_HOME=$grok_home")
|
|
376
|
+
fi
|
|
359
377
|
if [ "$vendor" = codex ] \
|
|
360
378
|
&& ! env -u PEERTABLE_POST_TOKEN "${launch_env[@]}" node "$codex_room_mcp_helper" ensure "$proj" "$peertable_repo"; then
|
|
361
379
|
echo "SEAT_CODEX_ROOM_MCP_INVALID: Codexのproject設定へseat固有room clientを装備できない(席は立てない)" >&2
|
|
@@ -80,6 +80,7 @@ if ! rm -f "$proj/.team/seats/$name.json"; then
|
|
|
80
80
|
echo "SEAT_LEAVE_IDENTITY_FAILED: $name" >&2
|
|
81
81
|
failed=1
|
|
82
82
|
fi
|
|
83
|
+
rm -rf "$proj/.team/seats/${name}.grok-home"
|
|
83
84
|
if ! env -u PEERTABLE_POST_TOKEN node "$credential_helper" remove "$proj" "$credential_file"; then
|
|
84
85
|
echo "SEAT_LEAVE_CREDENTIAL_FAILED: $name" >&2
|
|
85
86
|
failed=1
|